app-studio 0.6.28 → 0.6.30
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.
- package/dist/app-studio.cjs.development.js +45 -127
- package/dist/app-studio.cjs.development.js.map +1 -1
- package/dist/app-studio.cjs.production.min.js +1 -1
- package/dist/app-studio.esm.js +45 -127
- package/dist/app-studio.esm.js.map +1 -1
- package/dist/app-studio.umd.development.js +45 -127
- package/dist/app-studio.umd.development.js.map +1 -1
- package/dist/app-studio.umd.production.min.js +1 -1
- package/dist/components/Text/Text.props.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/components/Text/Text.style.d.ts +0 -27
|
@@ -1151,7 +1151,7 @@ const cssProperties = /*#__PURE__*/new Set([
|
|
|
1151
1151
|
// Borders
|
|
1152
1152
|
'border', 'borderWidth', 'borderStyle', 'borderColor', 'borderRadius', 'borderTop', 'borderRight', 'borderBottom', 'borderLeft', 'borderTopLeftRadius', 'borderTopRightRadius', 'borderBottomLeftRadius', 'borderBottomRightRadius',
|
|
1153
1153
|
// Effects
|
|
1154
|
-
'boxShadow', 'textShadow', 'transform', 'transition', 'animation', 'filter', 'backdropFilter',
|
|
1154
|
+
'boxShadow', 'textShadow', 'transform', 'transition', 'animation', 'filter', 'backdropFilter', 'mixBlendMode',
|
|
1155
1155
|
// Layout
|
|
1156
1156
|
'display', 'visibility', 'overflow', 'overflowX', 'overflowY', 'float', 'clear', 'objectFit', 'objectPosition',
|
|
1157
1157
|
// Interactivity
|
|
@@ -2321,7 +2321,7 @@ const Element = /*#__PURE__*/React__default.memo(/*#__PURE__*/React.forwardRef((
|
|
|
2321
2321
|
const propsToProcess = {
|
|
2322
2322
|
...rest
|
|
2323
2323
|
};
|
|
2324
|
-
if (blend) {
|
|
2324
|
+
if (blend !== false && propsToProcess.color === undefined && typeof rest.children === 'string') {
|
|
2325
2325
|
if (propsToProcess.bgColor) {
|
|
2326
2326
|
propsToProcess.mixBlendMode = 'exclusion';
|
|
2327
2327
|
propsToProcess.color = getColor(propsToProcess.bgColor);
|
|
@@ -2492,103 +2492,6 @@ const ImageBackground = /*#__PURE__*/React__default.forwardRef((_ref, ref) => {
|
|
|
2492
2492
|
}));
|
|
2493
2493
|
});
|
|
2494
2494
|
|
|
2495
|
-
/**
|
|
2496
|
-
* Text Styles
|
|
2497
|
-
*
|
|
2498
|
-
* Defines the styles for the Text component following the design guidelines:
|
|
2499
|
-
* - Typography: Inter/Geist font, specific sizes/weights
|
|
2500
|
-
* - Spacing: 4px grid system
|
|
2501
|
-
* - Colors: Neutral palette with semantic colors
|
|
2502
|
-
*/
|
|
2503
|
-
/**
|
|
2504
|
-
* Heading sizes following typography guidelines
|
|
2505
|
-
* Matching shadcn/ui typography patterns
|
|
2506
|
-
*/
|
|
2507
|
-
const HeadingSizes = {
|
|
2508
|
-
h1: {
|
|
2509
|
-
fontSize: '36px',
|
|
2510
|
-
lineHeight: '40px',
|
|
2511
|
-
fontWeight: '700',
|
|
2512
|
-
letterSpacing: '-0.02em',
|
|
2513
|
-
marginBottom: '24px',
|
|
2514
|
-
transition: 'color 0.15s ease'
|
|
2515
|
-
},
|
|
2516
|
-
h2: {
|
|
2517
|
-
fontSize: '30px',
|
|
2518
|
-
lineHeight: '36px',
|
|
2519
|
-
fontWeight: '700',
|
|
2520
|
-
letterSpacing: '-0.02em',
|
|
2521
|
-
marginBottom: '20px',
|
|
2522
|
-
transition: 'color 0.15s ease'
|
|
2523
|
-
},
|
|
2524
|
-
h3: {
|
|
2525
|
-
fontSize: '24px',
|
|
2526
|
-
lineHeight: '32px',
|
|
2527
|
-
fontWeight: '600',
|
|
2528
|
-
letterSpacing: '-0.01em',
|
|
2529
|
-
marginBottom: '16px',
|
|
2530
|
-
transition: 'color 0.15s ease'
|
|
2531
|
-
},
|
|
2532
|
-
h4: {
|
|
2533
|
-
fontSize: '20px',
|
|
2534
|
-
lineHeight: '28px',
|
|
2535
|
-
fontWeight: '600',
|
|
2536
|
-
letterSpacing: '-0.01em',
|
|
2537
|
-
marginBottom: '16px',
|
|
2538
|
-
transition: 'color 0.15s ease'
|
|
2539
|
-
},
|
|
2540
|
-
h5: {
|
|
2541
|
-
fontSize: '18px',
|
|
2542
|
-
lineHeight: '24px',
|
|
2543
|
-
fontWeight: '600',
|
|
2544
|
-
letterSpacing: '-0.01em',
|
|
2545
|
-
marginBottom: '12px',
|
|
2546
|
-
transition: 'color 0.15s ease'
|
|
2547
|
-
},
|
|
2548
|
-
h6: {
|
|
2549
|
-
fontSize: '16px',
|
|
2550
|
-
lineHeight: '24px',
|
|
2551
|
-
fontWeight: '600',
|
|
2552
|
-
letterSpacing: '-0.01em',
|
|
2553
|
-
marginBottom: '8px',
|
|
2554
|
-
transition: 'color 0.15s ease'
|
|
2555
|
-
}
|
|
2556
|
-
};
|
|
2557
|
-
/**
|
|
2558
|
-
* Font sizes following typography guidelines
|
|
2559
|
-
*/
|
|
2560
|
-
const FontSizes = {
|
|
2561
|
-
xs: '10px',
|
|
2562
|
-
sm: '12px',
|
|
2563
|
-
md: '14px',
|
|
2564
|
-
lg: '16px',
|
|
2565
|
-
xl: '20px'
|
|
2566
|
-
};
|
|
2567
|
-
/**
|
|
2568
|
-
* Line heights following typography guidelines
|
|
2569
|
-
*/
|
|
2570
|
-
const LineHeights = {
|
|
2571
|
-
xs: '14px',
|
|
2572
|
-
sm: '16px',
|
|
2573
|
-
md: '20px',
|
|
2574
|
-
lg: '22px',
|
|
2575
|
-
xl: '28px'
|
|
2576
|
-
};
|
|
2577
|
-
/**
|
|
2578
|
-
* Font weights following typography guidelines
|
|
2579
|
-
*/
|
|
2580
|
-
const FontWeights = {
|
|
2581
|
-
hairline: '100',
|
|
2582
|
-
thin: '200',
|
|
2583
|
-
light: '300',
|
|
2584
|
-
normal: '400',
|
|
2585
|
-
medium: '500',
|
|
2586
|
-
semiBold: '600',
|
|
2587
|
-
bold: '700',
|
|
2588
|
-
extraBold: '800',
|
|
2589
|
-
black: '900'
|
|
2590
|
-
};
|
|
2591
|
-
|
|
2592
2495
|
const normalizeHexColor = backgroundColor => {
|
|
2593
2496
|
if (!backgroundColor) {
|
|
2594
2497
|
return null;
|
|
@@ -2634,21 +2537,24 @@ const TextContent = _ref => {
|
|
|
2634
2537
|
children,
|
|
2635
2538
|
isSub,
|
|
2636
2539
|
isSup,
|
|
2637
|
-
views
|
|
2540
|
+
views,
|
|
2541
|
+
...props
|
|
2638
2542
|
} = _ref;
|
|
2639
|
-
return
|
|
2640
|
-
as: "sub"
|
|
2543
|
+
return isSub ? (/*#__PURE__*/React__default.createElement(View, Object.assign({
|
|
2544
|
+
as: "sub"
|
|
2545
|
+
}, views?.sup, {
|
|
2641
2546
|
fontSize: "75%",
|
|
2642
2547
|
lineHeight: "0",
|
|
2643
2548
|
position: "relative",
|
|
2644
2549
|
bottom: "-0.25em"
|
|
2645
|
-
}
|
|
2646
|
-
as: "sup"
|
|
2550
|
+
}), children)) : isSup ? (/*#__PURE__*/React__default.createElement(View, Object.assign({
|
|
2551
|
+
as: "sup"
|
|
2552
|
+
}, views?.sup, {
|
|
2647
2553
|
fontSize: "75%",
|
|
2648
2554
|
lineHeight: "0",
|
|
2649
2555
|
position: "relative",
|
|
2650
2556
|
top: "-0.5em"
|
|
2651
|
-
}
|
|
2557
|
+
}), children)) : (/*#__PURE__*/React__default.createElement(Element, Object.assign({}, props), children));
|
|
2652
2558
|
};
|
|
2653
2559
|
/**
|
|
2654
2560
|
* Renders text with truncation after a specified number of lines (JS calculation)
|
|
@@ -2658,6 +2564,8 @@ const TruncateText = _ref2 => {
|
|
|
2658
2564
|
text,
|
|
2659
2565
|
maxLines = 1,
|
|
2660
2566
|
views,
|
|
2567
|
+
isSub,
|
|
2568
|
+
isSup,
|
|
2661
2569
|
...rest // Pass down other HTML attributes
|
|
2662
2570
|
} = _ref2;
|
|
2663
2571
|
const containerRef = React.useRef(null);
|
|
@@ -2717,11 +2625,24 @@ const TruncateText = _ref2 => {
|
|
|
2717
2625
|
n.style.lineHeight = lineHeight;
|
|
2718
2626
|
}
|
|
2719
2627
|
}, [text, maxLines]);
|
|
2628
|
+
const subSupProps = isSub ? {
|
|
2629
|
+
as: 'sub',
|
|
2630
|
+
fontSize: '75%',
|
|
2631
|
+
lineHeight: '0',
|
|
2632
|
+
position: 'relative',
|
|
2633
|
+
bottom: '-0.25em'
|
|
2634
|
+
} : isSup ? {
|
|
2635
|
+
as: 'sup',
|
|
2636
|
+
fontSize: '75%',
|
|
2637
|
+
lineHeight: '0',
|
|
2638
|
+
position: 'relative',
|
|
2639
|
+
top: '-0.5em'
|
|
2640
|
+
} : {};
|
|
2720
2641
|
return /*#__PURE__*/React__default.createElement(Element, Object.assign({
|
|
2721
2642
|
as: "span",
|
|
2722
2643
|
ref: containerRef,
|
|
2723
2644
|
overflow: "hidden" // Crucial for final display state
|
|
2724
|
-
}, views?.truncateText,
|
|
2645
|
+
}, rest, subSupProps, views?.truncateText, {
|
|
2725
2646
|
// Add title attribute for accessibility/hover to see full text
|
|
2726
2647
|
title: isTruncated ? text : undefined
|
|
2727
2648
|
}), truncatedText);
|
|
@@ -2732,7 +2653,6 @@ const TruncateText = _ref2 => {
|
|
|
2732
2653
|
const TextView = _ref3 => {
|
|
2733
2654
|
let {
|
|
2734
2655
|
children,
|
|
2735
|
-
heading,
|
|
2736
2656
|
maxLines,
|
|
2737
2657
|
isItalic = false,
|
|
2738
2658
|
isUnderlined = false,
|
|
@@ -2740,47 +2660,45 @@ const TextView = _ref3 => {
|
|
|
2740
2660
|
isSub = false,
|
|
2741
2661
|
isSup = false,
|
|
2742
2662
|
isStriked = false,
|
|
2743
|
-
weight = 'normal',
|
|
2744
|
-
size = 'md',
|
|
2745
2663
|
bgColor,
|
|
2746
2664
|
backgroundColor: backgroundColorProp,
|
|
2747
2665
|
color,
|
|
2748
2666
|
views,
|
|
2667
|
+
blend,
|
|
2749
2668
|
...props
|
|
2750
2669
|
} = _ref3;
|
|
2751
|
-
// Apply heading styles if a heading is specified
|
|
2752
|
-
const headingStyles = heading ? HeadingSizes[heading] : {};
|
|
2753
2670
|
// For sub/sup text, use inline display
|
|
2754
2671
|
const noLineBreak = isSub || isSup ? {
|
|
2755
2672
|
display: 'inline'
|
|
2756
2673
|
} : {};
|
|
2757
|
-
// Get font size, line height, and weight from our design system
|
|
2758
|
-
const fontSize = FontSizes[size];
|
|
2759
|
-
const lineHeight = LineHeights[size];
|
|
2760
|
-
const fontWeight = FontWeights[weight];
|
|
2761
2674
|
const containerBackgroundColor = views?.container?.backgroundColor;
|
|
2762
2675
|
const effectiveBackgroundColor = bgColor ?? backgroundColorProp ?? containerBackgroundColor;
|
|
2763
2676
|
const computedColor = color ?? (effectiveBackgroundColor ? getTextColor(effectiveBackgroundColor) : undefined);
|
|
2764
2677
|
children = toUpperCase && typeof children === 'string' ? children.toUpperCase() : children;
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
// Apply typography styles according to design guidelines
|
|
2769
|
-
fontSize: fontSize,
|
|
2770
|
-
lineHeight: lineHeight,
|
|
2678
|
+
// Common props for both TruncateText and standard Element
|
|
2679
|
+
const commonProps = {
|
|
2680
|
+
as: 'span',
|
|
2771
2681
|
fontStyle: isItalic ? 'italic' : 'normal',
|
|
2772
|
-
fontWeight: fontWeight,
|
|
2773
|
-
letterSpacing: "-0.01em",
|
|
2774
2682
|
textDecoration: isStriked ? 'line-through' : isUnderlined ? 'underline' : 'none',
|
|
2775
2683
|
color: computedColor,
|
|
2776
|
-
|
|
2777
|
-
|
|
2684
|
+
maxLines,
|
|
2685
|
+
blend,
|
|
2686
|
+
backgroundColor: effectiveBackgroundColor,
|
|
2687
|
+
...noLineBreak,
|
|
2688
|
+
...props,
|
|
2689
|
+
...views?.container
|
|
2690
|
+
};
|
|
2691
|
+
children = toUpperCase && typeof children === 'string' ? children.toUpperCase() : children;
|
|
2692
|
+
return maxLines && typeof children === 'string' ? (/*#__PURE__*/React__default.createElement(TruncateText, Object.assign({
|
|
2693
|
+
isSub: isSub,
|
|
2694
|
+
isSup: isSup
|
|
2695
|
+
}, commonProps, {
|
|
2778
2696
|
text: children,
|
|
2779
2697
|
maxLines: maxLines
|
|
2780
|
-
})) : (/*#__PURE__*/React__default.createElement(TextContent, {
|
|
2698
|
+
}))) : (/*#__PURE__*/React__default.createElement(TextContent, Object.assign({
|
|
2781
2699
|
isSub: isSub,
|
|
2782
2700
|
isSup: isSup
|
|
2783
|
-
}, children))
|
|
2701
|
+
}, commonProps), children));
|
|
2784
2702
|
};
|
|
2785
2703
|
|
|
2786
2704
|
const TextComponent = props => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-studio.cjs.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-studio.cjs.development.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|