From fe9a2ef1ee77a0b0709a08427d36452fdb06950b Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Sun, 2 Apr 2023 02:11:29 -0700 Subject: [PATCH 01/12] Adds typing to keys and values of createStylesFromProps function --- src/createStylesFromProps.ts | 30 ++++++++++++++++-------------- src/index.ts | 2 +- src/quark.ts | 6 ++++-- src/utils/typeUtils.ts | 4 ++++ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/createStylesFromProps.ts b/src/createStylesFromProps.ts index 903a558..646cc5b 100644 --- a/src/createStylesFromProps.ts +++ b/src/createStylesFromProps.ts @@ -5,31 +5,33 @@ import { camelToKebabCase } from './utils/functions'; import { hasOwnProperty, objectEntries } from './utils/typeUtils'; import type { ThemeValues } from './theme/customOverwrites'; -import type { ExtractFunctionsFromUnion, OverwriteProperties } from './utils/typeUtils'; +import type { ExtractFunctionsFromUnion, OverwriteProperties, Prefix, valueof } from './utils/typeUtils'; import type { Properties } from 'csstype'; import type { CSSAttribute, DefaultTheme, Tagged, Theme } from 'goober'; +type PrefixedProperties = Prefix; -type PrefixedProperties = { - [P in keyof T & string as `$${P}`]?: T[P]; -}; +export type StyleProps = OverwriteProperties; -type StyleProps = OverwriteProperties, ThemeValues>; +export type QuarkProps> = StyleProps & + JSX.LibraryManagedAttributes & + P & + Theme; -type StylingFunction = Tagged< - JSX.LibraryManagedAttributes<'div', JSX.IntrinsicElements['div']> & StyleProps & Theme ->; +type StylingFunction = Tagged>; -type CallbackArg = ExtractFunctionsFromUnion[number]>; +type PropsType = ExtractFunctionsFromUnion< + Parameters>[number] +>; -const createStylesFromProps = (props: CallbackArg): CSSAttribute => +const createStylesFromProps = (props: PropsType): CSSAttribute => objectEntries(props).reduce((prevValue, [propertyKey, value]) => { - const key = camelToKebabCase(propertyKey.replaceAll('$', '')); // checks if prop is for styling - if (validateProp(propertyKey)) { + if (typeof propertyKey === 'string' && validateProp(propertyKey)) { + const key = camelToKebabCase(propertyKey.replaceAll('$', '')); // checks if prop is something from customOverwrites if (hasOwnProperty(customOverwrites, propertyKey)) { - const themeValue = customOverwrites[propertyKey](value); + const themeValue = customOverwrites[propertyKey](value as Parameters>[0]); return { ...prevValue, @@ -51,7 +53,7 @@ const createStylesFromProps = (props: CallbackArg): CSSAttribute => return { ...prevValue, - [`&:${extraColon}${key}`]: createStylesFromProps(value), + [`&:${extraColon}${key}`]: createStylesFromProps(value as PropsType), }; } diff --git a/src/index.ts b/src/index.ts index e3a76f4..b6749b2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import quark from './quark'; import setupQuarks from './setup'; -export { setupQuarks }; +export { setupQuarks as setup }; export default quark; diff --git a/src/quark.ts b/src/quark.ts index dccdd6d..7d16588 100644 --- a/src/quark.ts +++ b/src/quark.ts @@ -2,7 +2,9 @@ import { styled } from 'goober'; import createStylesFromProps from './createStylesFromProps'; -// @ts-expect-error TODO: add correct types -const quark = (tag: T) => styled(tag)(props => createStylesFromProps(props)); +import type { QuarkProps } from './createStylesFromProps'; + +const quark = (tag: T) => + styled>(tag)(props => createStylesFromProps(props)); export default quark; diff --git a/src/utils/typeUtils.ts b/src/utils/typeUtils.ts index 873e670..0f22504 100644 --- a/src/utils/typeUtils.ts +++ b/src/utils/typeUtils.ts @@ -4,6 +4,10 @@ export type OverwriteProperties = Omit & R; export type ExtractFunctionsFromUnion = T extends (...args: any) => any ? Parameters[0] : never; +export type Prefix = { + [P in keyof T & string as `${Pre}${P}`]?: T[P]; +}; + type ObjectEntriesReturn = [keyof T, valueof][]; type ObjectEntries = (object: T) => ObjectEntriesReturn; type ObjectKeys = (object: T) => (keyof T)[]; From 8f4b3c37d20b36a977a18af41ba42e1795e72254 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Sun, 2 Apr 2023 02:39:18 -0700 Subject: [PATCH 02/12] Removes unused generic that was causing issues, adds TODO --- .vscode/settings.json | 3 +++ src/createStylesFromProps.ts | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..72446f4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/src/createStylesFromProps.ts b/src/createStylesFromProps.ts index 646cc5b..d3d435c 100644 --- a/src/createStylesFromProps.ts +++ b/src/createStylesFromProps.ts @@ -13,9 +13,8 @@ type PrefixedProperties = Prefix; export type StyleProps = OverwriteProperties; -export type QuarkProps> = StyleProps & +export type QuarkProps = StyleProps & JSX.LibraryManagedAttributes & - P & Theme; type StylingFunction = Tagged>; @@ -43,7 +42,7 @@ const createStylesFromProps = (props: Pro if (hasOwnProperty(media, propertyKey)) { return { ...prevValue, - [media[propertyKey]]: createStylesFromProps(value), + [media[propertyKey]]: createStylesFromProps(value as PropsType), }; } @@ -53,6 +52,7 @@ const createStylesFromProps = (props: Pro return { ...prevValue, + // @ts-expect-error: "Expression produces a union type that is too complex to represent", TODO: find solution [`&:${extraColon}${key}`]: createStylesFromProps(value as PropsType), }; } From 89c9997b52227088e619b2e0aaf5bdbf0cc71a55 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Sun, 2 Apr 2023 04:01:23 -0700 Subject: [PATCH 03/12] Adds types for media queries, pseudoclasses, and pseudoelements --- src/createStylesFromProps.ts | 15 +++------------ src/media.ts | 0 src/types/pseudos.ts | 10 ++++++++++ src/types/quarkProps.ts | 22 ++++++++++++++++++++++ src/utils/typeUtils.ts | 9 +++++++++ 5 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 src/media.ts create mode 100644 src/types/pseudos.ts create mode 100644 src/types/quarkProps.ts diff --git a/src/createStylesFromProps.ts b/src/createStylesFromProps.ts index d3d435c..932f880 100644 --- a/src/createStylesFromProps.ts +++ b/src/createStylesFromProps.ts @@ -4,18 +4,9 @@ import { customOverwrites } from './theme/customOverwrites'; import { camelToKebabCase } from './utils/functions'; import { hasOwnProperty, objectEntries } from './utils/typeUtils'; -import type { ThemeValues } from './theme/customOverwrites'; -import type { ExtractFunctionsFromUnion, OverwriteProperties, Prefix, valueof } from './utils/typeUtils'; -import type { Properties } from 'csstype'; -import type { CSSAttribute, DefaultTheme, Tagged, Theme } from 'goober'; - -type PrefixedProperties = Prefix; - -export type StyleProps = OverwriteProperties; - -export type QuarkProps = StyleProps & - JSX.LibraryManagedAttributes & - Theme; +import type { QuarkProps } from './types/quarkProps'; +import type { ExtractFunctionsFromUnion, valueof } from './utils/typeUtils'; +import type { CSSAttribute, Tagged } from 'goober'; type StylingFunction = Tagged>; diff --git a/src/media.ts b/src/media.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/types/pseudos.ts b/src/types/pseudos.ts new file mode 100644 index 0000000..e38b1eb --- /dev/null +++ b/src/types/pseudos.ts @@ -0,0 +1,10 @@ +import type { Pseudos } from 'csstype'; +import type { Replace } from 'src/utils/typeUtils'; + +type FilterPseudoTypes = T extends `${U}${string}` ? T : never; + +type PseudoElements = FilterPseudoTypes; +type PseudoClasses = Exclude; + +export type PseudoClassProps = Replace; +export type PseudoElementProps = Replace; diff --git a/src/types/quarkProps.ts b/src/types/quarkProps.ts new file mode 100644 index 0000000..ba9c46d --- /dev/null +++ b/src/types/quarkProps.ts @@ -0,0 +1,22 @@ +import type { PseudoClassProps, PseudoElementProps } from './pseudos'; +import type media from '../theme/breakpoints'; +import type { ThemeValues } from '../theme/customOverwrites'; +import type { OverwriteProperties, Prefix } from '../utils/typeUtils'; +import type { Properties } from 'csstype'; +import type { DefaultTheme, Theme } from 'goober'; + +type PrefixedProperties = Prefix; + +type DirectStyleProps = OverwriteProperties; + +type StyleProps = DirectStyleProps & { + [P in keyof typeof media]?: StyleProps; +} & { + [P in PseudoClassProps]?: StyleProps; +} & { + [P in PseudoElementProps]?: StyleProps; +}; + +export type QuarkProps = StyleProps & + JSX.LibraryManagedAttributes & + Theme; diff --git a/src/utils/typeUtils.ts b/src/utils/typeUtils.ts index 0f22504..9600f0e 100644 --- a/src/utils/typeUtils.ts +++ b/src/utils/typeUtils.ts @@ -8,6 +8,15 @@ export type Prefix = { [P in keyof T & string as `${Pre}${P}`]?: T[P]; }; +export type Replace< + T extends string, + SearchVal extends string, + ReplaceVal extends string, + A extends string = '', +> = T extends `${infer L}${SearchVal}${infer R}` + ? Replace + : `${A}${T}`; + type ObjectEntriesReturn = [keyof T, valueof][]; type ObjectEntries = (object: T) => ObjectEntriesReturn; type ObjectKeys = (object: T) => (keyof T)[]; From 918f5f8b40ee70143cbcc743ac04ed8b6b373172 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Mon, 8 May 2023 21:07:29 -0700 Subject: [PATCH 04/12] Various type fixes --- .eslintrc | 2 +- src/createStylesFromProps.ts | 63 +++++++++++++++++------------------ src/quark.ts | 2 +- src/setup.ts | 3 +- src/theme/customOverwrites.ts | 4 +-- src/types/quarkProps.ts | 4 +-- src/utils/typeUtils.ts | 2 +- 7 files changed, 40 insertions(+), 40 deletions(-) diff --git a/.eslintrc b/.eslintrc index 37db1f7..1f21824 100644 --- a/.eslintrc +++ b/.eslintrc @@ -25,7 +25,7 @@ "version": "detect" } }, - "ignorePatterns": [], + "ignorePatterns": ["dist"], "rules": { "curly": "error", "eqeqeq": ["error", "smart"], diff --git a/src/createStylesFromProps.ts b/src/createStylesFromProps.ts index 932f880..3eb0e39 100644 --- a/src/createStylesFromProps.ts +++ b/src/createStylesFromProps.ts @@ -17,44 +17,43 @@ type PropsType = ExtractFunctionsFromUnio const createStylesFromProps = (props: PropsType): CSSAttribute => objectEntries(props).reduce((prevValue, [propertyKey, value]) => { // checks if prop is for styling - if (typeof propertyKey === 'string' && validateProp(propertyKey)) { - const key = camelToKebabCase(propertyKey.replaceAll('$', '')); - // checks if prop is something from customOverwrites - if (hasOwnProperty(customOverwrites, propertyKey)) { - const themeValue = customOverwrites[propertyKey](value as Parameters>[0]); - - return { - ...prevValue, - [key]: themeValue, - }; - } - - // checks if prop is a media query - if (hasOwnProperty(media, propertyKey)) { - return { - ...prevValue, - [media[propertyKey]]: createStylesFromProps(value as PropsType), - }; - } - - // checks if prop is pseudo-class or pseudo-element - if (typeof value === 'object') { - const extraColon = propertyKey.split('$').length > 2 ? ':' : ''; - - return { - ...prevValue, - // @ts-expect-error: "Expression produces a union type that is too complex to represent", TODO: find solution - [`&:${extraColon}${key}`]: createStylesFromProps(value as PropsType), - }; - } + if (typeof propertyKey !== 'string' || !validateProp(propertyKey)) { + return prevValue; + } + + const key = camelToKebabCase(propertyKey.replaceAll('$', '')); + // checks if prop is something from customOverwrites + if (hasOwnProperty(customOverwrites, propertyKey)) { + const themeValue = customOverwrites[propertyKey](value as Parameters>[0]); + + return { + ...prevValue, + [key]: themeValue, + }; + } + + // checks if prop is a media query + if (hasOwnProperty(media, propertyKey)) { + return { + ...prevValue, + [media[propertyKey]]: createStylesFromProps(value as PropsType), + }; + } + + // checks if prop is pseudo-class or pseudo-element + if (typeof value === 'object') { + const extraColon = propertyKey.split('$').length > 2 ? ':' : ''; return { ...prevValue, - [key]: value, + [`&:${extraColon}${key}`]: createStylesFromProps(value as PropsType), }; } - return prevValue; + return { + ...prevValue, + [key]: value, + }; }, {}); export default createStylesFromProps; diff --git a/src/quark.ts b/src/quark.ts index 7d16588..8f2d7cb 100644 --- a/src/quark.ts +++ b/src/quark.ts @@ -2,7 +2,7 @@ import { styled } from 'goober'; import createStylesFromProps from './createStylesFromProps'; -import type { QuarkProps } from './createStylesFromProps'; +import type { QuarkProps } from './types/quarkProps'; const quark = (tag: T) => styled>(tag)(props => createStylesFromProps(props)); diff --git a/src/setup.ts b/src/setup.ts index d5316d5..67cec99 100644 --- a/src/setup.ts +++ b/src/setup.ts @@ -6,7 +6,8 @@ import { createElement } from 'react'; import useTheme from './theme'; const stylePropPrefix = '$'; -export const validateProp = (key: string) => key.startsWith(stylePropPrefix); +export const validateProp = (string: string): string is `${typeof stylePropPrefix}${string}` => + typeof string === 'string' && string.startsWith(stylePropPrefix); const setupQuarks = () => setup( diff --git a/src/theme/customOverwrites.ts b/src/theme/customOverwrites.ts index e673f7a..65411a9 100644 --- a/src/theme/customOverwrites.ts +++ b/src/theme/customOverwrites.ts @@ -9,7 +9,7 @@ export const customOverwrites = { $color: (value: keyof typeof flattenedColors) => flattenedColors[value], }; -type GetThemeValues = { +type GetOverwriteValues = { [P in keyof T]?: T[P] extends (...args: any) => string ? Parameters[0] : never; }; -export type ThemeValues = GetThemeValues; +export type OverwriteValues = GetOverwriteValues; diff --git a/src/types/quarkProps.ts b/src/types/quarkProps.ts index ba9c46d..410dbba 100644 --- a/src/types/quarkProps.ts +++ b/src/types/quarkProps.ts @@ -1,13 +1,13 @@ import type { PseudoClassProps, PseudoElementProps } from './pseudos'; import type media from '../theme/breakpoints'; -import type { ThemeValues } from '../theme/customOverwrites'; +import type { OverwriteValues } from '../theme/customOverwrites'; import type { OverwriteProperties, Prefix } from '../utils/typeUtils'; import type { Properties } from 'csstype'; import type { DefaultTheme, Theme } from 'goober'; type PrefixedProperties = Prefix; -type DirectStyleProps = OverwriteProperties; +type DirectStyleProps = OverwriteProperties; type StyleProps = DirectStyleProps & { [P in keyof typeof media]?: StyleProps; diff --git a/src/utils/typeUtils.ts b/src/utils/typeUtils.ts index 9600f0e..5d90643 100644 --- a/src/utils/typeUtils.ts +++ b/src/utils/typeUtils.ts @@ -24,5 +24,5 @@ type ObjectKeys = (object: T) => (keyof T)[]; export const objectEntries: ObjectEntries = object => Object.entries(object) as ObjectEntriesReturn; export const objectKeys: ObjectKeys = object => Object.keys(object) as (keyof typeof object)[]; -export const hasOwnProperty = (object: Readonly>, key: string): key is K => +export const hasOwnProperty =

(object: Readonly>, key: string): key is P => key in object; From f37fb5e383e64884a9c91b9c6f3b02941d2b9765 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Mon, 8 May 2023 23:29:58 -0700 Subject: [PATCH 05/12] Adds type gates and direct pseudo element checking --- src/constants/pseudoElements.ts | 23 +++++++++++++++++++++++ src/createStylesFromProps.ts | 23 ++++++++++++----------- src/media.ts | 0 src/setup.ts | 4 +++- src/types/pseudos.ts | 2 +- src/types/quarkProps.ts | 2 +- src/utils/pseudoUtils.ts | 8 ++++++++ tsconfig.json | 1 - 8 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 src/constants/pseudoElements.ts delete mode 100644 src/media.ts create mode 100644 src/utils/pseudoUtils.ts diff --git a/src/constants/pseudoElements.ts b/src/constants/pseudoElements.ts new file mode 100644 index 0000000..bec9e16 --- /dev/null +++ b/src/constants/pseudoElements.ts @@ -0,0 +1,23 @@ +// part and slotted not currently supported by quarks +const PSEUDO_ELEMENTS = [ + '::after', + '::backdrop', + '::before', + '::cue', + '::cue-region', + '::first-letter', + '::first-line', + '::file-selector-button', + '::grammar-error', + '::marker', + // '::part()', + '::placeholder', + '::selection', + // '::slotted()', + '::spelling-error', + '::target-text', +]; + +export const prefixedPseudoElements = PSEUDO_ELEMENTS.map(pseudoEle => pseudoEle.replace('::', '$')); + +export default PSEUDO_ELEMENTS; diff --git a/src/createStylesFromProps.ts b/src/createStylesFromProps.ts index 3eb0e39..137ce46 100644 --- a/src/createStylesFromProps.ts +++ b/src/createStylesFromProps.ts @@ -2,6 +2,7 @@ import { validateProp } from './setup'; import media from './theme/breakpoints'; import { customOverwrites } from './theme/customOverwrites'; import { camelToKebabCase } from './utils/functions'; +import { isPseudo, isPseudoElement } from './utils/pseudoUtils'; import { hasOwnProperty, objectEntries } from './utils/typeUtils'; import type { QuarkProps } from './types/quarkProps'; @@ -10,21 +11,21 @@ import type { CSSAttribute, Tagged } from 'goober'; type StylingFunction = Tagged>; -type PropsType = ExtractFunctionsFromUnion< +export type PropsType = ExtractFunctionsFromUnion< Parameters>[number] >; const createStylesFromProps = (props: PropsType): CSSAttribute => - objectEntries(props).reduce((prevValue, [propertyKey, value]) => { + objectEntries(props).reduce((prevValue, [propName, value]) => { // checks if prop is for styling - if (typeof propertyKey !== 'string' || !validateProp(propertyKey)) { + if (typeof propName !== 'string' || !validateProp(propName)) { return prevValue; } - const key = camelToKebabCase(propertyKey.replaceAll('$', '')); + const key = camelToKebabCase(propName.replace('$', '')); // checks if prop is something from customOverwrites - if (hasOwnProperty(customOverwrites, propertyKey)) { - const themeValue = customOverwrites[propertyKey](value as Parameters>[0]); + if (hasOwnProperty(customOverwrites, propName)) { + const themeValue = customOverwrites[propName](value as Parameters>[0]); return { ...prevValue, @@ -33,20 +34,20 @@ const createStylesFromProps = (props: Pro } // checks if prop is a media query - if (hasOwnProperty(media, propertyKey)) { + if (hasOwnProperty(media, propName)) { return { ...prevValue, - [media[propertyKey]]: createStylesFromProps(value as PropsType), + [media[propName]]: createStylesFromProps(value as PropsType), }; } // checks if prop is pseudo-class or pseudo-element - if (typeof value === 'object') { - const extraColon = propertyKey.split('$').length > 2 ? ':' : ''; + if (isPseudo(value)) { + const extraColon = isPseudoElement(propName) ? ':' : ''; return { ...prevValue, - [`&:${extraColon}${key}`]: createStylesFromProps(value as PropsType), + [`&:${extraColon}${key}`]: createStylesFromProps(value), }; } diff --git a/src/media.ts b/src/media.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/setup.ts b/src/setup.ts index 67cec99..4e0b593 100644 --- a/src/setup.ts +++ b/src/setup.ts @@ -5,8 +5,10 @@ import { createElement } from 'react'; import useTheme from './theme'; +import type { StyleProps } from './types/quarkProps'; + const stylePropPrefix = '$'; -export const validateProp = (string: string): string is `${typeof stylePropPrefix}${string}` => +export const validateProp = (string: string): string is keyof StyleProps => typeof string === 'string' && string.startsWith(stylePropPrefix); const setupQuarks = () => diff --git a/src/types/pseudos.ts b/src/types/pseudos.ts index e38b1eb..05be19e 100644 --- a/src/types/pseudos.ts +++ b/src/types/pseudos.ts @@ -7,4 +7,4 @@ type PseudoElements = FilterPseudoTypes; type PseudoClasses = Exclude; export type PseudoClassProps = Replace; -export type PseudoElementProps = Replace; +export type PseudoElementProps = Exclude, '$slotted' | '$part'>; diff --git a/src/types/quarkProps.ts b/src/types/quarkProps.ts index 410dbba..6860ae5 100644 --- a/src/types/quarkProps.ts +++ b/src/types/quarkProps.ts @@ -9,7 +9,7 @@ type PrefixedProperties = Prefix; type DirectStyleProps = OverwriteProperties; -type StyleProps = DirectStyleProps & { +export type StyleProps = DirectStyleProps & { [P in keyof typeof media]?: StyleProps; } & { [P in PseudoClassProps]?: StyleProps; diff --git a/src/utils/pseudoUtils.ts b/src/utils/pseudoUtils.ts new file mode 100644 index 0000000..b76a463 --- /dev/null +++ b/src/utils/pseudoUtils.ts @@ -0,0 +1,8 @@ +import { prefixedPseudoElements } from '../constants/pseudoElements'; + +import type { PropsType } from '../createStylesFromProps'; + +export const isPseudo = (value: unknown): value is PropsType => + typeof value === 'object'; + +export const isPseudoElement = (propName: string) => prefixedPseudoElements.includes(propName); diff --git a/tsconfig.json b/tsconfig.json index 739eded..85ff349 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,6 @@ "moduleResolution": "node", "allowJs": false, "noEmit": true, - "strict": true, "allowSyntheticDefaultImports": true, "skipLibCheck": true, "noUnusedLocals": true, From 247d67541440da8b335df639bd16b05ef20671aa Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Tue, 9 May 2023 01:25:47 -0700 Subject: [PATCH 06/12] Cleans up type issues in createStylesFromProps --- src/constants/pseudoElements.ts | 33 +++++++++++++++++++++++++++++++-- src/createStylesFromProps.ts | 30 +++++++++++++----------------- src/utils/propChecks.ts | 19 +++++++++++++++++++ src/utils/pseudoUtils.ts | 8 -------- src/utils/typeUtils.ts | 2 -- tsconfig.json | 1 + 6 files changed, 64 insertions(+), 29 deletions(-) create mode 100644 src/utils/propChecks.ts delete mode 100644 src/utils/pseudoUtils.ts diff --git a/src/constants/pseudoElements.ts b/src/constants/pseudoElements.ts index bec9e16..554ec9f 100644 --- a/src/constants/pseudoElements.ts +++ b/src/constants/pseudoElements.ts @@ -1,5 +1,7 @@ // part and slotted not currently supported by quarks const PSEUDO_ELEMENTS = [ + // '::part()', + // '::slotted()', '::after', '::backdrop', '::before', @@ -10,12 +12,39 @@ const PSEUDO_ELEMENTS = [ '::file-selector-button', '::grammar-error', '::marker', - // '::part()', '::placeholder', '::selection', - // '::slotted()', '::spelling-error', '::target-text', + '::-moz-placeholder', + '::-moz-progress-bar', + '::-moz-range-progress', + '::-moz-range-thumb', + '::-moz-range-track', + '::-moz-selection', + '::-ms-backdrop', + '::-ms-browse', + '::-ms-check', + '::-ms-clear', + '::-ms-expand', + '::-ms-fill', + '::-ms-fill-lower', + '::-ms-fill-upper', + '::-ms-input-placeholder', + '::-ms-reveal', + '::-ms-thumb', + '::-ms-ticks-after', + '::-ms-ticks-before', + '::-ms-tooltip', + '::-ms-track', + '::-ms-value', + '::-webkit-backdrop', + '::-webkit-input-placeholder', + '::-webkit-progress-bar', + '::-webkit-progress-inner-value', + '::-webkit-progress-value', + '::-webkit-slider-runnable-track', + '::-webkit-slider-thumb', ]; export const prefixedPseudoElements = PSEUDO_ELEMENTS.map(pseudoEle => pseudoEle.replace('::', '$')); diff --git a/src/createStylesFromProps.ts b/src/createStylesFromProps.ts index 137ce46..ae0dde5 100644 --- a/src/createStylesFromProps.ts +++ b/src/createStylesFromProps.ts @@ -2,21 +2,14 @@ import { validateProp } from './setup'; import media from './theme/breakpoints'; import { customOverwrites } from './theme/customOverwrites'; import { camelToKebabCase } from './utils/functions'; -import { isPseudo, isPseudoElement } from './utils/pseudoUtils'; -import { hasOwnProperty, objectEntries } from './utils/typeUtils'; +import { isCustomOverwrite, isMediaQuery, isPseudo, isPseudoElement } from './utils/propChecks'; +import { objectEntries } from './utils/typeUtils'; -import type { QuarkProps } from './types/quarkProps'; -import type { ExtractFunctionsFromUnion, valueof } from './utils/typeUtils'; -import type { CSSAttribute, Tagged } from 'goober'; +import type { CSSAttribute } from 'goober'; -type StylingFunction = Tagged>; - -export type PropsType = ExtractFunctionsFromUnion< - Parameters>[number] ->; - -const createStylesFromProps = (props: PropsType): CSSAttribute => - objectEntries(props).reduce((prevValue, [propName, value]) => { +const createStylesFromProps = (props: Record): CSSAttribute => + objectEntries(props).reduce((prevValue, prop) => { + const [propName, value] = prop; // checks if prop is for styling if (typeof propName !== 'string' || !validateProp(propName)) { return prevValue; @@ -24,8 +17,9 @@ const createStylesFromProps = (props: Pro const key = camelToKebabCase(propName.replace('$', '')); // checks if prop is something from customOverwrites - if (hasOwnProperty(customOverwrites, propName)) { - const themeValue = customOverwrites[propName](value as Parameters>[0]); + if (isCustomOverwrite(prop)) { + const [overwriteKey, overwriteValue] = prop; + const themeValue = customOverwrites[overwriteKey](overwriteValue); return { ...prevValue, @@ -34,10 +28,12 @@ const createStylesFromProps = (props: Pro } // checks if prop is a media query - if (hasOwnProperty(media, propName)) { + if (isMediaQuery(prop)) { + const [mediaKey, mediaValue] = prop; + return { ...prevValue, - [media[propName]]: createStylesFromProps(value as PropsType), + [media[mediaKey]]: createStylesFromProps(mediaValue), }; } diff --git a/src/utils/propChecks.ts b/src/utils/propChecks.ts new file mode 100644 index 0000000..132d027 --- /dev/null +++ b/src/utils/propChecks.ts @@ -0,0 +1,19 @@ +import { customOverwrites } from 'src/theme/customOverwrites'; + +import { prefixedPseudoElements } from '../constants/pseudoElements'; +import media from '../theme/breakpoints'; + +import type { valueof } from './typeUtils'; + +type customOverWriteValues = Parameters>[number]; + +export const isCustomOverwrite = ( + prop: [string, unknown], +): prop is [keyof typeof customOverwrites, customOverWriteValues] => prop[0] in customOverwrites; + +export const isMediaQuery = (prop: [string, unknown]): prop is [keyof typeof media, Record] => + prop[0] in media; + +export const isPseudo = (value: unknown): value is Record => typeof value === 'object'; + +export const isPseudoElement = (propName: string) => prefixedPseudoElements.includes(propName); diff --git a/src/utils/pseudoUtils.ts b/src/utils/pseudoUtils.ts deleted file mode 100644 index b76a463..0000000 --- a/src/utils/pseudoUtils.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { prefixedPseudoElements } from '../constants/pseudoElements'; - -import type { PropsType } from '../createStylesFromProps'; - -export const isPseudo = (value: unknown): value is PropsType => - typeof value === 'object'; - -export const isPseudoElement = (propName: string) => prefixedPseudoElements.includes(propName); diff --git a/src/utils/typeUtils.ts b/src/utils/typeUtils.ts index 5d90643..70fc033 100644 --- a/src/utils/typeUtils.ts +++ b/src/utils/typeUtils.ts @@ -2,8 +2,6 @@ export type valueof = T[keyof T]; export type OverwriteProperties = Omit & R; -export type ExtractFunctionsFromUnion = T extends (...args: any) => any ? Parameters[0] : never; - export type Prefix = { [P in keyof T & string as `${Pre}${P}`]?: T[P]; }; diff --git a/tsconfig.json b/tsconfig.json index 85ff349..739eded 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "moduleResolution": "node", "allowJs": false, "noEmit": true, + "strict": true, "allowSyntheticDefaultImports": true, "skipLibCheck": true, "noUnusedLocals": true, From 612fee406dc7b54af730e674f1eb6bc44a1610c6 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Tue, 9 May 2023 02:20:34 -0700 Subject: [PATCH 07/12] Temporarily fixes type error with assertion --- src/quark.ts | 3 ++- src/theme/customOverwrites.ts | 2 +- src/types/pseudos.ts | 2 +- src/utils/propChecks.ts | 3 +-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/quark.ts b/src/quark.ts index 8f2d7cb..f44402d 100644 --- a/src/quark.ts +++ b/src/quark.ts @@ -4,7 +4,8 @@ import createStylesFromProps from './createStylesFromProps'; import type { QuarkProps } from './types/quarkProps'; +// TODO: Solve "Index signature for type 'string' is missing in type" from SVGProps const quark = (tag: T) => - styled>(tag)(props => createStylesFromProps(props)); + styled>(tag)(props => createStylesFromProps(props as Record)); export default quark; diff --git a/src/theme/customOverwrites.ts b/src/theme/customOverwrites.ts index 65411a9..b016429 100644 --- a/src/theme/customOverwrites.ts +++ b/src/theme/customOverwrites.ts @@ -1,4 +1,4 @@ -import flattenObject from 'src/utils/flattenObject'; +import flattenObject from '../utils/flattenObject'; import COLORS from './color'; diff --git a/src/types/pseudos.ts b/src/types/pseudos.ts index 05be19e..49421a3 100644 --- a/src/types/pseudos.ts +++ b/src/types/pseudos.ts @@ -1,5 +1,5 @@ +import type { Replace } from '../utils/typeUtils'; import type { Pseudos } from 'csstype'; -import type { Replace } from 'src/utils/typeUtils'; type FilterPseudoTypes = T extends `${U}${string}` ? T : never; diff --git a/src/utils/propChecks.ts b/src/utils/propChecks.ts index 132d027..10dab4a 100644 --- a/src/utils/propChecks.ts +++ b/src/utils/propChecks.ts @@ -1,7 +1,6 @@ -import { customOverwrites } from 'src/theme/customOverwrites'; - import { prefixedPseudoElements } from '../constants/pseudoElements'; import media from '../theme/breakpoints'; +import { customOverwrites } from '../theme/customOverwrites'; import type { valueof } from './typeUtils'; From 186a62408c9d9ea9168f443a78a3fa9690e48944 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Tue, 9 May 2023 03:49:04 -0700 Subject: [PATCH 08/12] Removes personal vscode folder --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 72446f4..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules/typescript/lib" -} From 124a8062555c0861907811e631c4b28a5dc62557 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Tue, 9 May 2023 03:50:27 -0700 Subject: [PATCH 09/12] Updates gitignore to include vscode folder --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 707837c..58d8587 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ dist .DS_Store *.pem .eslintcache -.vscode +.vscode* # debug npm-debug.log* From 9b5bb72054cb92a6a5fcf579e32d3293c2ea311f Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Sat, 13 May 2023 19:50:17 -0700 Subject: [PATCH 10/12] Creates getConfig function --- package.json | 9 +- src/assets/quarks-logo.png | Bin 34120 -> 26134 bytes src/assets/quarks-logo.svg | 1 - src/getConfig.ts | 11 ++ src/setup.ts | 7 +- src/utils/functions.ts | 8 ++ yarn.lock | 204 ++++++++++++++++++++++++++++++++++++- 7 files changed, 235 insertions(+), 5 deletions(-) delete mode 100644 src/assets/quarks-logo.svg create mode 100644 src/getConfig.ts diff --git a/package.json b/package.json index 1833b0e..143143c 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,9 @@ "author": { "name": "Daniel Slovinsky & Justin Wallace" }, + "browser": { + "fs": false + }, "contributors": [ { "name": "Daniel Slovinsky", @@ -46,13 +49,17 @@ "prepack": "yarn build" }, "dependencies": { - "goober": "^2.1.12" + "findup-sync": "^5.0.0", + "goober": "^2.1.12", + "ts-node": "^10.9.1" }, "peerDependencies": { "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { + "@types/findup-sync": "^4.0.2", + "@types/node": "^20.1.4", "@types/react": "^18.0.31", "@types/react-dom": "^18.0.11", "@typescript-eslint/eslint-plugin": "^5.57.0", diff --git a/src/assets/quarks-logo.png b/src/assets/quarks-logo.png index 760cf79b2c57948655f35460dd5a4e3b55c04170..dec971b74539a817f4d143f04af2df434184ea46 100644 GIT binary patch literal 26134 zcmV(`K-0g8P)fT&<4i-R~y7m6dISlKKxj5u8lvZ+8e?x1uw zA~FnPWr-qtSIeNNgPrwP`Kzd%seZU(XR$pe?3SO~l^$aOkOCwak2PovpNDWC3}EAHmJGr&0xTMU z1rMbA+xFP@{D#l|*a651jyrr7CvS%^eLljp2gL;l`|gAQ=j#msE z6>tP7>j6Zwim3o1=OREN6B%{h2=ibB3j!?cHtpiJ_|mt)*a65oW8zbG+92#VNYlrW z_WFr_CzAnj2L!lX5Rm{TF;4hhfC&^$6t5y+20@X56qzD3fvrR=!>l7$6O^Mp!17mHc~kVZ3z z0*I~H#Hhz2Zmq=AZQH0aRRu=0Nf4%?rg*o6@eoA+hJ6mN0n%m#4EM>k1DpX zJgI928PZFJ*hNoxt3k3hgY>||=MQ^P><-u-*#bY=SsAxEfL!n|6Ek3F2GH$mm>~jN zC}6~WW{?z_s zMSVawso0L^x; zWjMqx`8X)|2r#?rHlnMX(*T)Ryz3-b=Yeq$4NU+812ArWa+(1KF$yeZ;M^|OH9QFJ zXiEL!dbNgk!wiIs@X+9FXtdk95@UB zvmMprNQLi1n{%~Np7oG8;YXEn zF1`RH7|moOD!f=r_mD`{(!?VUN*(MW|TK5n#-Fi1R6I z{srk+{`Xe0O3X=<5dmDdh9{(YHK==r*P?zV53C-`9pwDbeL+2k1NTtl007+7wat7t zZuXpO^XZ&nkh}i*eP^6;vuNCIzZ5&u0WvF~ae&MK6xhTi1~CKsk;%-WS>yskaDKR# z3L!zQh!5}k%u$+qcNG>XOsq4coY&{_b=bRRh&|R~m%fMD56Koqg!9vD{v#jpwl zbAGeupBu{jwg zhX+SIZg_Tx-=hd8!3>gJ%Foer5{g(=Dd!{Q32!PuUp(M7Qd z`G@Zinx+Gy=y?WN75Rr3mBsM+0FEG%$%Lc6r3y=B8$^`B0TE?D9Ktl?;`PL@5>YFt zQ0iVTT~~^2$PA!gJMiZV(JB4uLL{X0K5AJUaX=#DH$eouf#ACKE6q_Pn6bCtzWT|w z)Isj?-pi&9;i4hDveq5^){x1MB?wR*kI2N8+8NkIe#3H=N96%$KS$J6^6EcYV?_>w zc&;#*J@&6P<)2R1X&{xDA_csXIcQ*0h}}m3 zi|v=1*)#FGpN+At8020@9uZi>7`!rQt)4BIJ%E@Ym`M!(>OtXVC!KL|dIV9zxHRdb zZvxYVHpC3#{Tx87r1NW?G^9QDVpiSr?ha$54sLbRi1!lrp}sQ4*twnL+Jo zEjeFL&T4h9M?IO5CqCjjFY4Wc(x$~Xr~r0?w+kN@HHEEtUGI1=0NmJq!EP%y*%koV z{q{%ABAFYI%&dY>fd&s@}S7mVtDzQ$BU~2&;F%)G> z*5F0;aOuUbXg_Zk+Rxc-VG`cbBG#VYo%SNt5j3z57!*OYVo|A3K!XxX@i}C0L?H{% zIWJg2pkl?mhP`~ku^oF>a_s=_k_jv({`r0xZBc}t}V+T_xbI| zO&c=HhRi;blx~wYl*f*rb5Y!qb0cSA)Hab-_i7r%%K_h39_uI0bAwV!J zPNhx4Lpb7gB$%{L=3gHYfZ+WQY=zW zt~F`%c`dGGQEtROyF7sM?;aUHWl;|Q#EY7!~{xoFw))~}%O zOGcho>}?nBRpei=cmo6_~@u$sRU-y*T&ed|-wsa;0lUnHRR;bDkY`Ia9EQ z-lE7QlLQkZ4TXL*YH}u{fq+hd51{YwfT2k(0KyVv`IWS;I?%gcHKEsI0;-u|=-QfP z)?%H!&P^b~jpG$Nv(DSz^syxX@=e$L;FRgiB6fCfShbbRA13N}7c?Fy0vtd2Nr_zE zeCy9w4#S`yv`qkxgmnaE+lyIRcM;vgDSd_a;od2VwiLI7jhf(`%o%_(P=#tZo>-*z zu6itfk^K7pFj$6!tj824nRwS$=EI=!Zz8`b5-;FdkQ)NSz;ifs-4J-<@uBfeTSqTB z>mt@SzxruYXw5=Y+FSsD-|3ny(Mf0kek>M=?=E3y^SNyt40OyCjg%5PQg(oiIBVkzx{77L9b?MSrsDQBLl> zuj^pd1J_di*ZEt?l`$~qWf*lf=^+WttmFaNqP1lv3YeXCMiS*U|F%!y!COu@)0vtog%DkQ{d_1jAh7zXUMdbab>#>m@ z`5Iw1)c3FdUi!L+mHEE19)Y6hgK$l7V2!J_bd)#^_5#7e_@C_b=t13C37Yu;YmO&}bYZb}dKls^b6zZ@IEv*puyo zCChU7d)V`1(DL)ocN=DvStQ(J0Q@#> z<9^Bj>|HY-r1uz;6)aiR)IQ~YuKd28xC8{#qi@=L zkZd|Y9{w}Wogw26N#YV&my(#GBG3l}@PvmjIVk}logcOQTn0zb1FYkuDFvF*I3`IM z0g6jWQpi9;j6i5AU}V5J0mqU>S_qq=h1rQ)&U%v2zY$J)!1xX0z5vW%5|rp_6+rYc zK;;_&#R{+v6AXbx0U*pi*9S#$O}xh{IG7%N^X8g?Hx(d{c**l-fWeUf!oUc+g9nTE zdn9mlJqC&F;g~@pi->5JSj000#p?`jUWxa6U=Rp<>{0+S{914E3il9@U;&Wp(a;eO zidSF!r7fT5@X-jE{T5(90$g4j0E7h$;4p)zbBQ&uv`!^f=}rJBqTmZVxIs(S5R3TZ zRp?-P^w7-%$)*A1+g@;0$s7y}0gK^c3jR6Ai~x!$K(4VF2%rGrfhFu>d4d}?=>;eO zApRN;5D(D9|v(OidjLSWRWU~Q{kR+?Dd)Gt1$eWfB=~t z^06z#Dh&=}-AaQnXN{YG(}P!T6IBGi=+FaY7Ktrm6(F*OFkasitxg6Ua<1dlO30v~ z^;o2G@hr zszcywu}kM4Yf)+~g}qY@LKR5%Z5&883?S3boZSP)EdtU+(l>myk zz^&*Zonnf$EL*Mukv9KkF-xvLJeuA(kNbvr(jWiyUz{|ZIfBki^l=Y<$m)+o=bsWpMwMA_uCC){S5&KI-Ex` zdod*_<**U#VrpzT=}o!u1edT9AFPNRs3;*PDfvl)3Ol~Hq}HbJk$gS!>y0x@#+l3B z_UNU9zxVC`aGURevDP?$7x{%_3IMLB0ti$_UdmVt7*Iv<>TnjM!Ru35p_)mC75)R` z_iaoR@EI4ep72Ajo&}^=1aWHD7_`sBkKh>e;*Afj7`4M*bFN+pwlwpSh*nw$vC%(~ z{UBX%9A>{pDPE1NyZUWU_`nWhoa7jP4fp$|IzBADSmlSrq$p8|9%VolrevmS(1Zf=~NAb7XY{>iPH8`5BG&gj`Px0`%)A$2ARv!(zC|?hx#3-m)d?s{=>h8vfwp5xBso zDEEn?6EV{eGYNSnh?cLUyMz*=CKpqHoZ}H5;c>qLT=A}_{K;+Bbh{D5-j3$FFW~|J z_{q4t_!C2lIaHt+7y_ulr`PeVcw-Lfzu{ot_?^w{=qc?P5u?wDi1noZ^7=VKx{{PQ z6@z&kn|9meJ+GaEq{2%=#Hg5URb;Q|8sY$Nld~uXhC9Lh{91F{S1bJ%%#@k+TCOOEBbxdwqg+6?EB*8*~|UobP3$*|%j~ zr1u(J0y5J(;Mlxj?nK@Le-#p~FAf#{leLqo!YFhUEYfxh*6Hap>An--@U%ti(*lTb zX4W_^2P(da&KAI^K@x#tvfn~Y@|0SuYwRX{BHPWwef?Pzzs*<_EoAR4A>i~opY`?~ z-^L~nyoh|`oGXgIszZhQzKcQjNUWkY@>}tPNKoa#`OA+V8tp%wZ{n0itRH&R?@T+} z-JnG&Ke?%j)D6$uENX?paanZ?mg8KIx%h*KS;tFJizGb0gFU;RGd`txamrS# zAX;H84MS2dH|1oLWD{i0bg@!M@P~MY=;Tr^i5@Do$MX6Bs<%am+cJRTCIUmh2X6`M zf+=_DozH*6ma3<8TOD|@o2O3(i{+tVQL7NL*0)+gA7rss0Y9hokmQW4EoHI9sV^gR zO7r8CM69Ph@~yMRVJTWUo5doj^wH%CCGorxrHJ(phozp;#n2QH!Mwg<#-p49$~X-E zk9hqOIx~GLpJQii%)q<3`9j>n>fqM=A)>2v73-{345F?E!+$2OwPEo-aQt<Vsns!E&@ z+=lWx{H=AMyd7Q8Io|%WuiFu;w%EXXx_SC&Sbs|<8E^uU!~S!m8Abs^i)tySgbMMj z60zju4RsRsIlup2n=yx8ZzL*kAnh z6JAtLia|_gW%Q}{WULH6%} zWBUxe)ExwZ!{H4VCR^?^S(|Y67+k+q6qeklL*)liB3l`;H35Jp#UdvRkY|0=c57O`nS(ry`?)6?Tq1p_w9~>3ppjLYw9E^^Hc`1 zD1}L6O1==MCcnHk0f@IQhN#5XC*b%j*Aot8JRyKQ_Z#0g<2~k0YYTwXCR)>F(aLam zyYKIT+~)&}aCNJ^>3rVb--nSf8-;XR-pqKkV%pI;?d$l9uiS3x|NrWR(|`T73r^bF zvK#2V>k1bH@@hc zu~_}l=kC167`NY`+iwj`8FUlYU}}-@cekAHD>|>shfX*?Y4b<89ul@LjTxY z3y_ue!3Lno8Z~SJ4r73E!sv2FVi~@oE<>0-5$EBpTCsle(*HY6NH>JId&6zTFiw2` zxJ&h}vgImA^D;mrqF1b5yb-@v!cF8kYR0*OV$3|e`gadsc}}FszV}mipZ4X2ta1B7 zxIVg6+SKr|k#eWVE#r{*ygO*=ZJ*ylOQS__u(uy_qODW7b~fQyvj!^BOEF1{ zgOR@By0Onb#69Qz;+NN5bZ=F}@|LS0T2WuDDgq4oxEVJ|yvn{0@uutI4A}R+E2TgD zy%^ZIbS{A7x{qBl_4}W=*8&jU;Ef$+FeY$M5mQuefzXaYca=h)cX4Rh*@cffv%SSI zC29>v_*S9t9j5b?^p8quACBrBK8NT-P;S+twJt!ey63_k+u42EYL$8fQl+rFtZ$%d ze4`_JL%+c`I|-wsaKv9swpy9v=f&`nX!$y6=gw9e@A}A|83gp;2>srDEE>7E0k@o! zI=DtUQeo`l4%NmL+V@$&8$apHw*78!YP=ZA3W*}F#UO{3IECeTeXf7!3@E5TBt!n* z37CA>1xN^I*SQ{Y?DBD#^qx76H;FMatJu;yHFO+$5RP)ZmXz^{*BpNHTmRd(HtD|O zru+F4NQcPhON(EJut*IKV4>LFhA1}vksnp6tQS2!(!gsz?aa0nxA383FBz<)6MACj ztE%9`YyvJLg)xHzRN!pkk!LXGIH!qQUU9t zOtDovGFSRKa?}3IN+6wOJDbA;$gBdLoKt73jko^WgXV$o04UKi_vMgc6i_gTxKojA z1e12Ja@Q?WtcZBvvu@)Gr)~HUQEQMDbeM@U*Vfm7634o17EWLgK%l;lfM@+VwkAM) znS3OiNN=04kPTBWKGrobZB{W(f6G8oeiJt91`)!GRuM?Ezy0oKZdTmJbWUaUF* z%m!K4Fi@UTRb9N@&e_B={xMPB>VPFRoeq3{n~Gcbh~r*DxIX8bD?mWi=_gm4D}5bK ziD{tv*rAwpF#|*Q%#O!fnPS|Q+EDy|wBz$Vs^ z?;(8g&VcI}EMyf};`iW0XMw!Xh?phyjj>#&wxy_LzWtVEAiO#;M+$*gaaH^r)p1v8 zATK;vGK$`?x?c9~BmrW)W3T{*=>f%Z(YIg%?kZqZAc0yh34qGp^Qsv2%KZDDx@~3Z zH!nSG##@+Ojh9b+{U`1;n7cj<5QqDdXr(vlJ>JI}k6WdSkh&L2+=4$gCkBw8yTjj3 z8N%Ix9k?`)4W`E^8jacL6Fzp|D05*L1e8DrvH7TMWVAFLwg%Uh zskid5kNMg$aBw88{+JbXqFQVkIOc<_v*&LnEkJT!Tf-udCcggMJNH1+1Bg#!HSDa) zx<>?s=pCs!jjMek*@T-w<*ic*6hn?fb-g3v001BWNklz3m4ZhCycX7%CRVaF=CclH8m_#Ce zxrz~LpNf9mneskKj2mW=0wAxt;Kn^jus6xSAIftZewzYWm#y|V+Dc6m{MDAF$lF1%_ zWI3nUgs&0(#9)>hw1rAy)o4I}A*H7@m@PA%v)h+N2@JV3(h*t{5gGsH}Ssd`nk zM_2jrMxG1hM=ACQ@vrfPk6cW!iWgHdO$V7ewq!e_O;66o2rHhqT3J3u&I4l+*?$e) z7y(De%P4IAedLSvtm32$m@odq#|?(N7e15psC04VewWu6)_fM@U7dRzwgL z7D-GZre9{1(yw6@h@#~%04;$k{e{wk!w#@6DD|w!M-Z)EF#6i|FK|J)KrXWZvBQu$ znf#^_nV-_HQtb`IIvnBD? z1~$r8uGZfd&J9)`J>?5WWMxkiztf_W$`njur(zEQ6rtjREUtw`tMG*+aFq1%(FqPzO=Mp}cO_DkE-5fm|U;IW5a`s39N7n=odKV@vD)Vd{ zu_G466x!r3f)r=vMXR=Jf(Yf0qgWN=x;l>U>L@dZ7P%bZxl?(P@cKM?g@vmPE71u+ z1tNm-gNV~reh>8=A! z$6a4KciLVfEQ+rq6Rj4B%KQ*w&pD-Pj7C*vtek{HTTa!@05Jf2{MRc%a7_^mCt_Cq z%_U&2A-M*V_gz3DVw9=F1QNZ4o1KF-c75Z>_?d&!PEB_7u_Y^jqu7KM#Cp{v)^TJ? zw6SP4X5e(JlqUdzIj2gql4Cu@RWVm(Mqpm7#c`+|h?u{>q?GIXXwN&9ih2NuCD_wQ z>=kb#$|;>8y)#&{awMq$Av>l@2FWJi9K2ZQDTMHAAN^0~96+42bI#cnKgj{goDTq_ z@((ZoA>^Rz+5(6PL>=$j;9+MGiz1kaGIKacmaA2YjbhH3ao*EDyHI+|RlWx(Ksass zE**)3wXvWtAr%1%pcn)J_T^~M42+Rtj_kpWK#@#0ZRP6eD*Og>i-hbaG0rTVOFyKH zXFu+($9%n|j+N&W!7I5S!W^AtMcap%>{5)<3>Iie_k(P;iVTCwdSzxVzVNf>UPGbK z+FP4>SqiE2kr>ufTdE)%H4@{LR>LC5F+U#x@>cwZ$wtLM>ZnryNX*g8LttiU0=r~j z6uu9QdaVBfoU{Eso;m$?uZvt8mK#z_4pkGLLD6ZJP)Su1)k|tM>|FG(NbZPOvxxBU zJ#PQWbH-$@2a#DUtyRjqUMS*yi&P<=RVHBoW##HHhr-7#c+?F7O_h^hi&k-ynoS7e zCn=}8tw54>7i0(HP_Ux9MX;czi5G)ccG#i#5XRjfiPMyrZC098&YF-dh#52&yHzYR28(L=hLV_LAtz*Ib31tFc>^$|*+7d>sMw^@dPq@5Kq>-K&KpUHWPgdY zJ}6#g&iUq>&zgSAv1dH`ty5n7@eaL|CjvRYLvlibU&LD^sbOoDO{U=E-L7;_SY_;j zNOpZkcKSXOE9dxkiOa#S;S@VK%>dexrF9Th1_+>kZLR#XBUasa(rD$pP~xj&Na9v$ z?iKTJBVt-|CJK=9D~z&W{nDqu@ixT0+~E^}mvHZ#@0m-g(41yQg!_ z)kJnR1S;y^E=W%{nS_JR!HRs=L+olt_ONqi&wsk}Ki{TW(FIY`PvTYzeY4Jy7mZ4R zSI$Fe+*B&zSs#H4MB<1913?FIN&g^a86nOth#HDX=P93bpR2m1lx@^E=buXW+a9QzO+6SJ+NuL-UPq$5ap zLV(YA~fj>6ECb+!$8g<&5L& z9OP^@r(PAz#TXTO!%AjR?lDB3Vp#$5HaLFx;qUg7e4aP>{SQ51s&jS{3{H_Vlh(Ln zUNI$tWBV@s^PP6raV(QF`?xD#TDVJZISi1?yzSlOFs>0)n0IWsN~DD(WCJFU9ro z^#ge$F{}hs$x`Yw2@SANs>$V3oq;B}dQ(cRbxEXxWB_)B(Kr9023&Gh`7$<1F2tB- zYY=lvDN^F9ov|}c4j@sFz*KrP=9DDoUA{bY!3RL3gz z`Rz8kQbv=kS5*ZKWz`a$UkYW~DuqYi13^r_`SpD9ZBj|!8K*vcRBtbWH(9T8Zbxco zM=BJD#r+g}<#ZSdvXhpFHVgaKf{^t2_`j_zS;PvrOF+P6xsp9#1OO%Gh@mGr^AXFi z8Q1~H&N$gom-mrqa!8>geRe2CDst(i@xP)KTU8#2CvTJIEGeku`x~WkP*UVsR8p@b z<(M?VlEn>PFxwK0ult0UEMq%kXPofRJqn$)UE?;=dQyvdm+Es^h)|$e1C*(^Qr?>k zfUI|9xS-NdN^d(TASH*Psx%)I_JC~GY3l0rTX;PGm)MzaGPavEO}E$B z4$!z2Ftlu}Teh}cG`2hPGf(}6Ez5}i_}K^VM|4xZAQ}rK`+{gpZWVzRk>D5tEf}JO zJ$Jon%bJv_3<$4Gxyq^)LO3edw`P^D0#1){vX~W$)-Ax_#QP`ZJKo%h*;W;flYOTY zch3|pV%Rz~&|!Su@5lUD%)2o%0R8?kFI(Nc{>jOgCd}cfd3qctFVBD^vQ| z+IVc6F&OKXtnKDr{QbYOB~o2K_^F5PX|SC|r2Pim1hS<^^u(xNx}Y0|so?ivA)^%o zZVn0NFS+~jmU2jb@!I=MLkBmA1q;Oi=pP@)k|DZm>B?5G-0(BCkai^_73{=7!v7CG zr~rZrNXTMY4H8uEg8`vHQG+CH2HD#m_FD=d|NSLz-GjE9N9*>P(HPJ=Kj{HY2WTk* zMQs5r3?2^@I~ogMR;=v~zTkUbb5`;){^AqgI%$yR5ZnRpm2XTNm>eMkB&JqTsKOX6 ziy0sxU^1jDxK$*W-F=UnwoEw77k}*=r=i0ea)&8MW?v~=yjl?ws<8g7vjRp@A3P;pl}n6ooIYge{R z4dt?Hy+h@OxLE$RnCMuTcr!@y^Vy_}6}YehOR2Mn7ZkUQ4)W}S*ZKOd*Z3xmBvAk{ zk0VuBPl0gk=t))A$rK3yAxu3?#PHh731Q(ie{^tD+A_cYBm3rv@HztD*IoDVN&w{NwbF!`A&`x8(Sj8poPAIFGk@Z}^W^LSpBo-F&J%YXS2UDGMN93f zmj~&-gSzpJGrStxz0TQ%xj*?I8#=lEc;&J40Cc51&f>AEm&Jh2doEWBs!@*|%P;LX z_Z`qL9t$`9$NkPKNRq#zh{iP`x>uUyXf^?#^WU*wM9Te0$scD*_9$xo%44G$1k^Oh zOraUW6rt{#ZN%?E$)sEPJkqftaUPys4w-rOpUgQHMN&N~<#Z}~b&x6~&CEi&K2@qh zViMD+N{16|H=2LVpB&r}G35_$`mTc=nFB55>WZC8$?d2~pGy~*%f;y!%%G0BlxYi* zJ$V965aGh|zu#}qMtqJF8sq~xrCwOoAV*Dh9sVBc0D!V)<=hX@Kp`yIDVcx^205`w zD>!pXB#|e?DqyRb>wffO&-l~*1bAh5XQ?_!{4BAKRc@$R*RD#85%}l~Sf@4ujmJqLBWYao-QbVbjKmin8P}LYly2|S) z*wK~cN2#`CQGb~iUBv4kN5x8Im6_KR`_igaD(oay&vFdtAaaNVn=Z>f?Wun`NrYDd zDSd-0j6|iJK$T(PMJblY4--sE?r`A+M@r->EJdaOh7x6VU-PF2&q)9B*7*`Y+Ll;W zp-JUPAy0Z&=pL$_G>gmfJ_SG}`=GYyO*k-{USfy<_lV9X7Ds8OLv>!db_%AEL|z3T zUKm5kis}yN@ zofWkxj!Aw?=}6TIp{{?G_OgU91GQaq+7s*dKJ=8C&NUOc(z{6|N{gCVPyr(OL9`MJ zsrGO2St$ER^gTMZ&_Rcr4-jAJQ0p81HyK-1@m=XzkmFL4P|x7SVJ*d-$Wc zXtb582FY4%p{-c8S(xwKV-0!CfZ2SCHV{_tWblx8qn%8ZuO_d)v5i4mfzk)k6RNOY z<$}~5Z?OjN-dF$W3r@>i+L7HK|E3mz2jbgEeU1XinHi!PSG{M@VxoRcP9zHAB;v%s z{QX1Ds7`gO!F87)s{s)!Ohzn# zb6OTWN9OY6ugFG#0OE1ignC&iphP~8GCz|NnH-eOXVQWI`TklI6E@Y=&o^Uy=I1Zl zqf7F{76;rPU46cynu&l&>ai(fi(0Mwt=ha&-${Whv#k6eC4)faB(#+-BBL*MiPD~5 z=Yi2s28k~L^r|~9Zz@e>FALyEtN9s(6}g!;OT znq*o`3HLnZiS=7cKQ>kMA>Wug!Upd^2YW{70swMh@@l*v~EF9RiBCklP4EdaP_ zjze-Li&w2J5}rVtXI*BGz!=K=uB}#-fCX73BU5G~#=o)bbJ9bob_4=~lmOD@d~||T zdeiI>4E?+@J{P(_BbJ~c6$1}hydemR`lf`5Q|LK|xh#d~ccF<-ocN*OCw8GPIk|Z3 zD;=7YQ12%aae1Wp2~C(t#9OEe8t-jgYHI+XtcM}^tvhA$lE1THlC?oEa{hklN#Ng+ zB-J2H_V|m2vag|Kn@J0u)TD`e2qlNF;~&Uy!GkV*Pw_lv`E=h}@AHfg!s(Fv(Z%0O zmhbpkb963B4oJtv8XV`avu=?}m&*4gdS)Rt>*hRg%qL7GfJjOds%#L$#T+obDJtt+ zRbNJUog)aH`J8CgJl&vw5ecTEWBH(W&68S(s6$+1-s zBT&qu^x~G`FWLC;Qf)O1tJJAaEJtQ4njRgqnoMr~EYe}j#Tr{NfzE_$4Fe@kFqZ)o zzo7UllYAx8%Gw1{62*5#F_PO54JbVuH^|{s0Egs?^Ta1kmI^@dOCK`|QqK1X*FXf0 zRC!08P}LcJF6Ol(72)rTK4EH+_`8+TKbc9&3M6$A2NDDi48wm1Dgq(4a5;ocjP1!2 zI~O;Ki-a(&<5Crfj*H%TR*VxrFb$XZGT_+pWVn!?iJ6i?w8Hp${*sTkyI?dr9)FlJ z2=$akcpqWnt6;hm(V&!SG(i_>u!}515j~vqp&Xx1fx(6lc&?EXuJs~S1Oo>4j8Z}r z#c&hDg{U)A$X2E_xv63X)}>I1O^GoC&|gNDlv5B@ zj^U8|Bv(C&jNrl#qQ$GsI!YN*gRj{<88$J8e2Ljw5x!90#=3FYszsSc>rd|+YubSN zE?W~#oH!ne)((IsfK@y&0VC5u?s zNI!Ox8BLt%whNZ3)CSGZkt7|(f3Xy34v0&72#8q4tFIeK4dvC=#2T2Zr}{afIOX{7 znj|I2*KL@+3P$nSp46n;0>s<_3>e~=E5m{pI12&{_3NqP2#{Cg%@{%dh^2j^SjCA^ zx;7RA0=uXa>Kt`)ieW?~OO0h2L{5FioLP7jawQ&G?guLlISI=MUv14I^}LL%*HnWg zgjY}Av?-=SB0Q#p^~A=VeH~>OdlAHzJnlJgQ9s|YCq9L~>xP}uJ&F^TIOOA$^S(nL zcI`c{elm&7O)c6&o{Ej%KL-lr6*4;jdtow8`Etls`c`rxo-)u+?nC2rb_ANVK$Y4p z?}^Q{wU0xEx05n$7rrcKDwD4Xy16h&cwmZpBe~ilFN6FeU@_rEX)o&d>JpJXqp*4{ zg{a<*SJcUOC}K09k?B?dIScDg9Z`v?LgHjh#cj#HmFTFjhx zJe{)T&iOtWWXhA2?;qfSU8srdxY?)0j`b;F3KyFlC4M)|{17I;L_h!smIl$wnPlOj zTySku3Ota*X<>wz*Fh`|u)(2ae+cKFi=PG+8&Fyt%2Gd6i(Npva6|Zf!XOKp5r%vl z72XEowsJg|x=EqX>pd4B-V_FT_j?|+kW)6b1B_QpX-yqM-gVAL?P;&m3rdes5^D-) zV;QG4?nbA)ApGRFykXgqSxM2m6k8;Cvu_A**u?CZc_I00Is(OVIZ_t0HvYSI<_JmnLGrlv*+kN2 zi6eW(lr5&wt{o+oDVT(V8PkgFawekdI5Y*!^}qamFFCDpI^C|}nQgN=Q=w=}_3 zaf#$@H-%0?I^|XwAqoan)+}y2NXx z6-&&(We7^NG$vL_Ey|NX8;XdfHK;V}YBs4P;GXDJh*{NWBwujD-&IFTh9cH4#G-Oq8bIa$`&Ix(`!(X@1IeS!c z%{$e%P>u`nQ6hUmj0*W!K1*o*R<$nc6-Y?RY#eO@^^?{ zB;uBsb+y?(WfZ18AE%sl-DBM(@lntBg_;F8iL+vhey&J4;)gLwtfG)n*iEX1e?3R?yvdXRWVaXAfFCTi}1-U!Paz2?bRoe{a60A}@PaB6vq z;-AtXw56&53FJZ)P;Dt(9}D0Iy$9^dBOdwZ8(tuf2xmy^6-f`#aOWD|#wsI#lQ=Nob>yceUUjGCO##X8A9>(B z5H3kDn#kI{p}zYVMUp2<*$5sup-P#FHTb-2&*AQ_J99}!FL?N`FZd3(N$+9C>Lhrw z3Q#1af5`J8y_WK46Q>!e=-vbpNvMje?B?Wx5Y9-BIk`$~>Nsf8Z(R;jOxLuw0F@4r zm+RAg71+d|0)%~l?54+f5o>j=;ti#;Uh5`(YnJ%qEr%$?DBjE{`MyC}-@M!czcM+q znrK?(mnSPtvVz34+amj}i}~v@4Bl|=wgnLdWVM!XcwX7Be%*h4-WiqI9hn&ixGIx) zti$fB6kw;6bG_*ZU|+?=SH;xdMK*tPu?ND#kNUP7He5Mhe(~ddfBD^{(qjvKsM8U> zs?~GwklQ3eVaJMmI%i8}DJ)tH9x_XJ`q1@BPpp^Eg_0#oMkrZi7)T<*80lHK#+M*s z7c1)rUVW#VHpQCt``10t$DSRmCre&MvV}`mZYh{S78)gbbX}u#ki7B|;^E)?;pd!j znf-+izxJ3TGu@F{ZJkZlC|8JFs6;2MmM>J|A}SG5<%E>SOZy)A{xgy?d~1W^B34+f zgf+zPp}~>ZqcsJfwS_9{B4x5v@%zVomqH9K0D?eA;8uZA=nsXMmCe8e+GilI*RP4r z!~$%a#v=dcT@Un?O|B@|g0$QknL_dkGDuW>0p@ou0P>=gSIEQf5Eb(!*VzpdNq*{K zuU#ZC2OZf}ozGI6c1y20r_Q>%u!Lb&$%$XN(xO=+IK4!#6CEFZ$#?nO^UKrBNS3I) z@)wH%>LnH06|eqv*`7jtB9-U6^8f%K07*naR3(N9i)iLZ%o7@(7y6Z{9xT)rs2Uhp z0YS|Eb-Y{x7yCU5-#}G7j-T4pax(9IN6<$+NLEX;DfY4slk-q2m^fYOLucK^t!;yk z;_z?H9GH63k6p2$RnmXzTVCtS|4jSP53QWb){4V60t~xgay?%4m;b;BGridecyzpVK^*^eQjy^i{ynrDsZ?(g)@QH9`$tZ4J{e*}A z;q-rg#QQb{9RK#xC+s1I2gqfQxmePmp6FVSz;YSS=H3jNB!+ctsgl>GV=Sy!GI}N) z1e#w<4}k$^U_Yo)O6Zq`9dO_=rjV0Vac9$ulKtUZ9=!MmZ+?hR$-T-s5mjU>Sw&Y_ zBv&fHE~c*@_Nl19^PHz{dfR{(e9P;WuX^a~rwPmz1h^vKvKRHT>35(c(U1>^@F)>p z`aKVS@84K9xqK*;zt~tOW`3|hAzth?Oz1_{V*9AM+a;$7$q;!|ql=6iy;6}0XM+HUS0S3POVbeekY z;&WyUy8TFWxdfE>%_mXm$6?`$xgRS?bi@$N{lLTCz3HFhUtan>d$5I@ko$autp!Mr zC5)Y)0}gw~FA8!s}Nq`ta}d>Lm04;>XAFPZu5FUJVZ5 z<4$dUvbzcxt_F+hK9xa&5o8P)50I9D(jp#x$>;W*wc5QhzUR4rHwo5Fp>@+9AcQb& zMy&_QA{sgd#x2{XT{!Zy-?il%lK#ex&z?5mrrD=HWx-8a(=J+Y$BoKCyd>A4+Td(lmA z=^0c80rCla|3L?Mjb;(qcbuK38Kf0ZXjYM90YL?n7SwqYK{6JQ7<|mjKE3r?wC#+I z8UOT>@14dDZYV&}RUiq+ibdK80@G2SK_uy^&BuvNDu9S+hCr8I^dG<5TkHnh$U!1I z0t017*E0F`yyp;Qy?)h3NIFW-;Yfuu@hlcd-Wg|M%=f}blujW%K9Vz6`89&xq7lI>PX%U5*Kno)*DR~?dY&8 zmP2jMt=bgCYKc|((19|dVTNjdNN39HL#3KIVLj{vJxyY)datB&^7 z!-t#1u#y;BqK`=xgXk9(f(bYaX5XE$iNoPM=}21*lr9Gs>cp^Ikz~Mmm|7f|RFhYU zQ8{0opXWT2bxrbX0tDh@p93W}4Y9|to{Qs2|r# zxynCJ?|jXh6_?gAT_RpJoT_Vss1?r7zwGWG-4V6Up>g9+|A6m#exMdo>9q$zF3z-D^{HF9#+9z~MW8?9jSV0_y_guJm{xdU99?8k$Pfl5mr{ zaD(L#6faI`CTW6hQpA+<8<1^o;Sq8;QRH}#4mbp*px42PW*8hPT34HNA;*xD(rlBJ%N)MT z$A0TpoxHaS5X~YzC7h!T`=Rl%I72N)tv7T+m55uxOG=4l=3jcxkDc{~_B-R$2NBMJ z!@a5GXUocRtMr1duUz+=En z92%KzAeNld5t#~2>hE}~*8B_a{qY@rWE+mZe8msV6W{>?$VD=g!!89Uat*FD!NsH_ zm1DGSk%})U%T`x~zH0|07ifSE58vhEZ#tn6p%Vhg-RN=42y}Q&UkF#@(LS-R>><~dDy!Lpa{QJsK(4k`ntQYN9a3wrxIu1v78Z$E8P_GT5)b^3OK;xvPOCfP zk_GOU8O(x$?jhhwyqMxAm6v&!B(?SYJD+#@y%~MsqDy;0?1wH z@xDaqY$;;pQO0BCYVlat#8p0(+UY2zJ|X40OWQEuR$`RO-2%X&=ic{|J0RI&(g5K< zc@R`ZlS0X+zTz#SlQspXKu0-`@`iY=sd7dj>mS@75A}C==$ZHb^bSbQ^7x})o|(ZG z4+Sx*jg{3&hkxkIKfOPmi!vmJU=wdDkRf_0R>HihX;At;VmB#PWUs#K&HwY1GA2(6 zAQ#i)7Yx9)MTkjJ!9+~G%J+_0ABkANWagIFG*sy|lvzX?P>LRt^%({b!J(N4e0nD& zBD<351mn)s8GfQ{7`G1~r zRCsf$FN`55xW8<$n4Zi)Nyh*dDdeKZ5u1U6h*e47pwM?6hMbbp83}XS4JW>o_>wE1 z{-94!zWJXn-eHqX8rNO(>`BwXoF#L>chCymtHR_bFrFRSSU>^%9x&Gc=HHD%+AJ4h zkPXza^dcNfnryrea=*b65WoOZ$~(bn&4p895Qrft-Wrhpxb}+_Y*NKrX!}L6=~ijMT)PfyNI?b-7Pfd@eYcz6a9YJEP8lG6+=CvwV2Q3B za`b7Du&#|I`bLh|%KFGqC<_dLBQvm)N%KYf2w~xe_I_q3c58#i+h6^`Dq>vB}I{ z1Mf!nUGEc@-R`SqJwXOmX~oJu601ZiR0Sf8in33RRe%YvIDY>_Kf9y6 zpP}(PuYaCzY;z-aIFU-vkrZZw6gVieAk|gl$?Z$K4#i{jEL&}*OH|7D5ObtBEP|PP zeBw9HNWHSbx>%<&K5A~5@#faCuXQCw;lSitSgH=z@vx8QoD`B%HL`qttT8_x8>5QP zrMg+E&|GKob7RZbq;?P}$z*<8>MYK@_pdHGs|C`w>-eoVUO8zT%^OFTH(v*^9S5NL zLT~=q*VH=>@mve>d`tYiI+o{Bfw=q_t8-El%TzV8g7Png8Okz1?GcdhTIe^jgB;oy1ykXh|w$ox~)}c5c3(u!pV!KNJQJN=!@Q8DZ+xu3q6q zt{b2D$j|M>aGm6M(;Kfk2o9H_!^?e-4(U1KYv>}c`hMa%sG@a?ybT@NDy4kHe^K<7 z$b<9i(reh-6K>a)41+O5e(6kt1I{Fa$oQ~5y4Zo)+p4OIZDJF{>`}6c3np%pnS@zE zpBpoC2;+2Rxzh4+V3JtGBDRglOcImQaLE~%`Qs0K!w#FQGk)XHPfgp7=8U7gVU>3T z%`Ft!qvJjB@hzCoIm*nESVOVNSeQVa;}WC#IEdMrL0nmJ(F9P$%8E!{?|?n``q=Bw zXeIhn_Jgc72ymJZ771{-PJ$8!G3@_v%14sCrOKlotQAH0e6*cAP|BIImdRoQZ2Ap$ zWx}*VN#03N0uA`?sW(3M(Vx58S(sZ`xM-7lUu=)@n)#PbT1RsuhX;VeLwwoK5GUnL z^WNFvT;a2D95a_gNr>fKK4yPLY^z2I1ff?wS7}G}n~E5f%7`itdGwO=-%czA(`OnS za3)188TaeH^B4i{CxF!=!w@1pN`-hrEX6Jn%|y|zSU34Zl+&?E7?t=A)_uE_6BB(Q6-V((f%RSqee% zuWeC@YOxx7F#U?&!6KCSJd$NgYVQJEaj%cQenX^zGcIDu_)zob`&%^E9cQJzWpK1w zloBxtu&VT~i(RXh30NuU14_Fn?lCW)MJs7`I|OAwrv)#GZl4E*pMbV=3=p*sV1O{e1sGxPi~h9?pq3{(QKer{07vhf)=xy=7%PjGQ`Rh( z!J|S-4qx(--`G(0-%x<~@wcPDoN3VqFcH`_qBn;YnWaV|1| zV+L_99Pb*t$Qm_^w9(w_WrJ|+S;S9pisoO-lRva6;A@375|hZD_&RO!m1Az6qgx@E z4vt>(k>A+xs+$`Q5I_EM*I&2o;~UYJIBRp#ULrWQ041FiB-%X8CxY% znM%asW2rdV+5v#@Ibwzh{;$TZlBIbtH1~J!xOmGq%UN&yuN{WhKx-Eh#!A;-rvlR(Hzja#w`O368s}Z>mvNTDZw#TVpk1} zb^shDFxF-e50cPW)q}*w)WrZ84-yZc#{XLGC|EiI)-C+~o9?xx{3$>Bt~dEMYrf^0 z4*}Zi?M(s*qktjDBWithJWvy3J^d37Bxsj|3Iz+g9Q+}0kCu;TA7MTMv+Cr7R)vwwjM&GPwQ5|(t___==Xnr z?WLOvm?yvEEz=g@RD;SI6K%{yIW2@e!g?ZYHS$CfIWEmXoFJozJwxB?); zAmLiJV3{$->&BTq!m)A~7QksaZ9yzl6^r=SN}h)}57EJr>2Ugu+&8)Mr%kh=WC>e1SJ*`T_i?SCV-g8 zBoQPOIiDY+oHw-O0YjFS$-tr+wa3uV^3p55>6GN=$Nu&oOc~=Q5#5wE-6SG;Fzhkt zc6%9pglz&t>AmnEAsBTXvxtlNI6;(($9}>EUBhqA@ygCXaaqI)X57}5%n?|Db9~s$ z8z(t~!U>qNLar5bE4qkg5Csw|=3fUXNlKiA*ufGyn7-%dHV!0b1t5O>{)K-(;}8$| zhM?oh_n|{fG-GsH02l!0yp?R(gjUiWpLfM(ZMQGH&QE;5H(fZkCc3c0G4MHk3>8qq+w0;r zwf;elO}i8T5=5@9D_KMU!sq;TVR9$SlxG=AAWF(QQ7>>IgtStVj=y(2vDKr80u z7A!8bWE@W4{n)h|0+KTxYI36ENnicu`Ri`?k6!yaljuf{9Cd=EQk^+467;ov59E-RA{|;n=!tV5497;06p)bjLosPcV!tJo zl0#fv+r(b$A^yVb26Q1^*?X*!+eDars}P|Pz6+8N4-?sqRJegeh5C|6=u(I|a6)sq z%taB#vqLVA!(lhAVX=pjd@o@mhPW24#Q1RPY^*54|5OUCTqeGXaJ`(A?<$q#k+fS< zq3n>tRbp>+7yyMX&JcjJ7YG(UdB=m(cl+Yp)(E@bD2Y2m8y!GC4@=z z$n}+U99Fhs<v|e&uu@*FtP(X{p4KA|KRH+uB#Vxheaq6#>(vhB%iwd z!84v_eO3YD$AA6ugBJdBIER4ME?F5e`yC zQ7%Bzg&0(Xs>=&nQrsN`kbL^WtIlYe^;rjqA5Z(zgO*z~-Ya^&oGa1;C{JX^5x+Xf zlQ2IgtbwEep-MUu$&;mk_ehd7WV=#}Fq|0fq_~dEyw=(;E{2ym%$Ak;zHi z48}QAMQidQnY^M`r8*r0MNfXB6z3l&GlPa&#RTG%I2r~&fSorLDXAUG=0w8`|v3mbw z&se?x{toc!w4(FSx&Y{CUG@4>+=|~RDwJtpfELk2Br+8!^qlM^$IGOz?wQ1$T%n_A zZww-?sFl{wgD!%>DPRc0$oa@5Mm^5^PCf3t$i{5Zv3M22%oU&<#X<<0IjCX~r@KC- zymEeje61Jh;=*Nm;#CG$2C#qx9b`5VkhGa?1YB9~z+w{Q-&G}G$$8%$nQ-BAqvxLy zkZc)%$awCt`^^%-lVcwTHGx%LNvHG;37OX`vrJB@5-%f7$U?MIbe;5)$_&6OSYi&> zUsBSPScbmWx#XP&Nd`x{uY+9nM^-Cg6p-IZwkoxOpN}Ac zh0og;oHj_d96`9!Rz%K>WDs^Or8a@N>JT2;k~EgD~mN0vw%SEOS{uNFdXoVP{LO85Jjc)I~B_s1mu-J)FsjU`k|4qK~sd%n~t*b0#ut zIa4rTIPYKQbIrS$XP)#8Np^A-1F|j>!WLKzi#kB*%tJ|?WtIq`?BnPekKbVqCD9_4 z{z9Xm2CbOY15Vs&mD}QH-z8>g(Cu7A9uFNDXSXrfBU=GQ_sDGHiir!Ui&fUh)r3ysQJ%<}L5llu?0jO4LgdOKSP*4+wa%haSy7O* zqONrYCE^v0FBKg+EmASt1O-}wLH}I=ozw4IPxj=nLr$}e7Ag$@$}2~yU&zFj`*fwX z3aG3`Vg?+7k|?ErACuSxD+ZC*XRD-fwJRAW0C3?;_`;J0$+iH9A6I|sp2vRS=6f7; z0FNPnmD&R?2U+RXMd`{_M$>TyLZ;_hL`vYOWhw#%M(pbzwS!IRLD{s+MUs+}Gmkzy zX?8#f+O)r00}I7`6NNIZ2%(U)t|Wg0su|{;kCjd z;sbG*zZPMQEap^Ieich-y)!LRdZkhdX;1O!Dod5JI0dmx%5D}WT1+~FR^%Zm*fROE zD3w=zOisbftUB;O3>-|AOH)xjlUih+vY0j87Qsk zP2$3fKGp>oRF1jI7zE9d+E=9{hg3VwCB$hAkBBp6^3BYzj+J3N^`p-(MSItU5}QG&2Myg*!1t0;S2ikn-E4B5h-30O(a* z=Y^v+M}hFN#~l3y|6w0ve0aLIbU9Ukmh$TpNC--?i}LT|_XQZJ1kBJ#I!WFp5OCqE z_@Wa^*F9^|yk~MeW6$SjI>gz|!0wK7)g6bLIF&4w+Gk6V2a|M5AQj0gQNM))dc?io zQ>J0ugFJ3r3W-mVy#DtqB6|tYa>TBUTZsPUWe_={*KkyC+M_(~;vNVZlf&D?K2)lV zk+(h=((gxp?_5ZP3K6-);p~z#?p!Lo5YBUiug^i3wA&E5+reK^nhSW?F2nRdZWgWK%XCVw5D$8&x}uCPZhde-1(LOZ6VKrl z=h3eWf-aX6ZU6uUxk*GpROFlkh>ZOY_|l{Yi3_X(6CKy;2E-Cw&5V6dQS5k_zv10}T6)fWSwrL~7U@2<(iEkJnu}4Z5MX10WT}+XMm|@tc z6kEw4^dRwnA^=2#qXLPDRGu}$^~@MeM{~Awb3gv}7o2i}(%)bD(kag*wxbCFNYrN{ zixf=3k=Dt9$d1DyKn$37i)+_l5IMYJR|S%D9w2%=_M5*t(^{N$2)lb#P80~-fVkCH z&=n{YNIJeAl3wDn9>UjofQX1^O`Pn3C9Eryb$^ctj4r0!+AabDW2qj5EKW&!?TE!H zsbq2!+X)*)(aDu!RO8gKSH3$p+jQ>8PrT*e8OhxH(7j$VWjk0f9ZdvL zj&s?AzL7hH6{40Ek?U3f0&9Sz7P+7gm@7sKB)2Jm$avI4zc%dA2Xhxc@{wi13HzXP7xFgkf?t|@hVgyp~w;zGGhdA zpi8=j046EloL|0+#;HI;cPdWqpSy$PsS)-@0EByno)I)-W z%Zp_!s>Sn;0V1FwFVnE-~VW8H!<@<3x0jAqE*b%a5PD1CW97;O{)X z#~GOR?BWbu?kbCwKkk&+6<7o?v5GU%d|NV31`3Y4Y#rk$S2^C*9FOIFOkCjwES^og zH`_lK0T2O^kIQr3+141bVntoTEAoxYrrpN5qZZu}uUEX`SD$*;>kfb94lfQmiFICa zr@(6B7#sq}TE}Z!tA@|5b98hEASW>H^Pi7Tlc8y{G);i}in_f5mcr7-01^G8Vi9aQ zW)SS@I-vlZQFXA43(O)*X9bh3^X8fq6B=N5kVSN3nY z`of>M;6)K6UMF!hzzX?zh&_gt@cMWiJ63t+$__wIVch%sZkZwj9yC*(fhlh3mH~pX zP+VymuJjgmU^<(DBjVP1_IOb!E|`O{4eSz>aEcvfcj35D)C;AZx~0Z+%Z+o3*13g0 zeC2m-n|>#sJnu!(1ngiU=JwD4JLJ6_ujMd=-fPz8j_UFCI{-OD<1RlKKr_j}nM6bJ zG16YBKmxUetlE1(oY&kE#5T_sKJLl`WaOE{w%Joo-HIi*Y)!Wu_TUyRb;thZ>PKw* z=0BflUgWJ?M-XT?8v{ANF^}4OyB6EjkB3-hfJIgTaC!$In=~e#`PC^10E+B^hP;mR z|Ax8d3n~Tzpqd0Uq|3ti_X0EH-w&Y70;)xx)GLpeYvSH9mpL&0XK;YsUx{?W7D|nP tt!81s$QTIq=wfKu1=RFh!1TZK0|38pQ=}v+c}M^N002ovPDHLkV1jC>b?g8D literal 34120 zcmV)GK)%0;P)B(yrGv#^s&!t2^gc zwl1vfz|-@gYaoJK9>J}O&O=O&em8-G2p&>$^tekN037hGarg$_qPq$Jw#f4hF2NR; z;1(C%EiS=^(Pv=GPjBV?j-LW#j^i0GyLN5s!|Dib^~i^nt@CR-=b-}+tqXvUTY4U7 z9}xhw_cG5JD2V{!==GHJH3WwNhgpt5(^M~JamD<00IU9M0sqbh=2k| z>;WV>aFOH-@8!5pNq~Zn0enaMs}L+c!g>#B{oR-NTOI+I`=A&<1;`%8>z@1N<-^dd zjn17r@_y~mhZU_4F!COvOniDSk7xV;=$mLSJGO?C?kmME^0CW)uNRk6ka zlKNXJ;7A2Lcq|BjLWGS3mXtn)`&+&meyW-gwj57q1+7e{Spjxg#Iej06w} zgw}i59U7YOc-8Q=8Q;+HPQZW?rSlG2k{CgN(NnWL0>K-V%2jqqIp!GfVr}Ewq;nPh_>wSVxUH8rAr_#lYp8^B`{@|=nEN{JkHEtsxR*eD! z0w+H%+60ooKw-cX+oDzQIDV})QlbT;b{PqRQl^Dw3?Kz4E~{bCiHaovQE&j%03p>X z>SLo~#R8BJNqY3bL7%0^{GO{qgbRI27k>B3ssHejk&S`J@%c~yL6XC>lj#(y|~y#Le> zt{nOBYH;xCk@qWx77(IF;js=^`G6|bAWM!`_Beq@R%+PS#b~c2Oe)9ldr{Rw8)lS3 zB{>uvDLHZTiVYG45Js9fu}ScVHxqwMibMl~o-|QaOMw$o*@wI*uxxB%x-g`4;lE#Z z$bTpm>^}@ZK629Et!{&VW9$8SG&!@h@Y%*-kcd>kO`fBwRRP4i44U13knIx%i1lP; zl}pquGU7#okWB)is9MHo9|K5a!<>zE0SLGP4mH?gPrX6_byl_FiLW4PdQ!sz1z&4O z{Yud2@svK;#Psfqez17M!+%%z|M-aq$Y&q(*K0>1tn0j6g9bKEP?7*5F(&Tqu@K03 zRzS=&0o0R4@5$GYuLM@fE}e>T-M`$l^d~yb(i{ZmuwTX(kNbkQe3~| zKO>SO8Lt=cbNtL8#x*{rOJ4EVt(S(F)_wSv2Y5oC=)^AdA*QWKEFU}8KmOv zsy>(UXTbmohfiruNa>Q-Jm&sOo0Qi5?WV(jqJZ)f1CZ|=_PvHxq(a&=lwI z=O1_P2L~yxd(Rz5{X`h^k9dGwyY!Eich0@hdw+pS1_ek;EH!X4?DkEb)DB88K|#>5 z6P1T!y(K9X3Ilr{IKbz5#?dN`fbbDIA8OSqOAiJNSsZ~(>bx4OD=N5-;7Q0OosK88 z#R&vQ>J$P`?F_J(QIM!t%i_by=U{yDX9;6~K=BmN#Uz1fr_~A3-;jy{j}oT{yL27^ zocBMEz3cbUnE&Iuk9|bPQv5!==b#-oEdIlDk;Up$x&ZA9FE`9?02%{`>V;7q8k*RV z&4K$S@s{k0pAl2S*=%Mr5De-u}eg)(yz}F5=yX8f4ix!V*!QhO&Vt;N)XUAY{*~GK-#eG z$lK3-B+s!&qy)M7kpHzZI(K36ehp7BmIG3cvN zWy0szbi)ZRwuv57cdw2t8GEmhv{M(dD@H!sZ#eN0IMJw{d>pdm>HQACisayv|IZPd zE)6NY`mOgp<`JiMJ>n$DrUmQXh*ARp)`Xs<;E}3*L-s=?=>TFMKwh<>ND!4KAU;xA z)tyXyeGFn>1jiCU!R5S>5KbhDNDh3h@7YRW4^l&qh29^Zfne3S+TN)ol}Z#pZq8&w zUao~R*MudF81eRl>TD2^SG~dwJ^|+N9Uq6Ie*KEj|ge#%n4&H%! z>;_zkK*V~!k@<$IOj4mIv6tfZO=gkM zWX3+20m`xB4p-@6T*AgC38}INQSxti|I!~kB5ad`T7ql|Z(p7qtaISrfRh6kQgR|; zz>ne;e5ZnVe?k&>sb`N)8+6$Oaeq1jgSv`FjW0GxR=;>dAfT#*k@OO>PFZCdh$@zd zn-#K@@ZQny1OY^JY?sjHUB2LIjd<{>@HYw8X(OQbmJ%;8w3p5Tt^-%eq6Q?@OTF)D6d>>ln}{~_d)F$kseOolU1~o zy=VHIKJWSSD)F31Q0Hs=g!e`5qQ^d4;o`;y0kwo>WF!HG%h7+aTZ|NOz%eCGe3b9V zukx_~B_<{6*Bd;*`cE#pX63^+(e^S9N`UP2Z#~zsO0~-B$kyvgBSBHO)Hjb{h*q_+ zK2e@LgUVnRqglLI`hIV}S64%0v!YssTb{fEh9Drxpm7~Ep(SwO^XX-1H$A6I23fK9alUP+h|#|JgyvNTEcg!d-fSDgut1e_a_ zNbKebbO71y-m=c6^htoUEc@N7Jp+MO zd!yf~hzFG*0+hx`g(g4m=!WU{>QGw+4Q~aEl_2c8?Kt)!M)$zCG_eafdfR|mfgJl_ zkTio4G$>Kbh7!d2Br2bA2zV>4l6;qWZ4iq@!siW3rE!}^goXYs3U)z;gF2X~t3ltp zmVu#al!^FH21bdUsNEApwqzqdrDYD%C;x5XmFpg!SvUJQsBDlK_vQ;707hcLC*~-1 zPWVbfIO1rzlMsav{BndCa`d-##aon(PtXbPB)I2^MuLkrE^ug*;Ohvy1#twi8DtMt zG+Tm9u+5JLendfq&JSSd2dp}Y_b7OY)sR}l`<6m$LOa=d8^G4v>AafQK)d9z0LxbJ z`Nk3e^y-rJ5|`;DFWtGKLP5$-x1v(<6~fP{aFs|5Md(?g07QwMc;n{HlfJi@fRZ^K z6FL)-HThVU_L=5VB(Ze~XAc)-!sG>)Ecouq=j?vcs}I)h7+b@00Kv6fui3P0)cOrpMu-3{Q}%_`3GQT>s|AH?cCH-Sn!1N;gHAw zCirGq28b6xQNHh@I;yQ=|UeF9hp1`N;xMFkR-B4U?hdqB8Y!@%jXs1K7= z@hnL?k|K~Nu}TpIKpPY^p#n{Qz45TSX(X-I5e0{Wv|Zc=t&tq5NRGU>Qllq5aKDfOszypE zNGed&U{UEYmAV2NpwDl0kk&q~eb&PQl842Ml>{6pIjrlper%}>#dD&>IejkQn0@s@ zSi9=Q;_@~%)7Mfdis9+R-Dz?`O?m9Ql}eju)0V(J<%5k79)?eLAy{62i=lj{x$ zIOs1QZi5})d<)!n(bJ)Q;A%QY_EOc6bJq*tDTCO#@;ICB5);wlj`qG#P%)W+VJr+@ z21%5ATu7u@synMCl*|~_3JUqLFb*6C71!SqE?s>%m}|LsNa;LRVdX(*XyV!T{Ji6Qr|O$c%QMGErblRbhk ze#4S^oIzcjp?;{Sk!Tn!5AMXF|TdJ9!U9OPKK2@QTNdd)tJ$)*XbpeDrLsa$E6y{t$ z*p(zn=-n$D=wwj1LQ|L7`@yAf$(P@|-!I=o89Q$I2yFh=>q|mc?{Cz=MgIF;u{)xN zS~crkYcMN)%*@|%yfHz=TH2=^SZ$p%fx?snhry^;%9KckP2t#XUBA`+>jB|!?SFu{ zH!sIHhcgCwJtmc$>8rWPJT|JBS?tL6NP1krkfjH2(W?rU$oAkwDYiq1#@-czB1#i$ zjQ7chH*Wk6{OgzhcE4Y~xs2_%d=$3)=&wmN?9=BhIBX(V$#yh6wjR}_j9UG*L`O2n zGilLE1|D7}z5*uZJd<*NZO4aTR5PZgz^8V&FD&2R*KofBB#|q(4gyxM?q&4#QOM8B zcX;ufWR*+k@71q3C}5c|0aVQ()ylQ}!EB4fO2xY8{*7?aC4aX+F4w$|d#`*e?7sK1 zN^)rQKjr5s)BckoIHob>w^qMw4v96qtsSBPWrMwutU)!#t!j12m7jyV@4Iatuhjk@akLHY z`queEoKlIAs{9k$a3Y8CbX;9LOl(5Pg(UjUNaTh0Y=7mUBM=P1V{g{vPU$*w;W@5q}8@@bGT zbUfj8mBLVQY=HD~Bp7xLKy0Llf>OpM#{xlunS;(TRejsed*F)ie|df`(g7Yj?zk9s z-glW)SCMoOSG(2eT6V%M`r`tcD}hcr3LC7XoB_o$^p-eprjs0Yl| z%3U7b9Fy&Wp}T0m^<5Kj^=f}J;Gc~~%H+&v;KY~=N{?X$J50bz2VZ9yRyK;d ze2sT88{m$MUv#dnV6XHbmvw|9HAd1VLII=TX=Ups&#MbZ?xK13Y|Se`l6xz8tY!-Y z@~EAL)#oQZ9`|<41{x+bvUH$A2N1LLaFx3^W{JWHJUx&Y_pchTTOQmD-@5UebGtwf z^VqrhtFZIF%S{qgF`U_RRSHeG>>^YkrA$4kZl#&4mQCGF*es}`0fY5?DR43{OwS=H$(bDM;H3MXtW}yH zLH3Bx&K(3vN5vNqBwl>-Knzx#9GBeim4|Sq`!<%HawZ&d{7K*rSwdH4>-AT`uG?;e zZr6@^|E&E8mGtLUU>rfJ1v^-s*478$hCa8|r{>;AgJV zA7=wZ{do5G%(nGk?@Zx=s(g)J;7p^?yy~KVb5-*Q-N2KIh0I+liqLQt;MZ>Y_IzC` z8Ve3T3QjoZm*KD{J`>!+rBu)q?Vm0-aO_J0r0C&+E3bfizWh(HxxPZk0ykW*&ynZ^pXkOaJ&5Mc^-P^?Ou+fPLboJ_W*z4m- zulJ9at*)3@3QzOaHEfS`Q&4$rYQqw561TSr;?Y8|Y}oXD*frceAD4>83D18qto_sX z!ST;}4lG!-02<%IplQkNjLv|j8PRVqUwt;5{Kmh6<6ibZ=Iys}Y`gO!%3ZfAq~@*j z^(a@|+8xll7wSHDQ1WkDZ=&mhC!Xw%79HyzE}kk(w+>@oD@ahekxA{MZoy+teDhiQ z*o8Ch;(4)0=F0}TaI)PoZcNqa?@#{v{n0pf_asH=y}^82RbEsoa#*gGk31PdFS^Wa zl^{)(2s2)C1ju}iC%^9XaN4V0U88CLjdL~FHIN8U>p3}3pR+U(7*=HhG0JtzhIj(9IYu(cEt%1qgRy1zU zo~#&j&y?yMI}yq{ful6)+ZREKCU&a{^eJ}3C}(orot$f{J~A72bU*}(9p3F zfrNk(T3Gbxli;zx{wMQt9=o=DAG-JetB}BdJ6$((7gX{_xn4?CB-d~6F5s~Y2+yi+ zNTxxr7~aVk+)6#^#G{3yRc}?_z!%BUQpaGCMiaqNa!eAqHM`x#bGAk11d!<7zETYH z-Yflh$9Vi>b`>jCo~peW@#>V`8AOmE?0|BS+XoUWi=f8!q?9ETyX5(dQBz4aHDJG zjS6b1D6-&?w+XW`CC|U}HoTj%dezE3Q6MM?k{h>9o$#{Q`{naww_d8QO#FO%YpGHX z`HpqF=csDURe~7RY8)grFsw?oCn?gmQ)ZVU_I{9Nb9yJ-d@6!&m0+$|AuwcL|)c>*Ul`JUybz1WA|1$LjLB)#P)1Q9is;z~Tk zf~arrCa!fbCspeq1Eh2BI2XlOeYDmEVULnx@6TZtKDa5vM9ttiT`}mV#>5+%kRTo`^DXgVsXcV?eBUM^N@JMM<21o~k#S7uc zr@e5_=M+a%IV!&tuJl?(+{h%Knf5(z$nFFy`Gb!A{^Y**Kr{SifV^dt(nERk1dc zC1^LWwW^Ho%*wCKSe1IaDU_`;P<@1*qq#@USN_Z@mI7M0SEPtiSO(3IHZN7;xol}? zu7;2$MT#7{>REF>r=1UczskByLNUR=*)BHKWouRFESc0T`k zt@M>A+d`t~Lz(EEtEES)94^y*a9q|z~ZVopA#5)p9O>_j6tED0Mst?C@%AofhY#LFGh9jZK{4H0!Ntx z>d|V6yvUP3(@C(*lDK{?)kGzRl^oV)NdU%h&vR@=dWgZp9~&T@dnXz_6NrdV*$e&S zFv0$qWQ-NEya$`yT=CNOvyUt`p5I$DQG!%^zJLPNPYC07mPL=BG_`aQ^xyL__ zT6ru1qiI^nMy!inlWpR;$h8yc;f>2TuayomO@GeAL3V4CTG@1^j_*`Q$GcDr^t|;t z7jX?T4korzR&};At*x(Zg(%4sWd(?}-WwlslkQoD51tRS(UD1UGXXyss^w{FRl-IHBo^=DU-g2bbRE?fkU z7EZ&W??GOp%B2H<2j@Y>>g(@W=NE~yjOXuFiGO4w0S=so^QLReS;mc8-R_+F-sZcJr;Fjmf zOL^HyK;S65lfYx4n&>{44yxvglm9a@66fxZRrmMDk|3@7y|oG8y#DGw$^Nh_e;PXu z6Cd|KH`_?w#5)4y)lG>zeKH>Zd>Y%bAV$4A6oVeoLKRFRz)_3$z`NYXasMrwOgG#v zw@wIEC3sUsUcFXgj|@U9fy1s+wdOpi8hn?p5zXbCMOltnc0#_D<`yBgTCdS`$ax?d z^c(q}I;6ZGb6cuqvG+VvSIkSiFX~lSsb01B%gojDwz)5?{c$eak1Ije%}zcnf7EP} zWKVmjK$pz(RD;UIJTl8P*cG~_oM>?Zj+{$l%q&HmND>h5mE)e|L8?`UGPT6?p#T6N z07*naR8i(Kw%>OjJPK8*5UCipuHK{=I4!^(WwlCtp2=1AK^KEClsnjZ!&P%XDO|}1 z9nM};)InY&b|H#YUTyGPT9g#FgPruG2e6*4R4zHHM+l7QawlBqFYPSFaUy z-lAona}dewAz~tsiUm}mhJV}@0OYyj&D@EG8<<3NPM)g?K zly)F?2L%-+n@|IcBUd8glMPpwDJfQ4DJc)N!~k=C)`L}~NRGO%dBA;f{sDs0qwi_b z(O0kR@l>7sBw+06`zE|*$#te|X41CFIqEB?V;a&_O*K8!NYWtl-TCuP%seGjiB3BF zh#%t;O&&LW>-(@{^L?yRAxN<4jxTDKBYMe*oAC$;2&|%FmEa*jn%M?-UjFZMKBq9f zg#Lao#(6G#WNA8}dHKrON|i0*(?83s~J%8EKAoO-2|$6Q^<_wd-gd+cb@<OW*$)Xi^JPZj|i|bmNkD z%X+JFM4hWRdg)9>TWI0dfBiJHyB?hL`7Ax|DaGl|CEba*SUKYLxB(A3KJ*=&T2StZ z6J8b?=WQs`qt*-@8SJg8%m`8^tGI3<0|h7lP~#-vv(!-=gLB)V=kl%XV;Bz`?6VZv zR|zr;;`$*tsH8}$us*vTV#g$DoBBu8fUFEVSuaxgWv+5A9;3+JVHFf~SvB(zSL~Qf zvFlQ}deOouICAOIeY{Mwj~{;XI=J@B-;o->T`oMJptNK~pWVKrsy6V08*hReKmJd1 zJ{KH|jy|QL*(g9$cKZr}aYAeAc3=|H1Q58#O8PNV*=1o8BOO68#C8+{7|lA&suyJz z%A_yWSl;*J9r#|2sHdI;u@QDAI2PA$uG+}9$X>@@0WxwItY+ykyS1A3@C6d%xb$E0UlkTkJ2LW2g!A|%X> zK)XZ$?ECikAXURpsi$3=qHFow!*Q=>ilLRPdi_s*C4z4SN$3^h>-Odg4$v$tZ43`wOL zmmc^Z0%BzNR(hN!J-r^r$c=r8(p7M$*Y_G--(v%vp}PPhk0u#nw)ggZ8+`~s<+`mQ zktRGV07<6u-^9JEVUDmy!|eY zpLzY~V0!WK5JwHT*0WlQIp`YDkj-@-+|YAhLweoi$G&A_85{A0eml1gV9;^*szzVa zMmpNUElQ_ieQa8~O~=w`r_nZUrqNCVrG9Ua*QjNJN;=y?SJiD(fDVjtkN{3ND*f!N zZQk}42iarPF-?e)+t=#Hu9699!Y3!GVtfAe+DIob4N6?3f@~=7)1fK^3=-v@d!koh zE;?`&TRP&RKlG`Oe=J;b)%ANlt9>2Y?%4ug{Iie4rSH24jyUmA@TgTM5-{+(+ycKWqxVyplSqM*d#-z}5Fe>Oyp61bnVmMe?t1f*zWdd) z+t_;nND_dQIpunC!RncP`OybSU+L24ZcLrZ@7<&HFtqGoTHNXlRJ%lf%cs&jWn(H!*LT!LR-^W=F2h>n>Dcf;*h|A@8&F^*mRVp8QWfJbUoa@8GUyTauL zJlvy=T~p`LhA>C{fqV~O#HR}a?Mv)Qf#%rwKE0ejy`lTJokx@J0O#Ie~kspkAY)Wy|{Fr zBKCmL>RmD(E%k22Y?CCl-GX|z#7+@4HkmYLCo#U)daLgP@I4Q$p$u3p%u} z^bhHvpNh-GMW)Dm4 z{|-Z6NyILuWUN6;oAaiKw~6dKxuzhlUs_~xAXZ$zp*GYzU(#;DESasL#%uh-8D=j6 zXGU^DMnZX4iDQj#3#e9dN5+$73b??Ea*m{c){! z^;NGuNf0Nh&6wh5L1MsBMascMe+PAIHIRn?8ZGxKJ*-!&Nh0D61;j@<`mn|Di_d># zg5=24p9zPbdqH=^7j?qgk*B9)HgHx%M#reIZv(iDgeViJ`G6qrmm(C%x2LFnlg_>yDAA zphZ4fuZCK+DtRHLAxtJFjtL;iJBOP3?hRNl4xw~-ic^Rk^WR_fY&c}$ z+)0cFYOH$I@4%wNk19ZDOctZYU$mM^FsA9g4$%y;);p3?REHV=(PgPUj>As2HQ)KPLu!i155;oCv@5nr9wVVCav>JmWcV#xK4$ulg93Cn?ahH90a%kWM^U zoPz5_{i4f?$2B!~&}DU%`CR&*V$ioeo>p?wDj zwK?>CwcSyG5e*NkZ{HZN)|fYI5ej^EaM%_KEOozkJrLf8)bBR-U~E&ib|A z$SM@(yL%~)r**+pN;q2|OQnc_ghS)}-s1LEPgX1oOE%n7mL#pJRyIf7)ofoaK9>tF zXcb185GpA~MooeQ;?6ZyPb$}K@pN^yK4Dd=G4}7IM5+oPyWKmMC-Gic0?5AFAus_z zlOE5;(8|U*RC-gb%&Du<)x{MGBh|z|f>8wmbF7@)aDY_l+RR5PnSNyxTSSkiXksK0 zUh=}n!*Bf8gG-V;_St8{)Bf-Onv=0|j)@e62tf)$Xpsc9zct$3n>9J=EiXD7Gx0^e zQiGm8sMQZmLRAKdufd`TPa}zwSVnL%lRS#*q?Gpx2!;lqDi2lZC(=J|RWJFSb8d8B zsk~WLBt1<`MbydZ#*Xd5dKi1&mr9eMSH*O#@(NG@kt5~CU^jP}iH4@Es8d5-T0ui8 zj*x8@aR5-YMdwO{J;a=o<%%fkban)UOtBcs1rRH8=9_=V~XaR`UtSdS3RJfIBS?l}=*(TDrDG z+95~WJCkgsJxlbt$ro8GO`!7o>@+@ic6m`RE0f=~XGLtbW0h*AY7zj{%bPjlin?Bm zaaOH__Y-C1(-J>U*9j>5s`Z*k5{Zp?wf^*a^qOxqtR{IQh9x%M|&h8In6U3|a_{Y*-VRyje`MN25L00wzhyHG-Yi4IYfd zwh$Gn(c~&IfmOY7MS^Sb2asZPbv-t z#>OZTX(SQ%n*B>#Wry^*SZVF-^h0?^e$+P<`u4~8V@3F^-`$rOV5^iE@!k8`OlkME z$_0H#GwIkujhKp=?VGengZ2rhB5(Y=PAe@2S#_`z6GR9Rk1qN6&*V zUve{i@Nd2iJ0INt(qwAU0yyKGweX}@yaZwwAa;C(5g^2O6}`qu7pZ(%^IFC>7@KSn zQpYSr=Y?{J*8thiaZqeHrN1{EH=&trNRDaXz>Pew*W#w{q_bBNKxFmGGb1>e*b39b z#z{@Z_)gjI?&LS3lm$X~%z%dh6mOc!3NIytoFP4enaLtiDlID0-FI;loLTDpTklhv z<#-u2Kva-fyQXik6w#g}524CC&oK^DA~e(`LsKZZ9!e$A4co90%NId0;Qk+4r#IK? zmB(=be|Hr6d$gOh0w9X~z&vhPr5iOqw^!J)YXld4`Ud#?$FJWnK$%{&0G{}tp9yE4 zvj)P#r4TzW0I{3rNzr*|hf@&SKmee9%kNKUEn|tQwxMM_QP3h#wUgB4dOrMqq{oZZ zO_cYMWA#d?@~-15as&>%jh&&#%YGnsKhoj7>>HuOBU!QOnEp=Bi3P--FQmE?Jzi+< zgTw$(I(%bj@buhj0n+)(QsDJ*@vl}({|S#zXA=e9NRYI)ytNO4zD!VHq~3d61)|9^ zW%96ft@@C5vhs|@DSGbPl!`r(zeo93&YWo!8-;Y>#5yu=f%CwlNE4>KS6@|5Og#!h zPsKcx;G_wR_poT`0RGE)Pk@)b<_uW>uQ$VYuDA`pd)cOkf`w`vb<#2L2~RiuIhcR+hfficJ!r#7|tY#i=TMQ@+5eSCau@-rKuv0$-ut;eU|ccK zp)%qPePj^jkF3EXHfokw^j8Y~J&EqEY8*GUbeW%|c?X1vpoqoKJFWsRc_fOYX@gsyqf3Gl3!JQjBB9Kp3$ZiXAKyc2Hy!2@u^ckdp%D*bWH$w$I5Cm#(fpY#}5 z@x&Fd=;$LLMlV}OD#H|267kg49nT9TgywUggveo@z@94tM_?e}d%YOscnoRq$(N84 zJ&t8hAQ?5XT8O_^7a&n#$)E>UtzlZfN^K5rS|3EQU9@Zvfdd#ERNYaOB|0h%LR-Fh zEFn$PP&L;5mt3_qiT)GXJM8 z9AIM~)^W#nMXX%F&Ot?iXP0Em&AoGET?2%T#90RH?ZMa34NR&wT`|chFksbl$Cb80 zFTIrgr{Eu|@*R7vO~spM@$0{w`k1W8&asBpzwDEaG2{W~s+ zb!qORPo@K|4SQF$CV!0~%o#Ac3YKh#xLl*j z7Hfdo>s3|iP>=~#VNgpAbrGssMKX%wDL{riNJg6%@qsrtddLd`PdX59mxD&sFp%nj zc#}_i$`LS14gGys^JEko=u&`)lK{Wdcl4ZBe@^CdniDS9p`${?vAAAS@e(<8>*AhN ztpT_Y_?l%GFMH^s3+(Q011D8^mX2+#_d$z}%n#GcZ zh+Q3s`5UF)u1pD1tGc3AX*Q=$V9XhDU8L8h6aS`yLec2t|CpV?JX`vmsA>^Vp5Y=U zDY=CEt*2@ zb-qZKqGIvylHd?kjEhv4@}fTRL?PWc75jpAfkEMA_*#M#yS6duri9{L7phg7;z~JvH^N9% zSrX)(s#?6~;9nAH$1uRCI~whsl>7-QVWiKxN{0xxz_-g8ge0A0_LUjU^Hk~Z>e>3P z`}*1^rKhbI36fUV>e0AOQ3Is+Ue|kvxar10*Z-~>1O+HM2Sm5k>VJk?mAp-~EPJpZ z1IUs`yV{a!C9iwwhUC-&pW+}ReYf;SCjf+^hB#?A<^^yhnrU)Np0rFZ%8}Mw3+aUA zy%!aMRVkJrUQ`w}5?ytB$%#Pet~>=IPDrm&<;3e`;>q82+(jIJ6H5w_v`N9NFR2*K zVymd8nx(MZlOVQ+le`gdrILt(H+H_nNT_31Cs|T*4}<<)3?cG%W!0D$e@wJ$RB`~n z9);ywVukX3Npsdy&**lBpXIZ6t0Q-Bm*<`{K&awjMvjkz+Qm(QeJQc|yL8z)$Y)HnIkTcP8J!(J5h7&bOQy7}%gI+u(@MoRW@J|l1 z@$S@Z6Ps{JnI_i-$Q?_w_SP{n&(aWt4h1DRUyA`D$4rT-JOQvV%cgy)Dk++FhE z%{8V;nBy-10l^np?V4_8U<6YPoUCv=V}mplu_omX`B{SqExLj=ei77!NF0S1PgYb@ zR;u8W?CBa&wF0*);Ik93=>3$+C;++bElH3li%{gN(TNjGO9FKw)v1VeV!&X*xkm3< z^knDR(Vt&KvPY6IdJB*mQOA6ahm21_iwTt=D`$7@?!i#+eS0l;aP^Pb>tiL#tYA@G zsF%u^Rb$$tP1PaPzR07(|TOmzM)}WmmmOg=c;iYrP4@4MtmU-MUxC}8OrM0!A~_! zNADvQY>HzfEG>kyMtUVX5fGqweNrYjxuViWR;3s#Vq-;vp z@)*l?W7jKrs5Ewxiew=WBvvvxJ_5P&NwG!LiNS#KqGD-nEG;Y4x0c20N|`5PM z_iPM#d`@n@+=Yr`9He^b-y*LCxv5E{hZl7xiWDI!5xBpG%d1w(QU-GxxNlz~^$KN1 z%pI2GZmy6gMvS%I!Ina%71K;I58PeO8WypC>^GJ zwjXr$iJ3Q)@0N!w0Z4@rmC6gqqQoX#a^+Tuje_7oS8q#dPoh<@c5?Vk9OTQFa&WH` zH!m@Cqhr^vzSn7cGj;0@2_(_17i0sV-Gb7CjDGoR6-3Q2t5s3MXGvlvxFP!&gF`so zobcMv&>xIQ%BS5^BC**7Wjz!_Acnu?vW8gAE28`0ZSD94WV`T1PkFrr^QUw|15OgZ zC=6f7E?@i`Mxr+A42(Tc#4LD|`D8w=)s5;}laV0arTq1l{A-O}D>X`;rAoUKkho?y zUl4Lb4k$3CT&pT>VGMNVifb;ZL?HqXlt7{3Z#k71u9gyXQ?;RN6YF}GW~QRDJCXJZc0nP z%`uV4M!W=WvRadP0*~S}$4nAi6$k)M(kN1(Q-SMwQHx@MWCz7nIN+?l!Oo&2@N)XC&Gx@Gc}1mRUg{<<*CS!xOrXUK`p z7HbG5Ivz|>N?&r$9Xr%BAd^lsXVf;49EF8z@*4ysO)d+=uWMYun|ucR^BbI~Nd&dm z*a-;jq1YvML@`jEP*QAD8Lz7#+AArPj7QCKz@TA3J`~@|sW23yo;7a-8s$C6pGo^> z28N@lTNNAWt5VQ=qUKL6YlkcECTB7;Fad1Vn~AmoSy73alsZ$xjEfT>6p zwsH6v$86LdD^40!%`?;2ND@7*XzU9O8A|B0w3#q$V7)V%!=kEIO;{xJp8#TPkfK1= z9x44){XA=Ht~C?PysGYtOiNHdg0V?-^4iY?3q+6!9L0xkBIzm>q|%>LK9yz`4m#xcKX5HY(^W04H4y%bDQFmdUOt_uInj0G-o;hD>q7o48StUy9)rTIh|Xm@r>gKS z>SCChVfJsFCZjy%MmGjDbdOr5J3Dq@IH_X>N(4m-rY_*|z8IK_rcbMvuQ0QHyN_E!NZm!439C60>Q0bzaEYW>x8zfKK{vT2uH$Uo(0Xw$0 z$4t9pV+17uL-s(0SpPm%+$ds{n!4b`Q@g}N`Hb}$sKm+V9t-Mabxo->(Im+bMOPN} z1nm+GB13gS&9dRyb4I65#;ng$4@AY{lvf2z$lfdZxNmdP5Ke3?O*7?3FodS04)=c3 ziKD?qb3piH13!|$pw`D_*DzArDS0ZiS+X$c*3f7L&}5smK_0gxl~mDD0MJ!ynLMsB z52vi%$TSjCG#XV}UDEUg=Y9dIao&N*`36Trv?{+fj zZQzfuWtS(3ZH`)Gi8J%kXJMk2DSr3#>8VKz>d~B=lMS2E@VrJ8c;V0RL~e5bbc&A0Pz-jZxcKaC2k&;n z5T=;7l~qnhMXI|tWVH+9AtMP4k}61zKFarL@)&}nr6?Ub2JrfY9QVmlbl@Bj1Wv;9 zn;J16i@aMk@sxUzpbFPS0f=Ya)*Ca{cjD<1zMbUfP&zQ?zzBa1vP)ayIFuv8&)czL z3yHc@HQ5=WaszTSU1xb)LwZ$HgTuOOjp)oTxuV_}qs>Z^WRGQV^wg)S=VcxDcLCvN5om@mT0X= z6xG3z*w{)O!>V)MbF75pC&g=`Zd8q@P{0rs5ig`VpI|74kdyrIjKIX7=klnsHb!qe zTT#?Fp8Wb7%IY12AyM0L>xkMOz)^&|++UO+2~&#Ejv*?dlbDy_hmYX4XNQR%j<}FhFMpys#S$% zlJZflrB&>ae$fU4hB}?G_BETRcC|N>#MK6O4gzMNs8L>*iYb6f#bW{~O9=|~7&?hc zjtm&7Bde@jTiKnBV%2vw?Y2bH6SxctUV&_%K9(e!T%`?o%Dw~;9cW}9#0{*^9mOz` zMun|i;@C6KF&}pL;x(KOLjno2dR67*nTj>KC~)Y767SSg6|x%K1f-!fB0bEd2+ z0yv@M)LM|bk#&|f274g4r5Ftik_I5oGU?LxCoF}hpSUEq?JDOJ^A&WGudbp$7dFd|1$O=Fp%#3e_|~;OHk7+1ghgpYlTnh8H^u8`ngktw=JJ5+A+roJ##KB}eiJ2hUOb*oCZDl5sv@)l9d|w{3#E zZn+!ox$QQ%=l0v^y|>?dL-m&&d)(>t+lL?iSXjLHXgKERRdCoLkLS3OaA$K|1XqT^ zkR%Dlky6X6WC4fLRXj1Nb-HpOSkrW)NKluh+7LD1mZk3u22xF$Z3J~%$XaKDwoO*A ztTYjrZ1?9)c2&7p-&RFyrAFyTHJ2idzvk-qR}~Y*o0Md7<@ak@pPVEGxy+B{VkN23 zd(EzG@X@>OfQvWZ1Dkg3o-_^jX}sXHj4}%x1S`JH=1ipFGTDDXOj8b(Gq~WL5 z)pCQFJMHqqE+v3Ocjwn!PTV4*p^_H0*P^<8DV^2j)maJM!%n*3MxS%kaq?qu5J7?) z>FWAiN&w+wEeoW_5Ipp`wxNC74%n_B>VJSAU2`jJxa>;Uc>RxH>-`Trr0Y2~SOhDM zelniqdiN#$ZCC6&Av3xn^uF8SqnmGsE4Dne8#voovLL`OJneA!_2(Z6 z#~(eFnY~GX0%qSeo`ED0cI{Wf*>WL+BMLY)yHUZAs9#1XI<^O?3S7wP3X&F88v_pV z&gd~cjz+9JPMw2cJH^KkAP5wE4GrNaKx!EL{S#H0qE6;!E#I z0ZEhd42y)%96IC0N*Od|xb6N|vIaG7XG}20vjj=Cx&#Iw`E~2MH6XI(d^8enNQz0K z(YdIC5)(zDT)yLec-yTvz%>tUpVyl>Y5ev}kA`3WPe;O%rJf2paOR>^KoRL-w*nGi z387L&Bnf-CT$UL8Se|<(Kz1f`I=a&L3f;a61iIc@>7>)+fzop+Pb7(5f_1Y-Qv#w; zz|pca!D0`%|K=C3gD-yUtFUGB`~sstP^vuXaj$_V9RCXp5&?)uicBkcBApbZqdx8; zIa-z;L5t8KK)ND1g2pJNf4fgsLI}}Q0OFGtj+4YVVpa2rCQ)EO4ft*TRmDQD40M$q z`WSjfcaJFxFb0^~-T(s-l_EW3+&oVzMYQ&7lVB^1;QWo(z{L-2-mf>YKb9;E@UGWC z8eZ_!B@6=1Ow{U)3XA~R380dL)G(*Mde3~svS_5*rN4_k5~tU3MdaM;3A zc)iTv@EnCFfUx>yt1~K4KnieJDT3S7&}YeE_dybDf&oRABx11V5C!mDC5`&6?u>PM zppJWtyLqjuG#=ZS^jN_#0W4W^^Z{Zdj8Z}Zz~wvdhv(n$O}J*~jstQ7?HINRKJ)c0 zaNFh~Jmd65Fuj0F`GDuxN%mId!Vtnalsa3vYNL4VI5wgIQF*UOQOrCH(wW~j`r%}# zj-&?is_dYr1Rr09=3Dr(t?( z5gfhjR4Jy>Q$92w#Qd%0kvMoNFR*AI_QDvaixVb7)EWgwt8p6G*G*_dZd>@J$zk-0 zKh<~DT1nw1OAs3*EQ(+8PH7B6Z4Tp+QkSmge0*ff?eH77Ub}zp)Q>q%Te$%KP@IQsljOpTrhJPgSRRZ`qsZvYpW-KW4Dw<2G^x zfK;bg40EoG!Up}Q9l+oH!PnrcpTFs#xTcRg_64x^l(%Ko3R+)Otg5!J8uF#`rE2e* zcSq`0%Pios_A=@)4?jwy(h_!K`5byE$e`R7UNH`kN@DasQ5)tNh58-~4&Mh-u`!&| zHLL^yR~`#c{`lS>!5`oKqy2Sn9@04e$N_xdoyWmxCr>kZvZrEUL2K=TrM8I1AQTie zNQyn;C6h8yg~f(0NtZP6=L8&~fCTLfQ+<&trLvRhrDwherrc5ii6ek`;Do^Tk~`Yu}S7mX+%vd$H1(iskZB@Roai0PnkZ?ggLs z$5^_^!^i*pI5_>}>1=PPB*`UojN2DH*R+bh07C5&HQK$DFj5Z}0l+k;rlJo~(_qC@ z)$?lMeuyqx^;ku=L!7vE|MDFh;L^|CdQe`|!xx_jFJ1L+m~uSzVeSJ?v+! zXUpW0SD7m=!AG{;3BP~$!Jz_78Z)B=-@R@({QPs#CJ}o?t2FvzS76B;Cw7XLR?7fd z8pxEv@nSbi_ByyGgk^m7O2f&*fgY}vID zPCV*4JXg@;HfTA=!~~Yf_K>t;O-(M-wS*xw-zE>o_D5}N6y-)AYrSBiq`Wnp_VZXo zynM?f*KVpnQF)}GmL`3-Zjp68&=_Of+4p*Y%Xi-ouiSL?fx0gbd2D{5gYR6s8(#6k zCB~_snTfn{*H|&i1vp4*4Bix35W*#QdaCP3(d9K=cC9UFjnhWJp+rx#*gjks~ZSU^mY5Z0~Gf1FChJhMCthYBaawlsq0ZTvROB+K|c zc*kvbb4%rCJed=bK>1c)dl{Ny*|{r~(#pAcC?!<+Sfq&oh)NJ*`$}sy$j8e2sWxzC zMN4@g$vgScb=%<&e)D^ei0g^t&aGF$v4@@kix(Xs%Y3TVXtq0CAvqeYM|ryud0~|Q z?kbQ(%deB64DMD_9W>?Fr5m`)Yt9Rwv_buaP8mymsbaoI<0m$tXpMgRd-*TsN%Y_D zx)!!|Ej*IOpZ@(8xb}xLIek{hBDrC|7G7vvXL==;joT$Cp(N&3(-_#oG+cV@I--RK z$H!1AAYg)TVJgf>=iO9&zjn4=cmDSuQP&g4`XBxY4AWLhs-qgel;5LUdEQPBVKhC0 z4)gVqxlH>=`_6YT!UEhR6=HVrMqz-r`F*_U`;h0=Iev~&l?^oz%!KbxZr9bI(9L%} z2{Hj3`8SjTZ9&PuefiD@;G*sKJ{ue4R(;a)m^#Um*(|{9=Sj7a9C599n57QC=gs%r_=vlaI=*`44E*y&+l>S% zKv1A)K#z@e1`)mo>FYi-uoz?*1wo19MT#hRyd**?Fc=)#rM3WS5JvFewif>719u)A z7w933Yc_obw!^Iu2kqodq)2R90YS%G!%~32 zTTsQirGUVagKH^~l+JE}Qvs_72rGg1q;iQ%_rqK7gll#m_$c{&jz9U^?V<{)s+2NN zxD+(6?9LfgO5Y(siqZp3Az^Nq}JF%iGWdZ$_Y=>jsXiaB$uVf5C&4*A;OMr zBlzgw?LT#O!68#{%%hK@+jrNd%`mfTX21N-5AV1HROFGW6!?_Ep(aK@xoIf0xF=qdkPbF!UC87&dy zV7iG!T0|oBC12PMJGRZQ^f>gWMewW_KLJkrnG;~?q05;OOytJ^_uu^>+zJgkB#&h;rdTxwP;ZT%o*vp9M3t=z8!A({%~IY zo`s7B@Sb6?YM`#M%VQ*b$UelJolB$IVC7fC>o!fP*q&6mJ_G~JzsmB>VI~} zTBp@fF14j46U3gBuoA}D6n!_X>pj=^R*_I^oAC3`?YM7VE+mfkJ@YvDlcyXF%Lb;| zgeoo3CS$XX|LhYNz*m3gI5_*H1@m?e7kzm*Q>~N4Hgb$3=6Fw|wul#d13Nysj(be0 zt%0@F(LfhBFu8rP0GxWWJR9^+OQlCK#z~bzTLV2?gAPVh zBX;ppcVe+W#2z7oUF;IFSJZ1IM!R^hE`?kZoa~U;^JK+dY-56f-H&_px3M_Mxa)UQ zw+l9n=4YjO-_wtSSDw7AN1Inli^K<<{qy*omM;SM*smV}XB;<}m-D#%+oNn`lT8pM zX(vH`T#R(tQi*@)Hjr*nc@r=p2%Pa~6%Q7J@Jko(oR`02;i3lK^q!}~@h2^nMYG=g zU_@=$5FAA9z(lObDdh-`pL_MoVS2&zyqwFe_k4>d_MnBX88Il-7#Fv0i*mw#(yq(*69UFafp zpb#=egqshbgcykHH<+NIzJ_jL_Ldb;@$KV9;QH^)&w}&1cbow$PFY0tv9MNe2qS(x zwVS0!Dy=d6)C~0r@v^yQ1j~+G1TTH{f1a0fx$C}b$y=2K04+BBAqgRq9wi5Qsv36t z+O3@$O2CjkRT}5WK|&KOM4+JbiJmdRvjKyJvqsWYLQIenW5K~#-k&=~^;!?;M3La) zt)saIv6c=zy#350c*02mY9~#2vaJJJkG7~eTDH{5>b`uTgSY?Ok~yExt#?M)w!H>O z{!K5cmjQ@3kFoC{8RPb|hK~g*1*umEbGkTih!OP>ZP#5hclGMjCohAup1TZu7=jO@ ztOiooDXCPAC60V(!A;F@!z9N+yeMiACTSdh%A?@avre1y`8>F5a}`b3B=k;Qy{0wa z*j}h7ooq!dOU4z&GU3|FP=>Wj3`+kHh4>Wd}oo%XZE^ulzS3 zcNi?2l6rc|cTTnR8Y{A_E4lU^5kURwGZ(LUZx|ebF^=*!jYn2Uam(a>D1??2f zIr{EW4j5{IH47*N#8fjhaS@GuFu1;P`P>2W!e2Vh6wOJ}F-#HUHeh8j0f+wzd@|@4-fi1TcfS9N{s#`fI=u3c5_b6pBKB6iYMba_Gfq_P`O**Bh zc+OG6{r~yFi`GM3!ZckqF_>3v6}55?5@$9EGaInxHePw+vMeQX;p$B0E7ch@Sdy85 zsYo3>wPgz({M?h~Zm@6LCiVstX~1sUlzCG*+rud(MY&w^Sf#DLCxf5>0>OfNlpHFZ z=Q<8q9N;O>L+Q~`(Kt`^6}EvwGsBC}U`8agR7=43pqfRslSP`~HWyL(+=~<#UbG*M7a8-R$0HLJmC z?cn^zq$PBP*4|5Z#)x(pQs$vHkGXx*+|vY3f9fK(5$Uo?%LZyE(FkCi^e~JR`|wx< zTT2y1FLiUcnj)`T36>mj$lNcfs!!7`{|+b7P$V5e!toK#b}AJuoumhFj)9Av1PYxL zg@7FY=t4Fj*6UB&nXtZ2kb<7gVC|4{1Is>*PkI|vR6?WgOQd-i{hSjgK#4*dXp9uI zr#&eUI!_~its4hJeG+BI~zX`1-AhEainOE3=l8%M3Qv<1NDH- zaYR?Ti>0jT$b2#lKY3G@f*z3fNd#TnEg(>o*^3}Sy52{=^^2LGSnCoF)vR=0d2S8! zem=S@lhOji^;hOt-N_s!nQZk+wQzhQpvO^~2S3ZCB z#<}b9%a%#^Ru08hiYX7X+Uxa6h9?Ro8UBoi*o!u+#vm zdNL5gloNG|i}&GF7)=i$v<)9eo>quihQVGx`HJ}le?m}fp$A8$3OF(xdUYNsj@;D$)vf{rCz(Z za8vKviYlmfmG`kS>?_HexGR!&!&-Le+$G2@*YAd15AKG5)DbbjnNHG)!=o7E#E=cG z81fxeZHK`K5(X0Go*>irjvMZt^LZV*;&=%F_B>YTt zd63BYV3-r6qDYS6@>XkR*TA3>GnAlY+|UNQIczvu&7;K6OG^GC5GM2eU#N%Y*KK|Yva zJHd5A9_(QEu3hlWPh2zS^Ev#{k7gBX!EWdl%uo!ZU9j6EOtnS2G%bt>5Yh0jS^+?t zU$<^x;c8v_=}UgCs>3>A`A(mzJXn<^sVDc?_v;_eDQF+>6;J0 z)?qAt@Uo{0YA1oV99E+^$3qf)=xe*-vscbN3jOS}e2)1zL!8XdtCBrB%)-(KhB8-O zbrqpApDor_glDduy9C*}J;I0n=uQYiNF-9CNRJ5GTqg-27!(dc(zGSo?K=4Szg!2~ z@16Uiv-IerGL1yH9Qc#?hvuszFtBXx2;(6LhUsBp^=g5JkU^0PJwzWr)&JdbfH<^6 z;w)g8eZ?C;rfrh#gdO*8J$uPK_{Y&$zkdjC`uhE%)M8+YFw_R}yIH8?X6Mwwt+xUARzqc}$ zCju*F&Fsa?=1vgA@sB^;2`~8cX4tyBGYMP0-%a9KgCglZ^o<#K{-14!t-I!DVx9N% zzKXdN2bmn}OIllg)o|H*SGgR++@LIN?BI7jeT{=9%jV@zfq(pi`{8fid>4}v(L3ck zktV{sQf9UgRFmw#`j0pknWi#f`vn+6-{}(Wg`ZVbv?Bu6~04 zUBbuz>74lr83J7X@g4A{wYR_zzq38N?D@Qm0WTAA<5gSX!qD!iq3p9dr@0{{L0aw%AZ-Lus%UbR+D4Ue&IbR5lYX00Zu?`~vZpNvm!z**FQ{eX zAFfwZ*B4I~dylkOwMjPx`<#z$gBDKv{!Os0o8M}R%cdQ?^rQu_X5|1@9O`qr>sK}n z;WO6`;p#i)zv9OmUghCk@9^gDQ`$@2E;?U3)8SXIWikdzny`=1-(2=$NmE(4;!=Q@ zKX-mWZ^vPeYT%6LErG}W%p#at#4Q#c+zRlc?`((b*KdWbcg;^GqaA1d%JbofQ&&>+ zA2*!hc5)QJBeS*lk&n}gn07n~HN&MT&AY2c)Bjwx2{q|L$WZ@mjXeBb_U|8*e7kG>dSa92l z6sh;T%NMEu!jA?*HQ^v36@S3|^ilKaOaJM2&z*Fdvj-tuyl{f{Yoh8CY>GXpQ;>SO z>GgZx_NYS-ru*`c#(C#>Sb2PpqBBNNH0qwUOD2po`IA}o8n;nY>Ehpg?HlG#&3d@T z2`_p=_E6={%O*R5bQVC!VbwXq>2C!JYuJ^nq`oMZd91r3Dj1 zpuLTxLophyzC8&XYV;eRJZ8Fq^N(5nh`yN@yxxuHlSS*vD`0ST?i!4w-khEUk{tJ# z01^w7m%lo}sjKGw&pcpb!C{Nwn5Ug!+_zGXcWRi8bsPJjYKs)(m?>F;@>)mk-kCyw zFLubrEB@gfW8NzrdkJGFL6*4<6AVkcoTdD{{~4$v!jNFh%k{S7m&4L|h^#*xxXdOgQl>Jr&HF1!;R-Nx^zD%(Zr@hathc@Ekt;<`IqxhgB3-sbk#lnC zP7f*XqZ6RyfMDoq;Dp-KRY?y9%B<1@_6;D0W7Ut1K&qqX$v(F$X9><#>KApbFL!pC z_wavCK4Lzv@c|jD9_Qc@Pg;c?Hmu0@;>q&ji6^x*eE;3MHb9tFP3Z%9Uw~| z_zuQIJ~$>hXw*LYdg5CkbVfa!@SYyY@g>U-ffpY(Kf%KTHU9p8d04*8fIzQ@4IRba z<%2T$p?}Hh{4JR9usRkefUGzd6a3Z%4o*4qk#jw#k5~vNz5WRtVc(yDf_BbZ%o3=Bm;iZhFAG@4MvxK_b>nVhP|E7KF+|ju43+v zsag|mOTXp8r1vRcGN_7Ovtqh|FRVV|pasdVzRHyH>4)du8p5%Jz_A zaSD=Al?Rf`068)op988QFBDNt+Vl3#ncHDzdhdJQv&{Zjdp~=feeS(&Z$GE&=Hz_5 z=bU>!_H&-~wbx#n(BHl3d34*(ORqAro#Mdpp?9}2GXNd|gWVBZvJ4(cnKM#kpA5-# z>yrT#p@tWW&pEHwTkj(J-TSXSb?a5{d^tV;C!U)du*Nmod8&9gkE&FPcf@I~>;bOc ztV#_lEzYOiiU0h)_aEQFWo?x~D6q(&p;Kj!+o(v|OALX=J=!LkmI5x~*Dtm7=^uF> zy>4kcDveya{ONBt^r7EshfFZcUk4ACQL)tF1z-6hT8>~L0E~49M?uXM<15Kt@xSFN zjVpH${oy|{-Leh+MlMw*yIXqGAHSMj@YcN{D_0W_xz`?k0UXiII|I9;U=Lu3Jel5x zF|A#i`Igv&HcBr=$byZ&EOK)NN=zF3;u4yAW)UzLV1cy2>X(p|4^)_)p9RnWS=H?29 z9`dh>RFfjbq@26o=TdH)NluM-X&5d}vidmDJ-;aQsfVu0BciULced@1K=B-aH>HISLR1=B0R}zq3cO6^V>NQ@V zg0Hs7SRA+F_8oKW;_o#joh6m-ag!sTcfEX(K7DXMy>8!?Ws`Tmt)b8TQA^9Oh(Vsr8t`87$o?W3RQ7G*TUy*tbo73vBOhVfeFasn$)1L8 z|Lqsi8$Wm(wM#AZh!n3DNvtxm?z~v6qtlkmpq?qm9yk`^V2bC>+qY(Ws9X?(I5~IA zYwq)vPYM@hsV4a%T`7r?%0xvf$41XzTFC{pQrbJ@fkY%^yM2* z{p~;A(7S)3p#!&4$rivKewsu!Y=J>qlaSb&j9mnnex{l-QBk0*6EX_Ld0%0X8lzxj z-7iZ>Y}DmGvdR4)5PI_)xBdM7#2Rjz^}jN2{4nLbBq#J@%E~`18XTa?KY3kXIidrmrRyi!^yL zX7X}u=*1{f@!OTQL4z;UEK2HBDzwlja7uuv`t{+nYxK8|uG7c1q0oYpeTzhIUuo!9 zf7$_qiKbSa0&q-JT}1EzsB0=0XCPRxATUH#Edn+GusE4jQcWyaIzrW|T-G%Cb;$r) zeS+xI4-$Rs143s%zb%iH7QeTpm*2HWx8AXvnq5=s=4}9g8~)6JL;>Oq?zrw$twmdnV9?411H{R>7roNa)bIEe!yw7$ zpTGe1v>>&cCnYHCGPl4i$T;zft&KLEr>8S(J$>@AIeqMGN1uFjPOIx%zpvN7nCaka z8@l5Mm=3 z4*-UncaBNi|Ludl(Z{)CiNgNyj1d9D0YI*gNWmZ;EF6bii~T`n)1!~v{gDe&ujmp0 zvfmH>$@0>y5Z3@=`ivyQJ+J~NmOzk1a1>+uY0(49hWjM`KW%u^z$!cq09x&YPW|7U z&VEl)>uWD%D9;W4&5zzuLz(h*bsg1ukBTO-&A-gmiO)@ahWsE&Qof0(6 z4M=M06#}ReP_vLpglIkf-o;W8T?CMV%FVl;J%}DVP4w;4OpknCd?%?sg3Qe)dmDPr z?F~(qTH5>CHZ*wG@OzH)CIHYK;|%c#icaUAJpw2cIKk`RCI*qjCau371%<@E9+o|N zUux8EJHvgm{OGSdH0Tg@SpX71@`^*m^fyVpB2=-g_lk!02sZ8_1GWcdD1pMLx=i}q zC^-YfH|m{SGE579YXITW)uVimjY!g(iIsicrjM5qVL_y-_u2@XxM}y7N`3M|;Oa#F!0?93}&+|4v zcYtvqa3kX)Fm&!>8*c7$rrdy_${alpyjLDX+-Ef^^%|TcRV%Sa@Lb*b&0qTXXiED= za?$Rfz2AKJfpfQh-wE&bMQ|ihZxoF$V~7~NSsaTHv!<-ZMipyYfWc)grnv9G++63v{) z$=Caho+YQ|X^mXrm~+L{xxVJU=(J;zq3Pw}{WDXuLbOmd5_+DF4OixK_j$|*B>F4c5e}^POfm*o! z(k4_MqZQVzTQ*kTx6DA;*lWU6ejIpYe|7tsVhwuRnAoVtV}{F^Z%I9F`v zbK^Pp=kNoYx1Lq}*|fNJ81Os<4x?e;&U~_~^T%C~*UHKzB|7bW^s6o%{>Ts*rcb2J zw@RzpA7r?{zxlb8`(oOB-{=3M!#nqZWkjt|iF5bj79?MyE{Ph|l2oFyvBH<0%cHft zaB@JP)Eaw*u?C-s;(z7+6QfkXhnGs(SF))TQ70346cdq$)5m`rZ9*M$F-~)z0uq@5 z;ubnsjjDMPM|^T@GmGixK3YDVrOG44#Ce!BcbvqElA%(Gq+!!KpUy5g^6inw-tmbG z@>*HBl-e0lm8ueV`QOV)W1tYQ zB=ZItSqpQaT!ZyxNn_Ez=#5-@cun_|Dt@Y14G}&19QG(oxkC*_Yn5z?)Xqz((q_=!VtLg3IpgELSU!F78XW^DqD!y#tW>FzPe+R z72hDy+ED=V040Trh3XYF*s6^JgJ@Z`YhcU7eYFr$`VO#GE)rVPU-Z!_NGKTR>L%{e zB;MZWCz3jW^=aTarv$kCDyELZ@DASX?Bg4;mX)(p+|UKFov6Lyy3zV^+MQaa3Rn}o z7fyv1mR08Fl2j{|ZOJ9y`}MP@14u?#13!B_Ai_?1M8`LwV7&WeLz9IYrjUrJV~OBLBh}$G35Q{z&Y9NK z^`OZN(jQ*^nSZ?`)k^4Q|H$ub&Q&87H(9%uxqXMB~K+r zISd0mPqv4*Kkj|C2uUD!ziIj}fOJQ{; zFsf&(g?}Ms!|;M%YcS$fy--h5Vk3LYwXZRa0H^!+PMj@+oq;l16={sS3c)8FHjBFTp@!BV6d^fvG;J01j$NR zp)U2t?r02-)%Q^A;?{%x(dad*rUwRn&cqGBwUIFz9qu8jQ$D>UF0VIHrD7M!mlQ|o zVH`tjHL6~D!#)B+jdt~r_0!pEKb;+V`ln7^aI}0Q+4ladOOJfxGzlH9+7{_^ZGdAx zz=;V)Y?EFjT?klU7ZY&pK`KH{7jo ze)*w0{dTqJw82{DP@4n$W)}VpxEE!WzG9bD)ip?_)Cj!uRJmzgdk6YT@Zn?Rz_8}n zA)a9lu3$Uq(9i10N+41fuY!i<@cFlVaa-&Tl*`iLd+CvHI(y`3STnr`El`SevyT7} zdX0-@ZenMsW=tW~B-$yy??)S|u!k5) zuwm42M?=0#Ll^|Nu?~Dg32^<|Jn zaD0y#1k|AnB2bR4|LDWpYImSqHh?%;I`hAW!(cobT!@boJ6H+)W+U#%BIxSvB=z)> z-T+3E3@21%+Im?qU0~CjFI~KauN3-pVAib{h9?LuH}wuo9iSN8xD5N(++7TGMH`|B zvCI}Q@Ldr=Bb$Bk>|z>3TOms{;u}!+W^f_8?L0+Q$TNciC%b$zW5hn_6b1&G1A9m_ zH);HQysXhb^T0K*VO)7yuRK=`;9&Hqf=iyyMv`cfY zAP&;T^C$?WBVX`ZKMvcPYW>OWzUkKUykINBe3GHs#Hr;DjTt1Z+P}ngds)gQB3xiQ z9S5daEe6}if80T0g7!eb%whNYQ!%B^rPDjrYAv$I`8bpts!}N)l0cA$Z-%b2Fdm}c zc8Zv`+_(H<<+1~0>Gb1I5X&JV=h+$p!lsF&-wIH~lVJ=b`6{&=Zv+aLoBbUwsEP&p z!;T1)DX@*?wp+MyG47$aFv2p0exp*@Ddjf1Pa+YEk+>5ZrAZ9H6o_opASBulT?cyw zfUD~b60NB}q2Ct)RV|rr9KBmi^rY*dDB|Z&IfFg+5qHt`PL2CGT!DJALIo2lRI8jy zlFEjzO4A>j|KKCr>anWH6<`perLR8WybCKayRxXznEH>9zTG|>+6;X~CIWs(;P)n` zgzO~Z1vqyL03f4Ii422)t;zhw&#zR#fOT~V_M>5A$4Lo91wo_wx}}DVOqBvMCbgu% zH)j6mu}ZEH7l&LKjSW|zd(M>ze%idG9f5--Y zI|F+(#wOAKHI13R*l7zA5o_#`#FXeMq}Hk#PNR*#V*C%ZKV!OB-$G!9G~#|3dr>A)I_BjpSK4M$C*2UMDR^$zj zZCWyPyX1-i#L3cE&YdLg0VG&c3&vS*O7>uFz}g+QQgbS>NBl=q=n>dM3$#p7vlj@i ztEn7gRVzG&1&RfUl*guZEr4Wr>T(0J02kURHu8eB;GE%BnI_5ezy(3; zdGyt+2QsHUO!UG^5EMTS${-wF!pr~$e1>8F0FK+gbH%_xR~jHrmLC3YU=pF#q@& zokB*XVs*nnK6ev=WPO`SB>hYK2E0I5|WY2b5PQ<;kBxs30F!ezF) zWe6fT9@(L^U1P>B!*|;HtTM}3qN!?&@W0t!b|u4SGq4r=#p5THbd)K)jzta*!(DNG z61hvw^%598ynD|eu5GNyE53VGz(H3NAWrst;hB@v$TBr_DzQeaQo=hR;V`9)z*nDg zaE~+1qtMrKBV`|FpPa=A?Z6?vXrQ6*tyY&SY+Tj2br-?F%s?(_(udC1O zv%;60cf@{KY!K?4YE(Wya>Hu-F=j8emd;WcWnHo9f z)q#cRzQrPLt&~AMbk{EAw^URbp^E*$pgI-xta58%++T)`9aXA9E5=qAWkc0v1RPsp zib1#CP@<=%a$z43eCc@W_}H2V3Ni_gb1>xb9A35Jd@Z{;0)TVPu3Dy#zaAF6r(@lV z*O%unS-b2(z^%wN0T7iv|28|!Q#l$8aja4pz`+QNHdIke?%kd76GcN6r~pA~Ea()- z$0QZ5=JDdfM9NY#2sp2n-D%B!Q7kw%lETh67t<%ELR-eB$(IeZ20((Ih6iBaW3B}=P0`$>B99JiE3709bXyc==!a*%bHttp>jZEn@wQQx@f7g-kVfdGMy&CZsBGG3}!hs$lCuWbIgc)b~6ScXyCO| zH-$=6qEXL*`)rhkM!-^=d94*F3YJAy!#uyXloIDa62P}QVY>5~7j>5{EB9jMngfWF z-6y&SXhO@x&UgoxYy;VGlMUXIRd>vr&&A_PFIChiN{KCF(0{x!a{xx!9=VvMR$Xh| zRwEoK0BL;&HR+9-rblBZt6GOC8hMlggllX4c5y#VR@CpNcjjqx$LHU|D1k=-BfouPL3(?83{iRnISXkYQh;p#R2u;`54!5eIha%|pm(LQmz zRkrbby8D1NM#TD5YxH2R!>o?6hBe?V%ZOPHOd>_x#JN-2ODRjh^h zjwb$uzGlJUFF#MNN!CEQW*G!!@vr3pYH68TI*|f@8m?7?eNwu73-*9oS7|%xo0bfM zwzP4oX&(S6cO8Qswi~gKYFitrR$E|_5fU4|OiN&KCA(_5I38JJ!}zF4s&3%>W9x9? z?N7qKC#FQpUwH1d4-UFs0ODlvFXZ&%pSkoDdM8bM;#z+4HA9<5?#@Ke3lP9(maS4w zre*4~jlylRKbxxUgJ34X?^69atrrb&q$KI!a=F~rRPtIdL9%o!bBA?xn@;~g8ORklBrRBNI0z{ya}p$aI5i;5de1Oro*63GL7LWPrO zh)&Fej=X2FKYlge|8~m_2N0FD5Ah1Mo>2}K!9wgGvXGg9aUTE(qxIPsfK80Kam2$2D9JTm}>j7Acnb>9Gk~I`iV*shx9RxN>jXi2=S813_ zVX&vVRU^ha0t5~Bs9v4vi0+#c-S=|~*KXd_<&b9`Kv23*@gZV5OcTCi;I(RNAgBOj z5Ch?X8nr2d6aeAOCTNq4s8(a1EJ4HFg2LD$GXRK0ki_)|9VmWsdTnOfUI}?t14O0! zOtYURbchF;%LJd2|I}azTWe z?a>>L7T6o7<|6kw#(2wgeogf1yP9$nAV%i@(Hx-0jgsX7bFg&lZUB(P5JtTk0ZQ^z z8yD{oAansXNX-@jWBrT>9q)-A=!uRmx81XzDaPa` zKrTS~GwlItJz(6l?A5V>jR6con=?rMJsi-})&MdV7a7_jK9G1ygig-MgW~wBo0}}L zRk;a}OBDHbyW+Ep8=ql(fS3<%s$!uHLM4NcRjWYVsxbx)-M%M!qSHcjvL`zE5}w`A zaf-_=Hvw`PM9xk2$CUg7ZW1P4Ctr)6=?w!lYXcRFGAK?7(Gw92C*$&I1;q1tc2iZ_ cP9dWI2Q4JQ \ No newline at end of file diff --git a/src/getConfig.ts b/src/getConfig.ts new file mode 100644 index 0000000..084b09d --- /dev/null +++ b/src/getConfig.ts @@ -0,0 +1,11 @@ +import findupSync from 'findup-sync'; + +const getConfig = () => { + const path = findupSync('quarks.config.ts'); + + const config = path && require(path); + + return config; +}; + +export default getConfig; diff --git a/src/setup.ts b/src/setup.ts index 4e0b593..c410b59 100644 --- a/src/setup.ts +++ b/src/setup.ts @@ -3,7 +3,7 @@ import { prefix } from 'goober/prefixer'; import { shouldForwardProp } from 'goober/should-forward-prop'; import { createElement } from 'react'; -import useTheme from './theme'; +import getConfig from './getConfig'; import type { StyleProps } from './types/quarkProps'; @@ -11,11 +11,14 @@ const stylePropPrefix = '$'; export const validateProp = (string: string): string is keyof StyleProps => typeof string === 'string' && string.startsWith(stylePropPrefix); +const config = getConfig(); +console.log(config); + const setupQuarks = () => setup( createElement, prefix, - useTheme, + undefined, shouldForwardProp(prop => !validateProp(prop)), ); diff --git a/src/utils/functions.ts b/src/utils/functions.ts index 452b41e..59e9f19 100644 --- a/src/utils/functions.ts +++ b/src/utils/functions.ts @@ -1,3 +1,5 @@ +import { readFileSync } from 'fs'; + export const stringToKebabCase = (id: string) => id .toLowerCase() @@ -21,3 +23,9 @@ export const camelToKebabCase = (string: T) => T, string >; + +export const readFromFile = (filepath: string): T => { + const readerBuffer = readFileSync(filepath); + + return JSON.parse(readerBuffer.toString()); +}; diff --git a/yarn.lock b/yarn.lock index 6c2222c..27d0ed8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@esbuild/android-arm64@0.17.15": version "0.17.15" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz#893ad71f3920ccb919e1757c387756a9bca2ef42" @@ -163,6 +170,24 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -184,6 +209,38 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/braces@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.1.tgz#5a284d193cfc61abb2e5a50d36ebbc50d942a32b" + integrity sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ== + +"@types/findup-sync@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/findup-sync/-/findup-sync-4.0.2.tgz#40ca32d621c8023d266c6070237de13d11d83233" + integrity sha512-MY2Acwvq6O+/rOMRtbV31phQOj1A+sbVWRbp47PvcZ5+VoofiSZHhj8ByATusuzJE+q/u+PA1SlkfPu3thhsjw== + dependencies: + "@types/micromatch" "*" + "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -194,6 +251,18 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/micromatch@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.2.tgz#ce29c8b166a73bf980a5727b1e4a4d099965151d" + integrity sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA== + dependencies: + "@types/braces" "*" + +"@types/node@^20.1.4": + version "20.1.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.1.4.tgz#83f148d2d1f5fe6add4c53358ba00d97fc4cdb71" + integrity sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q== + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -348,7 +417,12 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.0: +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -413,6 +487,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -628,6 +707,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -669,6 +753,16 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1018,6 +1112,13 @@ execa@^7.0.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -1078,6 +1179,16 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +findup-sync@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-5.0.0.tgz#54380ad965a7edca00cc8f63113559aadc541bd2" + integrity sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.3" + micromatch "^4.0.4" + resolve-dir "^1.0.1" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -1198,6 +1309,26 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + globals@^13.19.0: version "13.20.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" @@ -1282,6 +1413,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -1333,6 +1471,11 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.3, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -1493,6 +1636,11 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -1647,6 +1795,11 @@ lru-cache@^9.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.0.0.tgz#daece36a9fc332e93f8e75f3fcfd17900253567c" integrity sha512-9AEKXzvOZc4BMacFnYiTOlDH/197LNnQIK9wZ6iMB5NXPzuv4bWR/Msv7iUMplkiMQ1qQL+KSv/JF1mZAB5Lrg== +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -1868,6 +2021,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -1986,6 +2144,14 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -2322,6 +2488,25 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.14.1: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -2417,6 +2602,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -2454,6 +2644,13 @@ which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" +which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -2504,6 +2701,11 @@ yaml@^2.2.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 49365155e6d9ab211d23c8e5946c7a8e3c50686a Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Sun, 14 May 2023 13:00:30 -0700 Subject: [PATCH 11/12] Calls getConfig in setup file --- src/setup.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/setup.ts b/src/setup.ts index 2ee6c35..ccb34ad 100644 --- a/src/setup.ts +++ b/src/setup.ts @@ -4,9 +4,13 @@ import { shouldForwardProp } from 'goober/should-forward-prop'; import { createElement } from 'react'; import PROP_PREFIX from './constants/prefix'; +import getConfig from './getConfig'; import type { StyleProps } from './types/quarkProps'; +const config = getConfig(); +console.log(config); + export const validateProp = (string: string): string is keyof StyleProps => typeof string === 'string' && string.startsWith(PROP_PREFIX); From 31a2739b3235562321964c6f819320bf28253fa8 Mon Sep 17 00:00:00 2001 From: Daniel Slovinsky Date: Sun, 14 May 2023 14:12:41 -0700 Subject: [PATCH 12/12] Removes unnecessary ts-node and readFile function --- package.json | 7 ++- src/utils/functions.ts | 8 ---- yarn.lock | 96 +----------------------------------------- 3 files changed, 4 insertions(+), 107 deletions(-) diff --git a/package.json b/package.json index 21f502e..dc34e31 100644 --- a/package.json +++ b/package.json @@ -51,19 +51,18 @@ }, "dependencies": { "findup-sync": "^5.0.0", - "goober": "^2.1.12", - "ts-node": "^10.9.1" + "goober": "^2.1.12" }, "peerDependencies": { "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@types/findup-sync": "^4.0.2", - "@types/node": "^20.1.4", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^8.0.7", + "@types/findup-sync": "^4.0.2", + "@types/node": "^20.1.4", "@types/react": "^18.0.31", "@types/react-dom": "^18.0.11", "@typescript-eslint/eslint-plugin": "^5.57.0", diff --git a/src/utils/functions.ts b/src/utils/functions.ts index 59e9f19..452b41e 100644 --- a/src/utils/functions.ts +++ b/src/utils/functions.ts @@ -1,5 +1,3 @@ -import { readFileSync } from 'fs'; - export const stringToKebabCase = (id: string) => id .toLowerCase() @@ -23,9 +21,3 @@ export const camelToKebabCase = (string: T) => T, string >; - -export const readFromFile = (filepath: string): T => { - const readerBuffer = readFileSync(filepath); - - return JSON.parse(readerBuffer.toString()); -}; diff --git a/yarn.lock b/yarn.lock index d9efa48..095a215 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,13 +28,6 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - "@esbuild/android-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" @@ -232,11 +225,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -252,14 +240,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" @@ -691,26 +671,6 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - "@tufjs/canonical-json@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" @@ -918,12 +878,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1, acorn@^8.8.0: +acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -1057,11 +1012,6 @@ are-we-there-yet@^4.0.0: delegates "^1.0.0" readable-stream "^4.1.0" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -1574,11 +1524,6 @@ cosmiconfig@^8.0.0: parse-json "^5.0.0" path-type "^4.0.0" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1682,11 +1627,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diff@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" @@ -3431,11 +3371,6 @@ lru-cache@^9.1.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1" integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A== -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - make-fetch-happen@^10.0.3: version "10.2.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" @@ -5306,25 +5241,6 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - tsconfig-paths@^3.14.1: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" @@ -5519,11 +5435,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -5727,11 +5638,6 @@ yargs@^17.5.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"