source dump of claude code
at main 397 lines 39 kB view raw
1import { c as _c } from "react/compiler-runtime"; 2import React from 'react'; 3import type { KeyboardEvent } from '../../ink/events/keyboard-event.js'; 4import { Box } from '../../ink.js'; 5import { type OptionWithDescription, Select } from '../CustomSelect/select.js'; 6export type TreeNode<T> = { 7 id: string | number; 8 value: T; 9 label: string; 10 description?: string; 11 dimDescription?: boolean; 12 children?: TreeNode<T>[]; 13 metadata?: Record<string, unknown>; 14}; 15type FlattenedNode<T> = { 16 node: TreeNode<T>; 17 depth: number; 18 isExpanded: boolean; 19 hasChildren: boolean; 20 parentId?: string | number; 21}; 22export type TreeSelectProps<T> = { 23 /** 24 * Tree nodes to display. 25 */ 26 readonly nodes: TreeNode<T>[]; 27 28 /** 29 * Callback when a node is selected. 30 */ 31 readonly onSelect: (node: TreeNode<T>) => void; 32 33 /** 34 * Callback when cancel is pressed. 35 */ 36 readonly onCancel?: () => void; 37 38 /** 39 * Callback when focused node changes. 40 */ 41 readonly onFocus?: (node: TreeNode<T>) => void; 42 43 /** 44 * Node to focus by ID. 45 */ 46 readonly focusNodeId?: string | number; 47 48 /** 49 * Number of visible options. 50 */ 51 readonly visibleOptionCount?: number; 52 53 /** 54 * Layout of the options. 55 */ 56 readonly layout?: 'compact' | 'expanded' | 'compact-vertical'; 57 58 /** 59 * When disabled, user input is ignored. 60 */ 61 readonly isDisabled?: boolean; 62 63 /** 64 * When true, hides the numeric indexes next to each option. 65 */ 66 readonly hideIndexes?: boolean; 67 68 /** 69 * Function to determine if a node should be initially expanded. 70 * If not provided, all nodes start collapsed. 71 */ 72 readonly isNodeExpanded?: (nodeId: string | number) => boolean; 73 74 /** 75 * Callback when a node is expanded. 76 */ 77 readonly onExpand?: (nodeId: string | number) => void; 78 79 /** 80 * Callback when a node is collapsed. 81 */ 82 readonly onCollapse?: (nodeId: string | number) => void; 83 84 /** 85 * Custom prefix function for parent nodes 86 * @param isExpanded - Whether the parent node is currently expanded 87 * @returns The prefix string to display (default: '▼ ' when expanded, '▶ ' when collapsed) 88 */ 89 readonly getParentPrefix?: (isExpanded: boolean) => string; 90 91 /** 92 * Custom prefix function for child nodes 93 * @param depth - The depth of the child node in the tree (0-indexed from parent) 94 * @returns The prefix string to display (default: ' ▸ ') 95 */ 96 readonly getChildPrefix?: (depth: number) => string; 97 98 /** 99 * Callback when user presses up from the first item. 100 * If provided, navigation will not wrap to the last item. 101 */ 102 readonly onUpFromFirstItem?: () => void; 103}; 104 105/** 106 * TreeSelect is a generic component for selecting items from a hierarchical tree structure. 107 * It handles expand/collapse state, keyboard navigation, and renders the tree as a flat list 108 * using the Select component. 109 */ 110export function TreeSelect(t0) { 111 const $ = _c(48); 112 const { 113 nodes, 114 onSelect, 115 onCancel, 116 onFocus, 117 focusNodeId, 118 visibleOptionCount, 119 layout: t1, 120 isDisabled: t2, 121 hideIndexes: t3, 122 isNodeExpanded, 123 onExpand, 124 onCollapse, 125 getParentPrefix, 126 getChildPrefix, 127 onUpFromFirstItem 128 } = t0; 129 const layout = t1 === undefined ? "expanded" : t1; 130 const isDisabled = t2 === undefined ? false : t2; 131 const hideIndexes = t3 === undefined ? false : t3; 132 let t4; 133 if ($[0] === Symbol.for("react.memo_cache_sentinel")) { 134 t4 = new Set(); 135 $[0] = t4; 136 } else { 137 t4 = $[0]; 138 } 139 const [internalExpandedIds, setInternalExpandedIds] = React.useState(t4); 140 const isProgrammaticFocusRef = React.useRef(false); 141 const lastFocusedIdRef = React.useRef(null); 142 let t5; 143 if ($[1] !== internalExpandedIds || $[2] !== isNodeExpanded) { 144 t5 = nodeId => { 145 if (isNodeExpanded) { 146 return isNodeExpanded(nodeId); 147 } 148 return internalExpandedIds.has(nodeId); 149 }; 150 $[1] = internalExpandedIds; 151 $[2] = isNodeExpanded; 152 $[3] = t5; 153 } else { 154 t5 = $[3]; 155 } 156 const isExpanded = t5; 157 let result; 158 if ($[4] !== isExpanded || $[5] !== nodes) { 159 result = []; 160 function traverse(node, depth, parentId) { 161 const hasChildren = !!node.children && node.children.length > 0; 162 const nodeIsExpanded = isExpanded(node.id); 163 result.push({ 164 node, 165 depth, 166 isExpanded: nodeIsExpanded, 167 hasChildren, 168 parentId 169 }); 170 if (hasChildren && nodeIsExpanded && node.children) { 171 for (const child of node.children) { 172 traverse(child, depth + 1, node.id); 173 } 174 } 175 } 176 for (const node_0 of nodes) { 177 traverse(node_0, 0); 178 } 179 $[4] = isExpanded; 180 $[5] = nodes; 181 $[6] = result; 182 } else { 183 result = $[6]; 184 } 185 const flattenedNodes = result; 186 const defaultGetParentPrefix = _temp; 187 const defaultGetChildPrefix = _temp2; 188 const parentPrefixFn = getParentPrefix ?? defaultGetParentPrefix; 189 const childPrefixFn = getChildPrefix ?? defaultGetChildPrefix; 190 let t6; 191 if ($[7] !== childPrefixFn || $[8] !== parentPrefixFn) { 192 t6 = flatNode => { 193 let prefix = ""; 194 if (flatNode.hasChildren) { 195 prefix = parentPrefixFn(flatNode.isExpanded); 196 } else { 197 if (flatNode.depth > 0) { 198 prefix = childPrefixFn(flatNode.depth); 199 } 200 } 201 return prefix + flatNode.node.label; 202 }; 203 $[7] = childPrefixFn; 204 $[8] = parentPrefixFn; 205 $[9] = t6; 206 } else { 207 t6 = $[9]; 208 } 209 const buildLabel = t6; 210 let t7; 211 if ($[10] !== buildLabel || $[11] !== flattenedNodes) { 212 t7 = flattenedNodes.map(flatNode_0 => ({ 213 label: buildLabel(flatNode_0), 214 description: flatNode_0.node.description, 215 dimDescription: flatNode_0.node.dimDescription ?? true, 216 value: flatNode_0.node.id 217 })); 218 $[10] = buildLabel; 219 $[11] = flattenedNodes; 220 $[12] = t7; 221 } else { 222 t7 = $[12]; 223 } 224 const options = t7; 225 let map; 226 if ($[13] !== flattenedNodes) { 227 map = new Map(); 228 flattenedNodes.forEach(fn => map.set(fn.node.id, fn.node)); 229 $[13] = flattenedNodes; 230 $[14] = map; 231 } else { 232 map = $[14]; 233 } 234 const nodeMap = map; 235 let t8; 236 if ($[15] !== flattenedNodes) { 237 t8 = nodeId_0 => flattenedNodes.find(fn_0 => fn_0.node.id === nodeId_0); 238 $[15] = flattenedNodes; 239 $[16] = t8; 240 } else { 241 t8 = $[16]; 242 } 243 const findFlattenedNode = t8; 244 let t9; 245 if ($[17] !== findFlattenedNode || $[18] !== onCollapse || $[19] !== onExpand) { 246 t9 = (nodeId_1, shouldExpand) => { 247 const flatNode_1 = findFlattenedNode(nodeId_1); 248 if (!flatNode_1 || !flatNode_1.hasChildren) { 249 return; 250 } 251 if (shouldExpand) { 252 if (onExpand) { 253 onExpand(nodeId_1); 254 } else { 255 setInternalExpandedIds(prev => new Set(prev).add(nodeId_1)); 256 } 257 } else { 258 if (onCollapse) { 259 onCollapse(nodeId_1); 260 } else { 261 setInternalExpandedIds(prev_0 => { 262 const newSet = new Set(prev_0); 263 newSet.delete(nodeId_1); 264 return newSet; 265 }); 266 } 267 } 268 }; 269 $[17] = findFlattenedNode; 270 $[18] = onCollapse; 271 $[19] = onExpand; 272 $[20] = t9; 273 } else { 274 t9 = $[20]; 275 } 276 const toggleExpand = t9; 277 let t10; 278 if ($[21] !== findFlattenedNode || $[22] !== focusNodeId || $[23] !== isDisabled || $[24] !== nodeMap || $[25] !== onFocus || $[26] !== toggleExpand) { 279 t10 = e => { 280 if (!focusNodeId || isDisabled) { 281 return; 282 } 283 const flatNode_2 = findFlattenedNode(focusNodeId); 284 if (!flatNode_2) { 285 return; 286 } 287 if (e.key === "right" && flatNode_2.hasChildren) { 288 e.preventDefault(); 289 toggleExpand(focusNodeId, true); 290 } else { 291 if (e.key === "left") { 292 if (flatNode_2.hasChildren && flatNode_2.isExpanded) { 293 e.preventDefault(); 294 toggleExpand(focusNodeId, false); 295 } else { 296 if (flatNode_2.parentId !== undefined) { 297 e.preventDefault(); 298 isProgrammaticFocusRef.current = true; 299 toggleExpand(flatNode_2.parentId, false); 300 if (onFocus) { 301 const parentNode = nodeMap.get(flatNode_2.parentId); 302 if (parentNode) { 303 onFocus(parentNode); 304 } 305 } 306 } 307 } 308 } 309 } 310 }; 311 $[21] = findFlattenedNode; 312 $[22] = focusNodeId; 313 $[23] = isDisabled; 314 $[24] = nodeMap; 315 $[25] = onFocus; 316 $[26] = toggleExpand; 317 $[27] = t10; 318 } else { 319 t10 = $[27]; 320 } 321 const handleKeyDown = t10; 322 let t11; 323 if ($[28] !== nodeMap || $[29] !== onSelect) { 324 t11 = nodeId_2 => { 325 const node_1 = nodeMap.get(nodeId_2); 326 if (!node_1) { 327 return; 328 } 329 onSelect(node_1); 330 }; 331 $[28] = nodeMap; 332 $[29] = onSelect; 333 $[30] = t11; 334 } else { 335 t11 = $[30]; 336 } 337 const handleChange = t11; 338 let t12; 339 if ($[31] !== nodeMap || $[32] !== onFocus) { 340 t12 = nodeId_3 => { 341 if (isProgrammaticFocusRef.current) { 342 isProgrammaticFocusRef.current = false; 343 return; 344 } 345 if (lastFocusedIdRef.current === nodeId_3) { 346 return; 347 } 348 lastFocusedIdRef.current = nodeId_3; 349 if (onFocus) { 350 const node_2 = nodeMap.get(nodeId_3); 351 if (node_2) { 352 onFocus(node_2); 353 } 354 } 355 }; 356 $[31] = nodeMap; 357 $[32] = onFocus; 358 $[33] = t12; 359 } else { 360 t12 = $[33]; 361 } 362 const handleFocus = t12; 363 let t13; 364 if ($[34] !== focusNodeId || $[35] !== handleChange || $[36] !== handleFocus || $[37] !== hideIndexes || $[38] !== isDisabled || $[39] !== layout || $[40] !== onCancel || $[41] !== onUpFromFirstItem || $[42] !== options || $[43] !== visibleOptionCount) { 365 t13 = <Select options={options} onChange={handleChange} onFocus={handleFocus} onCancel={onCancel} defaultFocusValue={focusNodeId} visibleOptionCount={visibleOptionCount} layout={layout} isDisabled={isDisabled} hideIndexes={hideIndexes} onUpFromFirstItem={onUpFromFirstItem} />; 366 $[34] = focusNodeId; 367 $[35] = handleChange; 368 $[36] = handleFocus; 369 $[37] = hideIndexes; 370 $[38] = isDisabled; 371 $[39] = layout; 372 $[40] = onCancel; 373 $[41] = onUpFromFirstItem; 374 $[42] = options; 375 $[43] = visibleOptionCount; 376 $[44] = t13; 377 } else { 378 t13 = $[44]; 379 } 380 let t14; 381 if ($[45] !== handleKeyDown || $[46] !== t13) { 382 t14 = <Box tabIndex={0} autoFocus={true} onKeyDown={handleKeyDown}>{t13}</Box>; 383 $[45] = handleKeyDown; 384 $[46] = t13; 385 $[47] = t14; 386 } else { 387 t14 = $[47]; 388 } 389 return t14; 390} 391function _temp2(_depth) { 392 return " \u25B8 "; 393} 394function _temp(isExpanded_0) { 395 return isExpanded_0 ? "\u25BC " : "\u25B6 "; 396} 397//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIktleWJvYXJkRXZlbnQiLCJCb3giLCJPcHRpb25XaXRoRGVzY3JpcHRpb24iLCJTZWxlY3QiLCJUcmVlTm9kZSIsImlkIiwidmFsdWUiLCJUIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsImRpbURlc2NyaXB0aW9uIiwiY2hpbGRyZW4iLCJtZXRhZGF0YSIsIlJlY29yZCIsIkZsYXR0ZW5lZE5vZGUiLCJub2RlIiwiZGVwdGgiLCJpc0V4cGFuZGVkIiwiaGFzQ2hpbGRyZW4iLCJwYXJlbnRJZCIsIlRyZWVTZWxlY3RQcm9wcyIsIm5vZGVzIiwib25TZWxlY3QiLCJvbkNhbmNlbCIsIm9uRm9jdXMiLCJmb2N1c05vZGVJZCIsInZpc2libGVPcHRpb25Db3VudCIsImxheW91dCIsImlzRGlzYWJsZWQiLCJoaWRlSW5kZXhlcyIsImlzTm9kZUV4cGFuZGVkIiwibm9kZUlkIiwib25FeHBhbmQiLCJvbkNvbGxhcHNlIiwiZ2V0UGFyZW50UHJlZml4IiwiZ2V0Q2hpbGRQcmVmaXgiLCJvblVwRnJvbUZpcnN0SXRlbSIsIlRyZWVTZWxlY3QiLCJ0MCIsIiQiLCJfYyIsInQxIiwidDIiLCJ0MyIsInVuZGVmaW5lZCIsInQ0IiwiU3ltYm9sIiwiZm9yIiwiU2V0IiwiaW50ZXJuYWxFeHBhbmRlZElkcyIsInNldEludGVybmFsRXhwYW5kZWRJZHMiLCJ1c2VTdGF0ZSIsImlzUHJvZ3JhbW1hdGljRm9jdXNSZWYiLCJ1c2VSZWYiLCJsYXN0Rm9jdXNlZElkUmVmIiwidDUiLCJoYXMiLCJyZXN1bHQiLCJ0cmF2ZXJzZSIsImxlbmd0aCIsIm5vZGVJc0V4cGFuZGVkIiwicHVzaCIsImNoaWxkIiwibm9kZV8wIiwiZmxhdHRlbmVkTm9kZXMiLCJkZWZhdWx0R2V0UGFyZW50UHJlZml4IiwiX3RlbXAiLCJkZWZhdWx0R2V0Q2hpbGRQcmVmaXgiLCJfdGVtcDIiLCJwYXJlbnRQcmVmaXhGbiIsImNoaWxkUHJlZml4Rm4iLCJ0NiIsImZsYXROb2RlIiwicHJlZml4IiwiYnVpbGRMYWJlbCIsInQ3IiwibWFwIiwiZmxhdE5vZGVfMCIsIm9wdGlvbnMiLCJNYXAiLCJmb3JFYWNoIiwiZm4iLCJzZXQiLCJub2RlTWFwIiwidDgiLCJub2RlSWRfMCIsImZpbmQiLCJmbl8wIiwiZmluZEZsYXR0ZW5lZE5vZGUiLCJ0OSIsIm5vZGVJZF8xIiwic2hvdWxkRXhwYW5kIiwiZmxhdE5vZGVfMSIsInByZXYiLCJhZGQiLCJwcmV2XzAiLCJuZXdTZXQiLCJkZWxldGUiLCJ0b2dnbGVFeHBhbmQiLCJ0MTAiLCJlIiwiZmxhdE5vZGVfMiIsImtleSIsInByZXZlbnREZWZhdWx0IiwiY3VycmVudCIsInBhcmVudE5vZGUiLCJnZXQiLCJoYW5kbGVLZXlEb3duIiwidDExIiwibm9kZUlkXzIiLCJub2RlXzEiLCJoYW5kbGVDaGFuZ2UiLCJ0MTIiLCJub2RlSWRfMyIsIm5vZGVfMiIsImhhbmRsZUZvY3VzIiwidDEzIiwidDE0IiwiX2RlcHRoIiwiaXNFeHBhbmRlZF8wIl0sInNvdXJjZXMiOlsiVHJlZVNlbGVjdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50IH0gZnJvbSAnLi4vLi4vaW5rL2V2ZW50cy9rZXlib2FyZC1ldmVudC5qcydcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHR5cGUgT3B0aW9uV2l0aERlc2NyaXB0aW9uLCBTZWxlY3QgfSBmcm9tICcuLi9DdXN0b21TZWxlY3Qvc2VsZWN0LmpzJ1xuXG5leHBvcnQgdHlwZSBUcmVlTm9kZTxUPiA9IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuICB2YWx1ZTogVFxuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIGRpbURlc2NyaXB0aW9uPzogYm9vbGVhblxuICBjaGlsZHJlbj86IFRyZWVOb2RlPFQ+W11cbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxufVxuXG50eXBlIEZsYXR0ZW5lZE5vZGU8VD4gPSB7XG4gIG5vZGU6IFRyZWVOb2RlPFQ+XG4gIGRlcHRoOiBudW1iZXJcbiAgaXNFeHBhbmRlZDogYm9vbGVhblxuICBoYXNDaGlsZHJlbjogYm9vbGVhblxuICBwYXJlbnRJZD86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBUcmVlU2VsZWN0UHJvcHM8VD4gPSB7XG4gIC8qKlxuICAgKiBUcmVlIG5vZGVzIHRvIGRpc3BsYXkuXG4gICAqL1xuICByZWFkb25seSBub2RlczogVHJlZU5vZGU8VD5bXVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGEgbm9kZSBpcyBzZWxlY3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IG9uU2VsZWN0OiAobm9kZTogVHJlZU5vZGU8VD4pID0+IHZvaWRcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBjYW5jZWwgaXMgcHJlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IG9uQ2FuY2VsPzogKCkgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGZvY3VzZWQgbm9kZSBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgb25Gb2N1cz86IChub2RlOiBUcmVlTm9kZTxUPikgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBOb2RlIHRvIGZvY3VzIGJ5IElELlxuICAgKi9cbiAgcmVhZG9ubHkgZm9jdXNOb2RlSWQ/OiBzdHJpbmcgfCBudW1iZXJcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHZpc2libGUgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHZpc2libGVPcHRpb25Db3VudD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBMYXlvdXQgb2YgdGhlIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBsYXlvdXQ/OiAnY29tcGFjdCcgfCAnZXhwYW5kZWQnIHwgJ2NvbXBhY3QtdmVydGljYWwnXG5cbiAgLyoqXG4gICAqIFdoZW4gZGlzYWJsZWQsIHVzZXIgaW5wdXQgaXMgaWdub3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRGlzYWJsZWQ/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgaGlkZXMgdGhlIG51bWVyaWMgaW5kZXhlcyBuZXh0IHRvIGVhY2ggb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaGlkZUluZGV4ZXM/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIG5vZGUgc2hvdWxkIGJlIGluaXRpYWxseSBleHBhbmRlZC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBhbGwgbm9kZXMgc3RhcnQgY29sbGFwc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb2RlRXhwYW5kZWQ/OiAobm9kZUlkOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW5cblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBhIG5vZGUgaXMgZXhwYW5kZWQuXG4gICAqL1xuICByZWFkb25seSBvbkV4cGFuZD86IChub2RlSWQ6IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGEgbm9kZSBpcyBjb2xsYXBzZWQuXG4gICAqL1xuICByZWFkb25seSBvbkNvbGxhcHNlPzogKG5vZGVJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB2b2lkXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwcmVmaXggZnVuY3Rpb24gZm9yIHBhcmVudCBub2Rlc1xuICAgKiBAcGFyYW0gaXNFeHBhbmRlZCAtIFdoZXRoZXIgdGhlIHBhcmVudCBub2RlIGlzIGN1cnJlbnRseSBleHBhbmRlZFxuICAgKiBAcmV0dXJucyBUaGUgcHJlZml4IHN0cmluZyB0byBkaXNwbGF5IChkZWZhdWx0OiAn4pa8ICcgd2hlbiBleHBhbmRlZCwgJ+KWtiAnIHdoZW4gY29sbGFwc2VkKVxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0UGFyZW50UHJlZml4PzogKGlzRXhwYW5kZWQ6IGJvb2xlYW4pID0+IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcHJlZml4IGZ1bmN0aW9uIGZvciBjaGlsZCBub2Rlc1xuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgZGVwdGggb2YgdGhlIGNoaWxkIG5vZGUgaW4gdGhlIHRyZWUgKDAtaW5kZXhlZCBmcm9tIHBhcmVudClcbiAgICogQHJldHVybnMgVGhlIHByZWZpeCBzdHJpbmcgdG8gZGlzcGxheSAoZGVmYXVsdDogJyAg4pa4ICcpXG4gICAqL1xuICByZWFkb25seSBnZXRDaGlsZFByZWZpeD86IChkZXB0aDogbnVtYmVyKSA9PiBzdHJpbmdcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiB1c2VyIHByZXNzZXMgdXAgZnJvbSB0aGUgZmlyc3QgaXRlbS5cbiAgICogSWYgcHJvdmlkZWQsIG5hdmlnYXRpb24gd2lsbCBub3Qgd3JhcCB0byB0aGUgbGFzdCBpdGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgb25VcEZyb21GaXJzdEl0ZW0/OiAoKSA9PiB2b2lkXG59XG5cbi8qKlxuICogVHJlZVNlbGVjdCBpcyBhIGdlbmVyaWMgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgaXRlbXMgZnJvbSBhIGhpZXJhcmNoaWNhbCB0cmVlIHN0cnVjdHVyZS5cbiAqIEl0IGhhbmRsZXMgZXhwYW5kL2NvbGxhcHNlIHN0YXRlLCBrZXlib2FyZCBuYXZpZ2F0aW9uLCBhbmQgcmVuZGVycyB0aGUgdHJlZSBhcyBhIGZsYXQgbGlzdFxuICogdXNpbmcgdGhlIFNlbGVjdCBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmVlU2VsZWN0PFQ+KHtcbiAgbm9kZXMsXG4gIG9uU2VsZWN0LFxuICBvbkNhbmNlbCxcbiAgb25Gb2N1cyxcbiAgZm9jdXNOb2RlSWQsXG4gIHZpc2libGVPcHRpb25Db3VudCxcbiAgbGF5b3V0ID0gJ2V4cGFuZGVkJyxcbiAgaXNEaXNhYmxlZCA9IGZhbHNlLFxuICBoaWRlSW5kZXhlcyA9IGZhbHNlLFxuICBpc05vZGVFeHBhbmRlZCxcbiAgb25FeHBhbmQsXG4gIG9uQ29sbGFwc2UsXG4gIGdldFBhcmVudFByZWZpeCxcbiAgZ2V0Q2hpbGRQcmVmaXgsXG4gIG9uVXBGcm9tRmlyc3RJdGVtLFxufTogVHJlZVNlbGVjdFByb3BzPFQ+KTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgLy8gVHJhY2sgd2hpY2ggbm9kZXMgYXJlIGV4cGFuZGVkIChpbnRlcm5hbCBzdGF0ZSBpZiBub3QgY29udHJvbGxlZCBleHRlcm5hbGx5KVxuICBjb25zdCBbaW50ZXJuYWxFeHBhbmRlZElkcywgc2V0SW50ZXJuYWxFeHBhbmRlZElkc10gPSBSZWFjdC51c2VTdGF0ZTxcbiAgICBTZXQ8c3RyaW5nIHwgbnVtYmVyPlxuICA+KG5ldyBTZXQoKSlcblxuICAvLyBUcmFjayBpZiB3ZSdyZSBwcm9ncmFtbWF0aWNhbGx5IHNldHRpbmcgZm9jdXMgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHNcbiAgY29uc3QgaXNQcm9ncmFtbWF0aWNGb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSlcblxuICAvLyBUcmFjayBsYXN0IGZvY3VzZWQgSUQgdG8gcHJldmVudCBkdXBsaWNhdGUgZm9jdXMgY2FsbHNcbiAgY29uc3QgbGFzdEZvY3VzZWRJZFJlZiA9IFJlYWN0LnVzZVJlZjxzdHJpbmcgfCBudW1iZXIgfCBudWxsPihudWxsKVxuXG4gIC8vIERldGVybWluZSBpZiBhIG5vZGUgaXMgZXhwYW5kZWQgKHVzZSBleHRlcm5hbCBmdW5jdGlvbiBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZSBpbnRlcm5hbCBzdGF0ZSlcbiAgY29uc3QgaXNFeHBhbmRlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChub2RlSWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKGlzTm9kZUV4cGFuZGVkKSB7XG4gICAgICAgIHJldHVybiBpc05vZGVFeHBhbmRlZChub2RlSWQpXG4gICAgICB9XG4gICAgICByZXR1cm4gaW50ZXJuYWxFeHBhbmRlZElkcy5oYXMobm9kZUlkKVxuICAgIH0sXG4gICAgW2lzTm9kZUV4cGFuZGVkLCBpbnRlcm5hbEV4cGFuZGVkSWRzXSxcbiAgKVxuXG4gIC8vIEZsYXR0ZW4gdGhlIHRyZWUgaW50byBhIGxpbmVhciBsaXN0IGZvciB0aGUgU2VsZWN0IGNvbXBvbmVudFxuICBjb25zdCBmbGF0dGVuZWROb2RlcyA9IFJlYWN0LnVzZU1lbW8oKCk6IEZsYXR0ZW5lZE5vZGU8VD5bXSA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBGbGF0dGVuZWROb2RlPFQ+W10gPSBbXVxuXG4gICAgZnVuY3Rpb24gdHJhdmVyc2UoXG4gICAgICBub2RlOiBUcmVlTm9kZTxUPixcbiAgICAgIGRlcHRoOiBudW1iZXIsXG4gICAgICBwYXJlbnRJZD86IHN0cmluZyB8IG51bWJlcixcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gISFub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgY29uc3Qgbm9kZUlzRXhwYW5kZWQgPSBpc0V4cGFuZGVkKG5vZGUuaWQpXG5cbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGlzRXhwYW5kZWQ6IG5vZGVJc0V4cGFuZGVkLFxuICAgICAgICBoYXNDaGlsZHJlbixcbiAgICAgICAgcGFyZW50SWQsXG4gICAgICB9KVxuXG4gICAgICAvLyBPbmx5IHRyYXZlcnNlIGNoaWxkcmVuIGlmIHRoaXMgbm9kZSBpcyBleHBhbmRlZFxuICAgICAgaWYgKGhhc0NoaWxkcmVuICYmIG5vZGVJc0V4cGFuZGVkICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdHJhdmVyc2UoY2hpbGQsIGRlcHRoICsgMSwgbm9kZS5pZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgdHJhdmVyc2Uobm9kZSwgMClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sIFtub2RlcywgaXNFeHBhbmRlZF0pXG5cbiAgLy8gRGVmYXVsdCBwcmVmaXggZnVuY3Rpb25zXG4gIGNvbnN0IGRlZmF1bHRHZXRQYXJlbnRQcmVmaXggPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAoaXNFeHBhbmRlZDogYm9vbGVhbik6IHN0cmluZyA9PiAoaXNFeHBhbmRlZCA/ICfilrwgJyA6ICfilrYgJyksXG4gICAgW10sXG4gIClcbiAgY29uc3QgZGVmYXVsdEdldENoaWxkUHJlZml4ID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKF9kZXB0aDogbnVtYmVyKTogc3RyaW5nID0+ICcgIOKWuCAnLFxuICAgIFtdLFxuICApXG5cbiAgY29uc3QgcGFyZW50UHJlZml4Rm4gPSBnZXRQYXJlbnRQcmVmaXggPz8gZGVmYXVsdEdldFBhcmVudFByZWZpeFxuICBjb25zdCBjaGlsZFByZWZpeEZuID0gZ2V0Q2hpbGRQcmVmaXggPz8gZGVmYXVsdEdldENoaWxkUHJlZml4XG5cbiAgLy8gQnVpbGQgdGhlIGxhYmVsIHdpdGggYXBwcm9wcmlhdGUgcHJlZml4ZXMgYmFzZWQgb24gdHJlZSBwb3NpdGlvblxuICBjb25zdCBidWlsZExhYmVsID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKGZsYXROb2RlOiBGbGF0dGVuZWROb2RlPFQ+KTogc3RyaW5nID0+IHtcbiAgICAgIGxldCBwcmVmaXggPSAnJ1xuXG4gICAgICBpZiAoZmxhdE5vZGUuaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgLy8gUGFyZW50IG5vZGUgd2l0aCBjaGlsZHJlblxuICAgICAgICBwcmVmaXggPSBwYXJlbnRQcmVmaXhGbihmbGF0Tm9kZS5pc0V4cGFuZGVkKVxuICAgICAgfSBlbHNlIGlmIChmbGF0Tm9kZS5kZXB0aCA+IDApIHtcbiAgICAgICAgLy8gQ2hpbGQgbm9kZVxuICAgICAgICBwcmVmaXggPSBjaGlsZFByZWZpeEZuKGZsYXROb2RlLmRlcHRoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJlZml4ICsgZmxhdE5vZGUubm9kZS5sYWJlbFxuICAgIH0sXG4gICAgW3BhcmVudFByZWZpeEZuLCBjaGlsZFByZWZpeEZuXSxcbiAgKVxuXG4gIC8vIENvbnZlcnQgZmxhdHRlbmVkIG5vZGVzIHRvIFNlbGVjdCBvcHRpb25zXG4gIGNvbnN0IG9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKCgpOiBPcHRpb25XaXRoRGVzY3JpcHRpb248XG4gICAgc3RyaW5nIHwgbnVtYmVyXG4gID5bXSA9PiB7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZE5vZGVzLm1hcChmbGF0Tm9kZSA9PiAoe1xuICAgICAgbGFiZWw6IGJ1aWxkTGFiZWwoZmxhdE5vZGUpLFxuICAgICAgZGVzY3JpcHRpb246IGZsYXROb2RlLm5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBkaW1EZXNjcmlwdGlvbjogZmxhdE5vZGUubm9kZS5kaW1EZXNjcmlwdGlvbiA/PyB0cnVlLFxuICAgICAgdmFsdWU6IGZsYXROb2RlLm5vZGUuaWQsXG4gICAgfSkpXG4gIH0sIFtmbGF0dGVuZWROb2RlcywgYnVpbGRMYWJlbF0pXG5cbiAgLy8gTWFwIGZyb20gbm9kZSBJRCB0byB0aGUgYWN0dWFsIG5vZGUgZm9yIHF1aWNrIGxvb2t1cFxuICBjb25zdCBub2RlTWFwID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcgfCBudW1iZXIsIFRyZWVOb2RlPFQ+PigpXG4gICAgZmxhdHRlbmVkTm9kZXMuZm9yRWFjaChmbiA9PiBtYXAuc2V0KGZuLm5vZGUuaWQsIGZuLm5vZGUpKVxuICAgIHJldHVybiBtYXBcbiAgfSwgW2ZsYXR0ZW5lZE5vZGVzXSlcblxuICAvLyBGaW5kIHRoZSBmbGF0dGVuZWQgbm9kZSBieSBJRFxuICBjb25zdCBmaW5kRmxhdHRlbmVkTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChub2RlSWQ6IHN0cmluZyB8IG51bWJlcik6IEZsYXR0ZW5lZE5vZGU8VD4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZE5vZGVzLmZpbmQoZm4gPT4gZm4ubm9kZS5pZCA9PT0gbm9kZUlkKVxuICAgIH0sXG4gICAgW2ZsYXR0ZW5lZE5vZGVzXSxcbiAgKVxuXG4gIC8vIEhhbmRsZSBleHBhbmQvY29sbGFwc2VcbiAgY29uc3QgdG9nZ2xlRXhwYW5kID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKG5vZGVJZDogc3RyaW5nIHwgbnVtYmVyLCBzaG91bGRFeHBhbmQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGNvbnN0IGZsYXROb2RlID0gZmluZEZsYXR0ZW5lZE5vZGUobm9kZUlkKVxuICAgICAgaWYgKCFmbGF0Tm9kZSB8fCAhZmxhdE5vZGUuaGFzQ2hpbGRyZW4pIHJldHVyblxuXG4gICAgICBpZiAoc2hvdWxkRXhwYW5kKSB7XG4gICAgICAgIGlmIChvbkV4cGFuZCkge1xuICAgICAgICAgIG9uRXhwYW5kKG5vZGVJZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRJbnRlcm5hbEV4cGFuZGVkSWRzKHByZXYgPT4gbmV3IFNldChwcmV2KS5hZGQobm9kZUlkKSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9uQ29sbGFwc2UpIHtcbiAgICAgICAgICBvbkNvbGxhcHNlKG5vZGVJZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRJbnRlcm5hbEV4cGFuZGVkSWRzKHByZXYgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3U2V0ID0gbmV3IFNldChwcmV2KVxuICAgICAgICAgICAgbmV3U2V0LmRlbGV0ZShub2RlSWQpXG4gICAgICAgICAgICByZXR1cm4gbmV3U2V0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpbmRGbGF0dGVuZWROb2RlLCBvbkV4cGFuZCwgb25Db2xsYXBzZV0sXG4gIClcblxuICAvLyBIYW5kbGUgbGVmdC9yaWdodCBhcnJvdyBrZXlzIGZvciBleHBhbmQvY29sbGFwc2VcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKCFmb2N1c05vZGVJZCB8fCBpc0Rpc2FibGVkKSByZXR1cm5cblxuICAgIGNvbnN0IGZsYXROb2RlID0gZmluZEZsYXR0ZW5lZE5vZGUoZm9jdXNOb2RlSWQpXG4gICAgaWYgKCFmbGF0Tm9kZSkgcmV0dXJuXG5cbiAgICBpZiAoZS5rZXkgPT09ICdyaWdodCcgJiYgZmxhdE5vZGUuaGFzQ2hpbGRyZW4pIHtcbiAgICAgIC8vIEV4cGFuZCB0aGUgZm9jdXNlZCBub2RlIChvbmx5IGlmIGl0IGhhcyBjaGlsZHJlbilcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgdG9nZ2xlRXhwYW5kKGZvY3VzTm9kZUlkLCB0cnVlKVxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdsZWZ0Jykge1xuICAgICAgaWYgKGZsYXROb2RlLmhhc0NoaWxkcmVuICYmIGZsYXROb2RlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgLy8gQ29sbGFwc2UgdGhlIGZvY3VzZWQgcGFyZW50IG5vZGVcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHRvZ2dsZUV4cGFuZChmb2N1c05vZGVJZCwgZmFsc2UpXG4gICAgICB9IGVsc2UgaWYgKGZsYXROb2RlLnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNoaWxkIG5vZGUgT1IgYSBjb2xsYXBzZWQgcGFyZW50IHdpdGggYSBwYXJlbnQsXG4gICAgICAgIC8vIGNvbGxhcHNlIHRoZSBwYXJlbnQgYW5kIGZvY3VzIGl0XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBpc1Byb2dyYW1tYXRpY0ZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHRvZ2dsZUV4cGFuZChmbGF0Tm9kZS5wYXJlbnRJZCwgZmFsc2UpXG4gICAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG5vZGVNYXAuZ2V0KGZsYXROb2RlLnBhcmVudElkKVxuICAgICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBvbkZvY3VzKHBhcmVudE5vZGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHNlbGVjdGlvblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAobm9kZUlkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2RlTWFwLmdldChub2RlSWQpXG4gICAgICBpZiAoIW5vZGUpIHJldHVyblxuXG4gICAgICAvLyBBbHdheXMgc2VsZWN0IHRoZSBub2RlIC0gZXhwYW5kL2NvbGxhcHNlIGlzIGhhbmRsZWQgYnkgYXJyb3cga2V5c1xuICAgICAgb25TZWxlY3Qobm9kZSlcbiAgICB9LFxuICAgIFtub2RlTWFwLCBvblNlbGVjdF0sXG4gIClcblxuICAvLyBIYW5kbGUgZm9jdXMgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVGb2N1cyA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgIChub2RlSWQ6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgICAgLy8gU2tpcCBpZiB0aGlzIGlzIGEgcHJvZ3JhbW1hdGljIGZvY3VzIGNoYW5nZVxuICAgICAgaWYgKGlzUHJvZ3JhbW1hdGljRm9jdXNSZWYuY3VycmVudCkge1xuICAgICAgICBpc1Byb2dyYW1tYXRpY0ZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBpZiBzYW1lIG5vZGUgYWxyZWFkeSBmb2N1c2VkXG4gICAgICBpZiAobGFzdEZvY3VzZWRJZFJlZi5jdXJyZW50ID09PSBub2RlSWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBsYXN0Rm9jdXNlZElkUmVmLmN1cnJlbnQgPSBub2RlSWRcblxuICAgICAgaWYgKG9uRm9jdXMpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVNYXAuZ2V0KG5vZGVJZClcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICBvbkZvY3VzKG5vZGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkZvY3VzLCBub2RlTWFwXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPEJveCB0YWJJbmRleD17MH0gYXV0b0ZvY3VzIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn0+XG4gICAgICA8U2VsZWN0XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uRm9jdXM9e2hhbmRsZUZvY3VzfVxuICAgICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICAgIGRlZmF1bHRGb2N1c1ZhbHVlPXtmb2N1c05vZGVJZH1cbiAgICAgICAgdmlzaWJsZU9wdGlvbkNvdW50PXt2aXNpYmxlT3B0aW9uQ291bnR9XG4gICAgICAgIGxheW91dD17bGF5b3V0fVxuICAgICAgICBpc0Rpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgICBoaWRlSW5kZXhlcz17aGlkZUluZGV4ZXN9XG4gICAgICAgIG9uVXBGcm9tRmlyc3RJdGVtPXtvblVwRnJvbUZpcnN0SXRlbX1cbiAgICAgIC8+XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLEtBQUssTUFBTSxPQUFPO0FBQ3pCLGNBQWNDLGFBQWEsUUFBUSxvQ0FBb0M7QUFDdkUsU0FBU0MsR0FBRyxRQUFRLGNBQWM7QUFDbEMsU0FBUyxLQUFLQyxxQkFBcUIsRUFBRUMsTUFBTSxRQUFRLDJCQUEyQjtBQUU5RSxPQUFPLEtBQUtDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRztFQUN4QkMsRUFBRSxFQUFFLE1BQU0sR0FBRyxNQUFNO0VBQ25CQyxLQUFLLEVBQUVDLENBQUM7RUFDUkMsS0FBSyxFQUFFLE1BQU07RUFDYkMsV0FBVyxDQUFDLEVBQUUsTUFBTTtFQUNwQkMsY0FBYyxDQUFDLEVBQUUsT0FBTztFQUN4QkMsUUFBUSxDQUFDLEVBQUVQLFFBQVEsQ0FBQ0csQ0FBQyxDQUFDLEVBQUU7RUFDeEJLLFFBQVEsQ0FBQyxFQUFFQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUNwQyxDQUFDO0FBRUQsS0FBS0MsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHO0VBQ3RCQyxJQUFJLEVBQUVYLFFBQVEsQ0FBQ0csQ0FBQyxDQUFDO0VBQ2pCUyxLQUFLLEVBQUUsTUFBTTtFQUNiQyxVQUFVLEVBQUUsT0FBTztFQUNuQkMsV0FBVyxFQUFFLE9BQU87RUFDcEJDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sR0FBRyxNQUFNO0FBQzVCLENBQUM7QUFFRCxPQUFPLEtBQUtDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRztFQUMvQjtBQUNGO0FBQ0E7RUFDRSxTQUFTQyxLQUFLLEVBQUVqQixRQUFRLENBQUNHLENBQUMsQ0FBQyxFQUFFOztFQUU3QjtBQUNGO0FBQ0E7RUFDRSxTQUFTZSxRQUFRLEVBQUUsQ0FBQ1AsSUFBSSxFQUFFWCxRQUFRLENBQUNHLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSTs7RUFFOUM7QUFDRjtBQUNBO0VBQ0UsU0FBU2dCLFFBQVEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJOztFQUU5QjtBQUNGO0FBQ0E7RUFDRSxTQUFTQyxPQUFPLENBQUMsRUFBRSxDQUFDVCxJQUFJLEVBQUVYLFFBQVEsQ0FBQ0csQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJOztFQUU5QztBQUNGO0FBQ0E7RUFDRSxTQUFTa0IsV0FBVyxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU07O0VBRXRDO0FBQ0Y7QUFDQTtFQUNFLFNBQVNDLGtCQUFrQixDQUFDLEVBQUUsTUFBTTs7RUFFcEM7QUFDRjtBQUNBO0VBQ0UsU0FBU0MsTUFBTSxDQUFDLEVBQUUsU0FBUyxHQUFHLFVBQVUsR0FBRyxrQkFBa0I7O0VBRTdEO0FBQ0Y7QUFDQTtFQUNFLFNBQVNDLFVBQVUsQ0FBQyxFQUFFLE9BQU87O0VBRTdCO0FBQ0Y7QUFDQTtFQUNFLFNBQVNDLFdBQVcsQ0FBQyxFQUFFLE9BQU87O0VBRTlCO0FBQ0Y7QUFDQTtBQUNBO0VBQ0UsU0FBU0MsY0FBYyxDQUFDLEVBQUUsQ0FBQ0MsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLEVBQUUsR0FBRyxPQUFPOztFQUU5RDtBQUNGO0FBQ0E7RUFDRSxTQUFTQyxRQUFRLENBQUMsRUFBRSxDQUFDRCxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sRUFBRSxHQUFHLElBQUk7O0VBRXJEO0FBQ0Y7QUFDQTtFQUNFLFNBQVNFLFVBQVUsQ0FBQyxFQUFFLENBQUNGLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLEdBQUcsSUFBSTs7RUFFdkQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFLFNBQVNHLGVBQWUsQ0FBQyxFQUFFLENBQUNqQixVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTTs7RUFFMUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFLFNBQVNrQixjQUFjLENBQUMsRUFBRSxDQUFDbkIsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU07O0VBRW5EO0FBQ0Y7QUFDQTtBQUNBO0VBQ0UsU0FBU29CLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUk7QUFDekMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxTQUFBQyxXQUFBQyxFQUFBO0VBQUEsTUFBQUMsQ0FBQSxHQUFBQyxFQUFBO0VBQXVCO0lBQUFuQixLQUFBO0lBQUFDLFFBQUE7SUFBQUMsUUFBQTtJQUFBQyxPQUFBO0lBQUFDLFdBQUE7SUFBQUMsa0JBQUE7SUFBQUMsTUFBQSxFQUFBYyxFQUFBO0lBQUFiLFVBQUEsRUFBQWMsRUFBQTtJQUFBYixXQUFBLEVBQUFjLEVBQUE7SUFBQWIsY0FBQTtJQUFBRSxRQUFBO0lBQUFDLFVBQUE7SUFBQUMsZUFBQTtJQUFBQyxjQUFBO0lBQUFDO0VBQUEsSUFBQUUsRUFnQlQ7RUFUbkIsTUFBQVgsTUFBQSxHQUFBYyxFQUFtQixLQUFuQkcsU0FBbUIsR0FBbkIsVUFBbUIsR0FBbkJILEVBQW1CO0VBQ25CLE1BQUFiLFVBQUEsR0FBQWMsRUFBa0IsS0FBbEJFLFNBQWtCLEdBQWxCLEtBQWtCLEdBQWxCRixFQUFrQjtFQUNsQixNQUFBYixXQUFBLEdBQUFjLEVBQW1CLEtBQW5CQyxTQUFtQixHQUFuQixLQUFtQixHQUFuQkQsRUFBbUI7RUFBQSxJQUFBRSxFQUFBO0VBQUEsSUFBQU4sQ0FBQSxRQUFBTyxNQUFBLENBQUFDLEdBQUE7SUFXakJGLEVBQUEsT0FBSUcsR0FBRyxDQUFDLENBQUM7SUFBQVQsQ0FBQSxNQUFBTSxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBTixDQUFBO0VBQUE7RUFGWCxPQUFBVSxtQkFBQSxFQUFBQyxzQkFBQSxJQUFzRG5ELEtBQUssQ0FBQW9ELFFBQVMsQ0FFbEVOLEVBQVMsQ0FBQztFQUdaLE1BQUFPLHNCQUFBLEdBQStCckQsS0FBSyxDQUFBc0QsTUFBTyxDQUFDLEtBQUssQ0FBQztFQUdsRCxNQUFBQyxnQkFBQSxHQUF5QnZELEtBQUssQ0FBQXNELE1BQU8sQ0FBeUIsSUFBSSxDQUFDO0VBQUEsSUFBQUUsRUFBQTtFQUFBLElBQUFoQixDQUFBLFFBQUFVLG1CQUFBLElBQUFWLENBQUEsUUFBQVQsY0FBQTtJQUlqRXlCLEVBQUEsR0FBQXhCLE1BQUE7TUFDRSxJQUFJRCxjQUFjO1FBQUEsT0FDVEEsY0FBYyxDQUFDQyxNQUFNLENBQUM7TUFBQTtNQUM5QixPQUNNa0IsbUJBQW1CLENBQUFPLEdBQUksQ0FBQ3pCLE1BQU0sQ0FBQztJQUFBLENBQ3ZDO0lBQUFRLENBQUEsTUFBQVUsbUJBQUE7SUFBQVYsQ0FBQSxNQUFBVCxjQUFBO0lBQUFTLENBQUEsTUFBQWdCLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFoQixDQUFBO0VBQUE7RUFOSCxNQUFBdEIsVUFBQSxHQUFtQnNDLEVBUWxCO0VBQUEsSUFBQUUsTUFBQTtFQUFBLElBQUFsQixDQUFBLFFBQUF0QixVQUFBLElBQUFzQixDQUFBLFFBQUFsQixLQUFBO0lBSUNvQyxNQUFBLEdBQW1DLEVBQUU7SUFFckMsU0FBQUMsU0FBQTNDLElBQUEsRUFBQUMsS0FBQSxFQUFBRyxRQUFBO01BS0UsTUFBQUQsV0FBQSxHQUFvQixDQUFDLENBQUNILElBQUksQ0FBQUosUUFBcUMsSUFBeEJJLElBQUksQ0FBQUosUUFBUyxDQUFBZ0QsTUFBTyxHQUFHLENBQUM7TUFDL0QsTUFBQUMsY0FBQSxHQUF1QjNDLFVBQVUsQ0FBQ0YsSUFBSSxDQUFBVixFQUFHLENBQUM7TUFFMUNvRCxNQUFNLENBQUFJLElBQUssQ0FBQztRQUFBOUMsSUFBQTtRQUFBQyxLQUFBO1FBQUFDLFVBQUEsRUFHRTJDLGNBQWM7UUFBQTFDLFdBQUE7UUFBQUM7TUFHNUIsQ0FBQyxDQUFDO01BR0YsSUFBSUQsV0FBNkIsSUFBN0IwQyxjQUE4QyxJQUFiN0MsSUFBSSxDQUFBSixRQUFTO1FBQ2hELEtBQUssTUFBQW1ELEtBQVcsSUFBSS9DLElBQUksQ0FBQUosUUFBUztVQUMvQitDLFFBQVEsQ0FBQ0ksS0FBSyxFQUFFOUMsS0FBSyxHQUFHLENBQUMsRUFBRUQsSUFBSSxDQUFBVixFQUFHLENBQUM7UUFBQTtNQUNwQztJQUNGO0lBR0gsS0FBSyxNQUFBMEQsTUFBVSxJQUFJMUMsS0FBSztNQUN0QnFDLFFBQVEsQ0FBQzNDLE1BQUksRUFBRSxDQUFDLENBQUM7SUFBQTtJQUNsQndCLENBQUEsTUFBQXRCLFVBQUE7SUFBQXNCLENBQUEsTUFBQWxCLEtBQUE7SUFBQWtCLENBQUEsTUFBQWtCLE1BQUE7RUFBQTtJQUFBQSxNQUFBLEdBQUFsQixDQUFBO0VBQUE7RUE3QkgsTUFBQXlCLGNBQUEsR0ErQkVQLE1BQWE7RUFJZixNQUFBUSxzQkFBQSxHQUErQkMsS0FHOUI7RUFDRCxNQUFBQyxxQkFBQSxHQUE4QkMsTUFHN0I7RUFFRCxNQUFBQyxjQUFBLEdBQXVCbkMsZUFBeUMsSUFBekMrQixzQkFBeUM7RUFDaEUsTUFBQUssYUFBQSxHQUFzQm5DLGNBQXVDLElBQXZDZ0MscUJBQXVDO0VBQUEsSUFBQUksRUFBQTtFQUFBLElBQUFoQyxDQUFBLFFBQUErQixhQUFBLElBQUEvQixDQUFBLFFBQUE4QixjQUFBO0lBSTNERSxFQUFBLEdBQUFDLFFBQUE7TUFDRSxJQUFBQyxNQUFBLEdBQWEsRUFBRTtNQUVmLElBQUlELFFBQVEsQ0FBQXRELFdBQVk7UUFFdEJ1RCxNQUFBLENBQUFBLENBQUEsQ0FBU0osY0FBYyxDQUFDRyxRQUFRLENBQUF2RCxVQUFXLENBQUM7TUFBdEM7UUFDRCxJQUFJdUQsUUFBUSxDQUFBeEQsS0FBTSxHQUFHLENBQUM7VUFFM0J5RCxNQUFBLENBQUFBLENBQUEsQ0FBU0gsYUFBYSxDQUFDRSxRQUFRLENBQUF4RCxLQUFNLENBQUM7UUFBaEM7TUFDUDtNQUFBLE9BRU15RCxNQUFNLEdBQUdELFFBQVEsQ0FBQXpELElBQUssQ0FBQVAsS0FBTTtJQUFBLENBQ3BDO0lBQUErQixDQUFBLE1BQUErQixhQUFBO0lBQUEvQixDQUFBLE1BQUE4QixjQUFBO0lBQUE5QixDQUFBLE1BQUFnQyxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBaEMsQ0FBQTtFQUFBO0VBYkgsTUFBQW1DLFVBQUEsR0FBbUJILEVBZWxCO0VBQUEsSUFBQUksRUFBQTtFQUFBLElBQUFwQyxDQUFBLFNBQUFtQyxVQUFBLElBQUFuQyxDQUFBLFNBQUF5QixjQUFBO0lBTVFXLEVBQUEsR0FBQVgsY0FBYyxDQUFBWSxHQUFJLENBQUNDLFVBQUEsS0FBYTtNQUFBckUsS0FBQSxFQUM5QmtFLFVBQVUsQ0FBQ0YsVUFBUSxDQUFDO01BQUEvRCxXQUFBLEVBQ2QrRCxVQUFRLENBQUF6RCxJQUFLLENBQUFOLFdBQVk7TUFBQUMsY0FBQSxFQUN0QjhELFVBQVEsQ0FBQXpELElBQUssQ0FBQUwsY0FBdUIsSUFBcEMsSUFBb0M7TUFBQUosS0FBQSxFQUM3Q2tFLFVBQVEsQ0FBQXpELElBQUssQ0FBQVY7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFBQWtDLENBQUEsT0FBQW1DLFVBQUE7SUFBQW5DLENBQUEsT0FBQXlCLGNBQUE7SUFBQXpCLENBQUEsT0FBQW9DLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFwQyxDQUFBO0VBQUE7RUFSTCxNQUFBdUMsT0FBQSxHQUdFSCxFQUtHO0VBQzJCLElBQUFDLEdBQUE7RUFBQSxJQUFBckMsQ0FBQSxTQUFBeUIsY0FBQTtJQUk5QlksR0FBQSxHQUFZLElBQUlHLEdBQUcsQ0FBK0IsQ0FBQztJQUNuRGYsY0FBYyxDQUFBZ0IsT0FBUSxDQUFDQyxFQUFBLElBQU1MLEdBQUcsQ0FBQU0sR0FBSSxDQUFDRCxFQUFFLENBQUFsRSxJQUFLLENBQUFWLEVBQUcsRUFBRTRFLEVBQUUsQ0FBQWxFLElBQUssQ0FBQyxDQUFDO0lBQUF3QixDQUFBLE9BQUF5QixjQUFBO0lBQUF6QixDQUFBLE9BQUFxQyxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBckMsQ0FBQTtFQUFBO0VBRjVELE1BQUE0QyxPQUFBLEdBR0VQLEdBQVU7RUFDUSxJQUFBUSxFQUFBO0VBQUEsSUFBQTdDLENBQUEsU0FBQXlCLGNBQUE7SUFJbEJvQixFQUFBLEdBQUFDLFFBQUEsSUFDU3JCLGNBQWMsQ0FBQXNCLElBQUssQ0FBQ0MsSUFBQSxJQUFNTixJQUFFLENBQUFsRSxJQUFLLENBQUFWLEVBQUcsS0FBSzBCLFFBQU0sQ0FDdkQ7SUFBQVEsQ0FBQSxPQUFBeUIsY0FBQTtJQUFBekIsQ0FBQSxPQUFBNkMsRUFBQTtFQUFBO0lBQUFBLEVBQUEsR0FBQTdDLENBQUE7RUFBQTtFQUhILE1BQUFpRCxpQkFBQSxHQUEwQkosRUFLekI7RUFBQSxJQUFBSyxFQUFBO0VBQUEsSUFBQWxELENBQUEsU0FBQWlELGlCQUFBLElBQUFqRCxDQUFBLFNBQUFOLFVBQUEsSUFBQU0sQ0FBQSxTQUFBUCxRQUFBO0lBSUN5RCxFQUFBLEdBQUFBLENBQUFDLFFBQUEsRUFBQUMsWUFBQTtNQUNFLE1BQUFDLFVBQUEsR0FBaUJKLGlCQUFpQixDQUFDekQsUUFBTSxDQUFDO01BQzFDLElBQUksQ0FBQ3lDLFVBQWlDLElBQWxDLENBQWNBLFVBQVEsQ0FBQXRELFdBQVk7UUFBQTtNQUFBO01BRXRDLElBQUl5RSxZQUFZO1FBQ2QsSUFBSTNELFFBQVE7VUFDVkEsUUFBUSxDQUFDRCxRQUFNLENBQUM7UUFBQTtVQUVoQm1CLHNCQUFzQixDQUFDMkMsSUFBQSxJQUFRLElBQUk3QyxHQUFHLENBQUM2QyxJQUFJLENBQUMsQ0FBQUMsR0FBSSxDQUFDL0QsUUFBTSxDQUFDLENBQUM7UUFBQTtNQUMxRDtRQUVELElBQUlFLFVBQVU7VUFDWkEsVUFBVSxDQUFDRixRQUFNLENBQUM7UUFBQTtVQUVsQm1CLHNCQUFzQixDQUFDNkMsTUFBQTtZQUNyQixNQUFBQyxNQUFBLEdBQWUsSUFBSWhELEdBQUcsQ0FBQzZDLE1BQUksQ0FBQztZQUM1QkcsTUFBTSxDQUFBQyxNQUFPLENBQUNsRSxRQUFNLENBQUM7WUFBQSxPQUNkaUUsTUFBTTtVQUFBLENBQ2QsQ0FBQztRQUFBO01BQ0g7SUFDRixDQUNGO0lBQUF6RCxDQUFBLE9BQUFpRCxpQkFBQTtJQUFBakQsQ0FBQSxPQUFBTixVQUFBO0lBQUFNLENBQUEsT0FBQVAsUUFBQTtJQUFBTyxDQUFBLE9BQUFrRCxFQUFBO0VBQUE7SUFBQUEsRUFBQSxHQUFBbEQsQ0FBQTtFQUFBO0VBdEJILE1BQUEyRCxZQUFBLEdBQXFCVCxFQXdCcEI7RUFBQSxJQUFBVSxHQUFBO0VBQUEsSUFBQTVELENBQUEsU0FBQWlELGlCQUFBLElBQUFqRCxDQUFBLFNBQUFkLFdBQUEsSUFBQWMsQ0FBQSxTQUFBWCxVQUFBLElBQUFXLENBQUEsU0FBQTRDLE9BQUEsSUFBQTVDLENBQUEsU0FBQWYsT0FBQSxJQUFBZSxDQUFBLFNBQUEyRCxZQUFBO0lBR3FCQyxHQUFBLEdBQUFDLENBQUE7TUFDcEIsSUFBSSxDQUFDM0UsV0FBeUIsSUFBMUJHLFVBQTBCO1FBQUE7TUFBQTtNQUU5QixNQUFBeUUsVUFBQSxHQUFpQmIsaUJBQWlCLENBQUMvRCxXQUFXLENBQUM7TUFDL0MsSUFBSSxDQUFDK0MsVUFBUTtRQUFBO01BQUE7TUFFYixJQUFJNEIsQ0FBQyxDQUFBRSxHQUFJLEtBQUssT0FBK0IsSUFBcEI5QixVQUFRLENBQUF0RCxXQUFZO1FBRTNDa0YsQ0FBQyxDQUFBRyxjQUFlLENBQUMsQ0FBQztRQUNsQkwsWUFBWSxDQUFDekUsV0FBVyxFQUFFLElBQUksQ0FBQztNQUFBO1FBQzFCLElBQUkyRSxDQUFDLENBQUFFLEdBQUksS0FBSyxNQUFNO1VBQ3pCLElBQUk5QixVQUFRLENBQUF0RCxXQUFtQyxJQUFuQnNELFVBQVEsQ0FBQXZELFVBQVc7WUFFN0NtRixDQUFDLENBQUFHLGNBQWUsQ0FBQyxDQUFDO1lBQ2xCTCxZQUFZLENBQUN6RSxXQUFXLEVBQUUsS0FBSyxDQUFDO1VBQUE7WUFDM0IsSUFBSStDLFVBQVEsQ0FBQXJELFFBQVMsS0FBS3lCLFNBQVM7Y0FHeEN3RCxDQUFDLENBQUFHLGNBQWUsQ0FBQyxDQUFDO2NBQ2xCbkQsc0JBQXNCLENBQUFvRCxPQUFBLEdBQVcsSUFBSDtjQUM5Qk4sWUFBWSxDQUFDMUIsVUFBUSxDQUFBckQsUUFBUyxFQUFFLEtBQUssQ0FBQztjQUN0QyxJQUFJSyxPQUFPO2dCQUNULE1BQUFpRixVQUFBLEdBQW1CdEIsT0FBTyxDQUFBdUIsR0FBSSxDQUFDbEMsVUFBUSxDQUFBckQsUUFBUyxDQUFDO2dCQUNqRCxJQUFJc0YsVUFBVTtrQkFDWmpGLE9BQU8sQ0FBQ2lGLFVBQVUsQ0FBQztnQkFBQTtjQUNwQjtZQUNGO1VBQ0Y7UUFBQTtNQUNGO0lBQUEsQ0FDRjtJQUFBbEUsQ0FBQSxPQUFBaUQsaUJBQUE7SUFBQWpELENBQUEsT0FBQWQsV0FBQTtJQUFBYyxDQUFBLE9BQUFYLFVBQUE7SUFBQVcsQ0FBQSxPQUFBNEMsT0FBQTtJQUFBNUMsQ0FBQSxPQUFBZixPQUFBO0lBQUFlLENBQUEsT0FBQTJELFlBQUE7SUFBQTNELENBQUEsT0FBQTRELEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUE1RCxDQUFBO0VBQUE7RUE3QkQsTUFBQW9FLGFBQUEsR0FBc0JSLEdBNkJyQjtFQUFBLElBQUFTLEdBQUE7RUFBQSxJQUFBckUsQ0FBQSxTQUFBNEMsT0FBQSxJQUFBNUMsQ0FBQSxTQUFBakIsUUFBQTtJQUlDc0YsR0FBQSxHQUFBQyxRQUFBO01BQ0UsTUFBQUMsTUFBQSxHQUFhM0IsT0FBTyxDQUFBdUIsR0FBSSxDQUFDM0UsUUFBTSxDQUFDO01BQ2hDLElBQUksQ0FBQ2hCLE1BQUk7UUFBQTtNQUFBO01BR1RPLFFBQVEsQ0FBQ1AsTUFBSSxDQUFDO0lBQUEsQ0FDZjtJQUFBd0IsQ0FBQSxPQUFBNEMsT0FBQTtJQUFBNUMsQ0FBQSxPQUFBakIsUUFBQTtJQUFBaUIsQ0FBQSxPQUFBcUUsR0FBQTtFQUFBO0lBQUFBLEdBQUEsR0FBQXJFLENBQUE7RUFBQTtFQVBILE1BQUF3RSxZQUFBLEdBQXFCSCxHQVNwQjtFQUFBLElBQUFJLEdBQUE7RUFBQSxJQUFBekUsQ0FBQSxTQUFBNEMsT0FBQSxJQUFBNUMsQ0FBQSxTQUFBZixPQUFBO0lBSUN3RixHQUFBLEdBQUFDLFFBQUE7TUFFRSxJQUFJN0Qsc0JBQXNCLENBQUFvRCxPQUFRO1FBQ2hDcEQsc0JBQXNCLENBQUFvRCxPQUFBLEdBQVcsS0FBSDtRQUFBO01BQUE7TUFLaEMsSUFBSWxELGdCQUFnQixDQUFBa0QsT0FBUSxLQUFLekUsUUFBTTtRQUFBO01BQUE7TUFHdkN1QixnQkFBZ0IsQ0FBQWtELE9BQUEsR0FBV3pFLFFBQUg7TUFFeEIsSUFBSVAsT0FBTztRQUNULE1BQUEwRixNQUFBLEdBQWEvQixPQUFPLENBQUF1QixHQUFJLENBQUMzRSxRQUFNLENBQUM7UUFDaEMsSUFBSWhCLE1BQUk7VUFDTlMsT0FBTyxDQUFDVCxNQUFJLENBQUM7UUFBQTtNQUNkO0lBQ0YsQ0FDRjtJQUFBd0IsQ0FBQSxPQUFBNEMsT0FBQTtJQUFBNUMsQ0FBQSxPQUFBZixPQUFBO0lBQUFlLENBQUEsT0FBQXlFLEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUF6RSxDQUFBO0VBQUE7RUFwQkgsTUFBQTRFLFdBQUEsR0FBb0JILEdBc0JuQjtFQUFBLElBQUFJLEdBQUE7RUFBQSxJQUFBN0UsQ0FBQSxTQUFBZCxXQUFBLElBQUFjLENBQUEsU0FBQXdFLFlBQUEsSUFBQXhFLENBQUEsU0FBQTRFLFdBQUEsSUFBQTVFLENBQUEsU0FBQVYsV0FBQSxJQUFBVSxDQUFBLFNBQUFYLFVBQUEsSUFBQVcsQ0FBQSxTQUFBWixNQUFBLElBQUFZLENBQUEsU0FBQWhCLFFBQUEsSUFBQWdCLENBQUEsU0FBQUgsaUJBQUEsSUFBQUcsQ0FBQSxTQUFBdUMsT0FBQSxJQUFBdkMsQ0FBQSxTQUFBYixrQkFBQTtJQUlHMEYsR0FBQSxJQUFDLE1BQU0sQ0FDSXRDLE9BQU8sQ0FBUEEsUUFBTSxDQUFDLENBQ05pQyxRQUFZLENBQVpBLGFBQVcsQ0FBQyxDQUNiSSxPQUFXLENBQVhBLFlBQVUsQ0FBQyxDQUNWNUYsUUFBUSxDQUFSQSxTQUFPLENBQUMsQ0FDQ0UsaUJBQVcsQ0FBWEEsWUFBVSxDQUFDLENBQ1ZDLGtCQUFrQixDQUFsQkEsbUJBQWlCLENBQUMsQ0FDOUJDLE1BQU0sQ0FBTkEsT0FBSyxDQUFDLENBQ0ZDLFVBQVUsQ0FBVkEsV0FBUyxDQUFDLENBQ1RDLFdBQVcsQ0FBWEEsWUFBVSxDQUFDLENBQ0xPLGlCQUFpQixDQUFqQkEsa0JBQWdCLENBQUMsR0FDcEM7SUFBQUcsQ0FBQSxPQUFBZCxXQUFBO0lBQUFjLENBQUEsT0FBQXdFLFlBQUE7SUFBQXhFLENBQUEsT0FBQTRFLFdBQUE7SUFBQTVFLENBQUEsT0FBQVYsV0FBQTtJQUFBVSxDQUFBLE9BQUFYLFVBQUE7SUFBQVcsQ0FBQSxPQUFBWixNQUFBO0lBQUFZLENBQUEsT0FBQWhCLFFBQUE7SUFBQWdCLENBQUEsT0FBQUgsaUJBQUE7SUFBQUcsQ0FBQSxPQUFBdUMsT0FBQTtJQUFBdkMsQ0FBQSxPQUFBYixrQkFBQTtJQUFBYSxDQUFBLE9BQUE2RSxHQUFBO0VBQUE7SUFBQUEsR0FBQSxHQUFBN0UsQ0FBQTtFQUFBO0VBQUEsSUFBQThFLEdBQUE7RUFBQSxJQUFBOUUsQ0FBQSxTQUFBb0UsYUFBQSxJQUFBcEUsQ0FBQSxTQUFBNkUsR0FBQTtJQVpKQyxHQUFBLElBQUMsR0FBRyxDQUFXLFFBQUMsQ0FBRCxHQUFDLENBQUUsU0FBUyxDQUFULEtBQVEsQ0FBQyxDQUFZVixTQUFhLENBQWJBLGNBQVksQ0FBQyxDQUNsRCxDQUFBUyxHQVdDLENBQ0gsRUFiQyxHQUFHLENBYUU7SUFBQTdFLENBQUEsT0FBQW9FLGFBQUE7SUFBQXBFLENBQUEsT0FBQTZFLEdBQUE7SUFBQTdFLENBQUEsT0FBQThFLEdBQUE7RUFBQTtJQUFBQSxHQUFBLEdBQUE5RSxDQUFBO0VBQUE7RUFBQSxPQWJOOEUsR0FhTTtBQUFBO0FBbFBILFNBQUFqRCxPQUFBa0QsTUFBQTtFQUFBLE9BZ0Z5QixXQUFNO0FBQUE7QUFoRi9CLFNBQUFwRCxNQUFBcUQsWUFBQTtFQUFBLE9BNEUrQnRHLFlBQVUsR0FBVixTQUF3QixHQUF4QixTQUF3QjtBQUFBIiwiaWdub3JlTGlzdCI6W119