source dump of claude code
at main 265 lines 25 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import React, { useCallback, useEffect, useRef } from 'react'; 3import { Box, Text } from '../ink.js'; 4import { isMaxSubscriber, isProSubscriber, isTeamSubscriber } from '../utils/auth.js'; 5import { getGlobalConfig, saveGlobalConfig } from '../utils/config.js'; 6import type { EffortLevel } from '../utils/effort.js'; 7import { convertEffortValueToLevel, getDefaultEffortForModel, getOpusDefaultEffortConfig, toPersistableEffort } from '../utils/effort.js'; 8import { parseUserSpecifiedModel } from '../utils/model/model.js'; 9import { updateSettingsForSource } from '../utils/settings/settings.js'; 10import type { OptionWithDescription } from './CustomSelect/select.js'; 11import { Select } from './CustomSelect/select.js'; 12import { effortLevelToSymbol } from './EffortIndicator.js'; 13import { PermissionDialog } from './permissions/PermissionDialog.js'; 14type EffortCalloutSelection = EffortLevel | undefined | 'dismiss'; 15type Props = { 16 model: string; 17 onDone: (selection: EffortCalloutSelection) => void; 18}; 19const AUTO_DISMISS_MS = 30_000; 20export function EffortCallout(t0) { 21 const $ = _c(18); 22 const { 23 model, 24 onDone 25 } = t0; 26 let t1; 27 if ($[0] === Symbol.for("react.memo_cache_sentinel")) { 28 t1 = getOpusDefaultEffortConfig(); 29 $[0] = t1; 30 } else { 31 t1 = $[0]; 32 } 33 const defaultEffortConfig = t1; 34 const onDoneRef = useRef(onDone); 35 let t2; 36 if ($[1] !== onDone) { 37 t2 = () => { 38 onDoneRef.current = onDone; 39 }; 40 $[1] = onDone; 41 $[2] = t2; 42 } else { 43 t2 = $[2]; 44 } 45 useEffect(t2); 46 let t3; 47 if ($[3] === Symbol.for("react.memo_cache_sentinel")) { 48 t3 = () => { 49 onDoneRef.current("dismiss"); 50 }; 51 $[3] = t3; 52 } else { 53 t3 = $[3]; 54 } 55 const handleCancel = t3; 56 let t4; 57 if ($[4] === Symbol.for("react.memo_cache_sentinel")) { 58 t4 = []; 59 $[4] = t4; 60 } else { 61 t4 = $[4]; 62 } 63 useEffect(_temp, t4); 64 let t5; 65 let t6; 66 if ($[5] === Symbol.for("react.memo_cache_sentinel")) { 67 t5 = () => { 68 const timeoutId = setTimeout(handleCancel, AUTO_DISMISS_MS); 69 return () => clearTimeout(timeoutId); 70 }; 71 t6 = [handleCancel]; 72 $[5] = t5; 73 $[6] = t6; 74 } else { 75 t5 = $[5]; 76 t6 = $[6]; 77 } 78 useEffect(t5, t6); 79 let t7; 80 if ($[7] !== model) { 81 const defaultEffort = getDefaultEffortForModel(model); 82 t7 = defaultEffort ? convertEffortValueToLevel(defaultEffort) : "high"; 83 $[7] = model; 84 $[8] = t7; 85 } else { 86 t7 = $[8]; 87 } 88 const defaultLevel = t7; 89 let t8; 90 if ($[9] !== defaultLevel) { 91 t8 = value => { 92 const effortLevel = value === defaultLevel ? undefined : value; 93 updateSettingsForSource("userSettings", { 94 effortLevel: toPersistableEffort(effortLevel) 95 }); 96 onDoneRef.current(value); 97 }; 98 $[9] = defaultLevel; 99 $[10] = t8; 100 } else { 101 t8 = $[10]; 102 } 103 const handleSelect = t8; 104 let t9; 105 if ($[11] === Symbol.for("react.memo_cache_sentinel")) { 106 t9 = [{ 107 label: <EffortOptionLabel level="medium" text="Medium (recommended)" />, 108 value: "medium" 109 }, { 110 label: <EffortOptionLabel level="high" text="High" />, 111 value: "high" 112 }, { 113 label: <EffortOptionLabel level="low" text="Low" />, 114 value: "low" 115 }]; 116 $[11] = t9; 117 } else { 118 t9 = $[11]; 119 } 120 const options = t9; 121 let t10; 122 if ($[12] === Symbol.for("react.memo_cache_sentinel")) { 123 t10 = <Box marginBottom={1} flexDirection="column"><Text>{defaultEffortConfig.dialogDescription}</Text></Box>; 124 $[12] = t10; 125 } else { 126 t10 = $[12]; 127 } 128 let t11; 129 if ($[13] === Symbol.for("react.memo_cache_sentinel")) { 130 t11 = <EffortIndicatorSymbol level="low" />; 131 $[13] = t11; 132 } else { 133 t11 = $[13]; 134 } 135 let t12; 136 if ($[14] === Symbol.for("react.memo_cache_sentinel")) { 137 t12 = <EffortIndicatorSymbol level="medium" />; 138 $[14] = t12; 139 } else { 140 t12 = $[14]; 141 } 142 let t13; 143 if ($[15] === Symbol.for("react.memo_cache_sentinel")) { 144 t13 = <Box marginBottom={1}><Text dimColor={true}>{t11} low {"\xB7"}{" "}{t12} medium {"\xB7"}{" "}<EffortIndicatorSymbol level="high" /> high</Text></Box>; 145 $[15] = t13; 146 } else { 147 t13 = $[15]; 148 } 149 let t14; 150 if ($[16] !== handleSelect) { 151 t14 = <PermissionDialog title={defaultEffortConfig.dialogTitle}><Box flexDirection="column" paddingX={2} paddingY={1}>{t10}{t13}<Select options={options} onChange={handleSelect} onCancel={handleCancel} /></Box></PermissionDialog>; 152 $[16] = handleSelect; 153 $[17] = t14; 154 } else { 155 t14 = $[17]; 156 } 157 return t14; 158} 159function _temp() { 160 markV2Dismissed(); 161} 162function EffortIndicatorSymbol(t0) { 163 const $ = _c(4); 164 const { 165 level 166 } = t0; 167 let t1; 168 if ($[0] !== level) { 169 t1 = effortLevelToSymbol(level); 170 $[0] = level; 171 $[1] = t1; 172 } else { 173 t1 = $[1]; 174 } 175 let t2; 176 if ($[2] !== t1) { 177 t2 = <Text color="suggestion">{t1}</Text>; 178 $[2] = t1; 179 $[3] = t2; 180 } else { 181 t2 = $[3]; 182 } 183 return t2; 184} 185function EffortOptionLabel(t0) { 186 const $ = _c(5); 187 const { 188 level, 189 text 190 } = t0; 191 let t1; 192 if ($[0] !== level) { 193 t1 = <EffortIndicatorSymbol level={level} />; 194 $[0] = level; 195 $[1] = t1; 196 } else { 197 t1 = $[1]; 198 } 199 let t2; 200 if ($[2] !== t1 || $[3] !== text) { 201 t2 = <>{t1} {text}</>; 202 $[2] = t1; 203 $[3] = text; 204 $[4] = t2; 205 } else { 206 t2 = $[4]; 207 } 208 return t2; 209} 210 211/** 212 * Check whether to show the effort callout. 213 * 214 * Audience: 215 * - Pro: already had medium default; show unless they saw v1 (effortCalloutDismissed) 216 * - Max/Team: getting medium via tengu_grey_step2 config; show when enabled 217 * - Everyone else: mark as dismissed so it never shows 218 */ 219export function shouldShowEffortCallout(model: string): boolean { 220 // Only show for Opus 4.6 for now 221 const parsed = parseUserSpecifiedModel(model); 222 if (!parsed.toLowerCase().includes('opus-4-6')) { 223 return false; 224 } 225 const config = getGlobalConfig(); 226 if (config.effortCalloutV2Dismissed) return false; 227 228 // Don't show to brand-new users — they never knew the old default, so this 229 // isn't a change for them. Mark as dismissed so it stays suppressed. 230 if (config.numStartups <= 1) { 231 markV2Dismissed(); 232 return false; 233 } 234 235 // Pro users already had medium default before this PR. Show the new copy, 236 // but skip if they already saw the v1 dialog — no point nagging twice. 237 if (isProSubscriber()) { 238 if (config.effortCalloutDismissed) { 239 markV2Dismissed(); 240 return false; 241 } 242 return getOpusDefaultEffortConfig().enabled; 243 } 244 245 // Max/Team are the target of the tengu_grey_step2 config. 246 // Don't mark dismissed when config is disabled — they should see the dialog 247 // once it's enabled for them. 248 if (isMaxSubscriber() || isTeamSubscriber()) { 249 return getOpusDefaultEffortConfig().enabled; 250 } 251 252 // Everyone else (free tier, API key, non-subscribers): not in scope. 253 markV2Dismissed(); 254 return false; 255} 256function markV2Dismissed(): void { 257 saveGlobalConfig(current => { 258 if (current.effortCalloutV2Dismissed) return current; 259 return { 260 ...current, 261 effortCalloutV2Dismissed: true 262 }; 263 }); 264} 265//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlUmVmIiwiQm94IiwiVGV4dCIsImlzTWF4U3Vic2NyaWJlciIsImlzUHJvU3Vic2NyaWJlciIsImlzVGVhbVN1YnNjcmliZXIiLCJnZXRHbG9iYWxDb25maWciLCJzYXZlR2xvYmFsQ29uZmlnIiwiRWZmb3J0TGV2ZWwiLCJjb252ZXJ0RWZmb3J0VmFsdWVUb0xldmVsIiwiZ2V0RGVmYXVsdEVmZm9ydEZvck1vZGVsIiwiZ2V0T3B1c0RlZmF1bHRFZmZvcnRDb25maWciLCJ0b1BlcnNpc3RhYmxlRWZmb3J0IiwicGFyc2VVc2VyU3BlY2lmaWVkTW9kZWwiLCJ1cGRhdGVTZXR0aW5nc0ZvclNvdXJjZSIsIk9wdGlvbldpdGhEZXNjcmlwdGlvbiIsIlNlbGVjdCIsImVmZm9ydExldmVsVG9TeW1ib2wiLCJQZXJtaXNzaW9uRGlhbG9nIiwiRWZmb3J0Q2FsbG91dFNlbGVjdGlvbiIsIlByb3BzIiwibW9kZWwiLCJvbkRvbmUiLCJzZWxlY3Rpb24iLCJBVVRPX0RJU01JU1NfTVMiLCJFZmZvcnRDYWxsb3V0IiwidDAiLCIkIiwiX2MiLCJ0MSIsIlN5bWJvbCIsImZvciIsImRlZmF1bHRFZmZvcnRDb25maWciLCJvbkRvbmVSZWYiLCJ0MiIsImN1cnJlbnQiLCJ0MyIsImhhbmRsZUNhbmNlbCIsInQ0IiwiX3RlbXAiLCJ0NSIsInQ2IiwidGltZW91dElkIiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsInQ3IiwiZGVmYXVsdEVmZm9ydCIsImRlZmF1bHRMZXZlbCIsInQ4IiwidmFsdWUiLCJlZmZvcnRMZXZlbCIsInVuZGVmaW5lZCIsImhhbmRsZVNlbGVjdCIsInQ5IiwibGFiZWwiLCJvcHRpb25zIiwidDEwIiwiZGlhbG9nRGVzY3JpcHRpb24iLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJkaWFsb2dUaXRsZSIsIm1hcmtWMkRpc21pc3NlZCIsIkVmZm9ydEluZGljYXRvclN5bWJvbCIsImxldmVsIiwiRWZmb3J0T3B0aW9uTGFiZWwiLCJ0ZXh0Iiwic2hvdWxkU2hvd0VmZm9ydENhbGxvdXQiLCJwYXJzZWQiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiY29uZmlnIiwiZWZmb3J0Q2FsbG91dFYyRGlzbWlzc2VkIiwibnVtU3RhcnR1cHMiLCJlZmZvcnRDYWxsb3V0RGlzbWlzc2VkIiwiZW5hYmxlZCJdLCJzb3VyY2VzIjpbIkVmZm9ydENhbGxvdXQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uL2luay5qcydcbmltcG9ydCB7XG4gIGlzTWF4U3Vic2NyaWJlcixcbiAgaXNQcm9TdWJzY3JpYmVyLFxuICBpc1RlYW1TdWJzY3JpYmVyLFxufSBmcm9tICcuLi91dGlscy9hdXRoLmpzJ1xuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnLCBzYXZlR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBFZmZvcnRMZXZlbCB9IGZyb20gJy4uL3V0aWxzL2VmZm9ydC5qcydcbmltcG9ydCB7XG4gIGNvbnZlcnRFZmZvcnRWYWx1ZVRvTGV2ZWwsXG4gIGdldERlZmF1bHRFZmZvcnRGb3JNb2RlbCxcbiAgZ2V0T3B1c0RlZmF1bHRFZmZvcnRDb25maWcsXG4gIHRvUGVyc2lzdGFibGVFZmZvcnQsXG59IGZyb20gJy4uL3V0aWxzL2VmZm9ydC5qcydcbmltcG9ydCB7IHBhcnNlVXNlclNwZWNpZmllZE1vZGVsIH0gZnJvbSAnLi4vdXRpbHMvbW9kZWwvbW9kZWwuanMnXG5pbXBvcnQgeyB1cGRhdGVTZXR0aW5nc0ZvclNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3NldHRpbmdzL3NldHRpbmdzLmpzJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25XaXRoRGVzY3JpcHRpb24gfSBmcm9tICcuL0N1c3RvbVNlbGVjdC9zZWxlY3QuanMnXG5pbXBvcnQgeyBTZWxlY3QgfSBmcm9tICcuL0N1c3RvbVNlbGVjdC9zZWxlY3QuanMnXG5pbXBvcnQgeyBlZmZvcnRMZXZlbFRvU3ltYm9sIH0gZnJvbSAnLi9FZmZvcnRJbmRpY2F0b3IuanMnXG5pbXBvcnQgeyBQZXJtaXNzaW9uRGlhbG9nIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy9QZXJtaXNzaW9uRGlhbG9nLmpzJ1xuXG50eXBlIEVmZm9ydENhbGxvdXRTZWxlY3Rpb24gPSBFZmZvcnRMZXZlbCB8IHVuZGVmaW5lZCB8ICdkaXNtaXNzJ1xuXG50eXBlIFByb3BzID0ge1xuICBtb2RlbDogc3RyaW5nXG4gIG9uRG9uZTogKHNlbGVjdGlvbjogRWZmb3J0Q2FsbG91dFNlbGVjdGlvbikgPT4gdm9pZFxufVxuXG5jb25zdCBBVVRPX0RJU01JU1NfTVMgPSAzMF8wMDBcblxuZXhwb3J0IGZ1bmN0aW9uIEVmZm9ydENhbGxvdXQoeyBtb2RlbCwgb25Eb25lIH06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgZGVmYXVsdEVmZm9ydENvbmZpZyA9IGdldE9wdXNEZWZhdWx0RWZmb3J0Q29uZmlnKClcbiAgLy8gTGF0ZXN0LXJlZiBwYXR0ZXJuIOKAlCB3cml0ZSB2aWEgZWZmZWN0IHNvIFJlYWN0IENvbXBpbGVyIGNhbiBtZW1vaXplLlxuICBjb25zdCBvbkRvbmVSZWYgPSB1c2VSZWYob25Eb25lKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uRG9uZVJlZi5jdXJyZW50ID0gb25Eb25lXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gdXNlQ2FsbGJhY2soKCk6IHZvaWQgPT4ge1xuICAgIG9uRG9uZVJlZi5jdXJyZW50KCdkaXNtaXNzJylcbiAgfSwgW10pXG5cbiAgLy8gUGVybWFuZW50bHkgZGlzbWlzcyBvbiBtb3VudCBzbyBpdCBvbmx5IHNob3dzIG9uY2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBtYXJrVjJEaXNtaXNzZWQoKVxuICB9LCBbXSlcblxuICAvLyAzMC1zZWNvbmQgYXV0by1kaXNtaXNzIHRpbWVyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dChoYW5kbGVDYW5jZWwsIEFVVE9fRElTTUlTU19NUylcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgfSwgW2hhbmRsZUNhbmNlbF0pXG5cbiAgY29uc3QgZGVmYXVsdEVmZm9ydCA9IGdldERlZmF1bHRFZmZvcnRGb3JNb2RlbChtb2RlbClcbiAgY29uc3QgZGVmYXVsdExldmVsID0gZGVmYXVsdEVmZm9ydFxuICAgID8gY29udmVydEVmZm9ydFZhbHVlVG9MZXZlbChkZWZhdWx0RWZmb3J0KVxuICAgIDogJ2hpZ2gnXG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKHZhbHVlOiBFZmZvcnRMZXZlbCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgZWZmb3J0TGV2ZWwgPSB2YWx1ZSA9PT0gZGVmYXVsdExldmVsID8gdW5kZWZpbmVkIDogdmFsdWVcbiAgICAgIHVwZGF0ZVNldHRpbmdzRm9yU291cmNlKCd1c2VyU2V0dGluZ3MnLCB7XG4gICAgICAgIGVmZm9ydExldmVsOiB0b1BlcnNpc3RhYmxlRWZmb3J0KGVmZm9ydExldmVsKSxcbiAgICAgIH0pXG4gICAgICBvbkRvbmVSZWYuY3VycmVudCh2YWx1ZSlcbiAgICB9LFxuICAgIFtkZWZhdWx0TGV2ZWxdLFxuICApXG5cbiAgY29uc3Qgb3B0aW9uczogT3B0aW9uV2l0aERlc2NyaXB0aW9uPEVmZm9ydExldmVsPltdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiA8RWZmb3J0T3B0aW9uTGFiZWwgbGV2ZWw9XCJtZWRpdW1cIiB0ZXh0PVwiTWVkaXVtIChyZWNvbW1lbmRlZClcIiAvPixcbiAgICAgIHZhbHVlOiAnbWVkaXVtJyxcbiAgICB9LFxuICAgIHsgbGFiZWw6IDxFZmZvcnRPcHRpb25MYWJlbCBsZXZlbD1cImhpZ2hcIiB0ZXh0PVwiSGlnaFwiIC8+LCB2YWx1ZTogJ2hpZ2gnIH0sXG4gICAgeyBsYWJlbDogPEVmZm9ydE9wdGlvbkxhYmVsIGxldmVsPVwibG93XCIgdGV4dD1cIkxvd1wiIC8+LCB2YWx1ZTogJ2xvdycgfSxcbiAgXVxuXG4gIHJldHVybiAoXG4gICAgPFBlcm1pc3Npb25EaWFsb2cgdGl0bGU9e2RlZmF1bHRFZmZvcnRDb25maWcuZGlhbG9nVGl0bGV9PlxuICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgcGFkZGluZ1g9ezJ9IHBhZGRpbmdZPXsxfT5cbiAgICAgICAgPEJveCBtYXJnaW5Cb3R0b209ezF9IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICA8VGV4dD57ZGVmYXVsdEVmZm9ydENvbmZpZy5kaWFsb2dEZXNjcmlwdGlvbn08L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8Qm94IG1hcmdpbkJvdHRvbT17MX0+XG4gICAgICAgICAgPFRleHQgZGltQ29sb3I+XG4gICAgICAgICAgICA8RWZmb3J0SW5kaWNhdG9yU3ltYm9sIGxldmVsPVwibG93XCIgLz4gbG93IHsnwrcnfXsnICd9XG4gICAgICAgICAgICA8RWZmb3J0SW5kaWNhdG9yU3ltYm9sIGxldmVsPVwibWVkaXVtXCIgLz4gbWVkaXVtIHsnwrcnfXsnICd9XG4gICAgICAgICAgICA8RWZmb3J0SW5kaWNhdG9yU3ltYm9sIGxldmVsPVwiaGlnaFwiIC8+IGhpZ2hcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvQm94PlxuICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlU2VsZWN0fVxuICAgICAgICAgIG9uQ2FuY2VsPXtoYW5kbGVDYW5jZWx9XG4gICAgICAgIC8+XG4gICAgICA8L0JveD5cbiAgICA8L1Blcm1pc3Npb25EaWFsb2c+XG4gIClcbn1cblxuZnVuY3Rpb24gRWZmb3J0SW5kaWNhdG9yU3ltYm9sKHtcbiAgbGV2ZWwsXG59OiB7XG4gIGxldmVsOiBFZmZvcnRMZXZlbFxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiA8VGV4dCBjb2xvcj1cInN1Z2dlc3Rpb25cIj57ZWZmb3J0TGV2ZWxUb1N5bWJvbChsZXZlbCl9PC9UZXh0PlxufVxuXG5mdW5jdGlvbiBFZmZvcnRPcHRpb25MYWJlbCh7XG4gIGxldmVsLFxuICB0ZXh0LFxufToge1xuICBsZXZlbDogRWZmb3J0TGV2ZWxcbiAgdGV4dDogc3RyaW5nXG59KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPEVmZm9ydEluZGljYXRvclN5bWJvbCBsZXZlbD17bGV2ZWx9IC8+IHt0ZXh0fVxuICAgIDwvPlxuICApXG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0byBzaG93IHRoZSBlZmZvcnQgY2FsbG91dC5cbiAqXG4gKiBBdWRpZW5jZTpcbiAqIC0gUHJvOiBhbHJlYWR5IGhhZCBtZWRpdW0gZGVmYXVsdDsgc2hvdyB1bmxlc3MgdGhleSBzYXcgdjEgKGVmZm9ydENhbGxvdXREaXNtaXNzZWQpXG4gKiAtIE1heC9UZWFtOiBnZXR0aW5nIG1lZGl1bSB2aWEgdGVuZ3VfZ3JleV9zdGVwMiBjb25maWc7IHNob3cgd2hlbiBlbmFibGVkXG4gKiAtIEV2ZXJ5b25lIGVsc2U6IG1hcmsgYXMgZGlzbWlzc2VkIHNvIGl0IG5ldmVyIHNob3dzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTaG93RWZmb3J0Q2FsbG91dChtb2RlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgc2hvdyBmb3IgT3B1cyA0LjYgZm9yIG5vd1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVVzZXJTcGVjaWZpZWRNb2RlbChtb2RlbClcbiAgaWYgKCFwYXJzZWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnb3B1cy00LTYnKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgY29uZmlnID0gZ2V0R2xvYmFsQ29uZmlnKClcbiAgaWYgKGNvbmZpZy5lZmZvcnRDYWxsb3V0VjJEaXNtaXNzZWQpIHJldHVybiBmYWxzZVxuXG4gIC8vIERvbid0IHNob3cgdG8gYnJhbmQtbmV3IHVzZXJzIOKAlCB0aGV5IG5ldmVyIGtuZXcgdGhlIG9sZCBkZWZhdWx0LCBzbyB0aGlzXG4gIC8vIGlzbid0IGEgY2hhbmdlIGZvciB0aGVtLiBNYXJrIGFzIGRpc21pc3NlZCBzbyBpdCBzdGF5cyBzdXBwcmVzc2VkLlxuICBpZiAoY29uZmlnLm51bVN0YXJ0dXBzIDw9IDEpIHtcbiAgICBtYXJrVjJEaXNtaXNzZWQoKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gUHJvIHVzZXJzIGFscmVhZHkgaGFkIG1lZGl1bSBkZWZhdWx0IGJlZm9yZSB0aGlzIFBSLiBTaG93IHRoZSBuZXcgY29weSxcbiAgLy8gYnV0IHNraXAgaWYgdGhleSBhbHJlYWR5IHNhdyB0aGUgdjEgZGlhbG9nIOKAlCBubyBwb2ludCBuYWdnaW5nIHR3aWNlLlxuICBpZiAoaXNQcm9TdWJzY3JpYmVyKCkpIHtcbiAgICBpZiAoY29uZmlnLmVmZm9ydENhbGxvdXREaXNtaXNzZWQpIHtcbiAgICAgIG1hcmtWMkRpc21pc3NlZCgpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIGdldE9wdXNEZWZhdWx0RWZmb3J0Q29uZmlnKCkuZW5hYmxlZFxuICB9XG5cbiAgLy8gTWF4L1RlYW0gYXJlIHRoZSB0YXJnZXQgb2YgdGhlIHRlbmd1X2dyZXlfc3RlcDIgY29uZmlnLlxuICAvLyBEb24ndCBtYXJrIGRpc21pc3NlZCB3aGVuIGNvbmZpZyBpcyBkaXNhYmxlZCDigJQgdGhleSBzaG91bGQgc2VlIHRoZSBkaWFsb2dcbiAgLy8gb25jZSBpdCdzIGVuYWJsZWQgZm9yIHRoZW0uXG4gIGlmIChpc01heFN1YnNjcmliZXIoKSB8fCBpc1RlYW1TdWJzY3JpYmVyKCkpIHtcbiAgICByZXR1cm4gZ2V0T3B1c0RlZmF1bHRFZmZvcnRDb25maWcoKS5lbmFibGVkXG4gIH1cblxuICAvLyBFdmVyeW9uZSBlbHNlIChmcmVlIHRpZXIsIEFQSSBrZXksIG5vbi1zdWJzY3JpYmVycyk6IG5vdCBpbiBzY29wZS5cbiAgbWFya1YyRGlzbWlzc2VkKClcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIG1hcmtWMkRpc21pc3NlZCgpOiB2b2lkIHtcbiAgc2F2ZUdsb2JhbENvbmZpZyhjdXJyZW50ID0+IHtcbiAgICBpZiAoY3VycmVudC5lZmZvcnRDYWxsb3V0VjJEaXNtaXNzZWQpIHJldHVybiBjdXJyZW50XG4gICAgcmV0dXJuIHsgLi4uY3VycmVudCwgZWZmb3J0Q2FsbG91dFYyRGlzbWlzc2VkOiB0cnVlIH1cbiAgfSlcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLEtBQUssSUFBSUMsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLE1BQU0sUUFBUSxPQUFPO0FBQzdELFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLFdBQVc7QUFDckMsU0FDRUMsZUFBZSxFQUNmQyxlQUFlLEVBQ2ZDLGdCQUFnQixRQUNYLGtCQUFrQjtBQUN6QixTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUN0RSxjQUFjQyxXQUFXLFFBQVEsb0JBQW9CO0FBQ3JELFNBQ0VDLHlCQUF5QixFQUN6QkMsd0JBQXdCLEVBQ3hCQywwQkFBMEIsRUFDMUJDLG1CQUFtQixRQUNkLG9CQUFvQjtBQUMzQixTQUFTQyx1QkFBdUIsUUFBUSx5QkFBeUI7QUFDakUsU0FBU0MsdUJBQXVCLFFBQVEsK0JBQStCO0FBQ3ZFLGNBQWNDLHFCQUFxQixRQUFRLDBCQUEwQjtBQUNyRSxTQUFTQyxNQUFNLFFBQVEsMEJBQTBCO0FBQ2pELFNBQVNDLG1CQUFtQixRQUFRLHNCQUFzQjtBQUMxRCxTQUFTQyxnQkFBZ0IsUUFBUSxtQ0FBbUM7QUFFcEUsS0FBS0Msc0JBQXNCLEdBQUdYLFdBQVcsR0FBRyxTQUFTLEdBQUcsU0FB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