@fab1o978/react-ui 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ColorWheel/ColorWheel.module.scss","../../../src/components/ColorWheel/usePointerDrag.ts","../../../src/components/ColorWheel/useUnwrappedAngle.ts","../../../src/utils/color.ts","../../../src/components/ColorWheel/colorMath.ts","../../../src/components/ColorWheel/ColorWheel.tsx"],"names":["root","recents","chipWrap","chip","chipRemove","picker","glow","modeToggle","modePill","modeButton","active","stage","stageShadow","ring","hueHandlePivot","hueHandle","alphaArcShadowWrap","alphaArcShadow","alphaArc","alphaArcFill","alphaArcCap","alphaArcCapStart","alphaArcCapEnd","alphaArcHandle","currentDisc","discFill","currentHex","currentHexInput","copied","discBadge","discBadgeTop","pulse","discBadgeBottom","useRef","useEffect","useMemo","useState","dragging","jsxs","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":[".root {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n@media (prefers-color-scheme: dark) {\n .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n }\n}\n:global([data-theme='light']) .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n:global([data-theme='dark']) .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n}\n.root[data-theme=dark] {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n}\n.root[data-theme=light] {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n.root {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n font-family: -apple-system, \"Segoe UI\", Inter, \"Helvetica Neue\", Arial, sans-serif;\n color: var(--text);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .root, .root *, .root *::before, .root *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n.recents {\n display: flex;\n align-items: center;\n gap: 7px;\n min-height: 30px;\n background: var(--surface-2);\n border-radius: 999px;\n padding: 5px 8px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.14), var(--shadow-soft);\n}\n\n.chipWrap {\n position: relative;\n flex: none;\n animation: chipIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) both;\n}\n\n.chip {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n border: none;\n padding: 0;\n cursor: pointer;\n display: block;\n box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.22), var(--shadow-soft);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n.chip:hover {\n transform: scale(1.14) translateY(-1px);\n box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.3), 0 4px 10px -3px rgba(0, 0, 0, 0.3);\n}\n.chip:active {\n transform: scale(1.02);\n}\n\n.chipRemove {\n position: absolute;\n top: -3px;\n right: -3px;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: none;\n padding: 0;\n display: grid;\n place-items: center;\n background: var(--surface);\n color: var(--text-dim);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(128, 128, 128, 0.25);\n cursor: pointer;\n z-index: 2;\n opacity: 0;\n pointer-events: none;\n transform: scale(0.6);\n transition: opacity 0.12s ease, transform 0.12s ease, color 0.12s ease;\n}\n.chipRemove svg {\n width: 8px;\n height: 8px;\n}\n.chipRemove:hover {\n color: var(--text);\n}\n.chipWrap:hover .chipRemove {\n opacity: 1;\n pointer-events: auto;\n transform: scale(1);\n}\n\n@keyframes chipIn {\n 0% {\n transform: scale(0) rotate(-25deg);\n opacity: 0;\n }\n 100% {\n transform: scale(1) rotate(0);\n opacity: 1;\n }\n}\n.picker {\n position: relative;\n margin-top: 96px;\n width: 272px;\n}\n\n.glow {\n position: absolute;\n width: 340px;\n height: 340px;\n left: 50%;\n top: 88px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n opacity: 0.55;\n pointer-events: none;\n z-index: 0;\n}\n\n.modeToggle {\n position: absolute;\n top: 88px;\n left: 50%;\n transform: translate(-50%, calc(-50% - 170px));\n z-index: 3;\n display: grid;\n background: var(--surface-2);\n border-radius: 999px;\n padding: 3px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.14), var(--shadow-soft);\n}\n\n.modePill {\n position: absolute;\n top: 3px;\n bottom: 3px;\n left: 3px;\n border-radius: 999px;\n background: var(--surface);\n box-shadow: var(--shadow-soft);\n transition: transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n.modeButton {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 22px;\n background: none;\n border: none;\n padding: 0;\n font-size: 10.5px;\n font-weight: 700;\n line-height: 22px;\n letter-spacing: 0.02em;\n color: var(--text-dim);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.modeButton.active {\n color: var(--text);\n}\n.modeButton:hover:not(.active) {\n color: var(--text);\n}\n\n.stage {\n position: absolute;\n top: -48px;\n left: 50%;\n width: 272px;\n height: 272px;\n transform: translateX(-50%);\n touch-action: none;\n}\n\n.stageShadow {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.22), 0 10px 18px rgba(0, 0, 0, 0.22);\n pointer-events: none;\n}\n\n.ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n pointer-events: none;\n z-index: 2;\n -webkit-mask: radial-gradient(circle closest-side, transparent 0 92px, black 93px 100%);\n mask: radial-gradient(circle closest-side, transparent 0 92px, black 93px 100%);\n}\n\n.hueHandlePivot {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0;\n height: 0;\n z-index: 3;\n transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.root[data-dragging=true] .hueHandlePivot {\n transition: none;\n}\n\n.hueHandle {\n position: absolute;\n top: -114px;\n left: 0;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n border: 3px solid #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(0, 0, 0, 0.15);\n transform: translate(-50%, -50%);\n cursor: grab;\n z-index: 3;\n}\n\n.alphaArcShadowWrap {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 380px;\n height: 380px;\n transform: translate(calc(-50% + 1px), calc(-50% + 5px));\n z-index: 1;\n pointer-events: none;\n filter: blur(7px);\n}\n\n.alphaArcShadow {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.22);\n clip-path: path(\"M 328.56,270 A 160 160 0 0 1 51.44,270 L 65.29,262 A 144 144 0 0 0 314.71,262 Z\");\n}\n\n.alphaArc {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 380px;\n height: 380px;\n transform: translate(-50%, -50%);\n touch-action: none;\n cursor: grab;\n z-index: 2;\n background: var(--surface-2);\n clip-path: path(\"M 328.56,270 A 160 160 0 0 1 51.44,270 L 65.29,262 A 144 144 0 0 0 314.71,262 Z\");\n}\n\n.alphaArcFill {\n position: absolute;\n inset: 0;\n}\n\n.alphaArcCap {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n z-index: 2;\n pointer-events: none;\n background: var(--surface-2);\n}\n\n.alphaArcCapStart {\n transform: translate(calc(-50% + 131.6px), calc(-50% + 76px));\n}\n\n.alphaArcCapEnd {\n transform: translate(calc(-50% - 131.6px), calc(-50% + 76px));\n}\n\n.alphaArcHandle {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid #fff;\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(0, 0, 0, 0.2);\n z-index: 3;\n pointer-events: none;\n transition: transform 0.12s ease;\n}\n\n.root[data-dragging=true] .alphaArcHandle {\n transition: none;\n}\n\n.currentDisc {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 156px;\n height: 156px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n overflow: hidden;\n cursor: pointer;\n z-index: 2;\n box-shadow: 0 10px 24px -8px rgba(20, 16, 10, 0.4), inset 0 0 0 1px rgba(0, 0, 0, 0.08);\n background-image: linear-gradient(45deg, var(--check-a) 25%, transparent 25%, transparent 75%, var(--check-a) 75%), linear-gradient(45deg, var(--check-a) 25%, transparent 25%, transparent 75%, var(--check-a) 75%);\n background-size: 12px 12px;\n background-position: 0 0, 6px 6px;\n background-color: var(--check-b);\n}\n\n.discFill {\n position: absolute;\n inset: 0;\n}\n\n.currentHex,\n.currentHexInput {\n position: absolute;\n inset: 0;\n z-index: 1;\n font-family: \"SF Mono\", \"IBM Plex Mono\", \"JetBrains Mono\", Consolas, \"Liberation Mono\", monospace;\n font-size: 17px;\n font-weight: 700;\n letter-spacing: 0.01em;\n font-variant-numeric: tabular-nums;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);\n}\n\n.currentHex {\n display: grid;\n place-items: center;\n cursor: text;\n transition: transform 0.15s cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n.currentHex.copied {\n transform: scale(1.06);\n}\n\n.currentHexInput {\n z-index: 2;\n width: 100%;\n height: 100%;\n text-align: center;\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n}\n.currentHexInput::selection {\n background: rgba(255, 255, 255, 0.35);\n}\n\n.discBadge {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n border: none;\n display: grid;\n place-items: center;\n cursor: pointer;\n z-index: 3;\n transition: transform 0.15s ease, filter 0.15s ease;\n}\n.discBadge:hover {\n filter: brightness(1.15);\n}\n.discBadge svg {\n width: 15px;\n height: 15px;\n}\n\n.discBadgeTop {\n transform: translate(-50%, calc(-50% - 46px));\n}\n.discBadgeTop:active {\n transform: translate(-50%, calc(-50% - 46px)) scale(0.92);\n}\n.discBadgeTop.pulse {\n animation: badgePulseTop 0.4s ease;\n}\n\n.discBadgeBottom {\n transform: translate(-50%, calc(-50% + 46px));\n}\n.discBadgeBottom:active {\n transform: translate(-50%, calc(-50% + 46px)) scale(0.92);\n}\n\n@keyframes badgePulseTop {\n 0% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1);\n }\n 40% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1.28);\n }\n 100% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1);\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbG9yV2hlZWwubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUNBO0VBMUJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBb0JBO0VBQ0U7SUFsQkY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7O0FBa0JBO0VBekNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBa0NBO0VBL0JBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBMEJBO0VBcENBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBNkJBO0VBcERBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBZ0JGO0VBOEJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0lBQ0U7SUFDQTs7O0FBS0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7OztBQU1KO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7O0FBRUY7RUFDRTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7SUFBSztJQUFvQzs7RUFDekM7SUFBTztJQUErQjs7O0FBV3hDO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFFRjtFQUNFOzs7QUFLSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFPRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7OztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUlBO0VBSUE7OztBQUVGO0VBQ0U7OztBQUVGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBY0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsV0F0QlE7OztBQXlCVjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsV0FwQ1E7OztBQXVDVjtFQUNFO0VBQ0E7OztBQVNGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFHRjtFQUNFOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVGO0VBQ0U7OztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLGtCQUNFO0VBRUY7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUtGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBR0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7OztBQVFKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBRUY7RUFDRTtFQUNBOzs7QUFHSjtFQUNFOztBQUNBO0VBQ0U7O0FBRUY7RUFDRTs7O0FBR0o7RUFDRTs7QUFDQTtFQUNFOzs7QUFHSjtFQUNFO0lBQUs7O0VBQ0w7SUFBTTs7RUFDTjtJQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlbWUgdG9rZW5zIGFyZSBzY29wZWQgdG8gLnJvb3QgKGNvbXBvbmVudC1sb2NhbCksIG5vdCA6cm9vdCAtLSB0aGlzXG4vLyBjb21wb25lbnQgbXVzdCBiZSBzYWZlIHRvIGRyb3AgaW50byBhbiBhcHAgd2l0aCBpdHMgb3duIGdsb2JhbCB0aGVtZVxuLy8gd2l0aG91dCBjb2xsaWRpbmcuIEFsbCAqY29tcHV0ZWQqIGNvbG9ycyAodGhlIGNvbG9yIHlvdSdyZSBwaWNraW5nLCBiYWRnZVxuLy8gdGludHMsIGdyYWRpZW50cykgYXJlIHBhc3NlZCBpbiBhcyBpbmxpbmUgc3R5bGVzIGZyb20gQ29sb3JXaGVlbC50c3gsIG5vdFxuLy8gQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzIGhlcmUgLS0gb25seSBzdHJ1Y3R1cmFsL3RoZW1lIHRva2VucyBsaXZlIGluIFNDU1MuXG5cbi8vIGxpZ2h0L2RhcmsgcGFsZXR0ZXMgLS0gaWRlbnRpY2FsIHZhbHVlcyBzaGFyZWQgYnkgZXZlcnkgdHJpZ2dlciBiZWxvdyAoT1Ncbi8vIHByZWZlcmVuY2UsIGhvc3QgYXBwJ3MgYW1iaWVudCB0aGVtZSwgYW5kIHRoaXMgaW5zdGFuY2UncyBvd24gYHRoZW1lYCBwcm9wKVxuQG1peGluIGxpZ2h0LXBhbGV0dGUge1xuICAtLWJnOiAjRUNFQUUzO1xuICAtLXN1cmZhY2U6ICNGRkZGRkY7XG4gIC0tc3VyZmFjZS0yOiAjRTNFMEQ4O1xuICAtLWJvcmRlcjogI0QyQ0RDMDtcbiAgLS10ZXh0OiAjMUExOTEzO1xuICAtLXRleHQtZGltOiAjNzI2RjY0O1xuICAtLXRleHQtZmFpbnQ6ICNBOEEzOTg7XG4gIC0tc2hhZG93LXNvZnQ6IDAgMXB4IDJweCByZ2JhKDMwLCAyNSwgMTUsIDAuMDgpO1xuICAtLWNoZWNrLWE6ICNkOGQ0Yzg7XG4gIC0tY2hlY2stYjogI2Y0ZjJlYztcbiAgY29sb3Itc2NoZW1lOiBsaWdodDtcbn1cbkBtaXhpbiBkYXJrLXBhbGV0dGUge1xuICAtLWJnOiAjMTMxMjE3O1xuICAtLXN1cmZhY2U6ICMxQzFCMjI7XG4gIC0tc3VyZmFjZS0yOiAjMjYyNTJFO1xuICAtLWJvcmRlcjogIzM0MzMzRDtcbiAgLS10ZXh0OiAjRUNFQUYwO1xuICAtLXRleHQtZGltOiAjOEU4Qzk5O1xuICAtLXRleHQtZmFpbnQ6ICM2MDVFNkI7XG4gIC0tc2hhZG93LXNvZnQ6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xuICAtLWNoZWNrLWE6ICMzNzM1M2Y7XG4gIC0tY2hlY2stYjogIzIwMWYyNjtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xufVxuXG4ucm9vdCB7XG4gIEBpbmNsdWRlIGxpZ2h0LXBhbGV0dGU7XG5cbiAgLy8gdGhlbWU9XCJzeXN0ZW1cIiAobm8gZGF0YS10aGVtZSBvZiBpdHMgb3duKTogZmFsbCBiYWNrIHRvIHRoZSBPUyBwcmVmZXJlbmNlXG4gIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcbiAgICAmOm5vdChbZGF0YS10aGVtZT0nbGlnaHQnXSk6bm90KFtkYXRhLXRoZW1lPSdkYXJrJ10pIHtcbiAgICAgIEBpbmNsdWRlIGRhcmstcGFsZXR0ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGVtZT1cInN5c3RlbVwiOiB0aGUgaG9zdCBhcHAncyBhbWJpZW50IHRoZW1lIChkYXRhLXRoZW1lIHNldCBvbiBhblxuICAvLyBhbmNlc3RvciwgZS5nLiA8aHRtbD4gLS0gdGhlIHNhbWUgY29udmVudGlvbiBDb2xvclBpY2tlci9UaW1lbGluZSByZWFkXG4gIC8vIGZyb20pIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgYmFyZSBPUyBwcmVmZXJlbmNlIGFib3ZlIHdoZW4gdGhlIGFwcFxuICAvLyBkZWNsYXJlcyBvbmUgLS0gaW5jbHVkaW5nIGV4cGxpY2l0bHkgb3ZlcnJpZGluZyBpdCBiYWNrIHRvIGxpZ2h0LCBzaW5jZVxuICAvLyB0aGUgT1MtcHJlZmVyZW5jZSBydWxlIGFib3ZlIGhhcyBubyB3YXkgdG8ga25vdyB0aGUgYXBwIGRpc2FncmVlc1xuICA6Z2xvYmFsKFtkYXRhLXRoZW1lPSdsaWdodCddKSAmOm5vdChbZGF0YS10aGVtZT0nbGlnaHQnXSk6bm90KFtkYXRhLXRoZW1lPSdkYXJrJ10pIHtcbiAgICBAaW5jbHVkZSBsaWdodC1wYWxldHRlO1xuICB9XG4gIDpnbG9iYWwoW2RhdGEtdGhlbWU9J2RhcmsnXSkgJjpub3QoW2RhdGEtdGhlbWU9J2xpZ2h0J10pOm5vdChbZGF0YS10aGVtZT0nZGFyayddKSB7XG4gICAgQGluY2x1ZGUgZGFyay1wYWxldHRlO1xuICB9XG5cbiAgLy8gdGhlbWU9XCJkYXJrXCIgLyB0aGVtZT1cImxpZ2h0XCI6IHBpbm5lZCBleHBsaWNpdGx5IG9uIHRoaXMgaW5zdGFuY2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIE9TIG9yIHRoZSBhcHBcbiAgJltkYXRhLXRoZW1lPSdkYXJrJ10ge1xuICAgIEBpbmNsdWRlIGRhcmstcGFsZXR0ZTtcbiAgfVxuICAmW2RhdGEtdGhlbWU9J2xpZ2h0J10ge1xuICAgIEBpbmNsdWRlIGxpZ2h0LXBhbGV0dGU7XG4gIH1cblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMjBweDtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sICdTZWdvZSBVSScsIEludGVyLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgY29sb3I6IHZhcigtLXRleHQpO1xufVxuXG5AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xuICAucm9vdCwgLnJvb3QgKiwgLnJvb3QgKjo6YmVmb3JlLCAucm9vdCAqOjphZnRlciB7XG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDtcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT0gUmVjZW50cyAoZmF2b3JpdGVzKSA9PT09PT09PT09PT1cbi5yZWNlbnRzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA3cHg7XG4gIG1pbi1oZWlnaHQ6IDMwcHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBwYWRkaW5nOiA1cHggOHB4O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgdmFyKC0tc2hhZG93LXNvZnQpO1xufVxuXG4uY2hpcFdyYXAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsZXg6IG5vbmU7XG4gIGFuaW1hdGlvbjogY2hpcEluIDAuNHMgY3ViaWMtYmV6aWVyKDAuMzQsIDEuNTYsIDAuNjQsIDEpIGJvdGg7XG59XG5cbi5jaGlwIHtcbiAgd2lkdGg6IDI2cHg7XG4gIGhlaWdodDogMjZweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMjIpLCB2YXIoLS1zaGFkb3ctc29mdCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlLCBib3gtc2hhZG93IDAuMTVzIGVhc2U7XG5cbiAgJjpob3ZlciB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjE0KSB0cmFuc2xhdGVZKC0xcHgpO1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMyksIDAgNHB4IDEwcHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIH1cbiAgJjphY3RpdmUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMik7XG4gIH1cbn1cblxuLy8gbm90aWZpY2F0aW9uLWJhZGdlIHN0eWxlOiBzaXRzIG9mZi1jZW50ZXIgb24gdGhlIGNoaXAncyByaW0sIHJldmVhbGVkIG9ubHlcbi8vIG9uIGhvdmVyIHNvIGl0IG5ldmVyIGNvbXBldGVzIHdpdGggdGhlIGNoaXAncyBvd24gY2xpY2stdG8tc2VsZWN0IGFyZWFcbi5jaGlwUmVtb3ZlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0zcHg7XG4gIHJpZ2h0OiAtM3B4O1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMDtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LWRpbSk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMyksIGluc2V0IDAgMCAwIDFweCByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMjUpO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHotaW5kZXg6IDI7XG4gIG9wYWNpdHk6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xMnMgZWFzZSwgdHJhbnNmb3JtIDAuMTJzIGVhc2UsIGNvbG9yIDAuMTJzIGVhc2U7XG5cbiAgc3ZnIHtcbiAgICB3aWR0aDogOHB4O1xuICAgIGhlaWdodDogOHB4O1xuICB9XG4gICY6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0KTtcbiAgfVxuICAuY2hpcFdyYXA6aG92ZXIgJiB7XG4gICAgb3BhY2l0eTogMTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2hpcEluIHtcbiAgMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDApIHJvdGF0ZSgtMjVkZWcpOyBvcGFjaXR5OiAwOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgwKTsgb3BhY2l0eTogMTsgfVxufVxuXG4vLyA9PT09PT09PT09PT0gUGlja2VyOiBwb3NpdGlvbmluZyBjb250ZXh0IGZvciB0aGUgcmluZydzIGJsZWVkID09PT09PT09PT09PVxuLy8gRXZlcnkgZGlyZWN0IGNoaWxkIGJlbG93IGlzIHBvc2l0aW9uOmFic29sdXRlICh0aGVyZSdzIG5vIGJhY2tpbmcgY2FyZCB0b1xuLy8gaG9sZCB0aGUgYm94IG9wZW4pLCBzbyAucGlja2VyIG5lZWRzIGFuIGV4cGxpY2l0IHNpemUgb3IgaXQgbWVhc3VyZXMgYXNcbi8vIDB4MCB0byB0aGUgbGF5b3V0IGVuZ2luZSAtLSBtYXJnaW4tdG9wIHJlc2VydmVzIHJvb20gZm9yIHdoYXQgcmVuZGVyc1xuLy8gYWJvdmUgdGhlIHNoYXJlZCBjZW50ZXIgYW5jaG9yIChtb3N0bHkgdGhlIG1vZGUgdG9nZ2xlKS4gYGhlaWdodGAgaXMgc2V0XG4vLyBpbmxpbmUgZnJvbSBDb2xvcldoZWVsLnRzeCBpbnN0ZWFkIG9mIGhlcmUsIHNpbmNlIGhvdyBmYXIgZG93biBpdCBuZWVkcyB0b1xuLy8gcmVzZXJ2ZSBkZXBlbmRzIG9uIGBhcmNWaXNpYmxlYCAodGhlIGFscGhhIGFyYyByZWFjaGVzIGxvd2VyIHRoYW4gdGhlIHJpbmdcbi8vIGFsb25lIGRvZXMpIC0tIHBsYWluIFNDU1MgY2FuJ3Qgc2VlIHRoYXQgcHJvcC5cbi5waWNrZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi10b3A6IDk2cHg7XG4gIHdpZHRoOiAyNzJweDtcbn1cblxuLmdsb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAzNDBweDtcbiAgaGVpZ2h0OiAzNDBweDtcbiAgbGVmdDogNTAlO1xuICB0b3A6IDg4cHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG9wYWNpdHk6IDAuNTU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiAwO1xufVxuXG4vLyA9PT09PT09PT09PT0gTW9kZSB0b2dnbGU6IHN3aXRjaGVzIHdoYXQgdGhlIHJpbmcgYWRqdXN0cyAoSC9TL1YpID09PT09PT09PT09PVxuLm1vZGVUb2dnbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSAxNzBweCkpO1xuICB6LWluZGV4OiAzO1xuICBkaXNwbGF5OiBncmlkO1xuICAvLyBncmlkLXRlbXBsYXRlLWNvbHVtbnMgYW5kIHdpZHRoIGFyZSBzZXQgaW5saW5lIChtb2RlIGNvdW50IGlzIGR5bmFtaWM6XG4gIC8vIDMtd2F5IEgvUy9WIG9yIDQtd2F5IEgvUy9WL0EgZGVwZW5kaW5nIG9uIHNob3dBbHBoYUNvbnRyb2wpXG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBwYWRkaW5nOiAzcHg7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCB2YXIoLS1zaGFkb3ctc29mdCk7XG59XG5cbi5tb2RlUGlsbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAzcHg7XG4gIGJvdHRvbTogM3B4O1xuICBsZWZ0OiAzcHg7XG4gIC8vIHdpZHRoIGlzIHNldCBpbmxpbmUgKHNlZSAubW9kZVRvZ2dsZSlcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpO1xuICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctc29mdCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cyBjdWJpYy1iZXppZXIoMC4yLCAwLjgsIDAuMiwgMSk7XG59XG5cbi5tb2RlQnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgaGVpZ2h0OiAyMnB4O1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogMTAuNXB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsaW5lLWhlaWdodDogMjJweDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgY29sb3I6IHZhcigtLXRleHQtZGltKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzIGVhc2U7XG5cbiAgJi5hY3RpdmUge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0KTtcbiAgfVxuICAmOmhvdmVyOm5vdCguYWN0aXZlKSB7XG4gICAgY29sb3I6IHZhcigtLXRleHQpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PSBTdGFnZTogYSB0cnVlIHJpbmcgKGFubnVsdXMgdmlhIG1hc2spID09PT09PT09PT09PVxuLnN0YWdlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC00OHB4O1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyNzJweDtcbiAgaGVpZ2h0OiAyNzJweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0b3VjaC1hY3Rpb246IG5vbmU7XG59XG5cbi8vIHNoYWRvdyBjYXN0ZXI6IGEgcGxhaW4sIHVubWFza2VkIGNpcmNsZSBiZWhpbmQgdGhlIHJpbmcuIGJveC1zaGFkb3cgZHJhd3Ncbi8vIG91dHNpZGUgaXRzIGJvcmRlci1ib3ggcmVnYXJkbGVzcyBvZiB0aGUgaG9sZSBpbiB0aGUgc2hhcGUgZHJhd24gb24gdG9wIG9mXG4vLyBpdCwgc28gdGhpcyByZWxpYWJseSBjYXN0cyBhIHNoYWRvdyBhcm91bmQgdGhlIHJpbmcncyBvdXRlciBlZGdlIC0tXG4vLyBmaWx0ZXI6ZHJvcC1zaGFkb3cgb24gdGhlIG1hc2tlZCAucmluZyBpdHNlbGYgaXMgdW5yZWxpYWJsZSBhY3Jvc3MgZW5naW5lcy5cbi5zdGFnZVNoYWRvdyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yMiksIDAgMTBweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4ucmluZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDI7XG4gIC8vIGJhY2tncm91bmQgaXMgc2V0IHBlci1tb2RlIGlubGluZTogaHVlIHNwZWN0cnVtIC8gZ3JleS10by1jb2xvciAvIGJsYWNrLXRvLWNvbG9yXG4gIC13ZWJraXQtbWFzazogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBjbG9zZXN0LXNpZGUsIHRyYW5zcGFyZW50IDAgOTJweCwgYmxhY2sgOTNweCAxMDAlKTtcbiAgbWFzazogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBjbG9zZXN0LXNpZGUsIHRyYW5zcGFyZW50IDAgOTJweCwgYmxhY2sgOTNweCAxMDAlKTtcbn1cblxuLy8gcm90YXRlZCwgbm90IHJlcG9zaXRpb25lZCB2aWEgdG9wL2xlZnQgLS0gc2VlIHRoZSBjb21tZW50IG9uXG4vLyByaW5nQW5nbGVGcm9tVG9wRGVnIGluIENvbG9yV2hlZWwudHN4IGZvciB3aHlcbi5odWVIYW5kbGVQaXZvdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDA7XG4gIGhlaWdodDogMDtcbiAgLy8gYHRyYW5zZm9ybWAgY3JlYXRlcyBhIG5ldyBzdGFja2luZyBjb250ZXh0LCBzbyB0aGlzIG5lZWRzIGl0cyBvd25cbiAgLy8gei1pbmRleCAtLSB0aGUgY2hpbGQgLmh1ZUhhbmRsZSdzIHotaW5kZXggb25seSByYW5rcyBpdCB3aXRoaW4gdGhpc1xuICAvLyBjb250ZXh0LCBub3QgYWdhaW5zdCB0aGUgcmluZy9kaXNjL2JhZGdlcyBzaXR0aW5nIG91dHNpZGUgaXRcbiAgei1pbmRleDogMztcbiAgLy8gc3Ryb25nIGVhc2Utb3V0IC0tIGZhc3Qgc3RhcnQsIGxvbmcgZGVjZWxlcmF0aW9uIGludG8gdGhlIGZpbmFsIGFuZ2xlLFxuICAvLyBsaWtlIGJyYWtpbmcgaW50byBwb3NpdGlvbi4gUmVhZHMgYXMgYSByZWFsIHN3ZWVwIG9uIGEgYmlnIG1vZGUtc3dpdGNoXG4gIC8vIGp1bXAsIHN0YXlzIHNuYXBweSBvbiBzbWFsbCB3aGVlbC10aWNrIG51ZGdlcy5cbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMzJzIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xufVxuLnJvb3RbZGF0YS1kcmFnZ2luZz0ndHJ1ZSddIC5odWVIYW5kbGVQaXZvdCB7XG4gIHRyYW5zaXRpb246IG5vbmU7XG59XG4uaHVlSGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0xMTRweDsgLy8gbWlkLWJhbmQgcmFkaXVzICgwLjQxOTEgKiAyNzJweCBzdGFnZSksIGZpeGVkIGRpc3RhbmNlIGZyb20gdGhlIHBpdm90XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiAzcHggc29saWQgI2ZmZjtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC40KSwgMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBjdXJzb3I6IGdyYWI7XG4gIHotaW5kZXg6IDM7XG59XG5cbi8vID09PT09PT09PT09PSBBbHBoYSBhcmM6IGEgY3VydmVkIGFscGhhIHNsaWRlciBvdXRzaWRlIHRoZSByaW5nID09PT09PT09PT09PVxuLy8gYSBwdXJlIDFEIGNvbnRyb2wsIHBvc2l0aW9uIGFsb25nIHRoZSAxMjBkZWcgYmFuZCAoYm90dG9tLWNlbnRlcmVkKSBmYWRlc1xuLy8gYSBjaGVja2VyYm9hcmQgKGFscGhhIDApIGludG8gdGhlIGN1cnJlbnQgc29saWQgY29sb3IgKGFscGhhIDEpLiBjbGlwLXBhdGhcbi8vIGFsc28gZ2F0ZXMgaGl0LXRlc3RpbmcsIHNvIGNsaWNrcyBvdXRzaWRlIHRoZSB2aXNpYmxlIGNyZXNjZW50IGZhbGwgdGhyb3VnaC5cbiRhcmNQYXRoOiBwYXRoKCdNIDMyOC41NiwyNzAgQSAxNjAgMTYwIDAgMCAxIDUxLjQ0LDI3MCBMIDY1LjI5LDI2MiBBIDE0NCAxNDQgMCAwIDAgMzE0LjcxLDI2MiBaJyk7XG5cbi8vIHNoYWRvdyBjYXN0ZXI6IGNsaXAtcGF0aCArIGZpbHRlcjpibHVyIG9uIHRoZSBTQU1FIGVsZW1lbnQgY2xpcHMgYXdheSB0aGVcbi8vIGJsdXIncyBvd24gc29mdCBlZGdlIChubyByb29tIG91dHNpZGUgdGhlIHBhdGggZm9yIGl0IHRvIGZhZGUgaW50byksXG4vLyBsZWF2aW5nIGEgaGFyZC1lZGdlZCBzbXVkZ2UuIEZpeDogYmx1ciBhIHdyYXBwZXIgdGhhdCBJU04nVCBpdHNlbGYgY2xpcHBlZFxuLy8gLS0gaXQgY29tcG9zaXRlcyBpdHMgY2xpcHBlZCBjaGlsZCBmaXJzdCwgdGhlbiBibHVycyB0aGF0IHdob2xlIHJlc3VsdFxuLy8gZnJlZWx5LCBzaW5jZSBub3RoaW5nIGNsaXBzIHRoZSB3cmFwcGVyIGFmdGVyd2FyZC5cbi5hbHBoYUFyY1NoYWRvd1dyYXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzgwcHg7XG4gIGhlaWdodDogMzgwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoLTUwJSArIDFweCksIGNhbGMoLTUwJSArIDVweCkpO1xuICB6LWluZGV4OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZmlsdGVyOiBibHVyKDdweCk7XG59XG4uYWxwaGFBcmNTaGFkb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjIpO1xuICBjbGlwLXBhdGg6ICRhcmNQYXRoO1xufVxuXG4uYWxwaGFBcmMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzgwcHg7XG4gIGhlaWdodDogMzgwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICB0b3VjaC1hY3Rpb246IG5vbmU7XG4gIGN1cnNvcjogZ3JhYjtcbiAgei1pbmRleDogMjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTtcbiAgY2xpcC1wYXRoOiAkYXJjUGF0aDtcbn1cblxuLmFscGhhQXJjRmlsbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIC8vIGNvbmljLWdyYWRpZW50IHNldCBpbmxpbmUgKG5lZWRzIHRoZSBsaXZlIGFjY2VudCBjb2xvcilcbn1cblxuLy8gY2xpcC1wYXRoIGNhbid0IHRha2UgYSBib3JkZXItcmFkaXVzLCBzbyB0aGUgYmFuZCdzIHR3byBmbGF0LWN1dCBlbmRzIGFyZVxuLy8gXCJyb3VuZGVkXCIgYnkgY2FwcGluZyB0aGVtIHdpdGggcGxhaW4gY2lyY2xlcyBzaXplZCB0byB0aGUgYmFuZCdzIG93blxuLy8gdGhpY2tuZXNzIC0tIGEgcGlsbCBjYXAsIHNhbWUgdHJpY2sgYXMgYSByb3VuZGVkLWVuZCBzdHJva2UuIFRoZXNlIHNpdFxuLy8gT1VUU0lERSAuYWxwaGFBcmMgKGl0cyBjbGlwLXBhdGggd291bGQgc2xpY2UgdGhlbSB0b28pLCBwb3NpdGlvbmVkIGZyb21cbi8vIHRoZSBzaGFyZWQgY2VudGVyIHBvaW50IGxpa2UgdGhlIG1vZGUgdG9nZ2xlIGlzLlxuLmFscGhhQXJjQ2FwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDE2cHg7XG4gIGhlaWdodDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICB6LWluZGV4OiAyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTtcbn1cbi5hbHBoYUFyY0NhcFN0YXJ0IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtNTAlICsgMTMxLjZweCksIGNhbGMoLTUwJSArIDc2cHgpKTtcbiAgLy8gYmFja2dyb3VuZCBzZXQgaW5saW5lIChhY2NlbnQtc29saWQsIHRoZSBcImZ1bGxcIiBlbmQpXG59XG4uYWxwaGFBcmNDYXBFbmQge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC01MCUgLSAxMzEuNnB4KSwgY2FsYygtNTAlICsgNzZweCkpO1xufVxuXG4vLyBzaXRzIE9VVFNJREUgLmFscGhhQXJjIHRvbywgc2FtZSByZWFzb24gYXMgdGhlIGNhcHMgLS0gY2xpcC1wYXRoIHdvdWxkXG4vLyBzbGljZSBpdCBpbnRvIGEgY3Jlc2NlbnQgd2hlbmV2ZXIgaXQgbmVhcnMgdGhlIGJhbmQncyBmbGF0LWN1dCBlbmRzXG4uYWxwaGFBcmNIYW5kbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuNSksIDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIHotaW5kZXg6IDM7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xMnMgZWFzZTtcbn1cbi5yb290W2RhdGEtZHJhZ2dpbmc9J3RydWUnXSAuYWxwaGFBcmNIYW5kbGUge1xuICB0cmFuc2l0aW9uOiBub25lO1xufVxuXG4vLyA9PT09PT09PT09PT0gQ3VycmVudC1jb2xvciBkaXNjID09PT09PT09PT09PVxuLmN1cnJlbnREaXNjIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMTU2cHg7XG4gIGhlaWdodDogMTU2cHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgei1pbmRleDogMjtcbiAgYm94LXNoYWRvdzogMCAxMHB4IDI0cHggLThweCByZ2JhKDIwLCAxNiwgMTAsIDAuNCksIGluc2V0IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICBiYWNrZ3JvdW5kLWltYWdlOlxuICAgIGxpbmVhci1ncmFkaWVudCg0NWRlZywgdmFyKC0tY2hlY2stYSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDc1JSwgdmFyKC0tY2hlY2stYSkgNzUlKSxcbiAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHZhcigtLWNoZWNrLWEpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoZWNrLWEpIDc1JSk7XG4gIGJhY2tncm91bmQtc2l6ZTogMTJweCAxMnB4O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDAsIDZweCA2cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNoZWNrLWIpO1xufVxuXG4uZGlzY0ZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICAvLyBiYWNrZ3JvdW5kIChyZ2JhIG9mIGN1cnJlbnQgY29sb3IsIHNvIHRoZSBjaGVja2VyYm9hcmQgcmVhZHMgdGhyb3VnaFxuICAvLyB3aGVuIGFscGhhIDwgMSkgc2V0IGlubGluZVxufVxuXG4uY3VycmVudEhleCxcbi5jdXJyZW50SGV4SW5wdXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAxO1xuICBmb250LWZhbWlseTogJ1NGIE1vbm8nLCAnSUJNIFBsZXggTW9ubycsICdKZXRCcmFpbnMgTW9ubycsIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDE3cHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHRleHQtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgLy8gY29sb3Igc2V0IGlubGluZSAoY29tcHV0ZWQgZm9yIGNvbnRyYXN0IGFnYWluc3QgdGhlIGN1cnJlbnQgY29sb3IpXG59XG4uY3VycmVudEhleCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogdGV4dDtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGN1YmljLWJlemllcigwLjM0LCAxLjU2LCAwLjY0LCAxKTtcblxuICAmLmNvcGllZCB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA2KTtcbiAgfVxufVxuLmN1cnJlbnRIZXhJbnB1dCB7XG4gIHotaW5kZXg6IDI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMDtcblxuICAmOjpzZWxlY3Rpb24ge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7XG4gIH1cbn1cblxuLy8gYmFkZ2VzIHJlc3RpbmcgaW5sYW5kIG9uIHRoZSBkaXNjLCB0b3AgKGV5ZWRyb3BwZXIpIGFuZCBib3R0b20gKHNhdmUgdG9cbi8vIGZhdm9yaXRlcykgLS0gZGlzY3JlZXQ6IG5lYXItaW52aXNpYmxlIGZpbGwsIGFuZCBpbnN0ZWFkIG9mIGEgZHJhd24tb25cbi8vIGJvcmRlciwgYW4gZW5ncmF2ZWQgZ3Jvb3ZlIChkYXJrIGluc2V0IGxpcCBvbiB0b3AsIGZhaW50IGhpZ2hsaWdodCBvbiB0aGVcbi8vIGJvdHRvbSBlZGdlKSBzbyB0aGV5IHJlYWQgYXMgY2FydmVkIGludG8gdGhlIGRpc2MgcmF0aGVyIHRoYW4gc3R1Y2sgb24gaXRcbi5kaXNjQmFkZ2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAzNHB4O1xuICBoZWlnaHQ6IDM0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiBub25lO1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHotaW5kZXg6IDM7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlLCBmaWx0ZXIgMC4xNXMgZWFzZTtcblxuICAmOmhvdmVyIHtcbiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4xNSk7XG4gIH1cbiAgc3ZnIHtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG4gIH1cbn1cbi5kaXNjQmFkZ2VUb3Age1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSk7XG4gICY6YWN0aXZlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMC45Mik7XG4gIH1cbiAgJi5wdWxzZSB7XG4gICAgYW5pbWF0aW9uOiBiYWRnZVB1bHNlVG9wIDAuNHMgZWFzZTtcbiAgfVxufVxuLmRpc2NCYWRnZUJvdHRvbSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSArIDQ2cHgpKTtcbiAgJjphY3RpdmUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSArIDQ2cHgpKSBzY2FsZSgwLjkyKTtcbiAgfVxufVxuQGtleWZyYW1lcyBiYWRnZVB1bHNlVG9wIHtcbiAgMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMSk7IH1cbiAgNDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDEuMjgpOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMSk7IH1cbn1cbiJdfQ== */","import { useEffect, useRef } from \"react\";\n\nexport interface PointerPos {\n x: number;\n y: number;\n}\n\n/**\n * Wires a press-and-drag gesture onto `ref`: on pointerdown, calls `onMove`\n * immediately with the pointer position, then keeps calling it on every\n * pointermove (tracked via window listeners, so the drag continues even once\n * the pointer leaves the element) until pointerup, when `onEnd` fires once.\n *\n * `onDraggingChange` is optional and only used to let the caller suppress CSS\n * transitions while a drag is in progress (snappy 1:1 tracking instead of an\n * easing lag).\n */\nexport function usePointerDrag(\n ref: React.RefObject<Element | null>,\n onMove: (pos: PointerPos) => void,\n onEnd?: () => void,\n onDraggingChange?: (dragging: boolean) => void\n): void {\n // refs so the effect's event listeners always call the latest callbacks\n // without needing to re-attach on every render\n const onMoveRef = useRef(onMove);\n onMoveRef.current = onMove;\n const onEndRef = useRef(onEnd);\n onEndRef.current = onEnd;\n const onDraggingChangeRef = useRef(onDraggingChange);\n onDraggingChangeRef.current = onDraggingChange;\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n function pointerPos(e: PointerEvent): PointerPos {\n return { x: e.clientX, y: e.clientY };\n }\n\n function move(e: PointerEvent) {\n onMoveRef.current(pointerPos(e));\n }\n\n function up() {\n onDraggingChangeRef.current?.(false);\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n onEndRef.current?.();\n }\n\n function down(e: Event) {\n const pe = e as PointerEvent;\n pe.preventDefault();\n pe.stopPropagation();\n onDraggingChangeRef.current?.(true);\n onMoveRef.current(pointerPos(pe));\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n }\n\n el.addEventListener(\"pointerdown\", down);\n return () => {\n el.removeEventListener(\"pointerdown\", down);\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n };\n }, [ref]);\n}\n","import { useRef } from \"react\";\n\n/**\n * Takes a target angle in degrees (any range, typically re-derived fresh\n * each render from a 0-360 value like hue) and returns a CONTINUOUS angle\n * that always takes the shortest path to it -- so a CSS `transition` on\n * `rotate(${angle}deg)` sweeps a few degrees the short way instead of\n * jumping ~360deg the long way whenever the raw value wraps past 0/360\n * (e.g. hue going from 2deg to 358deg is a 4deg step backward, not a\n * 356deg step forward, but naively re-deriving `358` fresh every render\n * gives the transition no way to know that).\n */\nexport function useUnwrappedAngle(targetDeg: number): number {\n const continuousRef = useRef(targetDeg);\n\n const targetMod = ((targetDeg % 360) + 360) % 360;\n const currentMod = ((continuousRef.current % 360) + 360) % 360;\n let delta = targetMod - currentMod;\n if (delta > 180) delta -= 360;\n else if (delta < -180) delta += 360;\n\n continuousRef.current += delta;\n return continuousRef.current;\n}\n","export function hexToHsl(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [h * 360, s * 100, l * 100];\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return Math.round(255 * (ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)));\n };\n return { r: f(0), g: f(8), b: f(4) };\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rr = r / 255, gg = g / 255, bb = b / 255;\n const max = Math.max(rr, gg, bb);\n const min = Math.min(rr, gg, bb);\n const l = (max + min) / 2;\n let h = 0, s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rr: h = ((gg - bb) / d + (gg < bb ? 6 : 0)) / 6; break;\n case gg: h = ((bb - rr) / d + 2) / 6; break;\n case bb: h = ((rr - gg) / d + 4) / 6; break;\n }\n }\n return [h * 360, s * 100, l * 100];\n}\n\nfunction hslToRgba(h: number, s: number, l: number, alpha: number): string {\n const { r, g, b } = hslToRgb(h, s, l);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport interface AccentTokens {\n base: string;\n dot: string;\n track: string;\n ring: string;\n glow: string;\n light: string;\n}\n\nexport interface ColorValue {\n hex: string;\n hexa: string;\n hsl: string;\n hsla: string;\n rgb: string;\n rgba: string;\n h: number;\n s: number;\n l: number;\n a: number;\n}\n\nexport function buildColorValue(h: number, s: number, l: number, a: number): ColorValue {\n const { r, g, b } = hslToRgb(h, s, l);\n const hex = hslToHex(h, s, l);\n const alphaHex = Math.round(a * 255).toString(16).padStart(2, \"0\");\n const hR = Math.round(h), sR = Math.round(s), lR = Math.round(l);\n const aR = Math.round(a * 100) / 100;\n return {\n hex,\n hexa: `${hex}${alphaHex}`,\n hsl: `hsl(${hR}, ${sR}%, ${lR}%)`,\n hsla: `hsla(${hR}, ${sR}%, ${lR}%, ${aR})`,\n rgb: `rgb(${r}, ${g}, ${b})`,\n rgba: `rgba(${r}, ${g}, ${b}, ${aR})`,\n h, s, l, a,\n };\n}\n\nexport function deriveAccent(hex: string): AccentTokens {\n const [h, s, l] = hexToHsl(hex);\n return {\n base: hex,\n dot: hslToHex(h, s, Math.min(l + 12, 95)),\n track: hex,\n ring: hex,\n glow: hslToRgba(h, s, l, 0.3),\n light: hslToHex(h, Math.max(s - 20, 0), Math.min(l + 45, 96)),\n };\n}\n\nexport function accentToCssVars(\n tokens: AccentTokens,\n prefix: string\n): Record<string, string> {\n return {\n [`--${prefix}-accent`]: tokens.base,\n [`--${prefix}-accent-dot`]: tokens.dot,\n [`--${prefix}-accent-track`]: tokens.track,\n [`--${prefix}-accent-ring`]: tokens.ring,\n [`--${prefix}-accent-glow`]: tokens.glow,\n [`--${prefix}-accent-light`]: tokens.light,\n };\n}\n","// Pure color-space conversions and small numeric helpers. No DOM, no React --\n// safe to unit test in isolation.\n\nexport interface Hsv {\n h: number; // 0-360\n s: number; // 0-100\n v: number; // 0-100\n}\n\nexport interface Rgb {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n}\n\nexport function hsvToRgb(h: number, s: number, v: number): Rgb {\n s /= 100;\n v /= 100;\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n let r: number, g: number, b: number;\n if (h < 60) { r = c; g = x; b = 0; }\n else if (h < 120) { r = x; g = c; b = 0; }\n else if (h < 180) { r = 0; g = c; b = x; }\n else if (h < 240) { r = 0; g = x; b = c; }\n else if (h < 300) { r = x; g = 0; b = c; }\n else { r = c; g = 0; b = x; }\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n}\n\nexport function rgbToHsv(r: number, g: number, b: number): Hsv {\n r /= 255; g /= 255; b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === r) h = ((g - b) / d) % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n const s = max === 0 ? 0 : d / max;\n return { h, s: s * 100, v: max * 100 };\n}\n\nfunction toHexByte(n: number): string {\n const h = Math.max(0, Math.min(255, Math.round(n))).toString(16);\n return h.length === 1 ? \"0\" + h : h;\n}\n\nexport function rgbToHex(c: Rgb): string {\n return (\"#\" + toHexByte(c.r) + toHexByte(c.g) + toHexByte(c.b)).toUpperCase();\n}\n\n/** hsv + alpha (0-1) -> \"#RRGGBB\" or \"#RRGGBBAA\" (alpha channel only appended when < 1) */\nexport function hsvaToHex(hsv: Hsv, a: number): string {\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n let hex = rgbToHex(rgb);\n if (a < 1) hex += toHexByte(Math.round(a * 255));\n return hex;\n}\n\n/** \"#RGB\" / \"#RRGGBB\" / \"#RRGGBBAA\" (with or without leading #) -> hsv + alpha, or null if unparseable */\nexport function hexToHsva(input: string): { hsv: Hsv; a: number } | null {\n let clean = input.trim().replace(/^#/, \"\");\n if (/^[0-9a-fA-F]{3}$/.test(clean)) {\n clean = clean.split(\"\").map((ch) => ch + ch).join(\"\");\n }\n if (!/^[0-9a-fA-F]{6}$/.test(clean) && !/^[0-9a-fA-F]{8}$/.test(clean)) return null;\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const a = clean.length === 8 ? parseInt(clean.slice(6, 8), 16) / 255 : 1;\n return { hsv: rgbToHsv(r, g, b), a };\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\n}\n\nexport function round2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\n/** shortest distance between two angles on a 0-360 circle */\nexport function angleDistance(a: number, b: number): number {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/** relative luminance (0-1), used to pick light/dark text or icon color against a background */\nexport function relativeLuminance(c: Rgb): number {\n return (0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b) / 255;\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport styles from \"./ColorWheel.module.scss\";\nimport { usePointerDrag } from \"./usePointerDrag\";\nimport { useUnwrappedAngle } from \"./useUnwrappedAngle\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\nimport {\n angleDistance,\n clamp,\n hexToHsva,\n hsvToRgb,\n hsvaToHex,\n relativeLuminance,\n rgbToHex,\n round2,\n type Hsv,\n} from \"./colorMath\";\n\nexport type ColorWheelMode = \"h\" | \"s\" | \"v\" | \"a\";\nexport type ColorWheelAlphaMode = \"arc\" | \"ring\";\nexport type ColorWheelTheme = \"light\" | \"dark\" | \"system\";\n\nexport interface ColorWheelProps {\n /** current color, as \"#RRGGBB\" or \"#RRGGBBAA\" */\n value: string;\n /** called with the next hex value on every interaction (drag, wheel, paste, eyedropper, picking a favorite) */\n onChange: (hex: string) => void;\n /** favorite hex swatches, rendered above the ring. Omit to hide the row entirely. */\n favorites?: string[];\n /** called with the full next list when the user saves the current color (the \"+\" badge) -- this component holds no favorites state of its own */\n onFavoritesChange?: (favorites: string[]) => void;\n /** caps how many favorites the \"+\" badge will keep (oldest dropped first). Only enforced on the list this component hands back -- a longer list you pass in is rendered as-is. */\n maxFavorites?: number;\n /**\n * Master switch: is alpha adjustable in the UI at all? true (default):\n * yes, via whichever scheme `alphaMode` picks. false: no alpha UI\n * whatsoever -- no arc, no \"A\" in the ring toggle -- though a translucent\n * `value` passed in is still honored, just not editable.\n */\n showAlphaControl?: boolean;\n /**\n * Only matters when `showAlphaControl` is true. 'arc' (default): a 3-way\n * H/S/V ring, alpha adjusted via the curved arc outside it. 'ring': a\n * 4-way H/S/V/A ring handles alpha itself, and the (now redundant) arc is\n * hidden. Mutually exclusive schemes, not two controls active at once.\n */\n alphaMode?: ColorWheelAlphaMode;\n /** 'system' (default) follows prefers-color-scheme; 'light'/'dark' pins it */\n theme?: ColorWheelTheme;\n /**\n * Uniform scale factor, 1 (default) = the design size (272px ring). Applied\n * as a CSS transform, so all the drag/wheel hit-testing (already measured\n * live via getBoundingClientRect, not hardcoded pixels) keeps working\n * unchanged at any size. Note this does NOT shrink the component's actual\n * DOM footprint to match -- it already visually bleeds past its own box at\n * scale 1 (the ring/arc extend beyond it), so a container you size and\n * position yourself is still expected, same as today.\n */\n size?: number;\n /** custom accent color (hex) -- overrides the global theme's primary color for this instance */\n accent?: string;\n className?: string;\n}\n\nconst RING_SPECTRUM =\n \"conic-gradient(from 180deg, hsl(0 100% 50%) 0%, hsl(60 100% 50%) 16.667%, \" +\n \"hsl(120 100% 50%) 33.333%, hsl(180 100% 50%) 50%, hsl(240 100% 50%) 66.667%, \" +\n \"hsl(300 100% 50%) 83.333%, hsl(360 100% 50%) 100%)\";\n\n// hue ring geometry (272px design size)\nconst RING_INNER_FRAC = 0.3382; // hole radius -- clicks inside go to the disc\nconst RING_OUTER_FRAC = 0.5; // ring's outer edge -- ignore clicks past it\n// mid-band handle radius (0.4191 * 272px stage ≈ 114px) is hardcoded directly\n// in ColorWheel.module.scss (.hueHandle's `top`), since the handle is now\n// positioned via a rotated pivot rather than a computed top/left percentage\n\n// alpha arc geometry (380px design size). Angles use the SAME convention as\n// the hue ring: a \"logical\" angle straight out of atan2(dy,dx), with\n// physical angle-from-top = 90deg + logical angle.\nconst ARC_A0 = 30;\nconst ARC_A1 = 150;\nconst ARC_HANDLE_R_FRAC = 152 / 380;\n\n// .picker's own height -- SCSS can't react to `arcVisible`, so it's set\n// inline instead. With the arc showing, reserve down to its visible crescent\n// (this value is chosen to match the arc's clipped band + handle, empirically\n// -- see the $arcPath comment in ColorWheel.module.scss). With it hidden,\n// shrink back to the ring's own real bottom edge (.stage's `top: -48px` +\n// `height: 272px` in the same file) so a consumer measuring .picker's box\n// (hit-testing, backdrops) doesn't get dead space below the ring.\nconst PICKER_HEIGHT_WITH_ARC = 265;\nconst PICKER_HEIGHT_NO_ARC = 224;\n\nconst MODES_HSV: ColorWheelMode[] = [\"h\", \"s\", \"v\"];\nconst MODES_HSVA: ColorWheelMode[] = [\"h\", \"s\", \"v\", \"a\"];\n\nfunction ringGradient(mode: ColorWheelMode, hsv: Hsv): string {\n if (mode === \"s\") {\n const grey = rgbToHex(hsvToRgb(hsv.h, 0, hsv.v));\n const full = rgbToHex(hsvToRgb(hsv.h, 100, hsv.v));\n return `conic-gradient(from 180deg, ${grey} 0deg, ${full} 360deg)`;\n }\n if (mode === \"v\") {\n const bright = rgbToHex(hsvToRgb(hsv.h, hsv.s, 100));\n return `conic-gradient(from 180deg, #000000 0deg, ${bright} 360deg)`;\n }\n if (mode === \"a\") {\n // true CSS transparency (not a checkerboard) -- whatever sits behind the\n // ring (the ambient glow) shows through, same as the disc's own alpha fill\n const full = rgbToHex(hsvToRgb(hsv.h, hsv.s, hsv.v));\n return `conic-gradient(from 180deg, transparent 0deg, ${full} 360deg)`;\n }\n return RING_SPECTRUM;\n}\n\nconst EMPTY_FAVORITES: string[] = [];\n\nexport function ColorWheel({\n value,\n onChange,\n favorites = EMPTY_FAVORITES,\n onFavoritesChange,\n maxFavorites = 5,\n showAlphaControl = true,\n alphaMode = \"arc\",\n theme = \"system\",\n size = 1,\n accent,\n className,\n}: ColorWheelProps) {\n const ringIsFourWay = showAlphaControl && alphaMode === \"ring\";\n const arcVisible = showAlphaControl && alphaMode === \"arc\";\n const modes = ringIsFourWay ? MODES_HSVA : MODES_HSV;\n const parsed = useMemo(() => hexToHsva(value), [value]);\n const [hsv, setHsv] = useState<Hsv>(() => parsed?.hsv ?? { h: 0, s: 0, v: 100 });\n const [alpha, setAlpha] = useState<number>(() => parsed?.a ?? 1);\n const [mode, setMode] = useState<ColorWheelMode>(\"h\");\n const [dragging, setDragging] = useState(false);\n const [copied, setCopied] = useState(false);\n const [pulseFavorite, setPulseFavorite] = useState(false);\n const [editing, setEditing] = useState(false);\n const [editValue, setEditValue] = useState(\"\");\n const [eyedropperSupported, setEyedropperSupported] = useState(false);\n\n const accentVars = accent ? accentToCssVars(deriveAccent(accent), \"colorwheel\") : {};\n\n // keep internal hsv/alpha in sync when `value` changes from OUTSIDE this\n // component -- but not when the change was our own onChange echoing back\n // through a controlled parent, or every keystroke of a drag would fight\n // the render.\n const lastEmitted = useRef(value);\n useEffect(() => {\n if (value === lastEmitted.current) return;\n const next = hexToHsva(value);\n if (next) {\n setHsv(next.hsv);\n setAlpha(next.a);\n }\n lastEmitted.current = value;\n }, [value]);\n\n useEffect(() => {\n setEyedropperSupported(typeof window !== \"undefined\" && \"EyeDropper\" in window);\n }, []);\n\n // if the props change out from under \"A\" while it happens to be selected\n // (alpha turned off, or switched to the arc scheme), fall back to hue\n // rather than leaving the ring stuck on a mode that no longer exists\n useEffect(() => {\n if (!ringIsFourWay && mode === \"a\") setMode(\"h\");\n }, [ringIsFourWay, mode]);\n\n const stageRef = useRef<HTMLDivElement>(null);\n const alphaArcRef = useRef<HTMLDivElement>(null);\n const modeToggleRef = useRef<HTMLDivElement>(null);\n const hexInputRef = useRef<HTMLInputElement>(null);\n\n function commit(nextHsv: Hsv, nextAlpha: number) {\n setHsv(nextHsv);\n setAlpha(nextAlpha);\n const hex = hsvaToHex(nextHsv, nextAlpha);\n lastEmitted.current = hex;\n onChange(hex);\n }\n\n // ---------------- derived, per-render ----------------\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n const solidHex = rgbToHex(rgb);\n const hexString = hsvaToHex(hsv, alpha);\n const luminance = relativeLuminance(rgb);\n const isLight = luminance > 0.58;\n const discText = isLight ? \"#1A1913\" : \"#FFFFFF\";\n const badgeBg = isLight ? \"rgba(0,0,0,0.02)\" : \"rgba(255,255,255,0.03)\";\n const badgeGrooveDark = isLight ? \"rgba(0,0,0,0.2)\" : \"rgba(0,0,0,0.32)\";\n const badgeGrooveLight = isLight ? \"rgba(255,255,255,0.35)\" : \"rgba(255,255,255,0.12)\";\n const badgeIcon = isLight ? \"rgba(0,0,0,0.72)\" : \"rgba(255,255,255,0.88)\";\n const badgeShadow: CSSProperties = {\n background: badgeBg,\n color: badgeIcon,\n boxShadow: `inset 0 1px 1px ${badgeGrooveDark}, inset 0 -1px 1px ${badgeGrooveLight}`,\n };\n\n // The handle's transform animates a ROTATION (not a top/left position) so\n // that switching mode -- which can jump the angle to the opposite side of\n // the ring -- sweeps along the circumference instead of interpolating a\n // straight line (a chord) through the middle of the ring.\n const ringLogicalAngle =\n mode === \"h\" ? hsv.h : mode === \"a\" ? alpha * 360 : ((mode === \"s\" ? hsv.s : hsv.v) / 100) * 360;\n // hue wraps freely (it's cyclic -- 0deg and 360deg are the same color), but\n // re-deriving it fresh in 0-360 every render means crossing that seam would\n // otherwise animate ~356deg the \"long way\" instead of a few degrees the\n // short way. This smooths it to always take the short path.\n const ringAngleFromTopDeg = useUnwrappedAngle(180 + ringLogicalAngle);\n\n // pixel offsets from the shared anchor point (NOT a percentage of the\n // handle's own containing block -- .alphaArcHandle is a sibling of\n // .alphaArc, anchored the same way the mode toggle is, not sized to the\n // arc's 380px coordinate space)\n const arcLogicalAngle = ARC_A1 - alpha * (ARC_A1 - ARC_A0);\n const arcAngleFromTop = (90 + arcLogicalAngle) * (Math.PI / 180);\n const arcHandleR = ARC_HANDLE_R_FRAC * 380;\n const arcHandleDx = arcHandleR * Math.sin(arcAngleFromTop);\n const arcHandleDy = -arcHandleR * Math.cos(arcAngleFromTop);\n\n // ---------------- ring: drag + wheel ----------------\n function applyRingAngle(angle: number) {\n if (mode === \"h\") commit({ ...hsv, h: angle }, alpha);\n else if (mode === \"s\") commit({ ...hsv, s: (angle / 360) * 100 }, alpha);\n else if (mode === \"a\") commit(hsv, angle / 360);\n else commit({ ...hsv, v: (angle / 360) * 100 }, alpha);\n }\n\n // Hue wraps freely when dragged all the way around (0deg and 360deg are the\n // same color, so there's nothing to \"stop\" at). S/V/A are linear 0-100%\n // quantities with real endpoints, though -- dragging past the seam should\n // pin at 0%/100%, not wrap to the other end. Since a single pointer sample\n // only gives a raw 0-360deg reading (angle wraps are indistinguishable from\n // \"moved to the far side\"), these two refs track the PREVIOUS sample and an\n // unclamped running total for the current gesture, so each step is read as\n // a small delta (shortest-path) rather than an absolute position -- and\n // that running total is what gets clamped, not the raw angle.\n const dragPrevAngleRef = useRef<number | null>(null);\n const dragAccumRef = useRef(0);\n\n usePointerDrag(\n stageRef,\n (pos) => {\n const rect = stageRef.current!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dx = pos.x - cx;\n const dy = pos.y - cy;\n const dist = Math.hypot(dx, dy);\n if (dist < rect.width * RING_INNER_FRAC || dist > rect.width * RING_OUTER_FRAC) return;\n // inverse of the render-time mapping (physical angle = 180deg + logical\n // angle): atan2 gives (physical - 90), so subtract another 90 to undo it\n let angle = Math.atan2(dy, dx) * (180 / Math.PI) - 90;\n angle = ((angle % 360) + 360) % 360;\n\n if (mode === \"h\") {\n applyRingAngle(angle);\n return;\n }\n\n if (dragPrevAngleRef.current === null) {\n dragAccumRef.current = angle;\n } else {\n let delta = angle - dragPrevAngleRef.current;\n if (delta > 180) delta -= 360;\n else if (delta < -180) delta += 360;\n dragAccumRef.current = clamp(dragAccumRef.current + delta, 0, 360);\n }\n dragPrevAngleRef.current = angle;\n applyRingAngle(dragAccumRef.current);\n },\n undefined,\n (dragging) => {\n if (!dragging) dragPrevAngleRef.current = null;\n setDragging(dragging);\n }\n );\n\n useEffect(() => {\n const el = stageRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n const rect = el!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dist = Math.hypot(e.clientX - cx, e.clientY - cy);\n if (dist < rect.width * RING_INNER_FRAC || dist > rect.width * RING_OUTER_FRAC) return;\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n if (mode === \"h\") commit({ ...hsv, h: (hsv.h + dir * 4 + 360) % 360 }, alpha);\n else if (mode === \"s\") commit({ ...hsv, s: clamp(hsv.s + dir * 3, 0, 100) }, alpha);\n else if (mode === \"a\") commit(hsv, clamp(round2(alpha + dir * 0.03), 0, 1));\n else commit({ ...hsv, v: clamp(hsv.v + dir * 3, 0, 100) }, alpha);\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [mode, hsv, alpha]);\n\n // ---------------- alpha arc: drag + wheel ----------------\n usePointerDrag(\n alphaArcRef,\n (pos) => {\n const rect = alphaArcRef.current!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n let angle = Math.atan2(pos.y - cy, pos.x - cx) * (180 / Math.PI);\n if (angle < 0) angle += 360;\n if (angle < ARC_A0 || angle > ARC_A1) {\n angle = angleDistance(angle, ARC_A0) < angleDistance(angle, ARC_A1) ? ARC_A0 : ARC_A1;\n }\n commit(hsv, round2((ARC_A1 - angle) / (ARC_A1 - ARC_A0)));\n },\n undefined,\n setDragging\n );\n\n useEffect(() => {\n const el = alphaArcRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n commit(hsv, clamp(round2(alpha + dir * 0.05), 0, 1));\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [hsv, alpha]);\n\n // ---------------- mode toggle ----------------\n useEffect(() => {\n const el = modeToggleRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const idx = modes.indexOf(mode);\n const dir = e.deltaY > 0 ? -1 : 1;\n setMode(modes[clamp(idx + dir, 0, modes.length - 1)]);\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [mode, modes]);\n\n // ---------------- disc: copy on click, edit on click of the hex text ----------------\n function handleDiscClick() {\n const done = () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 900);\n };\n if (navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(hexString).then(done, done);\n } else {\n done();\n }\n }\n\n function beginEdit(e: React.MouseEvent) {\n e.stopPropagation();\n setEditValue(hexString);\n setEditing(true);\n requestAnimationFrame(() => {\n hexInputRef.current?.focus();\n hexInputRef.current?.setSelectionRange(1, hexString.length);\n });\n }\n\n function commitEdit(cancelled: boolean) {\n if (!cancelled) {\n const next = hexToHsva(editValue);\n if (next) commit(next.hsv, next.a);\n }\n setEditing(false);\n }\n\n // ---------------- eyedropper ----------------\n function pickFromScreen() {\n // @ts-expect-error -- EyeDropper isn't in lib.dom.d.ts yet\n const dropper = new window.EyeDropper();\n dropper\n .open()\n .then((result: { sRGBHex: string }) => {\n const next = hexToHsva(result.sRGBHex);\n if (next) commit(next.hsv, next.a);\n })\n .catch(() => {});\n }\n\n // ---------------- favorites ----------------\n function saveFavorite() {\n const next = [hexString, ...favorites.filter((h) => h !== hexString)].slice(0, maxFavorites);\n onFavoritesChange?.(next);\n setPulseFavorite(false);\n requestAnimationFrame(() => setPulseFavorite(true));\n }\n\n function applyFavorite(hex: string) {\n const next = hexToHsva(hex);\n if (next) commit(next.hsv, next.a);\n }\n\n function removeFavorite(hex: string) {\n onFavoritesChange?.(favorites.filter((h) => h !== hex));\n }\n\n return (\n <div\n className={[styles.root, className].filter(Boolean).join(\" \")}\n data-theme={theme === \"system\" ? undefined : theme}\n data-dragging={dragging ? \"true\" : undefined}\n style={{\n ...accentVars,\n ...(size !== 1 ? { transform: `scale(${size})`, transformOrigin: \"top center\" } : undefined),\n } as React.CSSProperties}\n >\n {favorites.length > 0 && (\n <div className={styles.recents}>\n {favorites.map((hex, i) => (\n <div key={hex + i} className={styles.chipWrap} style={{ animationDelay: `${i * 0.02}s` }}>\n <button\n type=\"button\"\n className={styles.chip}\n style={{ background: hex.length > 7 ? hex.slice(0, 7) : hex }}\n title={hex}\n aria-label={`Apply color ${hex}`}\n onClick={() => applyFavorite(hex)}\n />\n <button\n type=\"button\"\n className={styles.chipRemove}\n aria-label={`Remove ${hex} from favorites`}\n onClick={(e) => {\n e.stopPropagation();\n removeFavorite(hex);\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={3} strokeLinecap=\"round\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.picker} style={{ height: arcVisible ? PICKER_HEIGHT_WITH_ARC : PICKER_HEIGHT_NO_ARC }}>\n <div\n className={styles.glow}\n style={{ background: `radial-gradient(closest-side, ${solidHex}, transparent 72%)` }}\n />\n\n <div\n className={styles.modeToggle}\n ref={modeToggleRef}\n style={{ width: modes.length * 28, gridTemplateColumns: `repeat(${modes.length}, 1fr)` }}\n >\n <div\n className={styles.modePill}\n style={{\n width: `calc(${100 / modes.length}% - 2px)`,\n transform: `translateX(calc(${modes.indexOf(mode)} * (100% + 1px)))`,\n }}\n />\n {modes.map((m) => (\n <button\n key={m}\n type=\"button\"\n className={[styles.modeButton, mode === m ? styles.active : \"\"].join(\" \")}\n onClick={() => setMode(m)}\n >\n {m.toUpperCase()}\n </button>\n ))}\n </div>\n\n <div className={styles.stage} ref={stageRef}>\n <div className={styles.stageShadow} />\n <div className={styles.ring} style={{ background: ringGradient(mode, hsv) }} />\n\n <div className={styles.currentDisc} onClick={handleDiscClick}>\n <div className={styles.discFill} style={{ background: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})` }} />\n {!editing && (\n <span className={[styles.currentHex, copied ? styles.copied : \"\"].join(\" \")} style={{ color: discText }} onClick={beginEdit}>\n {copied ? \"Copied\" : hexString}\n </span>\n )}\n {editing && (\n <input\n ref={hexInputRef}\n className={styles.currentHexInput}\n style={{ color: discText }}\n type=\"text\"\n inputMode=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={9}\n value={editValue}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") hexInputRef.current?.blur();\n else if (e.key === \"Escape\") {\n commitEdit(true);\n }\n }}\n onBlur={() => commitEdit(false)}\n />\n )}\n </div>\n\n {eyedropperSupported && (\n <button\n type=\"button\"\n className={[styles.discBadge, styles.discBadgeBottom].join(\" \")}\n style={badgeShadow}\n aria-label=\"Pick color from screen\"\n onClick={pickFromScreen}\n >\n <svg viewBox=\"0 0 32 32\" fill=\"currentColor\">\n <path d=\"M27.7,3.3c-1.5-1.5-3.9-1.5-5.4,0L17,8.6l-1.3-1.3c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l1.3,1.3L5,20.6c-0.6,0.6-1,1.4-1.1,2.3C3.3,23.4,3,24.2,3,25c0,1.7,1.3,3,3,3c0.8,0,1.6-0.3,2.2-0.9C9,27,9.8,26.6,10.4,26L21,15.4l1.3,1.3c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3c0.4-0.4,0.4-1,0-1.4L22.4,14l5.3-5.3C29.2,7.2,29.2,4.8,27.7,3.3z M9,24.6c-0.4,0.4-0.8,0.6-1.3,0.5c-0.4,0-0.7,0.2-0.9,0.5C6.7,25.8,6.3,26,6,26c-0.6,0-1-0.4-1-1c0-0.3,0.2-0.7,0.5-0.8c0.3-0.2,0.5-0.5,0.5-0.9c0-0.5,0.2-1,0.5-1.3L17,11.4l2.6,2.6L9,24.6z\" />\n </svg>\n </button>\n )}\n <button\n type=\"button\"\n className={[styles.discBadge, styles.discBadgeTop, pulseFavorite ? styles.pulse : \"\"].join(\" \")}\n style={badgeShadow}\n aria-label=\"Save current color to favorites\"\n onClick={saveFavorite}\n onAnimationEnd={() => setPulseFavorite(false)}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n\n <div className={styles.hueHandlePivot} style={{ transform: `translate(-50%, -50%) rotate(${ringAngleFromTopDeg}deg)` }}>\n <div className={styles.hueHandle} style={{ background: solidHex }} />\n </div>\n </div>\n\n {/* Two mutually exclusive schemes: 3-way ring (H/S/V) + this arc\n handles alpha, OR 4-way ring (H/S/V/A) handles all four and the\n arc is redundant -- not \"hide only while mode is literally A\".\n Kept mounted (never conditionally unmounted) even when hidden --\n the drag/wheel listeners are attached to these DOM nodes directly,\n and unmounting+remounting would silently drop them since the\n effects that attach them don't depend on the element re-mounting.\n display:none/contents just toggles visibility + interactivity. */}\n <div style={{ display: arcVisible ? \"contents\" : \"none\" }}>\n <div className={styles.alphaArcShadowWrap}>\n <div className={styles.alphaArcShadow} />\n </div>\n <div className={styles.alphaArc} ref={alphaArcRef}>\n <div\n className={styles.alphaArcFill}\n style={{ background: `conic-gradient(from 90deg, ${solidHex} 30deg, transparent 150deg)` }}\n />\n </div>\n <div className={[styles.alphaArcCap, styles.alphaArcCapStart].join(\" \")} style={{ background: solidHex }} />\n <div className={[styles.alphaArcCap, styles.alphaArcCapEnd].join(\" \")} />\n <div\n className={styles.alphaArcHandle}\n style={{\n transform: `translate(calc(-50% + ${arcHandleDx}px), calc(-50% + ${arcHandleDy}px))`,\n background: solidHex,\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../../src/components/ColorWheel/ColorWheel.module.scss","../../../src/components/ColorWheel/usePointerDrag.ts","../../../src/components/ColorWheel/useUnwrappedAngle.ts","../../../src/utils/color.ts","../../../src/components/ColorWheel/colorMath.ts","../../../src/components/ColorWheel/ColorWheel.tsx"],"names":["root","recents","recentsEmpty","chipWrap","chipWrapRemoving","chip","chipRemove","picker","glow","modeToggle","modePill","modeButton","active","stage","stageShadow","ring","hueHandlePivot","hueHandle","alphaArcShadowWrap","alphaArcShadow","alphaArc","alphaArcFill","alphaArcCap","alphaArcCapStart","alphaArcCapEnd","alphaArcHandle","currentDisc","discFill","currentHex","currentHexInput","copied","discBadge","discBadgeTop","pulse","discBadgeBottom","useRef","useEffect","useMemo","useState","dragging","jsxs","jsx"],"mappings":";;;;;;;;AAAA,IAAA,yBAAA,GAAA;AAAA,EAAC,IAAA,EAAAA,yBAAAA;AAAA,EAgGA,OAAA,EAAAC,4BAAAA;AAAA,EAYA,YAAA,EAAAC,iCAAAA;AAAA,EAKA,QAAA,EAAAC,6BAAAA;AAAA,EAMA,gBAAA,EAAAC,qCAAAA;AAAA,EAKA,IAAA,EAAAC,yBAAAA;AAAA,EAmBA,UAAA,EAAAC,+BAAAA;AAAA,EAsDA,MAAA,EAAAC,2BAAAA;AAAA,EAMA,IAAA,EAAAC,yBAAAA;AAAA,EAaA,UAAA,EAAAC,+BAAAA;AAAA,EAaA,QAAA,EAAAC,6BAAAA;AAAA,EAWA,UAAA,EAAAC,+BAAAA;AAAA,EAkBW,MAAA,EAAAC,2BAAAA;AAAA,EAOX,KAAA,EAAAC,0BAAAA;AAAA,EAUA,WAAA,EAAAC,gCAAAA;AAAA,EAQA,IAAA,EAAAC,yBAAAA;AAAA,EAUA,cAAA,EAAAC,mCAAAA;AAAA,EAcA,SAAA,EAAAC,8BAAAA;AAAA,EAcA,kBAAA,EAAAC,uCAAAA;AAAA,EAYA,cAAA,EAAAC,mCAAAA;AAAA,EAOA,QAAA,EAAAC,6BAAAA;AAAA,EAcA,YAAA,EAAAC,iCAAAA;AAAA,EAKA,WAAA,EAAAC,gCAAAA;AAAA,EAYA,gBAAA,EAAAC,qCAAAA;AAAA,EAIA,cAAA,EAAAC,mCAAAA;AAAA,EAIA,cAAA,EAAAC,mCAAAA;AAAA,EAkBA,WAAA,EAAAC,gCAAAA;AAAA,EAkBA,QAAA,EAAAC,6BAAAA;AAAA,EAKA,UAAA,EAAAC,+BAAAA;AAAA,EACA,eAAA,EAAAC,oCAAAA;AAAA,EAkBW,MAAA,EAAAC,2BAAAA;AAAA,EAkBX,SAAA,EAAAC,8BAAAA;AAAA,EAsBA,YAAA,EAAAC,iCAAAA;AAAA,EAMa,KAAA,EAAAC,0BAAAA;AAAA,EAIb,eAAA,EAAAC;AAAA,CAAA;ACxdM,SAAS,cAAA,CACd,GAAA,EACA,MAAA,EACA,KAAA,EACA,gBAAA,EACM;AAGN,EAAA,MAAM,SAAA,GAAYC,aAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,MAAM,QAAA,GAAWA,aAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,EAAA,MAAM,mBAAA,GAAsBA,aAAO,gBAAgB,CAAA;AACnD,EAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAE9B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,SAAS,WAAW,CAAA,EAA6B;AAC/C,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IACtC;AAEA,IAAA,SAAS,KAAK,CAAA,EAAiB;AAC7B,MAAA,SAAA,CAAU,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IACjC;AAEA,IAAA,SAAS,EAAA,GAAK;AACZ,MAAA,mBAAA,CAAoB,UAAU,KAAK,CAAA;AACnC,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,IAAI,CAAA;AAC9C,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,EAAE,CAAA;AAC1C,MAAA,QAAA,CAAS,OAAA,IAAU;AAAA,IACrB;AAEA,IAAA,SAAS,KAAK,CAAA,EAAU;AACtB,MAAA,MAAM,EAAA,GAAK,CAAA;AACX,MAAA,EAAA,CAAG,cAAA,EAAe;AAClB,MAAA,EAAA,CAAG,eAAA,EAAgB;AACnB,MAAA,mBAAA,CAAoB,UAAU,IAAI,CAAA;AAClC,MAAA,SAAA,CAAU,OAAA,CAAQ,UAAA,CAAW,EAAE,CAAC,CAAA;AAChC,MAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,IAAI,CAAA;AAC3C,MAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,EAAE,CAAA;AAAA,IACzC;AAEA,IAAA,EAAA,CAAG,gBAAA,CAAiB,eAAe,IAAI,CAAA;AACvC,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,eAAe,IAAI,CAAA;AAC1C,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,IAAI,CAAA;AAC9C,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,EAAE,CAAA;AAAA,IAC5C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACV;ACxDO,SAAS,kBAAkB,SAAA,EAA2B;AAC3D,EAAA,MAAM,aAAA,GAAgBD,aAAO,SAAS,CAAA;AAEtC,EAAA,MAAM,SAAA,GAAA,CAAc,SAAA,GAAY,GAAA,GAAO,GAAA,IAAO,GAAA;AAC9C,EAAA,MAAM,UAAA,GAAA,CAAe,aAAA,CAAc,OAAA,GAAU,GAAA,GAAO,GAAA,IAAO,GAAA;AAC3D,EAAA,IAAI,QAAQ,SAAA,GAAY,UAAA;AACxB,EAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,GAAA;AAAA,OAAA,IACjB,KAAA,GAAQ,MAAM,KAAA,IAAS,GAAA;AAEhC,EAAA,aAAA,CAAc,OAAA,IAAW,KAAA;AACzB,EAAA,OAAO,aAAA,CAAc,OAAA;AACvB;;;ACvBO,SAAS,SAAS,GAAA,EAAuC;AAC9D,EAAA,MAAM,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAE1C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAA,CAAK,MAAM,GAAA,IAAO,CAAA;AACxB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,IAAA,CAAA,GAAI,IAAI,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,GAAM,GAAA,CAAA,GAAO,KAAK,GAAA,GAAM,GAAA,CAAA;AAC/C,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,CAAA;AAAG,QAAA,CAAA,GAAA,CAAA,CAAM,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,CAAA,IAAM,CAAA;AAAG,QAAA;AAAA,MACjD,KAAK,CAAA;AAAG,QAAA,CAAA,GAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AAAG,QAAA;AAAA,MACnC,KAAK,CAAA;AAAG,QAAA,CAAA,GAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA;AAAG,QAAA;AAAA;AACrC,EACF;AAEA,EAAA,OAAO,CAAC,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,GAAA,EAAK,IAAI,GAAG,CAAA;AACnC;AAEO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAChE,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAc;AACvB,IAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,GAAI,EAAA,IAAM,EAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAK,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAAA,EAC7D,CAAA;AACA,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA;AAC/B;AAEO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgD;AAC7F,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,KAAK,CAAA,GAAI,GAAA;AACf,EAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAClC,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAc;AACvB,IAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,GAAI,EAAA,IAAM,EAAA;AACzB,IAAA,OAAO,KAAK,KAAA,CAAM,GAAA,IAAO,EAAA,GAAK,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA,CAAE,CAAA;AAAA,EAC5E,CAAA;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AACrC;AAoBA,SAAS,SAAA,CAAU,CAAA,EAAW,CAAA,EAAW,CAAA,EAAW,KAAA,EAAuB;AACzE,EAAA,MAAM,EAAE,GAAG,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,EAAA,OAAO,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AACxC;AAyCO,SAAS,aAAa,GAAA,EAA2B;AACtD,EAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,GAAG,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,GAAA;AAAA,IACP,GAAA,EAAO,SAAS,CAAA,EAAG,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,GAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IAC1C,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAO,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,IAC7B,KAAA,EAAO,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA,EAAI,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,EAAA,EAAI,EAAE,CAAC;AAAA,GAC9D;AACF;AAEO,SAAS,eAAA,CACd,QACA,MAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,OAAA,CAAS,GAAS,MAAA,CAAO,IAAA;AAAA,IACrC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,WAAA,CAAa,GAAK,MAAA,CAAO,GAAA;AAAA,IACrC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,aAAA,CAAe,GAAG,MAAA,CAAO,KAAA;AAAA,IACrC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,YAAA,CAAc,GAAI,MAAA,CAAO,IAAA;AAAA,IACrC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,YAAA,CAAc,GAAI,MAAA,CAAO,IAAA;AAAA,IACrC,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,aAAA,CAAe,GAAG,MAAA,CAAO;AAAA,GACvC;AACF;;;ACtHO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgB;AAC7D,EAAA,CAAA,IAAK,GAAA;AACL,EAAA,CAAA,IAAK,GAAA;AACL,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,CAAA,GAAI,KAAK,CAAA,GAAI,IAAA,CAAK,IAAM,CAAA,GAAI,EAAA,GAAM,IAAK,CAAC,CAAA,CAAA;AAC9C,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,IAAI,GAAW,CAAA,EAAW,CAAA;AAC1B,EAAA,IAAI,IAAI,EAAA,EAAI;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAC1B,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAChC,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAChC,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MAAA,IAChC,IAAI,GAAA,EAAK;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG,CAAA,MACpC;AAAE,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAG,IAAA,CAAA,GAAI,CAAA;AAAA,EAAG;AAC5B,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,KAAK,GAAG,CAAA;AAAA,IAC3B,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,KAAK,GAAG,CAAA;AAAA,IAC3B,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,GAAI,KAAK,GAAG;AAAA,GAC7B;AACF;AAEO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,CAAA,EAAgB;AAC7D,EAAA,CAAA,IAAK,GAAA;AAAK,EAAA,CAAA,IAAK,GAAA;AAAK,EAAA,CAAA,IAAK,GAAA;AACzB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,IAAI,GAAA,GAAM,GAAA;AAChB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,IAAI,GAAA,KAAQ,CAAA,EAAG,CAAA,GAAA,CAAM,CAAA,GAAI,KAAK,CAAA,GAAK,CAAA;AAAA,SAAA,IAC1B,GAAA,KAAQ,CAAA,EAAG,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAAA,SACjC,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA;AACvB,IAAA,CAAA,IAAK,EAAA;AACL,IAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,GAAA;AAAA,EAClB;AACA,EAAA,MAAM,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAA;AAC9B,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,IAAI,GAAA,EAAK,CAAA,EAAG,MAAM,GAAA,EAAI;AACvC;AAEA,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAE,SAAS,EAAE,CAAA;AAC/D,EAAA,OAAO,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA;AACpC;AAEO,SAAS,SAAS,CAAA,EAAgB;AACvC,EAAA,OAAA,CAAQ,GAAA,GAAM,SAAA,CAAU,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,CAAC,GAAG,WAAA,EAAY;AAC9E;AAGO,SAAS,SAAA,CAAU,KAAU,CAAA,EAAmB;AACrD,EAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACxC,EAAA,IAAI,GAAA,GAAM,SAAS,GAAG,CAAA;AACtB,EAAA,IAAI,CAAA,GAAI,GAAG,GAAA,IAAO,SAAA,CAAU,KAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC/C,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,UAAU,KAAA,EAA+C;AACvE,EAAA,IAAI,QAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AACzC,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,IAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,GAAK,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,CAAC,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,IAAA;AAC/E,EAAA,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACxC,EAAA,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACxC,EAAA,MAAM,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA,GAAM,CAAA;AACvE,EAAA,OAAO,EAAE,GAAA,EAAK,QAAA,CAAS,GAAG,CAAA,EAAG,CAAC,GAAG,CAAA,EAAE;AACrC;AAEO,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AACjE,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACvC;AAEO,SAAS,OAAO,CAAA,EAAmB;AACxC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;AAGO,SAAS,aAAA,CAAc,GAAW,CAAA,EAAmB;AAC1D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA;AAC5B,EAAA,OAAO,CAAA,GAAI,GAAA,GAAM,GAAA,GAAM,CAAA,GAAI,CAAA;AAC7B;AAGO,SAAS,kBAAkB,CAAA,EAAgB;AAChD,EAAA,OAAA,CAAQ,MAAA,GAAS,EAAE,CAAA,GAAI,MAAA,GAAS,EAAE,CAAA,GAAI,MAAA,GAAS,EAAE,CAAA,IAAK,GAAA;AACxD;ACpCA,IAAM,aAAA,GACJ,2MAAA;AAKF,IAAM,eAAA,GAAkB,MAAA;AACxB,IAAM,eAAA,GAAkB,GAAA;AAQxB,IAAM,MAAA,GAAS,EAAA;AACf,IAAM,MAAA,GAAS,GAAA;AACf,IAAM,oBAAoB,GAAA,GAAM,GAAA;AAShC,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,oBAAA,GAAuB,GAAA;AAK7B,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,QAAA,GAAW,CAAA;AACjB,SAAS,oBAAoB,SAAA,EAA2B;AACtD,EAAA,OAAO,YAAY,CAAA,GAAI,SAAA,GAAY,SAAA,GAAA,CAAa,SAAA,GAAY,KAAK,QAAA,GAAW,CAAA;AAC9E;AAEA,IAAM,SAAA,GAA8B,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAClD,IAAM,UAAA,GAA+B,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAExD,SAAS,YAAA,CAAa,MAAsB,GAAA,EAAkB;AAC5D,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,MAAM,IAAA,GAAO,SAAS,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,SAAS,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,EAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AACjD,IAAA,OAAO,CAAA,4BAAA,EAA+B,IAAI,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,MAAM,MAAA,GAAS,SAAS,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AACnD,IAAA,OAAO,6CAA6C,MAAM,CAAA,QAAA,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,SAAS,GAAA,EAAK;AAGhB,IAAA,MAAM,IAAA,GAAO,SAAS,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AACnD,IAAA,OAAO,iDAAiD,IAAI,CAAA,QAAA,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,aAAA;AACT;AAEA,IAAM,kBAA4B,EAAC;AAE5B,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,eAAA;AAAA,EACZ,iBAAA;AAAA,EACA,YAAA,GAAe,CAAA;AAAA,EACf,gBAAA,GAAmB,IAAA;AAAA,EACnB,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ,QAAA;AAAA,EACR,IAAA,GAAO,CAAA;AAAA,EACP,MAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,aAAA,GAAgB,oBAAoB,SAAA,KAAc,MAAA;AACxD,EAAA,MAAM,UAAA,GAAa,oBAAoB,SAAA,KAAc,KAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,gBAAgB,UAAA,GAAa,SAAA;AAC3C,EAAA,MAAM,MAAA,GAASE,cAAQ,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIC,eAAc,MAAM,MAAA,EAAQ,GAAA,IAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAC/E,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAIA,eAAiB,MAAM,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC/D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAyB,GAAG,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAIpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,IAAIA,cAAA,iBAAsB,IAAI,KAAK,CAAA;AAKzE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,cAAA,GAAiBH,aAAO,CAAC,CAAA;AAC/B,EAAAC,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,GAAU,sBAAsB,MAAM;AACnD,MAAA,cAAA,CAAe,OAAA,GAAU,qBAAA,CAAsB,MAAM,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,IAC5E,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,oBAAA,CAAqB,cAAA,CAAe,OAAO,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,SAAS,eAAA,CAAgB,YAAA,CAAa,MAAM,CAAA,EAAG,YAAY,IAAI,EAAC;AAMnF,EAAA,MAAM,WAAA,GAAcD,aAAO,KAAK,CAAA;AAChC,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,KAAA,KAAU,YAAY,OAAA,EAAS;AACnC,IAAA,MAAM,IAAA,GAAO,UAAU,KAAK,CAAA;AAC5B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,MAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACjB;AACA,IAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AAAA,EACxB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAAA,gBAAU,MAAM;AACd,IAAA,sBAAA,CAAuB,OAAO,MAAA,KAAW,WAAA,IAAe,YAAA,IAAgB,MAAM,CAAA;AAAA,EAChF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,IAAiB,IAAA,KAAS,GAAA,UAAa,GAAG,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,aAAA,EAAe,IAAI,CAAC,CAAA;AAExB,EAAA,MAAM,QAAA,GAAWD,aAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAcA,aAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgBA,aAAuB,IAAI,CAAA;AACjD,EAAA,MAAM,WAAA,GAAcA,aAAyB,IAAI,CAAA;AAEjD,EAAA,SAAS,MAAA,CAAO,SAAc,SAAA,EAAmB;AAC/C,IAAA,MAAA,CAAO,OAAO,CAAA;AACd,IAAA,QAAA,CAAS,SAAS,CAAA;AAClB,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,OAAA,EAAS,SAAS,CAAA;AACxC,IAAA,WAAA,CAAY,OAAA,GAAU,GAAA;AACtB,IAAA,QAAA,CAAS,GAAG,CAAA;AAAA,EACd;AAGA,EAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,GAAG,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,SAAS,GAAG,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,kBAAkB,GAAG,CAAA;AACvC,EAAA,MAAM,UAAU,SAAA,GAAY,IAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,UAAU,SAAA,GAAY,SAAA;AACvC,EAAA,MAAM,OAAA,GAAU,UAAU,kBAAA,GAAqB,wBAAA;AAC/C,EAAA,MAAM,eAAA,GAAkB,UAAU,iBAAA,GAAoB,kBAAA;AACtD,EAAA,MAAM,gBAAA,GAAmB,UAAU,wBAAA,GAA2B,wBAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,UAAU,kBAAA,GAAqB,wBAAA;AACjD,EAAA,MAAM,WAAA,GAA6B;AAAA,IACjC,UAAA,EAAY,OAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,CAAA,gBAAA,EAAmB,eAAe,CAAA,mBAAA,EAAsB,gBAAgB,CAAA;AAAA,GACrF;AAMA,EAAA,MAAM,gBAAA,GACJ,IAAA,KAAS,GAAA,GAAM,GAAA,CAAI,IAAI,IAAA,KAAS,GAAA,GAAM,KAAA,GAAQ,GAAA,GAAA,CAAQ,SAAS,GAAA,GAAM,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,KAAK,GAAA,GAAO,GAAA;AAK/F,EAAA,MAAM,mBAAA,GAAsB,iBAAA,CAAkB,GAAA,GAAM,gBAAgB,CAAA;AAMpE,EAAA,MAAM,eAAA,GAAkB,MAAA,GAAS,KAAA,IAAS,MAAA,GAAS,MAAA,CAAA;AACnD,EAAA,MAAM,eAAA,GAAA,CAAmB,EAAA,GAAK,eAAA,KAAoB,IAAA,CAAK,EAAA,GAAK,GAAA,CAAA;AAC5D,EAAA,MAAM,aAAa,iBAAA,GAAoB,GAAA;AACvC,EAAA,MAAM,WAAA,GAAc,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AACzD,EAAA,MAAM,WAAA,GAAc,CAAC,UAAA,GAAa,IAAA,CAAK,IAAI,eAAe,CAAA;AAG1D,EAAA,SAAS,eAAe,KAAA,EAAe;AACrC,IAAA,IAAI,IAAA,KAAS,KAAK,MAAA,CAAO,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,KAAA,EAAM,EAAG,KAAK,CAAA;AAAA,SAAA,IAC3C,IAAA,KAAS,GAAA,EAAK,MAAA,CAAO,EAAE,GAAG,GAAA,EAAK,CAAA,EAAI,KAAA,GAAQ,GAAA,GAAO,GAAA,EAAI,EAAG,KAAK,CAAA;AAAA,SAAA,IAC9D,IAAA,KAAS,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,QAAQ,GAAG,CAAA;AAAA,SACzC,MAAA,CAAO,EAAE,GAAG,GAAA,EAAK,GAAI,KAAA,GAAQ,GAAA,GAAO,GAAA,EAAI,EAAG,KAAK,CAAA;AAAA,EACvD;AAWA,EAAA,MAAM,gBAAA,GAAmBA,aAAsB,IAAI,CAAA;AACnD,EAAA,MAAM,YAAA,GAAeA,aAAO,CAAC,CAAA;AAE7B,EAAA,cAAA;AAAA,IACE,QAAA;AAAA,IACA,CAAC,GAAA,KAAQ;AACP,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAS,qBAAA,EAAsB;AACrD,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA;AACpC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AACpC,MAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA;AACnB,MAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC9B,MAAA,IAAI,OAAO,IAAA,CAAK,KAAA,GAAQ,mBAAmB,IAAA,GAAO,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAGhF,MAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,GAAA,GAAM,KAAK,EAAA,CAAA,GAAM,EAAA;AACnD,MAAA,KAAA,GAAA,CAAU,KAAA,GAAQ,MAAO,GAAA,IAAO,GAAA;AAEhC,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,gBAAA,CAAiB,YAAY,IAAA,EAAM;AACrC,QAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,IAAI,KAAA,GAAQ,QAAQ,gBAAA,CAAiB,OAAA;AACrC,QAAA,IAAI,KAAA,GAAQ,KAAK,KAAA,IAAS,GAAA;AAAA,aAAA,IACjB,KAAA,GAAQ,MAAM,KAAA,IAAS,GAAA;AAChC,QAAA,YAAA,CAAa,UAAU,KAAA,CAAM,YAAA,CAAa,OAAA,GAAU,KAAA,EAAO,GAAG,GAAG,CAAA;AAAA,MACnE;AACA,MAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,MAAA,cAAA,CAAe,aAAa,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,MAAA;AAAA,IACA,CAACI,SAAAA,KAAa;AACZ,MAAA,IAAI,CAACA,SAAAA,EAAU,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC1C,MAAA,WAAA,CAAYA,SAAQ,CAAA;AAAA,IACtB;AAAA,GACF;AAEA,EAAAH,gBAAU,MAAM;AACd,IAAA,MAAM,KAAK,QAAA,CAAS,OAAA;AACpB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,SAAS,QAAQ,CAAA,EAAe;AAC9B,MAAA,MAAM,IAAA,GAAO,GAAI,qBAAA,EAAsB;AACvC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA;AACpC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,CAAA,CAAE,UAAU,EAAA,EAAI,CAAA,CAAE,UAAU,EAAE,CAAA;AACtD,MAAA,IAAI,OAAO,IAAA,CAAK,KAAA,GAAQ,mBAAmB,IAAA,GAAO,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAChF,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAA,GAAK,CAAA;AAChC,MAAA,IAAI,IAAA,KAAS,GAAA,EAAK,MAAA,CAAO,EAAE,GAAG,GAAA,EAAK,CAAA,EAAA,CAAI,GAAA,CAAI,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,IAAO,GAAA,IAAO,KAAK,CAAA;AAAA,WAAA,IACnE,SAAS,GAAA,EAAK,MAAA,CAAO,EAAE,GAAG,KAAK,CAAA,EAAG,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,MAAM,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,IAAK,KAAK,CAAA;AAAA,WAAA,IACzE,IAAA,KAAS,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,GAAA,GAAM,IAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,WACrE,MAAA,CAAO,EAAE,GAAG,GAAA,EAAK,GAAG,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,IAAK,KAAK,CAAA;AAAA,IAClE;AACA,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACxD,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,IAAA,EAAM,GAAA,EAAK,KAAK,CAAC,CAAA;AAGrB,EAAA,cAAA;AAAA,IACE,WAAA;AAAA,IACA,CAAC,GAAA,KAAQ;AACP,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAS,qBAAA,EAAsB;AACxD,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA;AACpC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AACpC,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,EAAA,EAAI,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,IAAK,GAAA,GAAM,IAAA,CAAK,EAAA,CAAA;AAC7D,MAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,IAAS,GAAA;AACxB,MAAA,IAAI,KAAA,GAAQ,MAAA,IAAU,KAAA,GAAQ,MAAA,EAAQ;AACpC,QAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,MAAM,CAAA,GAAI,cAAc,KAAA,EAAO,MAAM,IAAI,MAAA,GAAS,MAAA;AAAA,MACjF;AACA,MAAA,MAAA,CAAO,KAAK,MAAA,CAAA,CAAQ,MAAA,GAAS,KAAA,KAAU,MAAA,GAAS,OAAO,CAAC,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,KAAK,WAAA,CAAY,OAAA;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,SAAS,QAAQ,CAAA,EAAe;AAC9B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAA,GAAK,CAAA;AAChC,MAAA,MAAA,CAAO,GAAA,EAAK,MAAM,MAAA,CAAO,KAAA,GAAQ,MAAM,IAAI,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,IACrD;AACA,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACxD,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAGf,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,KAAK,aAAA,CAAc,OAAA;AACzB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,SAAS,QAAQ,CAAA,EAAe;AAC9B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAC9B,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAA,GAAK,CAAA;AAChC,MAAA,OAAA,CAAQ,KAAA,CAAM,MAAM,GAAA,GAAM,GAAA,EAAK,GAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACxD,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAGhB,EAAA,SAAS,eAAA,GAAkB;AACzB,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAG,CAAA;AAAA,IACxC,CAAA;AACA,IAAA,IAAI,SAAA,CAAU,WAAW,SAAA,EAAW;AAClC,MAAA,SAAA,CAAU,UAAU,SAAA,CAAU,SAAS,CAAA,CAAE,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF;AAEA,EAAA,SAAS,UAAU,CAAA,EAAqB;AACtC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,WAAA,CAAY,SAAS,KAAA,EAAM;AAC3B,MAAA,WAAA,CAAY,OAAA,EAAS,iBAAA,CAAkB,CAAA,EAAG,SAAA,CAAU,MAAM,CAAA;AAAA,IAC5D,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,WAAW,SAAA,EAAoB;AACtC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,UAAU,SAAS,CAAA;AAChC,MAAA,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACnC;AACA,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB;AAGA,EAAA,SAAS,cAAA,GAAiB;AAExB,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,UAAA,EAAW;AACtC,IAAA,OAAA,CACG,IAAA,EAAK,CACL,IAAA,CAAK,CAAC,MAAA,KAAgC;AACrC,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AACrC,MAAA,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,IACnC,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnB;AAGA,EAAA,SAAS,YAAA,GAAe;AACtB,IAAA,MAAM,IAAA,GAAO,CAAC,SAAA,EAAW,GAAG,UAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,SAAS,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,YAAY,CAAA;AAC3F,IAAA,iBAAA,GAAoB,IAAI,CAAA;AACxB,IAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,IAAA,qBAAA,CAAsB,MAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,SAAS,cAAc,GAAA,EAAa;AAClC,IAAA,MAAM,IAAA,GAAO,UAAU,GAAG,CAAA;AAC1B,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,EACnC;AAEA,EAAA,SAAS,eAAe,GAAA,EAAa;AAInC,IAAA,gBAAA,CAAiB,CAAC,SAAS,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACnD;AAEA,EAAA,SAAS,oBAAoB,GAAA,EAAa;AACxC,IAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS;AACzB,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,OAAO,IAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,iBAAA,GAAoB,UAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,GAAG,CAAC,CAAA;AAAA,EACxD;AAEA,EAAA,uBACEI,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,yBAAA,CAAO,IAAA,EAAM,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC5D,YAAA,EAAY,KAAA,KAAU,QAAA,GAAW,MAAA,GAAY,KAAA;AAAA,MAC7C,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MACnC,KAAA,EAAO;AAAA,QACL,GAAG,UAAA;AAAA,QACH,GAAI,IAAA,KAAS,CAAA,GAAI,EAAE,SAAA,EAAW,SAAS,IAAI,CAAA,CAAA,CAAA,EAAK,eAAA,EAAiB,YAAA,EAAa,GAAI;AAAA,OACpF;AAAA,MASE,QAAA,EAAA;AAAA,QAAA,CAAA,SAAA,CAAU,MAAA,GAAS,KAAK,iBAAA,qBACxBC,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAC,yBAAA,CAAO,OAAA,EAAS,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,yBAAA,CAAO,YAAA,GAAe,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,YACvF,KAAA,EAAO,EAAE,KAAA,EAAO,YAAA,GAAe,oBAAoB,SAAA,CAAU,MAAM,IAAI,CAAA,EAAE;AAAA,YAExE,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKnBD,eAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAW,CAAC,yBAAA,CAAO,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,GAAI,yBAAA,CAAO,gBAAA,GAAmB,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,kBAC5F,KAAA,EAAO,EAAE,cAAA,EAAgB,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA,GAAY,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,CAAA,CAAA,EAAI;AAAA,kBAC7E,cAAA,EAAgB,CAAC,CAAA,KAAM;AACrB,oBAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,cAAc,QAAA,CAAS,SAAS,CAAA,EAAG,mBAAA,CAAoB,GAAG,CAAA;AAAA,kBAClG,CAAA;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAC,cAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,WAAW,yBAAA,CAAO,IAAA;AAAA,wBAClB,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,EAAI;AAAA,wBAC5D,KAAA,EAAO,GAAA;AAAA,wBACP,YAAA,EAAY,eAAe,GAAG,CAAA,CAAA;AAAA,wBAC9B,OAAA,EAAS,MAAM,aAAA,CAAc,GAAG;AAAA;AAAA,qBAClC;AAAA,oCACAA,cAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,WAAW,yBAAA,CAAO,UAAA;AAAA,wBAClB,YAAA,EAAY,UAAU,GAAG,CAAA,eAAA,CAAA;AAAA,wBACzB,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,0BAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,0BAAA,cAAA,CAAe,GAAG,CAAA;AAAA,wBACpB,CAAA;AAAA,wBAEA,yCAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,CAAA,EAAG,eAAc,OAAA,EACvF,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAuB,CAAA,EACjC;AAAA;AAAA;AACF;AAAA,iBAAA;AAAA,gBA3BK;AAAA;AA4BP,aACD;AAAA;AAAA,SACH;AAAA,wBAGFD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,GAAa,sBAAA,GAAyB,oBAAA,EAAqB,EACzG,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,WAAW,yBAAA,CAAO,IAAA;AAAA,cAClB,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,8BAAA,EAAiC,QAAQ,CAAA,kBAAA,CAAA;AAAqB;AAAA,WACrF;AAAA,0BAEAD,eAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,WAAW,yBAAA,CAAO,UAAA;AAAA,cAClB,GAAA,EAAK,aAAA;AAAA,cACL,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,IAAI,mBAAA,EAAqB,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,MAAA,CAAA,EAAS;AAAA,cAEvF,QAAA,EAAA;AAAA,gCAAAC,cAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,WAAW,yBAAA,CAAO,QAAA;AAAA,oBAClB,KAAA,EAAO;AAAA,sBACL,KAAA,EAAO,CAAA,KAAA,EAAQ,GAAA,GAAM,KAAA,CAAM,MAAM,CAAA,QAAA,CAAA;AAAA,sBACjC,SAAA,EAAW,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,CAAA,iBAAA;AAAA;AACnD;AAAA,iBACF;AAAA,gBACC,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,cAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,QAAA;AAAA,oBACL,SAAA,EAAW,CAAC,yBAAA,CAAO,UAAA,EAAY,IAAA,KAAS,CAAA,GAAI,yBAAA,CAAO,MAAA,GAAS,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,oBACxE,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,oBAEvB,YAAE,WAAA;AAAY,mBAAA;AAAA,kBALV;AAAA,iBAOR;AAAA;AAAA;AAAA,WACH;AAAA,0CAEC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAA,CAAO,KAAA,EAAO,KAAK,QAAA,EACjC,QAAA,EAAA;AAAA,4BAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAA,CAAO,WAAA,EAAa,CAAA;AAAA,4BACpCA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAA,CAAO,IAAA,EAAM,KAAA,EAAO,EAAE,UAAA,EAAY,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA,EAAE,EAAG,CAAA;AAAA,4CAE5E,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAA,CAAO,WAAA,EAAa,SAAS,eAAA,EAC3C,QAAA,EAAA;AAAA,8BAAAA,cAAA,CAAC,SAAI,SAAA,EAAW,yBAAA,CAAO,UAAU,KAAA,EAAO,EAAE,YAAY,CAAA,KAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,EAAA,EAAK,KAAK,KAAI,EAAG,CAAA;AAAA,cACvG,CAAC,OAAA,oBACAA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAC,yBAAA,CAAO,UAAA,EAAY,MAAA,GAAS,yBAAA,CAAO,MAAA,GAAS,EAAE,EAAE,IAAA,CAAK,GAAG,CAAA,EAAG,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG,OAAA,EAAS,SAAA,EAC/G,QAAA,EAAA,MAAA,GAAS,QAAA,GAAW,SAAA,EACvB,CAAA;AAAA,cAED,OAAA,oBACCA,cAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,WAAA;AAAA,kBACL,WAAW,yBAAA,CAAO,eAAA;AAAA,kBAClB,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,kBACzB,IAAA,EAAK,MAAA;AAAA,kBACL,SAAA,EAAU,MAAA;AAAA,kBACV,YAAA,EAAa,KAAA;AAAA,kBACb,UAAA,EAAY,KAAA;AAAA,kBACZ,SAAA,EAAW,CAAA;AAAA,kBACX,KAAA,EAAO,SAAA;AAAA,kBACP,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,kBAClC,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBAC5C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,oBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,WAAA,CAAY,SAAS,IAAA,EAAK;AAAA,yBAAA,IACxC,CAAA,CAAE,QAAQ,QAAA,EAAU;AAC3B,sBAAA,UAAA,CAAW,IAAI,CAAA;AAAA,oBACjB;AAAA,kBACF,CAAA;AAAA,kBACA,MAAA,EAAQ,MAAM,UAAA,CAAW,KAAK;AAAA;AAAA;AAChC,aAAA,EAEJ,CAAA;AAAA,YAEC,mBAAA,oBACCA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAW,CAAC,yBAAA,CAAO,SAAA,EAAW,0BAAO,eAAe,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,gBAC9D,KAAA,EAAO,WAAA;AAAA,gBACP,YAAA,EAAW,wBAAA;AAAA,gBACX,OAAA,EAAS,cAAA;AAAA,gBAET,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,gBAC5B,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2fAAA,EAA4f,CAAA,EACtgB;AAAA;AAAA,aACF;AAAA,4BAEFA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAW,CAAC,yBAAA,CAAO,SAAA,EAAW,yBAAA,CAAO,YAAA,EAAc,aAAA,GAAgB,yBAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,gBAC9F,KAAA,EAAO,WAAA;AAAA,gBACP,YAAA,EAAW,iCAAA;AAAA,gBACX,OAAA,EAAS,YAAA;AAAA,gBACT,cAAA,EAAgB,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,gBAE5C,yCAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAAK,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAChH,yCAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAmB,CAAA,EAC7B;AAAA;AAAA,aACF;AAAA,4BAEAA,cAAA,CAAC,SAAI,SAAA,EAAW,yBAAA,CAAO,gBAAgB,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,6BAAA,EAAgC,mBAAmB,CAAA,IAAA,CAAA,IAC5G,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,WAAW,yBAAA,CAAO,SAAA,EAAW,OAAO,EAAE,UAAA,EAAY,QAAA,EAAS,EAAG,CAAA,EACrE;AAAA,WAAA,EACF,CAAA;AAAA,0BAUAD,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,UAAA,GAAa,UAAA,GAAa,QAAO,EACtD,QAAA,EAAA;AAAA,4BAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,WAAW,yBAAA,CAAO,kBAAA,EACrB,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAA,CAAO,cAAA,EAAgB,CAAA,EACzC,CAAA;AAAA,2CACC,KAAA,EAAA,EAAI,SAAA,EAAW,yBAAA,CAAO,QAAA,EAAU,KAAK,WAAA,EACpC,QAAA,kBAAAA,cAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,WAAW,yBAAA,CAAO,YAAA;AAAA,gBAClB,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,2BAAA,EAA8B,QAAQ,CAAA,2BAAA,CAAA;AAA8B;AAAA,aAC3F,EACF,CAAA;AAAA,2CACC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,yBAAA,CAAO,aAAa,yBAAA,CAAO,gBAAgB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,KAAA,EAAO,EAAE,UAAA,EAAY,UAAS,EAAG,CAAA;AAAA,4BAC1GA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,yBAAA,CAAO,WAAA,EAAa,yBAAA,CAAO,cAAc,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,CAAA;AAAA,4BACvEA,cAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,WAAW,yBAAA,CAAO,cAAA;AAAA,gBAClB,KAAA,EAAO;AAAA,kBACL,SAAA,EAAW,CAAA,sBAAA,EAAyB,WAAW,CAAA,iBAAA,EAAoB,WAAW,CAAA,IAAA,CAAA;AAAA,kBAC9E,UAAA,EAAY;AAAA;AACd;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"index.cjs","sourcesContent":[".root {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n@media (prefers-color-scheme: dark) {\n .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n }\n}\n:global([data-theme='light']) .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n:global([data-theme='dark']) .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n}\n.root[data-theme=dark] {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n}\n.root[data-theme=light] {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n.root {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n font-family: -apple-system, \"Segoe UI\", Inter, \"Helvetica Neue\", Arial, sans-serif;\n color: var(--text);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .root, .root *, .root *::before, .root *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n.recents {\n display: flex;\n align-items: center;\n gap: 7px;\n min-height: 30px;\n background: var(--surface-2);\n border-radius: 999px;\n padding: 5px 8px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.14), var(--shadow-soft);\n transition: width 0.25s ease;\n}\n\n.recentsEmpty {\n background: transparent;\n box-shadow: none;\n}\n\n.chipWrap {\n position: relative;\n flex: none;\n animation: chipIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) both;\n}\n\n.chipWrapRemoving {\n animation: chipOut 0.22s cubic-bezier(0.4, 0, 1, 1) both;\n pointer-events: none;\n}\n\n.chip {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n border: none;\n padding: 0;\n cursor: pointer;\n display: block;\n box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.22), var(--shadow-soft);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n.chip:hover {\n transform: scale(1.14) translateY(-1px);\n box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.3), 0 4px 10px -3px rgba(0, 0, 0, 0.3);\n}\n.chip:active {\n transform: scale(1.02);\n}\n\n.chipRemove {\n position: absolute;\n top: -3px;\n right: -3px;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: none;\n padding: 0;\n display: grid;\n place-items: center;\n background: var(--surface);\n color: var(--text-dim);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(128, 128, 128, 0.25);\n cursor: pointer;\n z-index: 2;\n opacity: 0;\n pointer-events: none;\n transform: scale(0.6);\n transition: opacity 0.12s ease, transform 0.12s ease, color 0.12s ease;\n}\n.chipRemove svg {\n width: 8px;\n height: 8px;\n}\n.chipRemove:hover {\n color: var(--text);\n}\n.chipWrap:hover .chipRemove {\n opacity: 1;\n pointer-events: auto;\n transform: scale(1);\n}\n\n@keyframes chipIn {\n 0% {\n transform: scale(0) rotate(-25deg);\n opacity: 0;\n }\n 100% {\n transform: scale(1) rotate(0);\n opacity: 1;\n }\n}\n@keyframes chipOut {\n 0% {\n transform: scale(1) rotate(0);\n opacity: 1;\n }\n 100% {\n transform: scale(0) rotate(18deg);\n opacity: 0;\n }\n}\n.picker {\n position: relative;\n margin-top: 96px;\n width: 272px;\n}\n\n.glow {\n position: absolute;\n width: 340px;\n height: 340px;\n left: 50%;\n top: 88px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n opacity: 0.55;\n pointer-events: none;\n z-index: 0;\n}\n\n.modeToggle {\n position: absolute;\n top: 88px;\n left: 50%;\n transform: translate(-50%, calc(-50% - 170px));\n z-index: 3;\n display: grid;\n background: var(--surface-2);\n border-radius: 999px;\n padding: 3px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.14), var(--shadow-soft);\n}\n\n.modePill {\n position: absolute;\n top: 3px;\n bottom: 3px;\n left: 3px;\n border-radius: 999px;\n background: var(--surface);\n box-shadow: var(--shadow-soft);\n transition: transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n.modeButton {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 22px;\n background: none;\n border: none;\n padding: 0;\n font-size: 10.5px;\n font-weight: 700;\n line-height: 22px;\n letter-spacing: 0.02em;\n color: var(--text-dim);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.modeButton.active {\n color: var(--text);\n}\n.modeButton:hover:not(.active) {\n color: var(--text);\n}\n\n.stage {\n position: absolute;\n top: -48px;\n left: 50%;\n width: 272px;\n height: 272px;\n transform: translateX(-50%);\n touch-action: none;\n}\n\n.stageShadow {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.22), 0 10px 18px rgba(0, 0, 0, 0.22);\n pointer-events: none;\n}\n\n.ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n pointer-events: none;\n z-index: 2;\n -webkit-mask: radial-gradient(circle closest-side, transparent 0 92px, black 93px 100%);\n mask: radial-gradient(circle closest-side, transparent 0 92px, black 93px 100%);\n}\n\n.hueHandlePivot {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0;\n height: 0;\n z-index: 3;\n transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.root[data-dragging=true] .hueHandlePivot {\n transition: none;\n}\n\n.hueHandle {\n position: absolute;\n top: -114px;\n left: 0;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n border: 3px solid #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(0, 0, 0, 0.15);\n transform: translate(-50%, -50%);\n cursor: grab;\n z-index: 3;\n}\n\n.alphaArcShadowWrap {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 380px;\n height: 380px;\n transform: translate(calc(-50% + 1px), calc(-50% + 5px));\n z-index: 1;\n pointer-events: none;\n filter: blur(7px);\n}\n\n.alphaArcShadow {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.22);\n clip-path: path(\"M 328.56,270 A 160 160 0 0 1 51.44,270 L 65.29,262 A 144 144 0 0 0 314.71,262 Z\");\n}\n\n.alphaArc {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 380px;\n height: 380px;\n transform: translate(-50%, -50%);\n touch-action: none;\n cursor: grab;\n z-index: 2;\n background: var(--surface-2);\n clip-path: path(\"M 328.56,270 A 160 160 0 0 1 51.44,270 L 65.29,262 A 144 144 0 0 0 314.71,262 Z\");\n}\n\n.alphaArcFill {\n position: absolute;\n inset: 0;\n}\n\n.alphaArcCap {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n z-index: 2;\n pointer-events: none;\n background: var(--surface-2);\n}\n\n.alphaArcCapStart {\n transform: translate(calc(-50% + 131.6px), calc(-50% + 76px));\n}\n\n.alphaArcCapEnd {\n transform: translate(calc(-50% - 131.6px), calc(-50% + 76px));\n}\n\n.alphaArcHandle {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid #fff;\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(0, 0, 0, 0.2);\n z-index: 3;\n pointer-events: none;\n transition: transform 0.12s ease;\n}\n\n.root[data-dragging=true] .alphaArcHandle {\n transition: none;\n}\n\n.currentDisc {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 156px;\n height: 156px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n overflow: hidden;\n cursor: pointer;\n z-index: 2;\n box-shadow: 0 10px 24px -8px rgba(20, 16, 10, 0.4), inset 0 0 0 1px rgba(0, 0, 0, 0.08);\n background-image: linear-gradient(45deg, var(--check-a) 25%, transparent 25%, transparent 75%, var(--check-a) 75%), linear-gradient(45deg, var(--check-a) 25%, transparent 25%, transparent 75%, var(--check-a) 75%);\n background-size: 12px 12px;\n background-position: 0 0, 6px 6px;\n background-color: var(--check-b);\n}\n\n.discFill {\n position: absolute;\n inset: 0;\n}\n\n.currentHex,\n.currentHexInput {\n position: absolute;\n inset: 0;\n z-index: 1;\n font-family: \"SF Mono\", \"IBM Plex Mono\", \"JetBrains Mono\", Consolas, \"Liberation Mono\", monospace;\n font-size: 17px;\n font-weight: 700;\n letter-spacing: 0.01em;\n font-variant-numeric: tabular-nums;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);\n}\n\n.currentHex {\n display: grid;\n place-items: center;\n cursor: text;\n transition: transform 0.15s cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n.currentHex.copied {\n transform: scale(1.06);\n}\n\n.currentHexInput {\n z-index: 2;\n width: 100%;\n height: 100%;\n text-align: center;\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n}\n.currentHexInput::selection {\n background: rgba(255, 255, 255, 0.35);\n}\n\n.discBadge {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n border: none;\n display: grid;\n place-items: center;\n cursor: pointer;\n z-index: 3;\n transition: transform 0.15s ease, filter 0.15s ease;\n}\n.discBadge:hover {\n filter: brightness(1.15);\n}\n.discBadge svg {\n width: 15px;\n height: 15px;\n}\n\n.discBadgeTop {\n transform: translate(-50%, calc(-50% - 46px));\n}\n.discBadgeTop:active {\n transform: translate(-50%, calc(-50% - 46px)) scale(0.92);\n}\n.discBadgeTop.pulse {\n animation: badgePulseTop 0.4s ease;\n}\n\n.discBadgeBottom {\n transform: translate(-50%, calc(-50% + 46px));\n}\n.discBadgeBottom:active {\n transform: translate(-50%, calc(-50% + 46px)) scale(0.92);\n}\n\n@keyframes badgePulseTop {\n 0% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1);\n }\n 40% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1.28);\n }\n 100% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1);\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbG9yV2hlZWwubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUNBO0VBMUJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBb0JBO0VBQ0U7SUFsQkY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7O0FBa0JBO0VBekNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBa0NBO0VBL0JBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBMEJBO0VBcENBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBNkJBO0VBcERBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBZ0JGO0VBOEJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0lBQ0U7SUFDQTs7O0FBS0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBSUE7OztBQU1GO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQU9GO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7OztBQU1KO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7O0FBRUY7RUFDRTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7SUFBSztJQUFvQzs7RUFDekM7SUFBTztJQUErQjs7O0FBR3hDO0VBQ0U7SUFBSztJQUErQjs7RUFDcEM7SUFBTztJQUFtQzs7O0FBVzVDO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFFRjtFQUNFOzs7QUFLSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFPRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7OztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUlBO0VBSUE7OztBQUVGO0VBQ0U7OztBQUVGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBY0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsV0F0QlE7OztBQXlCVjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsV0FwQ1E7OztBQXVDVjtFQUNFO0VBQ0E7OztBQVNGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFHRjtFQUNFOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVGO0VBQ0U7OztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLGtCQUNFO0VBRUY7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUtGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBR0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7OztBQVFKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBRUY7RUFDRTtFQUNBOzs7QUFHSjtFQUNFOztBQUNBO0VBQ0U7O0FBRUY7RUFDRTs7O0FBR0o7RUFDRTs7QUFDQTtFQUNFOzs7QUFHSjtFQUNFO0lBQUs7O0VBQ0w7SUFBTTs7RUFDTjtJQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlbWUgdG9rZW5zIGFyZSBzY29wZWQgdG8gLnJvb3QgKGNvbXBvbmVudC1sb2NhbCksIG5vdCA6cm9vdCAtLSB0aGlzXG4vLyBjb21wb25lbnQgbXVzdCBiZSBzYWZlIHRvIGRyb3AgaW50byBhbiBhcHAgd2l0aCBpdHMgb3duIGdsb2JhbCB0aGVtZVxuLy8gd2l0aG91dCBjb2xsaWRpbmcuIEFsbCAqY29tcHV0ZWQqIGNvbG9ycyAodGhlIGNvbG9yIHlvdSdyZSBwaWNraW5nLCBiYWRnZVxuLy8gdGludHMsIGdyYWRpZW50cykgYXJlIHBhc3NlZCBpbiBhcyBpbmxpbmUgc3R5bGVzIGZyb20gQ29sb3JXaGVlbC50c3gsIG5vdFxuLy8gQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzIGhlcmUgLS0gb25seSBzdHJ1Y3R1cmFsL3RoZW1lIHRva2VucyBsaXZlIGluIFNDU1MuXG5cbi8vIGxpZ2h0L2RhcmsgcGFsZXR0ZXMgLS0gaWRlbnRpY2FsIHZhbHVlcyBzaGFyZWQgYnkgZXZlcnkgdHJpZ2dlciBiZWxvdyAoT1Ncbi8vIHByZWZlcmVuY2UsIGhvc3QgYXBwJ3MgYW1iaWVudCB0aGVtZSwgYW5kIHRoaXMgaW5zdGFuY2UncyBvd24gYHRoZW1lYCBwcm9wKVxuQG1peGluIGxpZ2h0LXBhbGV0dGUge1xuICAtLWJnOiAjRUNFQUUzO1xuICAtLXN1cmZhY2U6ICNGRkZGRkY7XG4gIC0tc3VyZmFjZS0yOiAjRTNFMEQ4O1xuICAtLWJvcmRlcjogI0QyQ0RDMDtcbiAgLS10ZXh0OiAjMUExOTEzO1xuICAtLXRleHQtZGltOiAjNzI2RjY0O1xuICAtLXRleHQtZmFpbnQ6ICNBOEEzOTg7XG4gIC0tc2hhZG93LXNvZnQ6IDAgMXB4IDJweCByZ2JhKDMwLCAyNSwgMTUsIDAuMDgpO1xuICAtLWNoZWNrLWE6ICNkOGQ0Yzg7XG4gIC0tY2hlY2stYjogI2Y0ZjJlYztcbiAgY29sb3Itc2NoZW1lOiBsaWdodDtcbn1cbkBtaXhpbiBkYXJrLXBhbGV0dGUge1xuICAtLWJnOiAjMTMxMjE3O1xuICAtLXN1cmZhY2U6ICMxQzFCMjI7XG4gIC0tc3VyZmFjZS0yOiAjMjYyNTJFO1xuICAtLWJvcmRlcjogIzM0MzMzRDtcbiAgLS10ZXh0OiAjRUNFQUYwO1xuICAtLXRleHQtZGltOiAjOEU4Qzk5O1xuICAtLXRleHQtZmFpbnQ6ICM2MDVFNkI7XG4gIC0tc2hhZG93LXNvZnQ6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xuICAtLWNoZWNrLWE6ICMzNzM1M2Y7XG4gIC0tY2hlY2stYjogIzIwMWYyNjtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xufVxuXG4ucm9vdCB7XG4gIEBpbmNsdWRlIGxpZ2h0LXBhbGV0dGU7XG5cbiAgLy8gdGhlbWU9XCJzeXN0ZW1cIiAobm8gZGF0YS10aGVtZSBvZiBpdHMgb3duKTogZmFsbCBiYWNrIHRvIHRoZSBPUyBwcmVmZXJlbmNlXG4gIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcbiAgICAmOm5vdChbZGF0YS10aGVtZT0nbGlnaHQnXSk6bm90KFtkYXRhLXRoZW1lPSdkYXJrJ10pIHtcbiAgICAgIEBpbmNsdWRlIGRhcmstcGFsZXR0ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGVtZT1cInN5c3RlbVwiOiB0aGUgaG9zdCBhcHAncyBhbWJpZW50IHRoZW1lIChkYXRhLXRoZW1lIHNldCBvbiBhblxuICAvLyBhbmNlc3RvciwgZS5nLiA8aHRtbD4gLS0gdGhlIHNhbWUgY29udmVudGlvbiBDb2xvclBpY2tlci9UaW1lbGluZSByZWFkXG4gIC8vIGZyb20pIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgYmFyZSBPUyBwcmVmZXJlbmNlIGFib3ZlIHdoZW4gdGhlIGFwcFxuICAvLyBkZWNsYXJlcyBvbmUgLS0gaW5jbHVkaW5nIGV4cGxpY2l0bHkgb3ZlcnJpZGluZyBpdCBiYWNrIHRvIGxpZ2h0LCBzaW5jZVxuICAvLyB0aGUgT1MtcHJlZmVyZW5jZSBydWxlIGFib3ZlIGhhcyBubyB3YXkgdG8ga25vdyB0aGUgYXBwIGRpc2FncmVlc1xuICA6Z2xvYmFsKFtkYXRhLXRoZW1lPSdsaWdodCddKSAmOm5vdChbZGF0YS10aGVtZT0nbGlnaHQnXSk6bm90KFtkYXRhLXRoZW1lPSdkYXJrJ10pIHtcbiAgICBAaW5jbHVkZSBsaWdodC1wYWxldHRlO1xuICB9XG4gIDpnbG9iYWwoW2RhdGEtdGhlbWU9J2RhcmsnXSkgJjpub3QoW2RhdGEtdGhlbWU9J2xpZ2h0J10pOm5vdChbZGF0YS10aGVtZT0nZGFyayddKSB7XG4gICAgQGluY2x1ZGUgZGFyay1wYWxldHRlO1xuICB9XG5cbiAgLy8gdGhlbWU9XCJkYXJrXCIgLyB0aGVtZT1cImxpZ2h0XCI6IHBpbm5lZCBleHBsaWNpdGx5IG9uIHRoaXMgaW5zdGFuY2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIE9TIG9yIHRoZSBhcHBcbiAgJltkYXRhLXRoZW1lPSdkYXJrJ10ge1xuICAgIEBpbmNsdWRlIGRhcmstcGFsZXR0ZTtcbiAgfVxuICAmW2RhdGEtdGhlbWU9J2xpZ2h0J10ge1xuICAgIEBpbmNsdWRlIGxpZ2h0LXBhbGV0dGU7XG4gIH1cblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMjBweDtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sICdTZWdvZSBVSScsIEludGVyLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgY29sb3I6IHZhcigtLXRleHQpO1xufVxuXG5AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xuICAucm9vdCwgLnJvb3QgKiwgLnJvb3QgKjo6YmVmb3JlLCAucm9vdCAqOjphZnRlciB7XG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDtcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT0gUmVjZW50cyAoZmF2b3JpdGVzKSA9PT09PT09PT09PT1cbi5yZWNlbnRzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA3cHg7XG4gIG1pbi1oZWlnaHQ6IDMwcHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBwYWRkaW5nOiA1cHggOHB4O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgdmFyKC0tc2hhZG93LXNvZnQpO1xuICAvLyBgd2lkdGhgIGlzIHNldCBpbmxpbmUgZnJvbSBDb2xvcldoZWVsLnRzeCAoY2hpcCBjb3VudCAqIHNpemUgKyBnYXBzKSAtLVxuICAvLyB0cmFuc2l0aW9uaW5nIGl0IHR1cm5zIGFuIGFkZC9yZW1vdmUncyBzaHJpbmstdG8tZml0IHJlc2l6ZSBpbnRvIGFcbiAgLy8gc21vb3RoIHJlc2l6ZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnQgc25hcFxuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjI1cyBlYXNlO1xufVxuXG4vLyBzYW1lIGJveCAobWluLWhlaWdodCArIHBhZGRpbmcpLCBqdXN0IGludmlzaWJsZSAtLSBrZWVwcyB0aGUgc2xvdCdzXG4vLyBmb290cHJpbnQgcmVzZXJ2ZWQgc28gdGhlIHJlc3Qgb2YgdGhlIGxheW91dCBkb2Vzbid0IHNoaWZ0IHdoZW4gdGhlIGxhc3Rcbi8vIHByZXNldCBpcyByZW1vdmVkIChvciBiZWZvcmUgdGhlIGZpcnN0IG9uZSBpcyBldmVyIGFkZGVkKVxuLnJlY2VudHNFbXB0eSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uY2hpcFdyYXAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsZXg6IG5vbmU7XG4gIGFuaW1hdGlvbjogY2hpcEluIDAuNHMgY3ViaWMtYmV6aWVyKDAuMzQsIDEuNTYsIDAuNjQsIDEpIGJvdGg7XG59XG5cbi8vIHN3YXBzIGluIGZvciAuY2hpcFdyYXAgd2hpbGUgYSBjaGlwIGlzIGxlYXZpbmcgKHNlZSByZW1vdmVGYXZvcml0ZSAvXG4vLyBoYW5kbGVDaGlwUmVtb3ZlRW5kIGluIENvbG9yV2hlZWwudHN4KSAtLSB0cmFuc2Zvcm0tb25seSwgc28gaXQga2VlcHNcbi8vIG9jY3VweWluZyBpdHMgZmxleCBzbG90IChhbmQgLnJlY2VudHMnIHdpZHRoKSB1bnRpbCBpdCdzIGZ1bGx5IGludmlzaWJsZSxcbi8vIGF0IHdoaWNoIHBvaW50IHRoZSBhY3R1YWwgcmVtb3ZhbCArIC5yZWNlbnRzJyBvd24gd2lkdGggdHJhbnNpdGlvbiBraWNrIGluXG4uY2hpcFdyYXBSZW1vdmluZyB7XG4gIGFuaW1hdGlvbjogY2hpcE91dCAwLjIycyBjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKSBib3RoO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmNoaXAge1xuICB3aWR0aDogMjZweDtcbiAgaGVpZ2h0OiAyNnB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBibG9jaztcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4yMiksIHZhcigtLXNoYWRvdy1zb2Z0KTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGVhc2UsIGJveC1zaGFkb3cgMC4xNXMgZWFzZTtcblxuICAmOmhvdmVyIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTQpIHRyYW5zbGF0ZVkoLTFweCk7XG4gICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4zKSwgMCA0cHggMTBweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgfVxuICAmOmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTtcbiAgfVxufVxuXG4vLyBub3RpZmljYXRpb24tYmFkZ2Ugc3R5bGU6IHNpdHMgb2ZmLWNlbnRlciBvbiB0aGUgY2hpcCdzIHJpbSwgcmV2ZWFsZWQgb25seVxuLy8gb24gaG92ZXIgc28gaXQgbmV2ZXIgY29tcGV0ZXMgd2l0aCB0aGUgY2hpcCdzIG93biBjbGljay10by1zZWxlY3QgYXJlYVxuLmNoaXBSZW1vdmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTNweDtcbiAgcmlnaHQ6IC0zcHg7XG4gIHdpZHRoOiAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTtcbiAgY29sb3I6IHZhcigtLXRleHQtZGltKTtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwgaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4yNSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgei1pbmRleDogMjtcbiAgb3BhY2l0eTogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC42KTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjEycyBlYXNlLCB0cmFuc2Zvcm0gMC4xMnMgZWFzZSwgY29sb3IgMC4xMnMgZWFzZTtcblxuICBzdmcge1xuICAgIHdpZHRoOiA4cHg7XG4gICAgaGVpZ2h0OiA4cHg7XG4gIH1cbiAgJjpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLXRleHQpO1xuICB9XG4gIC5jaGlwV3JhcDpob3ZlciAmIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBjaGlwSW4ge1xuICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMCkgcm90YXRlKC0yNWRlZyk7IG9wYWNpdHk6IDA7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDApOyBvcGFjaXR5OiAxOyB9XG59XG5cbkBrZXlmcmFtZXMgY2hpcE91dCB7XG4gIDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMCk7IG9wYWNpdHk6IDE7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMCkgcm90YXRlKDE4ZGVnKTsgb3BhY2l0eTogMDsgfVxufVxuXG4vLyA9PT09PT09PT09PT0gUGlja2VyOiBwb3NpdGlvbmluZyBjb250ZXh0IGZvciB0aGUgcmluZydzIGJsZWVkID09PT09PT09PT09PVxuLy8gRXZlcnkgZGlyZWN0IGNoaWxkIGJlbG93IGlzIHBvc2l0aW9uOmFic29sdXRlICh0aGVyZSdzIG5vIGJhY2tpbmcgY2FyZCB0b1xuLy8gaG9sZCB0aGUgYm94IG9wZW4pLCBzbyAucGlja2VyIG5lZWRzIGFuIGV4cGxpY2l0IHNpemUgb3IgaXQgbWVhc3VyZXMgYXNcbi8vIDB4MCB0byB0aGUgbGF5b3V0IGVuZ2luZSAtLSBtYXJnaW4tdG9wIHJlc2VydmVzIHJvb20gZm9yIHdoYXQgcmVuZGVyc1xuLy8gYWJvdmUgdGhlIHNoYXJlZCBjZW50ZXIgYW5jaG9yIChtb3N0bHkgdGhlIG1vZGUgdG9nZ2xlKS4gYGhlaWdodGAgaXMgc2V0XG4vLyBpbmxpbmUgZnJvbSBDb2xvcldoZWVsLnRzeCBpbnN0ZWFkIG9mIGhlcmUsIHNpbmNlIGhvdyBmYXIgZG93biBpdCBuZWVkcyB0b1xuLy8gcmVzZXJ2ZSBkZXBlbmRzIG9uIGBhcmNWaXNpYmxlYCAodGhlIGFscGhhIGFyYyByZWFjaGVzIGxvd2VyIHRoYW4gdGhlIHJpbmdcbi8vIGFsb25lIGRvZXMpIC0tIHBsYWluIFNDU1MgY2FuJ3Qgc2VlIHRoYXQgcHJvcC5cbi5waWNrZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi10b3A6IDk2cHg7XG4gIHdpZHRoOiAyNzJweDtcbn1cblxuLmdsb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAzNDBweDtcbiAgaGVpZ2h0OiAzNDBweDtcbiAgbGVmdDogNTAlO1xuICB0b3A6IDg4cHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG9wYWNpdHk6IDAuNTU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiAwO1xufVxuXG4vLyA9PT09PT09PT09PT0gTW9kZSB0b2dnbGU6IHN3aXRjaGVzIHdoYXQgdGhlIHJpbmcgYWRqdXN0cyAoSC9TL1YpID09PT09PT09PT09PVxuLm1vZGVUb2dnbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSAxNzBweCkpO1xuICB6LWluZGV4OiAzO1xuICBkaXNwbGF5OiBncmlkO1xuICAvLyBncmlkLXRlbXBsYXRlLWNvbHVtbnMgYW5kIHdpZHRoIGFyZSBzZXQgaW5saW5lIChtb2RlIGNvdW50IGlzIGR5bmFtaWM6XG4gIC8vIDMtd2F5IEgvUy9WIG9yIDQtd2F5IEgvUy9WL0EgZGVwZW5kaW5nIG9uIHNob3dBbHBoYUNvbnRyb2wpXG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBwYWRkaW5nOiAzcHg7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCB2YXIoLS1zaGFkb3ctc29mdCk7XG59XG5cbi5tb2RlUGlsbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAzcHg7XG4gIGJvdHRvbTogM3B4O1xuICBsZWZ0OiAzcHg7XG4gIC8vIHdpZHRoIGlzIHNldCBpbmxpbmUgKHNlZSAubW9kZVRvZ2dsZSlcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpO1xuICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctc29mdCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cyBjdWJpYy1iZXppZXIoMC4yLCAwLjgsIDAuMiwgMSk7XG59XG5cbi5tb2RlQnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgaGVpZ2h0OiAyMnB4O1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogMTAuNXB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsaW5lLWhlaWdodDogMjJweDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgY29sb3I6IHZhcigtLXRleHQtZGltKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzIGVhc2U7XG5cbiAgJi5hY3RpdmUge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0KTtcbiAgfVxuICAmOmhvdmVyOm5vdCguYWN0aXZlKSB7XG4gICAgY29sb3I6IHZhcigtLXRleHQpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PSBTdGFnZTogYSB0cnVlIHJpbmcgKGFubnVsdXMgdmlhIG1hc2spID09PT09PT09PT09PVxuLnN0YWdlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC00OHB4O1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyNzJweDtcbiAgaGVpZ2h0OiAyNzJweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0b3VjaC1hY3Rpb246IG5vbmU7XG59XG5cbi8vIHNoYWRvdyBjYXN0ZXI6IGEgcGxhaW4sIHVubWFza2VkIGNpcmNsZSBiZWhpbmQgdGhlIHJpbmcuIGJveC1zaGFkb3cgZHJhd3Ncbi8vIG91dHNpZGUgaXRzIGJvcmRlci1ib3ggcmVnYXJkbGVzcyBvZiB0aGUgaG9sZSBpbiB0aGUgc2hhcGUgZHJhd24gb24gdG9wIG9mXG4vLyBpdCwgc28gdGhpcyByZWxpYWJseSBjYXN0cyBhIHNoYWRvdyBhcm91bmQgdGhlIHJpbmcncyBvdXRlciBlZGdlIC0tXG4vLyBmaWx0ZXI6ZHJvcC1zaGFkb3cgb24gdGhlIG1hc2tlZCAucmluZyBpdHNlbGYgaXMgdW5yZWxpYWJsZSBhY3Jvc3MgZW5naW5lcy5cbi5zdGFnZVNoYWRvdyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yMiksIDAgMTBweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4ucmluZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDI7XG4gIC8vIGJhY2tncm91bmQgaXMgc2V0IHBlci1tb2RlIGlubGluZTogaHVlIHNwZWN0cnVtIC8gZ3JleS10by1jb2xvciAvIGJsYWNrLXRvLWNvbG9yXG4gIC13ZWJraXQtbWFzazogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBjbG9zZXN0LXNpZGUsIHRyYW5zcGFyZW50IDAgOTJweCwgYmxhY2sgOTNweCAxMDAlKTtcbiAgbWFzazogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBjbG9zZXN0LXNpZGUsIHRyYW5zcGFyZW50IDAgOTJweCwgYmxhY2sgOTNweCAxMDAlKTtcbn1cblxuLy8gcm90YXRlZCwgbm90IHJlcG9zaXRpb25lZCB2aWEgdG9wL2xlZnQgLS0gc2VlIHRoZSBjb21tZW50IG9uXG4vLyByaW5nQW5nbGVGcm9tVG9wRGVnIGluIENvbG9yV2hlZWwudHN4IGZvciB3aHlcbi5odWVIYW5kbGVQaXZvdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDA7XG4gIGhlaWdodDogMDtcbiAgLy8gYHRyYW5zZm9ybWAgY3JlYXRlcyBhIG5ldyBzdGFja2luZyBjb250ZXh0LCBzbyB0aGlzIG5lZWRzIGl0cyBvd25cbiAgLy8gei1pbmRleCAtLSB0aGUgY2hpbGQgLmh1ZUhhbmRsZSdzIHotaW5kZXggb25seSByYW5rcyBpdCB3aXRoaW4gdGhpc1xuICAvLyBjb250ZXh0LCBub3QgYWdhaW5zdCB0aGUgcmluZy9kaXNjL2JhZGdlcyBzaXR0aW5nIG91dHNpZGUgaXRcbiAgei1pbmRleDogMztcbiAgLy8gc3Ryb25nIGVhc2Utb3V0IC0tIGZhc3Qgc3RhcnQsIGxvbmcgZGVjZWxlcmF0aW9uIGludG8gdGhlIGZpbmFsIGFuZ2xlLFxuICAvLyBsaWtlIGJyYWtpbmcgaW50byBwb3NpdGlvbi4gUmVhZHMgYXMgYSByZWFsIHN3ZWVwIG9uIGEgYmlnIG1vZGUtc3dpdGNoXG4gIC8vIGp1bXAsIHN0YXlzIHNuYXBweSBvbiBzbWFsbCB3aGVlbC10aWNrIG51ZGdlcy5cbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMzJzIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xufVxuLnJvb3RbZGF0YS1kcmFnZ2luZz0ndHJ1ZSddIC5odWVIYW5kbGVQaXZvdCB7XG4gIHRyYW5zaXRpb246IG5vbmU7XG59XG4uaHVlSGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0xMTRweDsgLy8gbWlkLWJhbmQgcmFkaXVzICgwLjQxOTEgKiAyNzJweCBzdGFnZSksIGZpeGVkIGRpc3RhbmNlIGZyb20gdGhlIHBpdm90XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiAzcHggc29saWQgI2ZmZjtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC40KSwgMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBjdXJzb3I6IGdyYWI7XG4gIHotaW5kZXg6IDM7XG59XG5cbi8vID09PT09PT09PT09PSBBbHBoYSBhcmM6IGEgY3VydmVkIGFscGhhIHNsaWRlciBvdXRzaWRlIHRoZSByaW5nID09PT09PT09PT09PVxuLy8gYSBwdXJlIDFEIGNvbnRyb2wsIHBvc2l0aW9uIGFsb25nIHRoZSAxMjBkZWcgYmFuZCAoYm90dG9tLWNlbnRlcmVkKSBmYWRlc1xuLy8gYSBjaGVja2VyYm9hcmQgKGFscGhhIDApIGludG8gdGhlIGN1cnJlbnQgc29saWQgY29sb3IgKGFscGhhIDEpLiBjbGlwLXBhdGhcbi8vIGFsc28gZ2F0ZXMgaGl0LXRlc3RpbmcsIHNvIGNsaWNrcyBvdXRzaWRlIHRoZSB2aXNpYmxlIGNyZXNjZW50IGZhbGwgdGhyb3VnaC5cbiRhcmNQYXRoOiBwYXRoKCdNIDMyOC41NiwyNzAgQSAxNjAgMTYwIDAgMCAxIDUxLjQ0LDI3MCBMIDY1LjI5LDI2MiBBIDE0NCAxNDQgMCAwIDAgMzE0LjcxLDI2MiBaJyk7XG5cbi8vIHNoYWRvdyBjYXN0ZXI6IGNsaXAtcGF0aCArIGZpbHRlcjpibHVyIG9uIHRoZSBTQU1FIGVsZW1lbnQgY2xpcHMgYXdheSB0aGVcbi8vIGJsdXIncyBvd24gc29mdCBlZGdlIChubyByb29tIG91dHNpZGUgdGhlIHBhdGggZm9yIGl0IHRvIGZhZGUgaW50byksXG4vLyBsZWF2aW5nIGEgaGFyZC1lZGdlZCBzbXVkZ2UuIEZpeDogYmx1ciBhIHdyYXBwZXIgdGhhdCBJU04nVCBpdHNlbGYgY2xpcHBlZFxuLy8gLS0gaXQgY29tcG9zaXRlcyBpdHMgY2xpcHBlZCBjaGlsZCBmaXJzdCwgdGhlbiBibHVycyB0aGF0IHdob2xlIHJlc3VsdFxuLy8gZnJlZWx5LCBzaW5jZSBub3RoaW5nIGNsaXBzIHRoZSB3cmFwcGVyIGFmdGVyd2FyZC5cbi5hbHBoYUFyY1NoYWRvd1dyYXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzgwcHg7XG4gIGhlaWdodDogMzgwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoLTUwJSArIDFweCksIGNhbGMoLTUwJSArIDVweCkpO1xuICB6LWluZGV4OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZmlsdGVyOiBibHVyKDdweCk7XG59XG4uYWxwaGFBcmNTaGFkb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjIpO1xuICBjbGlwLXBhdGg6ICRhcmNQYXRoO1xufVxuXG4uYWxwaGFBcmMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzgwcHg7XG4gIGhlaWdodDogMzgwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICB0b3VjaC1hY3Rpb246IG5vbmU7XG4gIGN1cnNvcjogZ3JhYjtcbiAgei1pbmRleDogMjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTtcbiAgY2xpcC1wYXRoOiAkYXJjUGF0aDtcbn1cblxuLmFscGhhQXJjRmlsbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIC8vIGNvbmljLWdyYWRpZW50IHNldCBpbmxpbmUgKG5lZWRzIHRoZSBsaXZlIGFjY2VudCBjb2xvcilcbn1cblxuLy8gY2xpcC1wYXRoIGNhbid0IHRha2UgYSBib3JkZXItcmFkaXVzLCBzbyB0aGUgYmFuZCdzIHR3byBmbGF0LWN1dCBlbmRzIGFyZVxuLy8gXCJyb3VuZGVkXCIgYnkgY2FwcGluZyB0aGVtIHdpdGggcGxhaW4gY2lyY2xlcyBzaXplZCB0byB0aGUgYmFuZCdzIG93blxuLy8gdGhpY2tuZXNzIC0tIGEgcGlsbCBjYXAsIHNhbWUgdHJpY2sgYXMgYSByb3VuZGVkLWVuZCBzdHJva2UuIFRoZXNlIHNpdFxuLy8gT1VUU0lERSAuYWxwaGFBcmMgKGl0cyBjbGlwLXBhdGggd291bGQgc2xpY2UgdGhlbSB0b28pLCBwb3NpdGlvbmVkIGZyb21cbi8vIHRoZSBzaGFyZWQgY2VudGVyIHBvaW50IGxpa2UgdGhlIG1vZGUgdG9nZ2xlIGlzLlxuLmFscGhhQXJjQ2FwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDE2cHg7XG4gIGhlaWdodDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICB6LWluZGV4OiAyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTtcbn1cbi5hbHBoYUFyY0NhcFN0YXJ0IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtNTAlICsgMTMxLjZweCksIGNhbGMoLTUwJSArIDc2cHgpKTtcbiAgLy8gYmFja2dyb3VuZCBzZXQgaW5saW5lIChhY2NlbnQtc29saWQsIHRoZSBcImZ1bGxcIiBlbmQpXG59XG4uYWxwaGFBcmNDYXBFbmQge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC01MCUgLSAxMzEuNnB4KSwgY2FsYygtNTAlICsgNzZweCkpO1xufVxuXG4vLyBzaXRzIE9VVFNJREUgLmFscGhhQXJjIHRvbywgc2FtZSByZWFzb24gYXMgdGhlIGNhcHMgLS0gY2xpcC1wYXRoIHdvdWxkXG4vLyBzbGljZSBpdCBpbnRvIGEgY3Jlc2NlbnQgd2hlbmV2ZXIgaXQgbmVhcnMgdGhlIGJhbmQncyBmbGF0LWN1dCBlbmRzXG4uYWxwaGFBcmNIYW5kbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuNSksIDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIHotaW5kZXg6IDM7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xMnMgZWFzZTtcbn1cbi5yb290W2RhdGEtZHJhZ2dpbmc9J3RydWUnXSAuYWxwaGFBcmNIYW5kbGUge1xuICB0cmFuc2l0aW9uOiBub25lO1xufVxuXG4vLyA9PT09PT09PT09PT0gQ3VycmVudC1jb2xvciBkaXNjID09PT09PT09PT09PVxuLmN1cnJlbnREaXNjIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMTU2cHg7XG4gIGhlaWdodDogMTU2cHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgei1pbmRleDogMjtcbiAgYm94LXNoYWRvdzogMCAxMHB4IDI0cHggLThweCByZ2JhKDIwLCAxNiwgMTAsIDAuNCksIGluc2V0IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICBiYWNrZ3JvdW5kLWltYWdlOlxuICAgIGxpbmVhci1ncmFkaWVudCg0NWRlZywgdmFyKC0tY2hlY2stYSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDc1JSwgdmFyKC0tY2hlY2stYSkgNzUlKSxcbiAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHZhcigtLWNoZWNrLWEpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoZWNrLWEpIDc1JSk7XG4gIGJhY2tncm91bmQtc2l6ZTogMTJweCAxMnB4O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDAsIDZweCA2cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNoZWNrLWIpO1xufVxuXG4uZGlzY0ZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICAvLyBiYWNrZ3JvdW5kIChyZ2JhIG9mIGN1cnJlbnQgY29sb3IsIHNvIHRoZSBjaGVja2VyYm9hcmQgcmVhZHMgdGhyb3VnaFxuICAvLyB3aGVuIGFscGhhIDwgMSkgc2V0IGlubGluZVxufVxuXG4uY3VycmVudEhleCxcbi5jdXJyZW50SGV4SW5wdXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAxO1xuICBmb250LWZhbWlseTogJ1NGIE1vbm8nLCAnSUJNIFBsZXggTW9ubycsICdKZXRCcmFpbnMgTW9ubycsIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDE3cHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHRleHQtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgLy8gY29sb3Igc2V0IGlubGluZSAoY29tcHV0ZWQgZm9yIGNvbnRyYXN0IGFnYWluc3QgdGhlIGN1cnJlbnQgY29sb3IpXG59XG4uY3VycmVudEhleCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogdGV4dDtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGN1YmljLWJlemllcigwLjM0LCAxLjU2LCAwLjY0LCAxKTtcblxuICAmLmNvcGllZCB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA2KTtcbiAgfVxufVxuLmN1cnJlbnRIZXhJbnB1dCB7XG4gIHotaW5kZXg6IDI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMDtcblxuICAmOjpzZWxlY3Rpb24ge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7XG4gIH1cbn1cblxuLy8gYmFkZ2VzIHJlc3RpbmcgaW5sYW5kIG9uIHRoZSBkaXNjLCB0b3AgKGV5ZWRyb3BwZXIpIGFuZCBib3R0b20gKHNhdmUgdG9cbi8vIGZhdm9yaXRlcykgLS0gZGlzY3JlZXQ6IG5lYXItaW52aXNpYmxlIGZpbGwsIGFuZCBpbnN0ZWFkIG9mIGEgZHJhd24tb25cbi8vIGJvcmRlciwgYW4gZW5ncmF2ZWQgZ3Jvb3ZlIChkYXJrIGluc2V0IGxpcCBvbiB0b3AsIGZhaW50IGhpZ2hsaWdodCBvbiB0aGVcbi8vIGJvdHRvbSBlZGdlKSBzbyB0aGV5IHJlYWQgYXMgY2FydmVkIGludG8gdGhlIGRpc2MgcmF0aGVyIHRoYW4gc3R1Y2sgb24gaXRcbi5kaXNjQmFkZ2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAzNHB4O1xuICBoZWlnaHQ6IDM0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiBub25lO1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHotaW5kZXg6IDM7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlLCBmaWx0ZXIgMC4xNXMgZWFzZTtcblxuICAmOmhvdmVyIHtcbiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4xNSk7XG4gIH1cbiAgc3ZnIHtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG4gIH1cbn1cbi5kaXNjQmFkZ2VUb3Age1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSk7XG4gICY6YWN0aXZlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMC45Mik7XG4gIH1cbiAgJi5wdWxzZSB7XG4gICAgYW5pbWF0aW9uOiBiYWRnZVB1bHNlVG9wIDAuNHMgZWFzZTtcbiAgfVxufVxuLmRpc2NCYWRnZUJvdHRvbSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSArIDQ2cHgpKTtcbiAgJjphY3RpdmUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSArIDQ2cHgpKSBzY2FsZSgwLjkyKTtcbiAgfVxufVxuQGtleWZyYW1lcyBiYWRnZVB1bHNlVG9wIHtcbiAgMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMSk7IH1cbiAgNDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDEuMjgpOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMSk7IH1cbn1cbiJdfQ== */","import { useEffect, useRef } from \"react\";\n\nexport interface PointerPos {\n x: number;\n y: number;\n}\n\n/**\n * Wires a press-and-drag gesture onto `ref`: on pointerdown, calls `onMove`\n * immediately with the pointer position, then keeps calling it on every\n * pointermove (tracked via window listeners, so the drag continues even once\n * the pointer leaves the element) until pointerup, when `onEnd` fires once.\n *\n * `onDraggingChange` is optional and only used to let the caller suppress CSS\n * transitions while a drag is in progress (snappy 1:1 tracking instead of an\n * easing lag).\n */\nexport function usePointerDrag(\n ref: React.RefObject<Element | null>,\n onMove: (pos: PointerPos) => void,\n onEnd?: () => void,\n onDraggingChange?: (dragging: boolean) => void\n): void {\n // refs so the effect's event listeners always call the latest callbacks\n // without needing to re-attach on every render\n const onMoveRef = useRef(onMove);\n onMoveRef.current = onMove;\n const onEndRef = useRef(onEnd);\n onEndRef.current = onEnd;\n const onDraggingChangeRef = useRef(onDraggingChange);\n onDraggingChangeRef.current = onDraggingChange;\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n function pointerPos(e: PointerEvent): PointerPos {\n return { x: e.clientX, y: e.clientY };\n }\n\n function move(e: PointerEvent) {\n onMoveRef.current(pointerPos(e));\n }\n\n function up() {\n onDraggingChangeRef.current?.(false);\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n onEndRef.current?.();\n }\n\n function down(e: Event) {\n const pe = e as PointerEvent;\n pe.preventDefault();\n pe.stopPropagation();\n onDraggingChangeRef.current?.(true);\n onMoveRef.current(pointerPos(pe));\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n }\n\n el.addEventListener(\"pointerdown\", down);\n return () => {\n el.removeEventListener(\"pointerdown\", down);\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n };\n }, [ref]);\n}\n","import { useRef } from \"react\";\n\n/**\n * Takes a target angle in degrees (any range, typically re-derived fresh\n * each render from a 0-360 value like hue) and returns a CONTINUOUS angle\n * that always takes the shortest path to it -- so a CSS `transition` on\n * `rotate(${angle}deg)` sweeps a few degrees the short way instead of\n * jumping ~360deg the long way whenever the raw value wraps past 0/360\n * (e.g. hue going from 2deg to 358deg is a 4deg step backward, not a\n * 356deg step forward, but naively re-deriving `358` fresh every render\n * gives the transition no way to know that).\n */\nexport function useUnwrappedAngle(targetDeg: number): number {\n const continuousRef = useRef(targetDeg);\n\n const targetMod = ((targetDeg % 360) + 360) % 360;\n const currentMod = ((continuousRef.current % 360) + 360) % 360;\n let delta = targetMod - currentMod;\n if (delta > 180) delta -= 360;\n else if (delta < -180) delta += 360;\n\n continuousRef.current += delta;\n return continuousRef.current;\n}\n","export function hexToHsl(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [h * 360, s * 100, l * 100];\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return Math.round(255 * (ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)));\n };\n return { r: f(0), g: f(8), b: f(4) };\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rr = r / 255, gg = g / 255, bb = b / 255;\n const max = Math.max(rr, gg, bb);\n const min = Math.min(rr, gg, bb);\n const l = (max + min) / 2;\n let h = 0, s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rr: h = ((gg - bb) / d + (gg < bb ? 6 : 0)) / 6; break;\n case gg: h = ((bb - rr) / d + 2) / 6; break;\n case bb: h = ((rr - gg) / d + 4) / 6; break;\n }\n }\n return [h * 360, s * 100, l * 100];\n}\n\nfunction hslToRgba(h: number, s: number, l: number, alpha: number): string {\n const { r, g, b } = hslToRgb(h, s, l);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport interface AccentTokens {\n base: string;\n dot: string;\n track: string;\n ring: string;\n glow: string;\n light: string;\n}\n\nexport interface ColorValue {\n hex: string;\n hexa: string;\n hsl: string;\n hsla: string;\n rgb: string;\n rgba: string;\n h: number;\n s: number;\n l: number;\n a: number;\n}\n\nexport function buildColorValue(h: number, s: number, l: number, a: number): ColorValue {\n const { r, g, b } = hslToRgb(h, s, l);\n const hex = hslToHex(h, s, l);\n const alphaHex = Math.round(a * 255).toString(16).padStart(2, \"0\");\n const hR = Math.round(h), sR = Math.round(s), lR = Math.round(l);\n const aR = Math.round(a * 100) / 100;\n return {\n hex,\n hexa: `${hex}${alphaHex}`,\n hsl: `hsl(${hR}, ${sR}%, ${lR}%)`,\n hsla: `hsla(${hR}, ${sR}%, ${lR}%, ${aR})`,\n rgb: `rgb(${r}, ${g}, ${b})`,\n rgba: `rgba(${r}, ${g}, ${b}, ${aR})`,\n h, s, l, a,\n };\n}\n\nexport function deriveAccent(hex: string): AccentTokens {\n const [h, s, l] = hexToHsl(hex);\n return {\n base: hex,\n dot: hslToHex(h, s, Math.min(l + 12, 95)),\n track: hex,\n ring: hex,\n glow: hslToRgba(h, s, l, 0.3),\n light: hslToHex(h, Math.max(s - 20, 0), Math.min(l + 45, 96)),\n };\n}\n\nexport function accentToCssVars(\n tokens: AccentTokens,\n prefix: string\n): Record<string, string> {\n return {\n [`--${prefix}-accent`]: tokens.base,\n [`--${prefix}-accent-dot`]: tokens.dot,\n [`--${prefix}-accent-track`]: tokens.track,\n [`--${prefix}-accent-ring`]: tokens.ring,\n [`--${prefix}-accent-glow`]: tokens.glow,\n [`--${prefix}-accent-light`]: tokens.light,\n };\n}\n","// Pure color-space conversions and small numeric helpers. No DOM, no React --\n// safe to unit test in isolation.\n\nexport interface Hsv {\n h: number; // 0-360\n s: number; // 0-100\n v: number; // 0-100\n}\n\nexport interface Rgb {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n}\n\nexport function hsvToRgb(h: number, s: number, v: number): Rgb {\n s /= 100;\n v /= 100;\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n let r: number, g: number, b: number;\n if (h < 60) { r = c; g = x; b = 0; }\n else if (h < 120) { r = x; g = c; b = 0; }\n else if (h < 180) { r = 0; g = c; b = x; }\n else if (h < 240) { r = 0; g = x; b = c; }\n else if (h < 300) { r = x; g = 0; b = c; }\n else { r = c; g = 0; b = x; }\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n}\n\nexport function rgbToHsv(r: number, g: number, b: number): Hsv {\n r /= 255; g /= 255; b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === r) h = ((g - b) / d) % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n const s = max === 0 ? 0 : d / max;\n return { h, s: s * 100, v: max * 100 };\n}\n\nfunction toHexByte(n: number): string {\n const h = Math.max(0, Math.min(255, Math.round(n))).toString(16);\n return h.length === 1 ? \"0\" + h : h;\n}\n\nexport function rgbToHex(c: Rgb): string {\n return (\"#\" + toHexByte(c.r) + toHexByte(c.g) + toHexByte(c.b)).toUpperCase();\n}\n\n/** hsv + alpha (0-1) -> \"#RRGGBB\" or \"#RRGGBBAA\" (alpha channel only appended when < 1) */\nexport function hsvaToHex(hsv: Hsv, a: number): string {\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n let hex = rgbToHex(rgb);\n if (a < 1) hex += toHexByte(Math.round(a * 255));\n return hex;\n}\n\n/** \"#RGB\" / \"#RRGGBB\" / \"#RRGGBBAA\" (with or without leading #) -> hsv + alpha, or null if unparseable */\nexport function hexToHsva(input: string): { hsv: Hsv; a: number } | null {\n let clean = input.trim().replace(/^#/, \"\");\n if (/^[0-9a-fA-F]{3}$/.test(clean)) {\n clean = clean.split(\"\").map((ch) => ch + ch).join(\"\");\n }\n if (!/^[0-9a-fA-F]{6}$/.test(clean) && !/^[0-9a-fA-F]{8}$/.test(clean)) return null;\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const a = clean.length === 8 ? parseInt(clean.slice(6, 8), 16) / 255 : 1;\n return { hsv: rgbToHsv(r, g, b), a };\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\n}\n\nexport function round2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\n/** shortest distance between two angles on a 0-360 circle */\nexport function angleDistance(a: number, b: number): number {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/** relative luminance (0-1), used to pick light/dark text or icon color against a background */\nexport function relativeLuminance(c: Rgb): number {\n return (0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b) / 255;\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport styles from \"./ColorWheel.module.scss\";\nimport { usePointerDrag } from \"./usePointerDrag\";\nimport { useUnwrappedAngle } from \"./useUnwrappedAngle\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\nimport {\n angleDistance,\n clamp,\n hexToHsva,\n hsvToRgb,\n hsvaToHex,\n relativeLuminance,\n rgbToHex,\n round2,\n type Hsv,\n} from \"./colorMath\";\n\nexport type ColorWheelMode = \"h\" | \"s\" | \"v\" | \"a\";\nexport type ColorWheelAlphaMode = \"arc\" | \"ring\";\nexport type ColorWheelTheme = \"light\" | \"dark\" | \"system\";\n\nexport interface ColorWheelProps {\n /** current color, as \"#RRGGBB\" or \"#RRGGBBAA\" */\n value: string;\n /** called with the next hex value on every interaction (drag, wheel, paste, eyedropper, picking a favorite) */\n onChange: (hex: string) => void;\n /** favorite hex swatches, rendered above the ring. Omit to hide the row entirely. */\n favorites?: string[];\n /** called with the full next list when the user saves the current color (the \"+\" badge) -- this component holds no favorites state of its own */\n onFavoritesChange?: (favorites: string[]) => void;\n /** caps how many favorites the \"+\" badge will keep (oldest dropped first). Only enforced on the list this component hands back -- a longer list you pass in is rendered as-is. */\n maxFavorites?: number;\n /**\n * Master switch: is alpha adjustable in the UI at all? true (default):\n * yes, via whichever scheme `alphaMode` picks. false: no alpha UI\n * whatsoever -- no arc, no \"A\" in the ring toggle -- though a translucent\n * `value` passed in is still honored, just not editable.\n */\n showAlphaControl?: boolean;\n /**\n * Only matters when `showAlphaControl` is true. 'arc' (default): a 3-way\n * H/S/V ring, alpha adjusted via the curved arc outside it. 'ring': a\n * 4-way H/S/V/A ring handles alpha itself, and the (now redundant) arc is\n * hidden. Mutually exclusive schemes, not two controls active at once.\n */\n alphaMode?: ColorWheelAlphaMode;\n /** 'system' (default) follows prefers-color-scheme; 'light'/'dark' pins it */\n theme?: ColorWheelTheme;\n /**\n * Uniform scale factor, 1 (default) = the design size (272px ring). Applied\n * as a CSS transform, so all the drag/wheel hit-testing (already measured\n * live via getBoundingClientRect, not hardcoded pixels) keeps working\n * unchanged at any size. Note this does NOT shrink the component's actual\n * DOM footprint to match -- it already visually bleeds past its own box at\n * scale 1 (the ring/arc extend beyond it), so a container you size and\n * position yourself is still expected, same as today.\n */\n size?: number;\n /** custom accent color (hex) -- overrides the global theme's primary color for this instance */\n accent?: string;\n className?: string;\n}\n\nconst RING_SPECTRUM =\n \"conic-gradient(from 180deg, hsl(0 100% 50%) 0%, hsl(60 100% 50%) 16.667%, \" +\n \"hsl(120 100% 50%) 33.333%, hsl(180 100% 50%) 50%, hsl(240 100% 50%) 66.667%, \" +\n \"hsl(300 100% 50%) 83.333%, hsl(360 100% 50%) 100%)\";\n\n// hue ring geometry (272px design size)\nconst RING_INNER_FRAC = 0.3382; // hole radius -- clicks inside go to the disc\nconst RING_OUTER_FRAC = 0.5; // ring's outer edge -- ignore clicks past it\n// mid-band handle radius (0.4191 * 272px stage ≈ 114px) is hardcoded directly\n// in ColorWheel.module.scss (.hueHandle's `top`), since the handle is now\n// positioned via a rotated pivot rather than a computed top/left percentage\n\n// alpha arc geometry (380px design size). Angles use the SAME convention as\n// the hue ring: a \"logical\" angle straight out of atan2(dy,dx), with\n// physical angle-from-top = 90deg + logical angle.\nconst ARC_A0 = 30;\nconst ARC_A1 = 150;\nconst ARC_HANDLE_R_FRAC = 152 / 380;\n\n// .picker's own height -- SCSS can't react to `arcVisible`, so it's set\n// inline instead. With the arc showing, reserve down to its visible crescent\n// (this value is chosen to match the arc's clipped band + handle, empirically\n// -- see the $arcPath comment in ColorWheel.module.scss). With it hidden,\n// shrink back to the ring's own real bottom edge (.stage's `top: -48px` +\n// `height: 272px` in the same file) so a consumer measuring .picker's box\n// (hit-testing, backdrops) doesn't get dead space below the ring.\nconst PICKER_HEIGHT_WITH_ARC = 265;\nconst PICKER_HEIGHT_NO_ARC = 224;\n\n// .recents' content width (excludes its own padding, see .recents in the\n// SCSS) -- set explicitly (instead of left to shrink-to-fit) so a change in\n// chip count is a `width` transition rather than an instant snap\nconst CHIP_SIZE = 26;\nconst CHIP_GAP = 7;\nfunction recentsContentWidth(chipCount: number): number {\n return chipCount > 0 ? chipCount * CHIP_SIZE + (chipCount - 1) * CHIP_GAP : 0;\n}\n\nconst MODES_HSV: ColorWheelMode[] = [\"h\", \"s\", \"v\"];\nconst MODES_HSVA: ColorWheelMode[] = [\"h\", \"s\", \"v\", \"a\"];\n\nfunction ringGradient(mode: ColorWheelMode, hsv: Hsv): string {\n if (mode === \"s\") {\n const grey = rgbToHex(hsvToRgb(hsv.h, 0, hsv.v));\n const full = rgbToHex(hsvToRgb(hsv.h, 100, hsv.v));\n return `conic-gradient(from 180deg, ${grey} 0deg, ${full} 360deg)`;\n }\n if (mode === \"v\") {\n const bright = rgbToHex(hsvToRgb(hsv.h, hsv.s, 100));\n return `conic-gradient(from 180deg, #000000 0deg, ${bright} 360deg)`;\n }\n if (mode === \"a\") {\n // true CSS transparency (not a checkerboard) -- whatever sits behind the\n // ring (the ambient glow) shows through, same as the disc's own alpha fill\n const full = rgbToHex(hsvToRgb(hsv.h, hsv.s, hsv.v));\n return `conic-gradient(from 180deg, transparent 0deg, ${full} 360deg)`;\n }\n return RING_SPECTRUM;\n}\n\nconst EMPTY_FAVORITES: string[] = [];\n\nexport function ColorWheel({\n value,\n onChange,\n favorites = EMPTY_FAVORITES,\n onFavoritesChange,\n maxFavorites = 5,\n showAlphaControl = true,\n alphaMode = \"arc\",\n theme = \"system\",\n size = 1,\n accent,\n className,\n}: ColorWheelProps) {\n const ringIsFourWay = showAlphaControl && alphaMode === \"ring\";\n const arcVisible = showAlphaControl && alphaMode === \"arc\";\n const modes = ringIsFourWay ? MODES_HSVA : MODES_HSV;\n const parsed = useMemo(() => hexToHsva(value), [value]);\n const [hsv, setHsv] = useState<Hsv>(() => parsed?.hsv ?? { h: 0, s: 0, v: 100 });\n const [alpha, setAlpha] = useState<number>(() => parsed?.a ?? 1);\n const [mode, setMode] = useState<ColorWheelMode>(\"h\");\n const [dragging, setDragging] = useState(false);\n const [copied, setCopied] = useState(false);\n const [pulseFavorite, setPulseFavorite] = useState(false);\n const [editing, setEditing] = useState(false);\n const [editValue, setEditValue] = useState(\"\");\n const [eyedropperSupported, setEyedropperSupported] = useState(false);\n // hexes currently mid-exit-animation -- still rendered (and still counted\n // toward .recents' width) until their chipOut animation finishes, at which\n // point they're actually dropped via onFavoritesChange\n const [removingHexes, setRemovingHexes] = useState<Set<string>>(new Set());\n // starts at 0 so .recents' first paint has something for the width\n // `transition` to animate FROM -- flipped true a couple frames later (a\n // transition can't animate the very first value an element ever renders\n // with, only a change away from one already on screen)\n const [recentsGrown, setRecentsGrown] = useState(false);\n const recentsGrowRaf = useRef(0);\n useEffect(() => {\n recentsGrowRaf.current = requestAnimationFrame(() => {\n recentsGrowRaf.current = requestAnimationFrame(() => setRecentsGrown(true));\n });\n return () => cancelAnimationFrame(recentsGrowRaf.current);\n }, []);\n\n const accentVars = accent ? accentToCssVars(deriveAccent(accent), \"colorwheel\") : {};\n\n // keep internal hsv/alpha in sync when `value` changes from OUTSIDE this\n // component -- but not when the change was our own onChange echoing back\n // through a controlled parent, or every keystroke of a drag would fight\n // the render.\n const lastEmitted = useRef(value);\n useEffect(() => {\n if (value === lastEmitted.current) return;\n const next = hexToHsva(value);\n if (next) {\n setHsv(next.hsv);\n setAlpha(next.a);\n }\n lastEmitted.current = value;\n }, [value]);\n\n useEffect(() => {\n setEyedropperSupported(typeof window !== \"undefined\" && \"EyeDropper\" in window);\n }, []);\n\n // if the props change out from under \"A\" while it happens to be selected\n // (alpha turned off, or switched to the arc scheme), fall back to hue\n // rather than leaving the ring stuck on a mode that no longer exists\n useEffect(() => {\n if (!ringIsFourWay && mode === \"a\") setMode(\"h\");\n }, [ringIsFourWay, mode]);\n\n const stageRef = useRef<HTMLDivElement>(null);\n const alphaArcRef = useRef<HTMLDivElement>(null);\n const modeToggleRef = useRef<HTMLDivElement>(null);\n const hexInputRef = useRef<HTMLInputElement>(null);\n\n function commit(nextHsv: Hsv, nextAlpha: number) {\n setHsv(nextHsv);\n setAlpha(nextAlpha);\n const hex = hsvaToHex(nextHsv, nextAlpha);\n lastEmitted.current = hex;\n onChange(hex);\n }\n\n // ---------------- derived, per-render ----------------\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n const solidHex = rgbToHex(rgb);\n const hexString = hsvaToHex(hsv, alpha);\n const luminance = relativeLuminance(rgb);\n const isLight = luminance > 0.58;\n const discText = isLight ? \"#1A1913\" : \"#FFFFFF\";\n const badgeBg = isLight ? \"rgba(0,0,0,0.02)\" : \"rgba(255,255,255,0.03)\";\n const badgeGrooveDark = isLight ? \"rgba(0,0,0,0.2)\" : \"rgba(0,0,0,0.32)\";\n const badgeGrooveLight = isLight ? \"rgba(255,255,255,0.35)\" : \"rgba(255,255,255,0.12)\";\n const badgeIcon = isLight ? \"rgba(0,0,0,0.72)\" : \"rgba(255,255,255,0.88)\";\n const badgeShadow: CSSProperties = {\n background: badgeBg,\n color: badgeIcon,\n boxShadow: `inset 0 1px 1px ${badgeGrooveDark}, inset 0 -1px 1px ${badgeGrooveLight}`,\n };\n\n // The handle's transform animates a ROTATION (not a top/left position) so\n // that switching mode -- which can jump the angle to the opposite side of\n // the ring -- sweeps along the circumference instead of interpolating a\n // straight line (a chord) through the middle of the ring.\n const ringLogicalAngle =\n mode === \"h\" ? hsv.h : mode === \"a\" ? alpha * 360 : ((mode === \"s\" ? hsv.s : hsv.v) / 100) * 360;\n // hue wraps freely (it's cyclic -- 0deg and 360deg are the same color), but\n // re-deriving it fresh in 0-360 every render means crossing that seam would\n // otherwise animate ~356deg the \"long way\" instead of a few degrees the\n // short way. This smooths it to always take the short path.\n const ringAngleFromTopDeg = useUnwrappedAngle(180 + ringLogicalAngle);\n\n // pixel offsets from the shared anchor point (NOT a percentage of the\n // handle's own containing block -- .alphaArcHandle is a sibling of\n // .alphaArc, anchored the same way the mode toggle is, not sized to the\n // arc's 380px coordinate space)\n const arcLogicalAngle = ARC_A1 - alpha * (ARC_A1 - ARC_A0);\n const arcAngleFromTop = (90 + arcLogicalAngle) * (Math.PI / 180);\n const arcHandleR = ARC_HANDLE_R_FRAC * 380;\n const arcHandleDx = arcHandleR * Math.sin(arcAngleFromTop);\n const arcHandleDy = -arcHandleR * Math.cos(arcAngleFromTop);\n\n // ---------------- ring: drag + wheel ----------------\n function applyRingAngle(angle: number) {\n if (mode === \"h\") commit({ ...hsv, h: angle }, alpha);\n else if (mode === \"s\") commit({ ...hsv, s: (angle / 360) * 100 }, alpha);\n else if (mode === \"a\") commit(hsv, angle / 360);\n else commit({ ...hsv, v: (angle / 360) * 100 }, alpha);\n }\n\n // Hue wraps freely when dragged all the way around (0deg and 360deg are the\n // same color, so there's nothing to \"stop\" at). S/V/A are linear 0-100%\n // quantities with real endpoints, though -- dragging past the seam should\n // pin at 0%/100%, not wrap to the other end. Since a single pointer sample\n // only gives a raw 0-360deg reading (angle wraps are indistinguishable from\n // \"moved to the far side\"), these two refs track the PREVIOUS sample and an\n // unclamped running total for the current gesture, so each step is read as\n // a small delta (shortest-path) rather than an absolute position -- and\n // that running total is what gets clamped, not the raw angle.\n const dragPrevAngleRef = useRef<number | null>(null);\n const dragAccumRef = useRef(0);\n\n usePointerDrag(\n stageRef,\n (pos) => {\n const rect = stageRef.current!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dx = pos.x - cx;\n const dy = pos.y - cy;\n const dist = Math.hypot(dx, dy);\n if (dist < rect.width * RING_INNER_FRAC || dist > rect.width * RING_OUTER_FRAC) return;\n // inverse of the render-time mapping (physical angle = 180deg + logical\n // angle): atan2 gives (physical - 90), so subtract another 90 to undo it\n let angle = Math.atan2(dy, dx) * (180 / Math.PI) - 90;\n angle = ((angle % 360) + 360) % 360;\n\n if (mode === \"h\") {\n applyRingAngle(angle);\n return;\n }\n\n if (dragPrevAngleRef.current === null) {\n dragAccumRef.current = angle;\n } else {\n let delta = angle - dragPrevAngleRef.current;\n if (delta > 180) delta -= 360;\n else if (delta < -180) delta += 360;\n dragAccumRef.current = clamp(dragAccumRef.current + delta, 0, 360);\n }\n dragPrevAngleRef.current = angle;\n applyRingAngle(dragAccumRef.current);\n },\n undefined,\n (dragging) => {\n if (!dragging) dragPrevAngleRef.current = null;\n setDragging(dragging);\n }\n );\n\n useEffect(() => {\n const el = stageRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n const rect = el!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dist = Math.hypot(e.clientX - cx, e.clientY - cy);\n if (dist < rect.width * RING_INNER_FRAC || dist > rect.width * RING_OUTER_FRAC) return;\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n if (mode === \"h\") commit({ ...hsv, h: (hsv.h + dir * 4 + 360) % 360 }, alpha);\n else if (mode === \"s\") commit({ ...hsv, s: clamp(hsv.s + dir * 3, 0, 100) }, alpha);\n else if (mode === \"a\") commit(hsv, clamp(round2(alpha + dir * 0.03), 0, 1));\n else commit({ ...hsv, v: clamp(hsv.v + dir * 3, 0, 100) }, alpha);\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [mode, hsv, alpha]);\n\n // ---------------- alpha arc: drag + wheel ----------------\n usePointerDrag(\n alphaArcRef,\n (pos) => {\n const rect = alphaArcRef.current!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n let angle = Math.atan2(pos.y - cy, pos.x - cx) * (180 / Math.PI);\n if (angle < 0) angle += 360;\n if (angle < ARC_A0 || angle > ARC_A1) {\n angle = angleDistance(angle, ARC_A0) < angleDistance(angle, ARC_A1) ? ARC_A0 : ARC_A1;\n }\n commit(hsv, round2((ARC_A1 - angle) / (ARC_A1 - ARC_A0)));\n },\n undefined,\n setDragging\n );\n\n useEffect(() => {\n const el = alphaArcRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n commit(hsv, clamp(round2(alpha + dir * 0.05), 0, 1));\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [hsv, alpha]);\n\n // ---------------- mode toggle ----------------\n useEffect(() => {\n const el = modeToggleRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const idx = modes.indexOf(mode);\n const dir = e.deltaY > 0 ? -1 : 1;\n setMode(modes[clamp(idx + dir, 0, modes.length - 1)]);\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [mode, modes]);\n\n // ---------------- disc: copy on click, edit on click of the hex text ----------------\n function handleDiscClick() {\n const done = () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 900);\n };\n if (navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(hexString).then(done, done);\n } else {\n done();\n }\n }\n\n function beginEdit(e: React.MouseEvent) {\n e.stopPropagation();\n setEditValue(hexString);\n setEditing(true);\n requestAnimationFrame(() => {\n hexInputRef.current?.focus();\n hexInputRef.current?.setSelectionRange(1, hexString.length);\n });\n }\n\n function commitEdit(cancelled: boolean) {\n if (!cancelled) {\n const next = hexToHsva(editValue);\n if (next) commit(next.hsv, next.a);\n }\n setEditing(false);\n }\n\n // ---------------- eyedropper ----------------\n function pickFromScreen() {\n // @ts-expect-error -- EyeDropper isn't in lib.dom.d.ts yet\n const dropper = new window.EyeDropper();\n dropper\n .open()\n .then((result: { sRGBHex: string }) => {\n const next = hexToHsva(result.sRGBHex);\n if (next) commit(next.hsv, next.a);\n })\n .catch(() => {});\n }\n\n // ---------------- favorites ----------------\n function saveFavorite() {\n const next = [hexString, ...favorites.filter((h) => h !== hexString)].slice(0, maxFavorites);\n onFavoritesChange?.(next);\n setPulseFavorite(false);\n requestAnimationFrame(() => setPulseFavorite(true));\n }\n\n function applyFavorite(hex: string) {\n const next = hexToHsva(hex);\n if (next) commit(next.hsv, next.a);\n }\n\n function removeFavorite(hex: string) {\n // don't drop it from the list yet -- just mark it as leaving, so it stays\n // mounted (and .recents stays at its current width) through the chipOut\n // animation. handleChipRemoveEnd does the actual removal once it's done.\n setRemovingHexes((prev) => new Set(prev).add(hex));\n }\n\n function handleChipRemoveEnd(hex: string) {\n setRemovingHexes((prev) => {\n if (!prev.has(hex)) return prev;\n const next = new Set(prev);\n next.delete(hex);\n return next;\n });\n onFavoritesChange?.(favorites.filter((h) => h !== hex));\n }\n\n return (\n <div\n className={[styles.root, className].filter(Boolean).join(\" \")}\n data-theme={theme === \"system\" ? undefined : theme}\n data-dragging={dragging ? \"true\" : undefined}\n style={{\n ...accentVars,\n ...(size !== 1 ? { transform: `scale(${size})`, transformOrigin: \"top center\" } : undefined),\n } as React.CSSProperties}\n >\n {/* Reserved whenever the favorites feature is actually wired up (there's\n an onFavoritesChange to call), not just when there's currently\n something in it -- so the ring/toggle below never shift position as\n presets are added or removed. Empty is just visually hidden\n (.recentsEmpty), the box footprint stays. A read-only preset list\n (favorites passed without onFavoritesChange, so it can never change\n at runtime) only needs the slot while it's non-empty. */}\n {(favorites.length > 0 || onFavoritesChange) && (\n <div\n className={[styles.recents, favorites.length === 0 ? styles.recentsEmpty : \"\"].join(\" \")}\n style={{ width: recentsGrown ? recentsContentWidth(favorites.length) : 0 }}\n >\n {favorites.map((hex, i) => (\n // keyed by hex alone (not index) so an add/remove -- which\n // shifts every other item's index -- doesn't remount and replay\n // the entrance animation on chips that were already there; only\n // a genuinely new hex mounts fresh and animates in\n <div\n key={hex}\n className={[styles.chipWrap, removingHexes.has(hex) ? styles.chipWrapRemoving : \"\"].join(\" \")}\n style={{ animationDelay: removingHexes.has(hex) ? undefined : `${i * 0.05}s` }}\n onAnimationEnd={(e) => {\n if (e.target === e.currentTarget && e.animationName.includes(\"chipOut\")) handleChipRemoveEnd(hex);\n }}\n >\n <button\n type=\"button\"\n className={styles.chip}\n style={{ background: hex.length > 7 ? hex.slice(0, 7) : hex }}\n title={hex}\n aria-label={`Apply color ${hex}`}\n onClick={() => applyFavorite(hex)}\n />\n <button\n type=\"button\"\n className={styles.chipRemove}\n aria-label={`Remove ${hex} from favorites`}\n onClick={(e) => {\n e.stopPropagation();\n removeFavorite(hex);\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={3} strokeLinecap=\"round\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.picker} style={{ height: arcVisible ? PICKER_HEIGHT_WITH_ARC : PICKER_HEIGHT_NO_ARC }}>\n <div\n className={styles.glow}\n style={{ background: `radial-gradient(closest-side, ${solidHex}, transparent 72%)` }}\n />\n\n <div\n className={styles.modeToggle}\n ref={modeToggleRef}\n style={{ width: modes.length * 28, gridTemplateColumns: `repeat(${modes.length}, 1fr)` }}\n >\n <div\n className={styles.modePill}\n style={{\n width: `calc(${100 / modes.length}% - 2px)`,\n transform: `translateX(calc(${modes.indexOf(mode)} * (100% + 1px)))`,\n }}\n />\n {modes.map((m) => (\n <button\n key={m}\n type=\"button\"\n className={[styles.modeButton, mode === m ? styles.active : \"\"].join(\" \")}\n onClick={() => setMode(m)}\n >\n {m.toUpperCase()}\n </button>\n ))}\n </div>\n\n <div className={styles.stage} ref={stageRef}>\n <div className={styles.stageShadow} />\n <div className={styles.ring} style={{ background: ringGradient(mode, hsv) }} />\n\n <div className={styles.currentDisc} onClick={handleDiscClick}>\n <div className={styles.discFill} style={{ background: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})` }} />\n {!editing && (\n <span className={[styles.currentHex, copied ? styles.copied : \"\"].join(\" \")} style={{ color: discText }} onClick={beginEdit}>\n {copied ? \"Copied\" : hexString}\n </span>\n )}\n {editing && (\n <input\n ref={hexInputRef}\n className={styles.currentHexInput}\n style={{ color: discText }}\n type=\"text\"\n inputMode=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={9}\n value={editValue}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") hexInputRef.current?.blur();\n else if (e.key === \"Escape\") {\n commitEdit(true);\n }\n }}\n onBlur={() => commitEdit(false)}\n />\n )}\n </div>\n\n {eyedropperSupported && (\n <button\n type=\"button\"\n className={[styles.discBadge, styles.discBadgeBottom].join(\" \")}\n style={badgeShadow}\n aria-label=\"Pick color from screen\"\n onClick={pickFromScreen}\n >\n <svg viewBox=\"0 0 32 32\" fill=\"currentColor\">\n <path d=\"M27.7,3.3c-1.5-1.5-3.9-1.5-5.4,0L17,8.6l-1.3-1.3c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l1.3,1.3L5,20.6c-0.6,0.6-1,1.4-1.1,2.3C3.3,23.4,3,24.2,3,25c0,1.7,1.3,3,3,3c0.8,0,1.6-0.3,2.2-0.9C9,27,9.8,26.6,10.4,26L21,15.4l1.3,1.3c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3c0.4-0.4,0.4-1,0-1.4L22.4,14l5.3-5.3C29.2,7.2,29.2,4.8,27.7,3.3z M9,24.6c-0.4,0.4-0.8,0.6-1.3,0.5c-0.4,0-0.7,0.2-0.9,0.5C6.7,25.8,6.3,26,6,26c-0.6,0-1-0.4-1-1c0-0.3,0.2-0.7,0.5-0.8c0.3-0.2,0.5-0.5,0.5-0.9c0-0.5,0.2-1,0.5-1.3L17,11.4l2.6,2.6L9,24.6z\" />\n </svg>\n </button>\n )}\n <button\n type=\"button\"\n className={[styles.discBadge, styles.discBadgeTop, pulseFavorite ? styles.pulse : \"\"].join(\" \")}\n style={badgeShadow}\n aria-label=\"Save current color to favorites\"\n onClick={saveFavorite}\n onAnimationEnd={() => setPulseFavorite(false)}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n\n <div className={styles.hueHandlePivot} style={{ transform: `translate(-50%, -50%) rotate(${ringAngleFromTopDeg}deg)` }}>\n <div className={styles.hueHandle} style={{ background: solidHex }} />\n </div>\n </div>\n\n {/* Two mutually exclusive schemes: 3-way ring (H/S/V) + this arc\n handles alpha, OR 4-way ring (H/S/V/A) handles all four and the\n arc is redundant -- not \"hide only while mode is literally A\".\n Kept mounted (never conditionally unmounted) even when hidden --\n the drag/wheel listeners are attached to these DOM nodes directly,\n and unmounting+remounting would silently drop them since the\n effects that attach them don't depend on the element re-mounting.\n display:none/contents just toggles visibility + interactivity. */}\n <div style={{ display: arcVisible ? \"contents\" : \"none\" }}>\n <div className={styles.alphaArcShadowWrap}>\n <div className={styles.alphaArcShadow} />\n </div>\n <div className={styles.alphaArc} ref={alphaArcRef}>\n <div\n className={styles.alphaArcFill}\n style={{ background: `conic-gradient(from 90deg, ${solidHex} 30deg, transparent 150deg)` }}\n />\n </div>\n <div className={[styles.alphaArcCap, styles.alphaArcCapStart].join(\" \")} style={{ background: solidHex }} />\n <div className={[styles.alphaArcCap, styles.alphaArcCapEnd].join(\" \")} />\n <div\n className={styles.alphaArcHandle}\n style={{\n transform: `translate(calc(-50% + ${arcHandleDx}px), calc(-50% + ${arcHandleDy}px))`,\n background: solidHex,\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -112,12 +112,21 @@
112
112
  border-radius: 999px;
113
113
  padding: 5px 8px;
114
114
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.14), var(--shadow-soft);
115
+ transition: width 0.25s ease;
116
+ }
117
+ .ColorWheel_module_recentsEmpty2 {
118
+ background: transparent;
119
+ box-shadow: none;
115
120
  }
116
121
  .ColorWheel_module_chipWrap2 {
117
122
  position: relative;
118
123
  flex: none;
119
124
  animation: ColorWheel_module_chipIn2 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) both;
120
125
  }
126
+ .ColorWheel_module_chipWrapRemoving2 {
127
+ animation: ColorWheel_module_chipOut2 0.22s cubic-bezier(0.4, 0, 1, 1) both;
128
+ pointer-events: none;
129
+ }
121
130
  .ColorWheel_module_chip2 {
122
131
  width: 26px;
123
132
  height: 26px;
@@ -182,6 +191,16 @@
182
191
  opacity: 1;
183
192
  }
184
193
  }
194
+ @keyframes ColorWheel_module_chipOut2 {
195
+ 0% {
196
+ transform: scale(1) rotate(0);
197
+ opacity: 1;
198
+ }
199
+ 100% {
200
+ transform: scale(0) rotate(18deg);
201
+ opacity: 0;
202
+ }
203
+ }
185
204
  .ColorWheel_module_picker2 {
186
205
  position: relative;
187
206
  margin-top: 96px;