no-data
插槽设置没有数据时显示的内容',
+ 'en-US': 'Set what is displayed when there is no data via the no-data
slot'
+ },
+ mode: ['pc'],
+ pcDemo: 'slot-nodata'
}
]
},
diff --git a/examples/sites/demos/apis/config-provider.js b/examples/sites/demos/apis/config-provider.js
index baa95059b..51cea1588 100644
--- a/examples/sites/demos/apis/config-provider.js
+++ b/examples/sites/demos/apis/config-provider.js
@@ -21,7 +21,7 @@ export default {
type: "'ltr' | 'rtl'",
defaultValue: 'ltr',
desc: {
- 'zh-CN': '文字排版方向',
+ 'zh-CN': '文字样式方向',
'en-US': 'Text layout direction'
},
mode: ['pc'],
diff --git a/examples/sites/demos/apis/credit-card-form.js b/examples/sites/demos/apis/credit-card-form.js
deleted file mode 100644
index 49738cd1d..000000000
--- a/examples/sites/demos/apis/credit-card-form.js
+++ /dev/null
@@ -1,98 +0,0 @@
-export default {
- mode: ['pc'],
- apis: [
- {
- name: 'credit-card-form',
- type: 'component',
- props: [
- {
- name: 'background-image',
- type: 'string , object',
- defaultValue: '',
- desc: {
- 'zh-CN': '设置卡片的背景图片;',
- 'en-US': 'Set the background image of the card.'
- },
- mode: ['pc'],
- pcDemo: 'background-image'
- },
- {
- name: 'form-data',
- type: 'object',
- defaultValue:
- "// 该属性的默认值为 \n{cardCvv: '', cardName: '', cardYear: '', cardMonth: '', cardNumber: ''}",
- desc: {
- 'zh-CN': '设置信用卡显示数据',
- 'en-US': 'Setting Credit Card Display Data'
- },
- mode: ['pc'],
- pcDemo: 'basic-usage'
- }
- ],
- events: [
- {
- name: 'input-card-cvv',
- defaultValue: '',
- desc: {
- 'zh-CN': '输入 cvv 时触发的事件',
- 'en-US': 'CVV input event triggered'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-month',
- defaultValue: '',
- desc: {
- 'zh-CN': '选择月时触发的事件',
- 'en-US': 'Event triggered when a month is selected'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-name',
- defaultValue: '',
- desc: {
- 'zh-CN': '输入卡持有者时触发的事件',
- 'en-US': 'Event triggered when a card holder is entered'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-number',
- defaultValue: '',
- desc: {
- 'zh-CN': '输入卡号时触发的事件',
- 'en-US': 'Event triggered when a card number is entered'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'input-card-year',
- defaultValue: '',
- desc: {
- 'zh-CN': '选择年时触发的事件',
- 'en-US': 'Event triggered when the year is selected'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- },
- {
- name: 'submit',
- defaultValue: '',
- desc: {
- 'zh-CN': '提交时触发的事件',
- 'en-US': 'Event triggered upon submission'
- },
- mode: ['pc'],
- pcDemo: 'credit-card-form-events'
- }
- ],
- methods: [],
- slots: []
- }
- ]
-}
diff --git a/examples/sites/demos/apis/detail-page.js b/examples/sites/demos/apis/detail-page.js
deleted file mode 100644
index 61ea42630..000000000
--- a/examples/sites/demos/apis/detail-page.js
+++ /dev/null
@@ -1,126 +0,0 @@
-export default {
- mode: ['pc'],
- apis: [
- {
- name: 'detail-page',
- type: 'component',
- props: [
- {
- name: 'cancel-button',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗取消按钮的文本,默认为 '取消'",
- 'en-US': "Text of the cancel button in the personalized pop-up window, The default value is'Cancel'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'dialog-title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗标题,默认为 '个性化标题'",
- 'en-US': "Personalize pop-up title, default is'Personalized title'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'label-title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗表头文本标题栏字段;默认为 '文本字段'",
- 'en-US': "Personalized pop-up window header text title bar field, The default value is 'Title'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'modelValue / v-model',
- typeAnchorName: 'IDetailPageItem',
- type: 'IDetailPageItem[]',
- defaultValue: '',
- desc: {
- 'zh-CN': '设置表头详情栏的数据',
- 'en-US': 'Set the data in the table header details column'
- },
- mode: ['pc'],
- pcDemo: ''
- },
- {
- name: 'save-button',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗确定按钮的文本,默认为 '确定'",
- 'en-US': "Text of the confirmation button in the personalized pop-up window, The default value is'Confirm'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'text-split',
- type: 'string',
- defaultValue: "'---'",
- desc: {
- 'zh-CN': '详情栏标题分隔符',
- 'en-US': 'Details column title separator'
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'tips',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "提示不能全部隐藏的提示语,默认为 '不能全部隐藏'",
- 'en-US': "Prompt message that cannot be completely hidden, The default value is 'Cannot hide all' "
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "详情栏标, 默认为 '数据'",
- 'en-US': "Details field, default value is' Data '"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- },
- {
- name: 'value-title',
- type: 'string',
- defaultValue: '',
- desc: {
- 'zh-CN': "个性化弹窗表头文本操作栏字段,默认为 '勾选隐藏'",
- 'en-US':
- "Personalized pop-up window header text operation column field, The default value is'Click to hide'"
- },
- mode: ['pc'],
- pcDemo: 'custom-show-text'
- }
- ],
- events: [],
- methods: [],
- slots: []
- }
- ],
- types: [
- {
- name: 'IDetailPageItem',
- type: 'interface',
- code: `interface IDetailPageItem {
- label: string
- value: string
- hidden?: boolean
-}`
- }
- ]
-}
diff --git a/examples/sites/demos/apis/hui.js b/examples/sites/demos/apis/hui.js
new file mode 100644
index 000000000..51672ae79
--- /dev/null
+++ b/examples/sites/demos/apis/hui.js
@@ -0,0 +1,49 @@
+export default {
+ mode: ['pc'],
+ apis: [
+ {
+ name: 'chart',
+ type: 'component',
+ props: [
+ {
+ name: 'options',
+ type: 'object',
+ defaultValue: '--',
+ desc: {
+ 'zh-CN': '图表参数',
+ 'en-US': 'Whether to disable container detection during resize'
+ },
+ mode: ['pc'],
+ pcDemo: 'chart/question#question-base'
+ }
+ ],
+ events: [],
+ methods: [],
+ slots: []
+ }
+ ],
+ types: [
+ {
+ name: 'options',
+ type: 'interface',
+ code: `
+interface options {
+ theme: string // 主题
+ color: array | string // 颜色
+ padding: array // 图表内边距值
+ tipHtml: function // 悬浮提示框内容配置
+ event: object // 图表事件
+ data: array // 图表数据
+ name: string // 图表名称(必填)
+ unit: string // 进度图右侧文本单位
+ barWidth: number // 进度图柱形宽度
+ minWidth: string // 进度图单项数据的最小宽度
+ calibrationValue: number // 进度图标定值
+ label: object // 堆叠进度图图表图元文本样式
+ state: object // 根据状态设置颜色
+ title: object // 进度图图表标题样式
+ text: object // 进度图图表右侧文本样式
+}`
+ }
+ ]
+}
diff --git a/examples/sites/demos/apis/image.js b/examples/sites/demos/apis/image.js
index eb8b943fe..c0881c565 100644
--- a/examples/sites/demos/apis/image.js
+++ b/examples/sites/demos/apis/image.js
@@ -19,7 +19,7 @@ export default {
},
{
name: 'image-size',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '设置预览的图片的大小',
@@ -54,7 +54,7 @@ export default {
},
{
name: 'preview-visible',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '开启移动端预览大图的功能',
@@ -65,7 +65,7 @@ export default {
},
{
name: 'round',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '通过 round 设置是否展示圆形',
@@ -90,7 +90,7 @@ export default {
},
{
name: 'show-hover',
- type: 'String',
+ type: 'string',
defaultValue: '',
desc: {
'zh-CN': '设置预览的图片的悬浮效果',
@@ -101,14 +101,15 @@ export default {
},
{
name: 'show-index',
- type: 'String',
+ type: 'boolean',
defaultValue: '',
desc: {
'zh-CN': '开启图片序列号展示',
'en-US': 'Enable the display of image serial numbers.'
},
- mode: ['mobile-first'],
- mfDemo: 'preview-src-list'
+ mode: ['pc', 'mobile-first'],
+ mfDemo: 'preview-src-list',
+ pcDemo: 'preview'
},
{
name: 'src',
@@ -133,6 +134,18 @@ export default {
mode: ['pc', 'mobile-first'],
pcDemo: '',
mfDemo: ''
+ },
+ {
+ name: 'keep-style',
+ type: 'boolean',
+ defaultValue: '',
+ desc: {
+ 'zh-CN': '保持图片样式属性',
+ 'en-US': 'Preserve Picture Style Properties'
+ },
+ mode: ['pc', 'mobile-first'],
+ pcDemo: 'keep-style',
+ mfDemo: ''
}
],
events: [
@@ -197,6 +210,18 @@ export default {
mode: ['pc', 'mobile-first'],
pcDemo: 'slot',
mfDemo: ''
+ },
+ {
+ name: 'count',
+ type: '',
+ defaultValue: '',
+ desc: {
+ 'zh-CN': '设置图片计数插槽',
+ 'en-US': 'Set Picture Count Slot'
+ },
+ mode: ['pc', 'mobile-first'],
+ pcDemo: 'count-slot',
+ mfDemo: ''
}
]
}
diff --git a/examples/sites/demos/apis/mind-map.js b/examples/sites/demos/apis/mind-map.js
index 48edd6603..0f973574e 100644
--- a/examples/sites/demos/apis/mind-map.js
+++ b/examples/sites/demos/apis/mind-map.js
@@ -7,24 +7,26 @@ export default {
props: [
{
name: 'modelValue',
- type: 'NodeObj',
+ type: 'Object',
defaultValue: '{}',
desc: {
'zh-CN': '默认节点数据',
'en-US': 'Default node data'
},
mode: ['pc'],
- pcDemo: 'basic-usage'
+ pcDemo: 'export-data'
},
{
name: 'options',
- type: 'Options',
+ typeAnchorName: 'IMindMaoOptions',
+ type: 'IMindMaoOptions',
defaultValue: '{contextMenu: false,toolBar: false,nodeMenu: false}',
desc: {
'zh-CN': '配置项',
'en-US': 'options'
},
- mode: ['pc']
+ mode: ['pc'],
+ pcDemo: 'export-data'
}
],
events: [
@@ -57,7 +59,8 @@ export default {
},
{
name: 'expandNode',
- type: 'onExpandNode',
+ typeAnchorName: 'IMindExpandNode',
+ type: 'IMindnExpandNode',
desc: {
'zh-CN': '展开节点时会触发该事件',
'en-US': 'This event will be triggered when expanding a node'
@@ -66,7 +69,8 @@ export default {
},
{
name: 'operation',
- type: 'onOperation',
+ typeAnchorName: 'IMindMapOperation',
+ type: 'IMindMapOperation',
desc: {
'zh-CN': '节点重新计算时, 例如将节点A拖拽到节点B, 使得节点A是节点B的子节点',
'en-US':
@@ -76,7 +80,8 @@ export default {
},
{
name: 'selectNewNode',
- type: 'onSelectNewNode',
+ typeAnchorName: 'IMindMapSelectNewNode',
+ type: 'IMindMapSelectNewNode',
desc: {
'zh-CN': '创建新节点时',
'en-US': 'when create new node'
@@ -85,7 +90,8 @@ export default {
},
{
name: 'selectNode',
- type: 'onSelectNode',
+ typeAnchorName: 'IMindMapSelectNode',
+ type: 'IMindMapSelectNode',
desc: {
'zh-CN': '选择任意一个节点时, 会触发该事件',
'en-US': 'When selecting any node, this event will be triggered'
@@ -94,7 +100,8 @@ export default {
},
{
name: 'selectNodes',
- type: 'onSelectNodes',
+ typeAnchorName: 'IMindMapSelectNodes',
+ type: 'IMindMapSelectNodes',
desc: {
'zh-CN': '选择多个节点的时候会触发该事件',
'en-US': 'When selecting multiple nodes, this event will be triggered'
@@ -103,7 +110,8 @@ export default {
},
{
name: 'unselectNode',
- type: 'onUnselectNode',
+ typeAnchorName: 'IMindMapUnselectNode',
+ type: 'IMindMapUnselectNode',
desc: {
'zh-CN': '取消选择的时候会触发该事件',
'en-US': 'When deselecting, this event will be triggered'
@@ -112,7 +120,8 @@ export default {
},
{
name: 'unselectNodes',
- type: 'onUnselectNode',
+ typeAnchorName: 'IMindMapUnselectNodes',
+ type: 'IMindMapUnselectNodes',
desc: {
'zh-CN': '取消选择多个节点时会触发该事件',
'en-US': 'This event will be triggered when multiple nodes are unselected'
@@ -126,10 +135,10 @@ export default {
],
types: [
{
- name: 'Options',
+ name: 'IMindMaoOptions',
type: 'interface',
code: `
-interface Options {
+interface options {
direction?: number
locale?: string
draggable?: boolean
@@ -152,53 +161,39 @@ interface Options {
`
},
{
- name: 'onOperation',
+ name: 'IMindMapOperation',
type: 'type',
- code: `
-type onOperation = ({render, info}: {render:MindElixirInstance, info: Operation}) => void
-`
+ code: `type onOperation = ({render, info}: {render:MindElixirInstance, info: Operation}) => void`
},
{
- name: 'onSelectNode',
+ name: 'IMindMapSelectNode',
type: 'type',
- code: `
-type onSelectNode = ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}, e?: MouseEvent) => void
-`
+ code: `type onSelectNode = ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}, e?: MouseEvent) => void`
},
{
- name: 'onSelectNewNode',
+ name: 'IMindMapSelectNewNode',
type: 'type',
- code: `
-type selectNewNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void
-`
+ code: `type selectNewNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void`
},
{
- name: 'onSelectNodes',
+ name: 'IMindMapSelectNodes',
type: 'type',
- code: `
-type selectNodes: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj[]}) => void
-`
+ code: `type selectNodes: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj[]}) => void`
},
{
- name: 'onUnselectNode',
+ name: 'IMindMapUnselectNode',
type: 'type',
- code: `
-type unselectNodes: ({render}: {render: MindElixirInstance}) => void
-`
+ code: `type unselectNodes: ({render}: {render: MindElixirInstance}) => void`
},
{
- name: 'onUnselectNodes',
+ name: 'IMindMapUnselectNodes',
type: 'type',
- code: `
-type unselectNodes: ({render}: {render: MindElixirInstance}) => void
-`
+ code: `type unselectNodes: ({render}: {render: MindElixirInstance}) => void`
},
{
- name: 'onExpandNode',
+ name: 'IMindExpandNode',
type: 'type',
- code: `
-type expandNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void
-`
+ code: `type expandNode: ({render,nodeObj}: {render:MindElixirInstance,nodeObj:NodeObj}) => void`
},
{
name: 'NodeObj',
diff --git a/examples/sites/demos/apis/numeric.js b/examples/sites/demos/apis/numeric.js
index 50d844549..06f7a134d 100644
--- a/examples/sites/demos/apis/numeric.js
+++ b/examples/sites/demos/apis/numeric.js
@@ -17,6 +17,18 @@ export default {
pcDemo: 'allow-empty',
mfDemo: ''
},
+ {
+ name: 'empty-value',
+ type: 'any',
+ defaultValue: 'undefined',
+ desc: {
+ 'zh-CN': '设置计数器在可清空下,清空后组件的绑定值',
+ 'en-US': 'Sets the bound value of the cleared component when the counter can be cleared.'
+ },
+ mode: ['pc', 'mobile-first'],
+ pcDemo: 'empty-value',
+ mfDemo: 'empty-value'
+ },
{
name: 'blank',
type: 'string',
diff --git a/examples/sites/demos/apis/popeditor.js b/examples/sites/demos/apis/popeditor.js
index b8b931343..0f5a9a72a 100644
--- a/examples/sites/demos/apis/popeditor.js
+++ b/examples/sites/demos/apis/popeditor.js
@@ -229,7 +229,7 @@ export default {
'en-US': ''
},
mode: ['pc'],
- pcDemo: 'selected-box-op'
+ pcDemo: 'selected-box'
},
{
name: 'show-clear-btn',
diff --git a/examples/sites/demos/apis/roles.js b/examples/sites/demos/apis/roles.js
index a80859471..ef3b96f18 100644
--- a/examples/sites/demos/apis/roles.js
+++ b/examples/sites/demos/apis/roles.js
@@ -16,6 +16,19 @@ export default {
},
mode: ['pc'],
pcDemo: 'fetch-role'
+ },
+ {
+ name: 'popper-append-to-body',
+ type: 'boolean',
+ defaultValue: 'true',
+ desc: {
+ 'zh-CN':
+ '是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false (可参考 select 组件)',
+ 'en-US':
+ 'Indicates whether to insert the pop-up box to the body element. If a fault occurs in locating the fault in the dialog box that is displayed, you can set this attribute to false (for details, see the select component).'
+ },
+ mode: ['pc'],
+ pcDemo: 'base'
}
],
events: [
diff --git a/examples/sites/demos/apis/select.js b/examples/sites/demos/apis/select.js
index 74eb99912..40ae04a1e 100644
--- a/examples/sites/demos/apis/select.js
+++ b/examples/sites/demos/apis/select.js
@@ -81,6 +81,15 @@ export default {
pcDemo: 'clearable',
mfDemo: 'clearable'
},
+ {
+ name: 'click-expend',
+ type: 'boolean',
+ defaultValue: 'false',
+ desc: {
+ 'zh-CN': '点击可展开或收起显示不全的选项。仅用于多选',
+ 'en-US': 'Click to expand or collapse options. Only applicable to multiple selections'
+ }
+ },
{
name: 'collapse-tags',
type: 'boolean',
@@ -240,6 +249,18 @@ export default {
pcDemo: 'remote-method',
mfDemo: 'remote-method'
},
+ {
+ name: 'max-visible-rows',
+ type: 'number',
+ defaultValue: '1',
+ desc: {
+ 'zh-CN': '多行默认最大显示行数,超出后选项自动隐藏',
+ 'en-US':
+ 'Default maximum display lines for multiple lines, with automatic hiding option for exceeding lines'
+ },
+ mode: ['pc'],
+ pcDemo: 'collapse-tags'
+ },
{
name: 'modelValue / v-model',
type: 'string | number | Arrayempty-value
属性设置计数器在可清空下,清空后组件的绑定值。默认为 undefined
。示例中将清空后组件绑定值改为null
',
+ 'en-US':
+ 'You can use the empty-value
attribute to set the binding value of the cleared component when the counter can be cleared. The default value is undefined
. In the example, the component binding value is changed to null
.'
+ },
+ codeFiles: ['empty-value.vue']
+ },
{
demoId: 'about-step',
name: {
diff --git a/examples/sites/demos/mobile/app/alert/basic-usage.spec.ts b/examples/sites/demos/mobile/app/alert/basic-usage.spec.ts
new file mode 100644
index 000000000..ac7d4d550
--- /dev/null
+++ b/examples/sites/demos/mobile/app/alert/basic-usage.spec.ts
@@ -0,0 +1,36 @@
+import { test, expect } from '@playwright/test'
+
+test('基本用法', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#base')
+
+ const alerts = page.locator('.demo-alert-base .tiny-mobile-alert')
+
+ // 背景色与图标色验证
+ await expect(alerts.first()).toHaveCSS('background-color', 'rgb(222, 236, 255)')
+ await expect(alerts.first().locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(20, 118, 255)')
+ await expect(alerts.nth(1)).toHaveCSS('background-color', 'rgb(252, 227, 225)')
+ await expect(alerts.nth(1).locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(242, 48, 48)')
+ await expect(alerts.nth(2)).toHaveCSS('background-color', 'rgb(230, 242, 213)')
+ await expect(alerts.nth(2).locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(92, 179, 0)')
+ await expect(alerts.nth(3)).toHaveCSS('background-color', 'rgb(255, 235, 209)')
+ await expect(alerts.nth(3).locator('.tiny-mobile-alert__icon').first()).toHaveCSS('fill', 'rgb(255, 136, 0)')
+
+ // 警告可见
+ const alertSuccess = page.locator('.tiny-mobile-alert--success')
+ await expect(alertSuccess).toBeVisible()
+
+ // 状态图标存在
+ const icon = alertSuccess.locator('.tiny-mobile-alert__icon').first()
+ await expect(icon).toBeVisible()
+
+ // 提示内容存在
+ const content = alertSuccess.locator('.tiny-mobile-alert__content')
+ await expect(content).toBeVisible()
+
+ // 点击关闭按钮,警告消失
+ const close = alertSuccess.locator('.tiny-mobile-alert__close')
+ await expect(close).toBeVisible()
+ await close.click()
+ await expect(alertSuccess).toBeHidden()
+})
diff --git a/examples/sites/demos/mobile/app/alert/center.spec.ts b/examples/sites/demos/mobile/app/alert/center.spec.ts
new file mode 100644
index 000000000..720a6a6c5
--- /dev/null
+++ b/examples/sites/demos/mobile/app/alert/center.spec.ts
@@ -0,0 +1,11 @@
+import { test, expect } from '@playwright/test'
+
+test('指定挂载节点', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#target')
+
+ const target = page.locator('.alert-wrap')
+ const alert = target.locator('> .tiny-mobile-alert')
+
+ await expect(alert).toBeVisible()
+})
diff --git a/examples/sites/demos/mobile/app/alert/custom-close.spec.ts b/examples/sites/demos/mobile/app/alert/custom-close.spec.ts
new file mode 100644
index 000000000..5d9f12b12
--- /dev/null
+++ b/examples/sites/demos/mobile/app/alert/custom-close.spec.ts
@@ -0,0 +1,45 @@
+import { test, expect } from '@playwright/test'
+
+test.describe('自定义关闭', async (page) => {
+ test('隐藏关闭图标', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alerts = page.locator('.tiny-mobile-alert')
+ const closeIcon = alerts.first().locator('.tiny-mobile-alert__close')
+
+ await expect(closeIcon).not.toBeVisible()
+ })
+
+ test('自动关闭', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alerts = page.locator('.tiny-mobile-alert')
+ await page.locator('#custom-close span').first().click()
+ await expect(alerts.filter({ hasText: '2秒后将自动关闭' })).toBeVisible()
+ await page.waitForTimeout(2000)
+ await expect(alerts.filter({ hasText: '2秒后将自动关闭' })).not.toBeVisible()
+ })
+
+ test('自定义关闭按钮文本', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alert = page.locator('.tiny-mobile-alert').nth(2)
+ const closeIcon = alert.locator('.tiny-mobile-alert__close')
+
+ await expect(closeIcon).not.toBeVisible()
+ await expect(alert.locator('span').filter({ hasText: '自定义关闭' })).toBeVisible()
+ })
+
+ test('关闭close事件', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('alert#custom-close')
+
+ const alert = page.locator('.tiny-mobile-alert').nth(3)
+ const toast = page.locator('.tiny-mobile-toast').filter({ hasText: 'close事件!' })
+ await alert.locator('.tiny-mobile-alert__close').click()
+ await expect(toast).toBeVisible()
+ })
+})
diff --git a/examples/sites/demos/mobile/app/alert/custom-close.vue b/examples/sites/demos/mobile/app/alert/custom-close.vue
index f8fe84042..70fb23243 100644
--- a/examples/sites/demos/mobile/app/alert/custom-close.vue
+++ b/examples/sites/demos/mobile/app/alert/custom-close.vue
@@ -19,7 +19,7 @@
diff --git a/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts b/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts
index d90023105..6496b8764 100644
--- a/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts
+++ b/examples/sites/demos/pc/app/calendar-view/calendar-event.spec.ts
@@ -9,6 +9,8 @@ test('事件', async ({ page }) => {
const month6 = page.getByText('六月')
const leftSvg = page.locator('.header-left > .tiny-svg')
const rightSvg = page.locator('.header-right > .tiny-svg')
+ const mode = page.locator('label').nth(2)
+ const modalVal = page.getByText('模式切换事件: timeline')
await timeBtn.click()
await page.waitForTimeout(100)
await leftYear.click()
@@ -22,4 +24,7 @@ test('事件', async ({ page }) => {
await rightSvg.click()
await page.waitForTimeout(100)
await expect(timeInput).toHaveText('2022 年 06 月')
+ await mode.click()
+ await page.waitForTimeout(100)
+ await expect(modalVal).toBeVisible()
})
diff --git a/examples/sites/demos/pc/app/calendar-view/calendar-event.vue b/examples/sites/demos/pc/app/calendar-view/calendar-event.vue
index c8a72f54d..fab264e98 100644
--- a/examples/sites/demos/pc/app/calendar-view/calendar-event.vue
+++ b/examples/sites/demos/pc/app/calendar-view/calendar-event.vue
@@ -8,12 +8,13 @@
@week-change="weekChange"
@year-change="yearChange"
@month-change="monthChange"
+ @mode-change="modeChange"
>
+
+
diff --git a/examples/sites/demos/pc/app/cascader/slot.spec.ts b/examples/sites/demos/pc/app/cascader/slot.spec.ts
new file mode 100644
index 000000000..2494c68be
--- /dev/null
+++ b/examples/sites/demos/pc/app/cascader/slot.spec.ts
@@ -0,0 +1,16 @@
+import { test, expect } from '@playwright/test'
+
+test('基本用法', async ({ page }) => {
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
+ await page.goto('cascader#slot')
+
+ // 自定义节点
+ await page.getByRole('textbox', { name: '请选择' }).nth(0).click()
+ await expect(page.getByText('指南', { exact: true })).toHaveAttribute('title', '指南')
+ await page.waitForTimeout(100)
+
+ // 无数据
+ await page.getByRole('textbox', { name: '请选择' }).nth(1).click()
+ const cascader = page.locator('.tiny-cascader-menu__no-data')
+ await expect(cascader).toHaveText('no-data')
+})
diff --git a/examples/sites/demos/pc/app/cascader/slot.vue b/examples/sites/demos/pc/app/cascader/slot.vue
new file mode 100644
index 000000000..1fc4b1d62
--- /dev/null
+++ b/examples/sites/demos/pc/app/cascader/slot.vue
@@ -0,0 +1,234 @@
+
+ \n Cascader cascade selector events include: change
, expand-change
, blur
, focus
, < code>visible-change. \n Use props.emitPath
to set the return type of the node.\n
default
插槽,自定义级联节点。no-data
插槽设置没有数据时显示的内容。
+ `,
+ 'en-US': `
+ Use the default
slot to customize the cascaded node.no-data
slot sets what is displayed when there is no data.
+ `
+ },
+ codeFiles: ['slot.vue']
}
]
}
diff --git a/examples/sites/demos/pc/app/chart/amap/amap.spec.ts b/examples/sites/demos/pc/app/chart/amap/amap.spec.ts
new file mode 100644
index 000000000..3e956a1bc
--- /dev/null
+++ b/examples/sites/demos/pc/app/chart/amap/amap.spec.ts
@@ -0,0 +1,6 @@
+import { test } from '@playwright/test'
+
+test('base', async ({ page }) => {
+ await page.goto('chart-autonavi-map')
+ const chart = page.locator('#amap-base .amap-layers')
+})
diff --git a/examples/sites/demos/pc/app/chart/amap/amap.spec.ts-snapshots/base-chromium-win32.png b/examples/sites/demos/pc/app/chart/amap/amap.spec.ts-snapshots/base-chromium-win32.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fa57b3da95e5ae564f8305f7ca0512633d97318
GIT binary patch
literal 174152
zcmXtgWl$V#*EDVcvS^Ut9w4|oEbeZ>-Q6v?JHg#GI0O&w?jGFT{hRyw>iw~^Q?paM
zHJ6;zr@POFE69nXAmJfFKtP~KN`RFhAfWmnARyxr;D9TJ??qa`8>EwxxG==;iLXZx
z5X2CYU?COv%+n4x@2`6;?{8UkvM%a%g}&3ZAQ33aAWY7;hJGmcx+qO|6Y_J>vy~S({^KnYDDAFBG z`3;N}Z7qErb{v6%2XGnc4yRooUwsbSl}Ng*GEN!;p;a$TKo?(qNPy&%=n$dv{j5FR zn1zpixZ@L`HH)c;uPI;?^}jd~*a?BemA9E9|M_6{l-F}OXus?Cv;O$FsJaLxcb%>B zzJF3GJ_us+7v4R7PZKP~9v=$JdIE)upIDynS;Ql8dT`vo*&3FU`QkO)dLai*86&m| zRxX^wr4+2qMxl$ZC9Y-?)>5&!Od?W2MRkH22yFBuuu|lqrrX2m^gqnfHW+(;F;HO2 z4c&MiJbQ>$9ycXPElC(Ca1uM%U~>__uJ9g8)MF#-d)d6KzgDAgcFP$?C!~Rj2dbGE zPD|v$+0HVXHQ)|Ne(l5gbU%%T>_L1v+P;DSsZcUpd0KXf6(*asHQr+61$}G_jAf|7 zSTI3jq|9ytZOB!DnH%=bz7P#>xi+aC^bQr;Qc=eUp zpwg@7R0e!fH&f18E* %4!e>uxFACQvU#Sh(-As%q*^%ism2}0{QisDAPwS2#NBiwuKDcKjA z>bXCkq*DGOgXc$&YrW^DEJkZS`&}5tdO?E+Zc^0WOM=E^^SCP6_R<2-seJ5;sVZ(6 z0e;`FK1-AWNS@XGtP5an9hH0P?m zxX(w{f{iJM zusWZ8dHqQ9jCgi6_!(f(@V8$z=hX(HDiX|V9}r}c^ryATm;R-NnS-5G#_oS}O+}*G zAn-%UN1N!77j5iY$xSM!Y^+9(pbmn&JqidE9&DJ9#8_Q4QMdEose|h`G$ySwRhzS1 zX93Hnx d4OFQOXt z%g#SlvYa7Ki=m%~?(oSYxT8<9zicccZY)Di_C|7}`8R~yj0{x}o`SqmQnEQPFt9kZ z1ewevGm9xelcK0e*GO=fa|ab7Pf*>d(OD6!lH#LC@(?j{>#U}bu1HsXS|8eLLy!I* zLqNU^Pn#wtob1n(7e(Was)a{61|lMgYTo+5aXZ9=7iPYwt3;nw!~h+Kz>lA`m&?O? zV?vdn>j{g{${PJWL2HHX7*~VB=_bwQCOuK7LRTh7`p2tZ^RSS5gu+)qSP@kJ }#rv-PXrjEX6L~kO>v0XTnU3^1AGHe-dGI|^iMU9M!ZW5s zPgq}L;XH!dV%F#d YMULzXe&O5efG!PF!xTdk$zgNT)4qCj0n&3`2Z zq0b)OY{tg~=#EN&ZB>cXrg=gdpyZ9`(nmP*9Im;3nO*bzQjPPInuW`_wx*JA1I^FE zrGYCIj%@PPtF2_)JR&=GMu;Xa9$?y{n6cbneS?_*3Nb5pdAV~p-`LiPOk>4PrRG3~ zhY0o3T^+s@(u7U7B{W$w7gQcAH6DZlgn0pzVOz*T!~`^e3NPKx@y$R+N-+@8!BTOY z8mI;P*KByI_s6g8$=LDUO~*?t& M<-UykFD#-SGIuwtp~IzEtyRdIhpY R z4Y`RaD^&bnFF>AeN54Wfd7^1_>!Ueahh5yY#hG?wg*AHlOf->#IR|u=nn#EOVQf z`k|020~3OdyhqclomV9R+$2)}wXwYVgz?M)mldc}zgg}h#fuO62y07!`w1HlCFz;_ z)J`~lw=umqFMWX<&2}EO%|91pB|ExEG9-be>XcSDUp4WF-pvRbA~t!kz&~=DW@lmG z?5W2BXT*|~={>f4?R5YQqEFwdW>0eLMnqwW7%Rgk5+#|0RI2Jo(t6 af`5VQaY#UbV}w@Y~_ za@SSsl5Tz 4wT>wuddU80xMWS;ez~iNw=n#w%-hI7Kq`a KKnc^}JoH25R0`j2@kY!son?mnDk_jcZIUv`|M#xXF8{*P#cm zgjgS(&Bb~1>F{M=-QS&8elQCm?l%J3J&*IfXczR8G|u+qZ8EVyCEJqfIZHDbW6v#q zskmX>Kx(`ajY-sq$?Ezdiqs Po^@l%FA$C@ PF3ECp6qxg4bl|+TBu$p>Bkb;5wAnqMTlP4MB)>B}nhCw@*E40p~!$ zUgQWXwUJyz$BUFnBm^~_DC$35%uSx-e5R-9`YB+w|LgwaXs#roZy% zbrg&V5Wa;a47KN_*{(-E|3;Zzkw!3J3WNb0$E)KVQl*v!c0M^({f5i_nH{`!TK>cS z5)deRVUn?hSLw8Oom@qz+MJ{SpTg(|?#yO3Pb0}rd3f*p>n|{KDrH#bQS#J&y&&x@ z`Eq#_gQUr(m9R}xS2S(}bM;~S>m2@q)pDtem1R-v2@w(9<8D*3j5lv*2d`W%OHL&v z{`gqULz93={%;7IaiYSx3Hw+hWhQ*BFzHZGK0&g{{KR&9YGH*kquf)wdLa~eseESy z&pLw;c|Q*IEgah-wv~y)EhpsPxk!SC?oIdAhLP=B14IvXd?H@ezP;;B&!CVU2lhRy zcz}vYX0vq{`E-vEB)sv%Aw7qHq5m3{`V%+H!N#uTuo)aBJe$rhCDFjRTk1g+MKO#6 zxJu6$UB&$Hvb*`l#B5*TnLK%eIUO~Dcb+8ACecvss~~u+vZD`(z?L@#0KB;NH}6u2 zOV#__e0ZHsGi;ChsIvv8%I(SQYoN0{?J}Im(;FZ1%wO@Ju+eB*m<~7;t!ay nfR|z0ue6qd4lBrd@b#-!fber1!!s^stxFJ|7 zB*h9|A_^;tAhBV6a7-=0K6M0^p29=(Awu%Uq4u2?wuLkwz)LI2mDj(ucl>QYZyR80 zH({j<{_65n2h e>-7R%gGNc5?`(bvbbriU zB zH`&{?>Ng_<^}K){w#i~%+4SYtU>+ev;zI4)K0InybC6kHQSdYqGWk($1-o@OWf^aa zP(~h%^RSd7k4P7Xc@+CXpHWwE2L^_OFY#6{3%#w`$yBaa9^MgHFe+)BuPnE%XU<>4 zIJ&z{*K;B6tPBAzamjH9F{JLwt&O)rbMO42wX(W>JeZ}K!US3<*n~}tF A8K>J-qKW%?ii#Q9Zbk$v6qmS3GjK+XRbtF=MG*CxW*1 zTF++I_4@`(#nG-Od>LgQMBI8E%GOFZfDJxZZ|Dpl2Zky~qCdj(3K%A`l|!a7kd3W@ zUT~m{X0zGI@_+|^FGw-DVNT*J0xrDH5N0PCj8X$P!pP%0bx~$@W&7-P+6Jq6UNFV# zquHFf$#`)9zAT%BCA8KPCCd2+RusM*n&;Z!Uy)a`>|GK=Hl0s@I0-ATO{p|Vs0S#Z zmx!|6!I+ft=U6h^(TylAdlc}{J1z|7wZ3r(muuU)gid3~iu~{;4e>&UfxUFf4Yk twcJ%`QX91YPRsuTzXoiOw1YMOfVI9})SzW8*-L~%qf$sgi)&3ny zIcSTM +tk4`hD37}ZtWybK>eg@1g@q0~Ob|L}4bUwGLW)$Z!MU?A}!7>nk z!}gb?7Pe0)lv1vZQuK1uQn0$RBUO`BV~4%v-wquA@-ju;mVs#Y8Z>b#ET^4xjVO!e zGx5I>*q-#(C(~{ Bq`Ik6su(mk3+Df z>5L;7tK(Z*d=*t=E|%ai=4?pP5p6dR{P56Kf13)+2wENXg$?iq8X?}k)v0cM?7%63 zs>_J2KW0nuOdn~tRMcH~#A0eZ1{R?lM_mv0x4dICi7K>7GQDL+x%slA*lSi6$jRlt zN9&o06LijEC0=;Yc4Z87$M+0Eb`J|FC4ft;fOWcgo_|Jyla#fA$OC!QYStURnGYQ@ zV=E4xU;B21{^J#(O3oslw_9RW7n3&Wm9%56Q7ocHTlk@PT9TFcgv*X1oZ751u9|&d zB6@v^9d+DAI HZSu!epIWQ0(}UU75@&NG(*!W4bl_*m{7>a(uG(4b*W~Ql-VRE0pte6Q4&=ck zQ2v>pvj9;jeo+r5S@ezn#(k|wKVs|`>d>T|){jnkKA%FPq|; zo)Y=y@-U~{wiB<|$y#|VRNmSo5_4>>8ZG9>k__NPOrs#n^4q(;l|O z@PCW&eGg|gSYz2Cj#*&F5pp8VPwci#x%lJb-&|&V>9e~LC|frFOSJ_$x3VRdtcu-G z_~`V;bAo>~Iy5SEe}ZzuqYo^|NTp`GS&nXsIHw*MS0og6=55?aX^QBX2Bz|D7i$H9 zZ(lX(vefO>e}w@A)THqhn9xKKqBO7bCUc%hTz{p_s8?ww0|!pdw$@M6$NQOurOQW1 zK4<&+THgcG%~hPFUh7H7UIdhE2)8Y;KqTmXCvD^U9%d1o2q!TPjFks?5GlYZTcB#+ z`?K=~mp?KPeGgA-g5&N@d89~t*Ys~RPW+>-wA$Yvkp;Jo!ge9%4uAkjHdD*6{_FtR zvRYvL%)Zv296psn_+ZfXWH dW5F62sZ?CO;3iriV4p3&c z>d_7m#&kxv^#5ZOI*eF{bSG|)6#rYpPk#Y0VUQ^iNmu@2GZK1MM6i2b{!Drer4Z&G z`Eega9o)xr)5M6^0CuZIOB}NJ>n&78&NZ06^j?>Lyc$=Z_;wl%9(4rQXx~Q3+s#?x zybdEeY}lJe$5D*wh-ZSna*0z=!a?4qh3|ESsC@sB#Vc~94Qxyv0^;*-R{Z}ll&63n z=f1IWtdp@pTyaXE9U`A|>5MTf?j2c;VG(scO2}!}4Q6Y{(0N|Qv$2JZr Ba9poqu1%J*9suoMP2b%^hIp?2Zw?eXkC~ZG zQ2?rqI$<|Faw5~ AqYOry9#U*aU}fPx6seD2-zNXhCGFTQyX*=i;AgTqMQI z^D`n#ZAz0rtC&VMN2JK{*?n#!OxVosrUV09j3bh Ek-^LJ1O gs*K9yc&~4(01kk{%bBvd=JXL-~$f?0ynJp +p2_393P)i)S$lpHQAhJy`7KA&NYLd4U26)b+ zB*WNa!xu@4kk5;ctGdHQRO8$H;a-UPtGeQI?=3IPEy1WcHXosVa7k7INaI53 SFS1;XKqYEOqg3nq}NV6>wnxaourxWL}xaR^&Z-i~a*bg;T0#kq~N6~C$r2luak z89W7f<;Kmj|9KWenqW&+oX8-4%B7i{gh3augM~<*tsTjFAMkeOviJLfmXm5G=W`Ss zn@i5>4HO$1>4nWKP5@)|Py;xT$QetQi?glO*j9hBBy(!J9n~{5r#8I7cuGfTvMn^u z+TXKcd9v9(fYaLJ%bF&mc 58os{T(540%Vajp-V{r zv= uhWS+P-)W=YLgokV>zm@4DkpXhyRIIS%cEG_#cV*Gk{$o~%9 zA2E?9;igY56Z~Mcke!EE9oJ&L`Fa-ji-&RKbLY&yfBkihgRCFBc%D*e)tFG(KN1H@ zFXRC%u3207y$cCV@LjonB2NxW#rLFe>F43TYdreDzX0Mv%GqU1l8HE_wKS~?J9cRp z7dp%}dRDvS9!`Xu!vZzO4!bn*3x{}7pz fEn2aQ&E(;*#6Z0+;}JAy^KT_o4W!>uXW{u+(EdUYvEsFm^$+{S@ds5ZuQTqs z*_HIwmaMi3h5SP%Yayz&o&LtTnp;ynVr0ACs*#Dq_B{5gHAL9A`@^8;a=l8~ n542F;UyYLgP_x&11}&d^M&YBS>JgqzuPFiwms z`7fj5%Vktln?W54z`4&BMzVISCMB& b4=m2 z;cHRoiE~yxd-zBlD4gDuu}~;7xUcYEKWyXW7?ui(muEEkbLl{`K!=#URa3@@cX#Qi z`pPGe`{Ow$;8*bBIi;BRLOd1*qSg__x~XvCEf~rGi4Vz%TKNT%z504^EH|vj7ys=1 zL{t{^+af|8dkvt>P{W9%h-9Ebq&$D2iN9!15u=%hEx>^vCLjKZY#<4^Q33jApgH>Z z9Z&mw0&t^1HKKw4OCbl^P!`>hQt3gZU;k8l#T{R8BHqRWTA1JajkjL|L5kD!t%n(> zl*sHL1{x)tW~$bS$lP%kQ0!NCFaf_Z$-do~pgg5`RO-rv{~p$?swQXy5Yepx?fk`c zu7*h?qr*{26Vg^kFkkLO6r1t&?RT?@)V{f323@j_T?~0XsO@oP|Kxca%{>Z46@5`N zdhgzdMgVLB$Y8ojYQO4`x4gjJ9*op7O4er;p${G~lWYjKuIvGBZG^^e-X;si1@td~ zs|cue|Ji$zH5 +l#S!#Bil&mUdX-j%hmktFf0HWwSytjWI(tYszWAz%b@7>>5 z)(}hhPO62u5ULf8)+?m33&JH8b~4L}nR}UW9OWD9AF+E6q~5{`k6-?Q6@Y;RhyV_{ z8O5>Ne@@y>q(`JKq==3)H@0a7p#1?wMF&`hib*6c5~zRJPXyZoFw6v~hzubbl6x(2 z^P7}LsF1HY5X{}TmP};`H@3NGm23b~8B)w+VIk5Hb8dID>mI&xLoL-$z83^La2n`W zPA((0A2gE^5Zt0xA713*v~Bz>*vZd-qDu-&B^!X~*;CU`EdnK5;E(UOl`m*gao!Id z@~raas(WR7c`wWvr1dO9(=f(Gzrbxj4Jg<_b&T)Xt$uw$zN}B4c`Zkhv@Em*_Y$8{ zb>DA{IA}!Y9?3h3(}+HVB@rzL7za%ZdKI2kqVH&~r|FrnJq^(Lm#d|5f|z4Bg*AQ1 zfVRVgFGo{A`E6YzUR%Q+=sO$HoyD&C1htTN)vQoVOS59cj4MN3Bvyg9)t9zw?CAaa zOS4k2HI}uZGxRzHMae8p35bl9S3pnxq~eE!oIi4GeNWa`6~9JvM|SXRC_h)?eMXhK zz@KN#d^s76h#IuW1l_Gt# 19-OHxsGf<<;8*%IW2zmtEnZzu3rA<1|2MzI3V(-$%pVeVQ_+5oqg^sGII!F_JCTj5;+_Ad{z;vNN_cna(87rOo+ zDK^yyoXS-C(9$>)KLbpcX#}3F>L#~#Q-|77KPSv~JXQr!n&@kH6ss#jWRE*Ta5r5t zv4!-5!VY~$;|5VAAtqpu$Tz!_Dnq?7&Y!Ed(lfOC(LP!3yKO<^Q)|rN;<=zX?xQQY zd{>?tf*)+)h8)^}zmi)x{l`b_il(v(raP_gD;j}AwzRh=|7-((A5XDDl^qik?(B?w z8_{IdjMs;=Mwus~k^^?cr5?mUOhZ8 JCPa2Rox^zmipR4J^L}}I}i>b94#6J9Cr1WnujStPSGmeD5F5gMt~f* zoW{Q(rH)9Y1Z+(W)i6gbs|%tk+E9xL8ZcdpopJufa7X{4OuC{Ic-zq}tu)Tu7RtPc z%(lV`VCt^g`9n$91C`O0i)tOcAH4p0Mj$Bna*=kQ1p0^>xBb^QX2P8^jNj>VBeWbK z_{iI8 9TD>dN@OD6Fq@xy+JW=+&_fD GcbnW4X&3>PIP8)L%n^x+P!ey{ISot?n?z<7fWjp|J{ zb-r)UJC?V7GjaZVC6|G5;lAHw*z>x^+_~TWB{eluwsU_+n4*qi-^!aw&h_^l!yw>Z zVX65sliwDZHHPF39V(a+s@ A_aA|~*j`2byZ)Q@fJtRKCkI(UJN(Zz32 zLIh=W3{)5%Z{zzy8&i0nNs?uyx|_>g{YI1b`g)sRjOFqJ?CoIu+$~gt0@wjyHtUjd zq7l6}V14-ADt3&0SVkLZM?Y*<%h%By2LI`(LTh_5*`4|icR;cuU+2XApW*h)ezQHV z71aV{q03cL?kYsWFFxE#Cm7K1ML>hq<2mLtTlp$twv)E@=+`(4eyP_(W%aNGP|UUF zu ka4m@j#6OK6XpK6csWFMqH>j{O^2vs7M;pYY>N@fGya5GJxY2k`KXy zZ VhRnXfGgXp~Zht(L<#uwZz{HoLYL`r4&gqFD%j6|{( zvnaGLxYFxsbZ;|ht|~7o?7){*fsi?s+mQy>TH^<=Tpn8kq*d+wicynzbLVS?q2el= z <~;Mwy-tAbXl>r$v0RS5Uw`DqgTkU5i0-{n*G5$*;!?E zerb2G0+n)TUqe*l8do21){ZySdrHVQV<4q}kZAx({{VAgQioax81it=^X1gAfZvXj zrgQfyH0zvbf3v6TIwVy`M?e*xCB(za*){ccy!s{x(^3tsJHW2ivT5WHQq1>5uX?&; zMGK&X3aX`QW%rY|^@o=Y{KwS5*Bb|pX#hDGi?};wZ8#7<&iK}HV)$b;)izLA b z$v?&E@Iej(@)BuaJONpg#dYSEaJ@bC$;cm9(GqW6L1#QZ49j&^-IF9ofu;>nRuQaL zzbOIG%Xx6q1QkB<1lQ0BA_gu_fUbE`mAWJgb^b1MSImbIN gOhSm2)>tdNx3CSb1N@j 4W?P0&lZp7JG}ZDsy^WpDiPyP z0GV Ur}4g}#}_-8A6=y1{%T{9DCwa; U^kw0u!Sk#sNPj9uBdfJGVYVgX52 EZfMBY6Btxd982dP!piqLMas` &}r&7%@e7wPqs^_l6rhCZX!7*-p?Y<7|e@n^K9{&-AqXD9@=;b_Nke|9@CFz7vY zAe8^zO~Cu YFKLr*FIrUITPee~uu(6~plG`}$^TGZ(WRne3}CV@S7 zTu}hl4&W3clZ12BFsCWeTaxA-MSzN1Gm#VWBwU}iVG^D;^9IPu?h^0mzeA2I@J1Kp zV`?ua0TAhqJ`nmBHKu4GVz5%jzy_2u6Q9xw2u~msi;s1XmcW}^edp&qU*JBy-p` oSIoMP+ z%7zjU_c5i99lAc3DXXPPn? 8Vk-4fs$x=cVfUf6$hILcIoZ2dtNX=#E&x;a??hJWe{bh{SX-5;yS5 zDiohG-H|3L8znKAja`KyE~yU>1}N|YCRLdCbq!-Y@@zGSIU<6I082*=j= PO(p!`3eyUubUE2mI4UDez-q#|C%8H~#~GGuV;79ceCDp5^m z$3b_IRp=p8tft;xu>P2V{y& 4qEIHaE6yY;4=!*xA_HXk**v#>vLEJ+U#t zH_u!3{hG{FDwVmfzPkJLIo<7Uw-f3E1Lm-?bS (ahYc(OgItXnk z>I8|@)F(UgDaD2;^vN2J{e&4$W^-S)IAw^->U>rcIi112NdVaFTAJy@DHOux;A-33 z?8@FJcV_`OZ1B>$w}ZM_Ui7{qI z{d#Hgs9EgyWTWq~;Z(l)M!d1oH<_um-QP7MJe1Ae7d3Nmc$2G?={LW2vC$CBYvq^X z^u8-fnIa+8x|}G1jIrCBlLqQ>2`%-H91%6sW1P3>BbfERLZC3mHS9HJ*1CRe{d`vb zOQMQ!IzR6=&YU^M%uILU`*p43_&I31?E_fZ{2b#a-0Xl0>NsJvxWwoaLnYn%RzQjw zn T(MECP;M+>sj!gMqC)yv>V2wUo;?hxk}5OMiI zKg(bjMa));sfcEJ|J?IaNQ`b7^E9!V+LWhfYdAoPa3z!{3(;<7slx;5#S+wrdKp2E zg{-HE#?JIXSKyp9B)jrK0!F6Cro&t5+I_zSB!3?Q;eRz2U?CI}fsqL;d5CrY+MfBx z+jIL%@ HThEs_?SE zp#}NtbHMu7tc(Q+u?6b={*ego@6$vhdquDo?q^|y8Rel~M@?5nxzAg4S52hH(ZEUn zgIbTTwJ?Q3rhx!ff^IzvrD1$s@vxch;uP6@FxYEYC(B4%9%`1n@xrW^Kn0d68p8L9 z$oMYww*CBkJhR{}yv01qtI|3D5w;&NC4=B30gC)G7fg<~q!06=4ET~UGi8pKf4mB1 zU6^@?=T^E3i1S}`xd4~toXtN3VwR(nHC4i_l_>5f @ zSc0O}w-Bk?h c*1ej0WQK@(7T-px&(#_sp z?(&|GM{i2ipZaa{G6@L3Y_V@rccyi?ProB@3r*A-@cOFCZ*f)LZnia_xN~@_ z(=|dcGOcdS9$4)1P!07cPKeHo<$j8unxx;fF7H+PMWuGExH$V4w|Q+AlFVtmswV97 zxf4K)euom3NUVN&7tQr`q&ms#3vJuhpZH_9BEjJKxlfhtf2DIs^*hCMTv{{4E94T* zVi*D<#Jn5~n+lnT542^CjO$Na+1DH9hA>be@O7%iu71sa(`Vx{7LQ0Lq>`?`H|~3V z`gF{satZ$ceJ837En1A9EhW3I 1@n{lM|2w|w?lA9L*sbTBNWuU auV$9CyEQm%8D zekL@f1UH>zZV#AOpBt9Bz{jcg*X31}gud5h23P6dcR4_#0g`A;=(js`n8A+GFKqaR zQgy1vO=YY#aP{l82{^YilLXv08UM>2xDacx#A+V?Y=O72uZ9Obtpn#p_P|fNY|l?q zux%eVMzE6{&s;zXHe<04LgH^!?78@rI&?Zol>xb?Ck?e5AOG&JPhUa-=O866|H )7-%JOhS7q8K%{0?5sBVtfZ`OX!&>mLDH)yZI##Df*_A`_`NllfWeB2s zhe6!}uL<$CdJF7W`GfnntnekVf&%WodR8OcMJ7vpx?DaNfe3n!6e8-uf70J&KD?mC zELqcNcbsTjz!vt65GUd~nf-ptx-ei;DGm2sIzX7*Sxw_hwvLVmgGNGI`?7HDL`wQR z{!9vxYI}qM86fG!2XbrmRXByHlXxDh9e!aHOSw7ER!hkVn0(0Js1xJqDGHhq#3X(> zhUZoisl;liZUb%U9JwbtoDgGjOhj@SYGw1-7M!qy(wib_p}*JeCJj^vZk~-N3+~-t z^Mf2KM8?N9=`O%uc5C%-aLAegBM$?JlLp8NpIq4bUPL6lZ#?OnuEI3gK5z$RQxqV# z6HWNnz5&cN0}%xo)ERkxB7rOosq1*vhn@%fNrYuuQ_|cptLx8{hO}_w9Yzs3LwH?U zAU{9OhIl1#R3_4Rdc4&49 iecgb04)Y~>&*JuVOY4$qTq>xPVEDeExC%7j!sUh!X|0Op7K#8l_MuceR^$V8{( z?RT?3m~lBCS{Ugd5Qe*3Oto_yOK>F}&93O8k7hc>zKOGs 5U$w9f1`?Rc=3+?y`2~S#3Tu8;K{1SUNvy zkS00a4ThY|64ayW3R*cics=>-A5PbgHGU4t=i7%C1;gZ9-}o6b^!B`CHeWoxc`M#h zxp@A_=C*7<%^%1L@}V=H_GP`j#FEIvjEC&4UR+#Qv!v?_%9Y$zmre=bbHOryBpDJM z 8#IYq-?V9f zC-qwENk!%M=(jtuKbojke_Y#q8A-?dm*HZu)=1N^Dm!6IJr1e6;o6;lOMTp6apz@` z-k=z$toIJ8tmp3|lCQBPb3JJ}%d-khqNQ8rYeT~EVG zG)bHkq+;g2e+D|4?@6w(J|5olG&;fb=jYun{Ez~(Me!3=wWS8>629I>ug3@klm1)* zY4mnJXnyC_n%(OKmKCju&b`nn ~+?E`7{P zS2aKtl*pd~>I)R_l@E5p5bdCFah=zdjgR7BMY#(FcsJcVoW97a!^ zMeykHkd-VZh-rdbbq{s48o9sh?_AmNtk2RMmQk!*zYsw(A_#}GpWZ7;BiT1DGH+9i zXhY<~bD>^5OKM=CR=Ct@2egER @X#2M!zaEB0%i!w`D_{xA$m^78hN^`}ch zJbvu+D@9P=O4-7YEc0v;7O5q}t9?<)C!#6!E#zh `lC6*rxpx805Z2|Vb*`2v9=W~*hJ^dNH5 z?_}AG$cEltc>f`)!<1>0K>(Jzqk**E0UDcYO#9te)ARAI%F^@a*L}85lfn}bEb0LM z6BssBfiBJveN7L&mR_B1l5UUDhV7Q^lBP{X&5BWv!*I cZt!Qf_6lx@c ztTu$s7}pwgQ?6S;U^Xv}6?ICSf|!V5LIleAWF~vccqV(@{{|qfpcp|JU;Z1laqV!4 z)MVK})w6AX= @*|0%Ri6?@p$=i1ukb2S?n z(Wn`ROE4T33xzR`O+r%Vo5Rb!373ZZ&gf3~ KM+EGz>03a!RVy-dOchSGsXKUA{+=CZrw%{`2Cnhw4Bi@pcZu{^L zGNnJ-&Qkag$I#DSn`n1BHTx=#@BI-;&cz~?5LJS~*+yoht831TOJrv9pjCv%5iz0W zLaZBI@637Y`kvs&>F7AP_;eZ%H6d@q=+w$sEdU(q1ff1q2qBR=&EjQ681Q-58}bSY zhzq4kH2nM#DKzoyrb9Am{?|Y BH3)hkkE!^JZElVA}q{v7Nb zsC+L# &3}xO7|A$CeG+?0&4ngUq6?g`2FisxoSP8t~9CCs9&` zD?OkMu@=L^eN}2Pw$eZyJN%982v16MfAZ&2?Yw{kzIZ%|)oBz4qM!?elNrUoc+bQd zJV6q+*zda%gQ$}d>4etiJR`4crV4^jhgW9H_)ixl4x_-;cPt4xj_Xv!898Y}e~M`4 z2RqLBlUeVVA0Io>eQ=U@W(o4ULj^esoj=ilZQY~O37_e8`fdbm@28TcM1Y2hF>uVa zIMNJUepkwaJUtj{1cxc43 H *bCV2eZ$9+97s*XGW|o_{u4Yz{LwwW8_+e>DF<#HGXW#wJfz}$ z1`*v>DIsVwhN}RlGZsv2c#OzKD+eaYnv|M4gcA6Gdfk1Gt)sJMztdYYsJu1SEs*A4 z*E6RChF+}$8sx`}oX6B_xyX?!YxD9eX&4B7B;UickoLM$mW&cNxeb5@VLaRd=EM zufUt|WBB@jnR$TYI@irI?-U+pdbOQgsi*sqn{e5`rzb3l)Dx!&yFyl>FN2U1T i)96Sh^>*v~*flP8A() z0EZ*(Gx}wh)WC|0FpE5UcU@L0@j)ttj`dEY)ReJ54OnB?BPH6L!gGt0aUttP5U*zB z9kR0t)WBx;4F?8%pa=?@j=n8XmRh q8FJh3Qs4?YfH&2BAeYHM-@jU2v)EjbC%)6Vf`LOr7uF*FszlZsT-^KQyGG`6 zZx dkvt(K#L*CO#7iOIwhc0|l3!sNxd#@yX}ZU*yRnLWj{R;k^3nhQW^Sp$-@H;ZRpySmJpB`AzMXo6~+&|O-qntOKH^JjW@cpMEfb=`I z>nS)AEA0dc6I$mkIT1BtWhKB~zsZ?wg+YJp1o(7zYYhOe+P$@f=|d&V$KZR_`5^T> zAmD~z33!Lv)^5r=7!`{OmFlkRJqGNW@qZadc7(B96Th4UN_Ougvtfo9&6ak^!<6U} ze)2*sxvd)go@MOSC0th6ufbcLg3FL3K$hpToU7FJr&buT@CRMO!0<%V=r7TMNjUBO zLiz9(%BbA8F#f^BXd;=V>%`M_ym?e=TtHk4-wDWvCS_$8r|dT`j={TFg|_Qtiv0b+ zqx`j&D@#6{UFbP1av+reHJjI0(GpckO6GC36=5+y8_*;hY9-(HVkgW0$w#R)qH>Fp zg~Ak3mGEF4iT78v89XFcMN#lF7Sm3GhrKs&u`!E}Cb>9~GC*`N{`~QPepl$%F6~f~ zkImTAZxX-Ak_Uru8-SDMj4nJQojB_- !=_%bU`$bI;X|4<4p1jUJE} z@m}F}+sxT;I!)uUoNapW=Sy*}%&GCLW``BHz9Fg-!qFZW$?|iOxHoZWFIY3+!1Ul2 ztFHgpr*pv}wnLL#gyt56soQCyzH5gtc+NaxuGOI%r$`EV3|!{Bf=Qx^!ol03Sq3(5 zU}8S*5HXa rrFiiF{L~&fkVfG8H)Qmu_w3v7njzJHkS$XB^o}5^`FVf z$vXFaRWI8;&q*1np@lMAvnE)kj%3^a#L3WvgADgg-uLnCZEuTVkB~m#L|Kx~GJ;wh zg{Sw47Sr?o`j*0@Motim>TYw)-&>&xKUr=*ap;!>qL2+wb!jHD-0zhqKRUB*V)Qxl zfC8Z8`W@T&or!%oIA4h|TIn7;pS`e)J~5~JkN8w#=__hodO--CADGEY)uf9dVG?_0 z@FRz3&vwPk^JZ~8sy_NO$5Co!^OyyvWqr=YE)?wZUq}&DMCYH {x{gM6yA!8V!;IXG{Q~-ea;@l5}A2abx`& zGIU75b}nHASiJw76thjb>!=xHpln6lja2fopK`;IYBHV$8#L3AzM9QvY2Zy^bg@2` zWwbLI>_FoDScAf5|A5&TkuZpcF_@^5LdU$NH2DC%sFerW`U8uZN8qbZ&RHgx;r`gy z R1fIDB}B#bU9&!kRgSniML519IArha`c6X9!Y6#F(uxbBk1XSB& z{&2Hd{7c>aZMBl8+tE!+xi9T%PIipF|D9Q^T%ednWz`hjr#pMYXf`rA-1)0sRw>e2 z6~?&`R -LC>PIWd~uPNSJ#73GPs)V zvUoLcmqQ_88#>TyV{5e-+NaAZhbkwi3bQkSpHFgwYA2t8KV9YetL~~{i2#hdPGX$# zFoyN{8R#j0n`8#EmtvQb$JG>?Fnx2p8g2*vZSnP6A&>z}{G!pW0xVaf>PE$Ub2=hR zeVC&ScZ;X;>XS+wW(h&u4FrlRTv;mI%4)N(vk!kL<{fOj2|Q&Amv($2M%k<}bbqLT zKtjg>Jg@gpluW$L*ld yC642A9Qni5QT_TaK}`_%ElN)lZjWVr0<>dJG?5M;vg*$`WYIXvk{JEw zqNoaEjU?u9{r2J#h^-TE;_AkrhaXv*A6Z(iu^$pi?hTs4Eg4h!kKVScuu#HF>DO(w zu0$32D>?mCh_xt-jz}6g*U1yKWh7x+LDFFq-ZnEMuco=Mwn8lMm_lZ1X)*1p_;v_~ zkM{>ITX-=V1_(%m(UBoY-WeI2YyWj@yCv}~4}bjQ)Dbp~EF}2^<1a~cjiaE6o`U`h zsFFxUf`?Z@3(kBdJNWt)03>(SqpAT_JNX`5(N#z97iR)$^|<+B3=txzChx7XJW;3@ zF Ps!2*;#Lb~c%bJ(Hg)Ca@<;}EbayVFK-SgNv`-t> z#!TZekkcM*be@lCCrLWn +k|E~pLVpcU p-#Hn!Z`e;GrREAFE22irEAQ;H3b>@!s6n7$_&{Q`oU&||n>1K=3OtcH!n8tg zko2oh+Q~JQ^$=oK$oMsA-d{HMe*ALcx2!x|m4eMOge@O)coNLq+E7~AEDcnPIJIx) zT6Qb+qJd5~{8dN`3v2&=9y8hQ19v-aGnR}Zc?a!_P;Hy3l{on(;OOUw;}SI
IA-u21S`1Yo``wgV)0aVqVkC644r;tPUvS!dz`U_p4Sh?k8rM1+ z0+uY`pmz35IY%lPWx4r$IxA;?LLw1MQVdQe(xt-uM^}9H*~)?=5v-4j`B^tn{yBW~ zg>*DTzZNBlYKHf=MkjVh014|FI~s$_i|rHo&1=1k;b9PrXfu?N_{ 3roZ*uQT zPg4FBJo@vUHs$Jts%FsgZ^afLT`LU|&92SjpGywcO#;(R^-l0A^+K(0Fq>BO&>uM< z!^--%xGAI8C>PQ*&Bms>9>K%OW>3ilDH|SVsN5uo;q-y+&l{jxdR?tvoqD!lJV7m@ zm_;k(${+z^b(@QcMU>*ftZ$d{DPv1)ULJ?ILAulw*(Iv)zAa7;FHAInWQWY^%o0ev zd#xEzjli`DBefICqP;H@)hvo+6Gl<;qT8HZZ&D7rfmO{_GI?(8eN)yU9(p=1%sR$U zQpgvss_Pu7M9D7kHm9&rafrwU8`=;&J$nH&1f2TwujSomZ&WC7S$NX6Ws@jH%b|9i z?wdR kU!m8KPAoxlSlQ^ytmq>dj>*GgRh==bG`zaTaB5FfEd*IKXK z(*!=zHGL67P!Y;Y45VHJ9PIV)^`vm7Y518LSQV1M@Su{Cw+LR%Tlm=317toXr*t12 z*uszQx8;=p!pyx+ykK@lexUB(LiUUnzQ0j;hHM8^LcG`;CPmJwe!V0jm4}WRQPqSx zONbymK`Kj{C0=KX$=mqu1o{{8zD;17uaW$w&c8?d3?FQtSSI`Dcp*EevdP(A^<&>b z08gy+t+06_7kh|hraVJ05?7(fnZPy1ffdf{SFfpj>V5R!Z(~LONDdJkxMS @UA~mkh1&qA|0sc0o+1UIo7IsRJzqryV6Dmfn(7?FfE$SAh6?xny&;v)Su| zZ1VmYYVeZtpq=@V6lm$3GA-^O>0ec{Gk+acn{Wz6BID3}N1BOYD@X7I2`JAI_mIMq zTnB&)6GncAxTfQtEF~FYs&cXB+G!hR3mkXH?4#t^3;>bc;;HZA7u-n fK?p7&lyjaTI;I11za3_ z^<*SK!)tVRE3zDR{ ?)ApjWwdGMigvN4PdCm -PM{UB5{d_hfc s^g z6G;V9lgYtm4Na5ru>s8|roxUAf6jiLU~Mn?p%d<0wRbd4!s6v$V>K|W!%7!-Em0j| ziF)OA#^Xnlkys{cLu$1V4=S{Ucq$yMe)?piF`no*zzmjiyNm->4SB=Af~RjvFl?4c zh1?3 hI8e|O-_Y=!BY&;9fAoXyGJhUH zE`I*E5jdHYlXtV4)kB28t4^zZ+2D5{e4>4S!4`k yxL5N>&*)$9^= zMuJazU0^==gCY =uN^8pvOe6?=IY)Kf_~fW8qb8Ki6mJ+AieTWh&eeT$ zd2?j}HP5){q%8TEsIxJ|uofGBj5-o;amGTr<9G6r5j4fb2}w`i)*JMRa;Rt&GL`A< zt7UjE)S))Hc6y_(Hd3>mm!7OXwvik-Ipnwgq{&>UUHD!B8sbVZx*is9NVX-;qgTbc zp)o+ 7sq lAolNZq#rxX z#V1v?V84=Ek79*S20c*MRm)yof$*OBQJszClegos-2g`bzI=W|@n`~x_tF;O*Qo}+ zlAq}E!}+69P=o9Gjx%oHpozIJy6eZbBbI3(&eHbwNXnR@+gNKnrG}`c?RRCazJ&rh zhRqFL+(a}QR@T7{vls;)T?Q_~0C(9olbLN~jp?5CbSW=?&bPi6dW)iT+*!f7L7^`? zhh+)C=vQQRJ4DYI6^(~jB#KTKqrM69R}W)bZ>+vysMGyF xnBQJil*J_D)&5xdmV!gY1f!H$_eN2MfR*dTMkx$cppnQZ&gr^=z~;ttm)1G9HQ1|>$SZSbtL&3xypeP;&l zJSZ}9GgtY#1h4w1K}17T)a+l!z>KDsu4-=&yz8C^^TddrsA1d7&I+b?%5Ak0aW$!L z2p|H%xOLCgUMsvw8tdkSrnji?HUG0go#I8_ha-}9T^qQQkiyDf^jI%}e}}GUZ}d!K z`{Q@xOTf}lP7Zf)-uq=xuk2C-^Xfy}&g~RTE`k9Un20Evf&o`!PMtLZ^31S>BDi{9 zMU{^*Ymp- %u6#W7xk~ pnCIgP-P%$|D*-B#I}d)X*Sl{*p!_%g1`Uq8EMXA9FoQ% zoM!O-C&^o}f|0~`?dCn)dzM^`K4|rl8NEKvV(^*~3!(EnI0`by+m+<`DbVtu>3qIy z46Xb&Oj~j1taUpFAvr+7j)-!{Vm>FXEt S+bi2izbfDS1#R^(_s+gZE z{=}ypk&qHW6rQ-(O@iL*>C7b&GCp1}u!CD;8Y@;+QEsN+HevY0!@b-fx8-!BvqT+L zqViuf9{)Lf7C^lPG;4O}W$@(n!l|$5>1XEW>hQB5!BaFA=J>B+%aak3&u}ebHZFPi z6C?NgH4#16XeGHLn7Yb^4N!8PIu~~D&Q>jZ*#I}bsFh2~?<7Ff`_4~MWzy!P2lR=k zB1Mu4)Bfd%d#wUJ{2F|-$7}tJAf1BvtJB_UDUDl@F~i4OHJ;<$Yyz)NOXykCTR=~; zp1EZzr(j+~A hZ+qFeH aEq6MY4(gnKexo9_N%pd{LXV?ZWpf!+4G(J1P zMQ8xGX?e>RA4x)<=&H_R$SsUhql5^Zl8aOQ_I_T_s!t94!Uc}O|B6w_@X>F~;Fb;# z)BoMm!|yq8Y&uV7eO4e`iMDu2XEbU*CpPnTDe>~VJW6 b{$8YX_N3A7Lo&VwIyLDw=|3YmGlr5GZLj-B@4ox-OyVILOps=>5V0 zA-Vq?QxGxQyq O|R(=GraH7ccF##XRj9PMJ^Cwyu@d? z7Q@J{r{&`t@w6a2kjR=HgTQ5TFPA(xR^N7qx?OGJm2wdE$YI(_b2ggQx5tu}>S8_w zJ^i*{TvlIVh_C)ZZKjl~a4?6(*MC-(Wij(FM03f &T%z=ssB|l@-HTaRV898yK#BZ)3u^$wh`2Hp`H|5v#r iy6OhFq5v3 O!7hG6^A+Vd_gMZD_)ZQA|5gvN zul9Pt|I(G39}&0Aw6Gy?bM`CaH@?h*6<=szX?4Ox4;WP`$!%Znff;UtIn8`_Z%4pD z(6Rkgtrde~BFX*&fHn!UfS;i4H&RC=nmBmX3Xj#Jm!4+V$Q7V$@HRfIYchtB*ZWlP zg|0v%rkNl)*lb`}Q&W3}26W9vT^8_D#%1Jt{*^{pM`we=phlD*%}>TqjABdPJ1)lb zqd-tLjo7Q)PAF3$YOMdS1S1gAw|5gnE81GWQe}Z=H``bSgm*aWV}{1h(hwskM~Gn7 zp0jrlf)FXXWCJAtw1>9_f?vVx08$qxW|5&yF^0C@YQvua_bV@x4eb*iyEOuss!8?} zcuF8wT>ou7aVH=VEy}wSrL6^U0Ez{3E$qehqk7)udIYKHT*U;vJ=iVF1Z)>fUur`S zG52V$-e_{(DnL0!mc9;Qv?-HLgmES`cUW5mU5zyyN=rmCAzmV1djZhJd!q)W{Gd+? zDko=s=prlYUc&h+>UfZYIH_wt0uG+T3!&~C3%r2e<|E=wf9_c@eBEGr3N%IQ#Pm+7 z*(I=f_akk70TafUv&)kAVBcjx<9zFcr?Q7VS^f4I 7vkf6khZSK%3CXm9WUTn)uRj6KhSz@)6P2dW-U~eo- zwsQZ++20{B7p+ig1TT-^8+xDa{A8B5`tO?J@!z|q2|U3}V&8T@qW}qz7rN~vWs)TV zk!EaQjkYhwMGUkeIqW^TsEDn^qvKkp=7I*3Yu|+a2vKl4;k$pmi}WegRu)$@fP)#? z@iLaF7akC3A&aCm1#^_JnFoSID eE@41b{D_yxma%cA_~G0~ z$z;aw2ukjpPt^?jQ)gBdnX`bbxG40bL=67mf5v#DFY7a7NEaeM-sl*6vmEopn`9r3 z^qnSeII;DAmJ;g4b05U3B+A7nW4aM(j>7V2gwF6m0dGAUIz2piJUaE3ucw*z=)4Kl z-iHiR_M8*k)-M7dK9TS#XXSYEt)hX(1KxrPH1Yz%mXyK*J_7Vzz5$bC$R}>1&7hjw zf3+-7*=qE}rl_Iy!#Dr^hWKA#N5tC7PQOuZCq;Q9Q~r{UyzCq`^-N!Gf|j6C|3wwt zM#CNqw6e8Bb;;W*j(%Z@C@hQ52!yRt`t9OA>*nobr7>?rh%s{QB7(@@t=n`JOjIbq zcO_@Qm|=Ka&bJWb(?DgkPM^B+VAy^lrR=WqK)Bl>L}nN}dp}nOE?hTP$H|Lma?!u? z0eb?VqFny>!7O~lq=@ZlO(b?76MTB5#AJ5z!+;_SiWdoh$d)(q6tzh!4cZL{`Dok_ zo4Kg^$H1QQkE^Tn4=McC^BMF6XD9*147DOPh9nGr@EG3sLsoVd;w{Oy)QV;eKN$v= zM*zWX-u8I;Z6)8Sa8F8w)(&i~>bic3xk9Gg@UoH&5kG;NnC2n@Ufk~~DUOS^7>oOf zA!xX`3&&+R#VP}G3M0Y2*0yDXn%W=PZ_3OFE*kbjS0Fc$e(CKWRu_PfUm1u`Cqz)V zI@mhrxCe{e )|ZPWjY$%okPGV9tyb6DMvde$Hu`m&o?Xn8L4 z=flxyJ6beMhKle5uc?#_|8wu&KVy1n`JbRT^HJ{RMCX>K4Nugp>M!G#A{lVZ{!kWk z*Hfv+(5jl>xLuu%6p@w^b7KA$cvs8RBL;Vz%K}}oAnad!9J^a2{E0qWUEHwwIMH{v zPQmT=+9#ZU?Yi>D=_6HdDX2JwS5P-urD6>gBlIb%xeXP6y)zy2+^W~l5#}}3H1U%l zEKM^>(3LPtrXtzhy}h=j;Ri{guklft`fsfBVqJNR^T}iri9S?Q2c3acXDfx=S>4-j zce{%+F20}4wiDS5VgC2D;b|OXlYypUe r1AG4K(70^+aPkB _c%@+PmX_1jmuI|)Ne#9%_Dx)H{dO?IYTpg5in{cVHXoN_b{G&)lM z9j>tsZ%(Jc_t)SDs7$qYrAo!|^EcC8T|m*O_|K&MCEY3^YKNyTgWmLCM36-Pow`R9 z=+v1;93|8IZ5!=8WybyjyTXQIJE6dDQZN6$S*r~B+bSP|u_bbvB2IkD3tDY|-ha)# zM$r>jdcg4RQrjJ_8Yid8DG#2MHjmQNezVY2;l+V>b8Hts(Ha@0k4B81yc7nil{Z$? zg7i>TjGE761RrCSuoYK<{{;}EKzzkGL%%QPf&EqTq8&_AMJ!(D5o}kMs*Y?+5NkY5 zU*F5Dtc(gGy+kEg!ZymGdpebUG0UIAo$VyOf|@-ZAp!lrIb9iyI<7oCy1#I+cfLU2 zkWg^V3bml-C!?Gm){}8_R@tq2-}gbtu-fp;!!{C1<9Zw1vfVB390tC<#Wg_1r?D&ZZ&IK~)xXhW=8 YwGtlg5`oG z9ic2A_2kY2XLQt5W}wg1pj5`}nb%RF#FQ0`po@;B)m?P_rlU&W2d(l9Tb1xzLx_rA z6r63A7&HPuvQY9wBATIqHW+zXrAG%>LqZ*@V~{X5B!o2M!P2C~a{yi6|9MXB+^$cT zI(8z=N>_2QeX^e!ss&o9MYY^J2C@QoC6{UN+~XF6%m @(&m1WuMHFkRA=s#Y`sX5&Pf#q`i*?%*9hra+1!!xZjS@f)WIxK zF;$_IYwi9d6vMw7%Ppq3+_n%Hb-uWBSNUf*O+lb!4hKnMT}#gbD_%`f8?mKBP~)>@ ztnJv~JE(^A19TnzmkNbt8_XsLU+jdH;an8Vk-A1KN=G +Df{*|co@zW ziF(w&{&;1BX!g_k%Z`v09Vy#onQ9Mr?a>pLf*~5RZ#|zmqIye7APL|6*G`E+;Uno2 zapfTBMiQD43pquc#^OfaJMa{;rt+~K2s|O@Q7O2k?=uIG$p2HGH0z80>B{|ZcwIuv zcedn|4B78@kw}nK^7O0$Cm~c g!oK)!MiPxKqJqhw`R7VU z6Xn~Ex3J7gw;i-*Rp$lz4F`xcT05aX&Lv-mbl)P|)IvNJ7Ygb%uj(O&r5ay9N5Iq< z?cPaPIV=E~Z`7-nnJk{P-}Vx%!;*?`kCeMMaLq(^lsHAKzb$uY!z+0iL%N*56-R3c zPNY9AQ*nMwwm6QSQpkd#hQ@HT<63Ca &WKF0IHMU2gRBRsXYrg>EUN zpm(OLk450FYTrr&NV5NcYZ7E1lHSzv`X%me V2n7}jlO&p)Y+MMUZ0C6KICC{+1Oyd}1N+65c`s<%t11h+VdZ^x{P!AOV{9OE zF#lZ2%0x$i%B3ps9$Vl3UklK7kLy2loS~pwrRn*V@0ggIH5suH-7Y|b6*N?#22|hs zuW(c~oFl5%#)%NqIz*C7$_g6bFdfxa5SxmIVN if7T}8 z0KM#gJUTb&OqFDlP2xlhD7zcM$qv6pl5OqyLpB@!bqUkZ{wHZ6oHRBMI%qt%@Yo80 z8q>j>&K^t+Rk5;7J}qQI6(VF@Oio`Ys$uX}mZ?%N#^v>#zdQs09}ZOrJ!dZY(B=HQ zuJrb=I4F5f0x^q;mx9wD87Y=2uH$^~Q%0n(0M=1Nq_+`D2nU+mHbNxtSWX-G<)Lxd zLM+K7xaPF|ij7#(^?K?bV$CHG5Mu$= gFpTC)0Si!$^uB9iuYa!kSSt% zm^aSg>?_g%LZ-fV#mGYYO>usF>aMZ3<)PYF2k#DA4GvOHUVq)b*}b*A&735wr(Sve z(l=qYlKYGl^iDRsC(@ex%z8&EgM+$v9^PYTfsw6sb@h~yYz95r(hR8g{$|{gZW%4U zF8YI0WE|6OU7pyue8}HSb6RZGNH>8xCRttTT2UaGql=SDUmH{M{unN1DDFDNIw&ZI z09=g!rqD7KdOD}qAdF85rX&4qEQ5A=iFLc%1c~(yu?urL?ewYV0iL;7vQOOE)b+1K z7e$uFY@>V6uWN79B<(+M4Kf%@kyV01@{##r3-KhmDrBicqW*or{6~0(Jqt;Na3Z8w zOD6ZgMuX&q|CP9Q{DLy7?Lf-+lfwc*^P^+a#vzY-N$cP3a2NsMW-o!p(c>e8{0tWc zu*l4`joX4Kq#4!yl-TaD1BC2|cK--bp(IiSGcaVGU;5=k3S|0socZV{8bQ~hf?2N& zWsNiErP`<(V|lToGl2)4ZNIpQzOFo4Ucznc3AFz$)Q$6Eg{T|JB3tMke(-mC1C8Q9 z?q-0#Pd1Qssx#^DHg^ND2k4nKi>qZlb;PQp)flD5cS_JKBwe6q1-4h2@G%-H0ynMm z(#cjhCC+PbF=5+M5ux7j+ny{=P<2(4uc&?yyNX7+&W+?-SE{i``*#Mmk67U2A`DAD z;AM$jI0(p2mJ@t?=olmbOk;5*7m-o?5JOy^&~^03o2X$n^KXW|{nIB!r!67xhGl5f zv^{d<#8cDz8Op%W)-5raA|2Ip8Hje!R9+|0zpb=g+zX&AT#FwE{55wc%`!t((1e;B zXl w5~_{dHMtV|HFr(z`VyqmUpt*jdd_=`7@TFsCB|FZ!?evXbaHy8!vQ z(JxYJJ2Xpa(HnVx;kZ#vGugg0&{s@M`~su)rT(u<+QKXZU;etq{IUB@H>U*_Hj -9F2{26)|o^M4V%YHwh z-8U?gi|uKIfOcezPX9;KJ4Q#^Jzv9_nQ&s;HYT>MiETTX*tR?7#I`-LJ+W<1toOQq z|MyudpSnA%`#R@TovOWeRb{-aYTf&dKtwV9Cq^HRSPZ5_+syadjIJ$&gO@4?LJSe! zp@g@7009HStC{9UNSsIS*T6BH*kA`4DSaFvuSkogd0lXDxJ4Mt@o_#o-S>LK8LEMu zCl>jT9EEERJcJuW#75md_rS&9*}t1qKmkfnBxTkKDjafkRt+-Yy +J(!!+o|o z7K;_$Gl+5z%Y`uZ?GtY0Q`L>PFXLbwi_3$3rGS9M^{)u=W5uQyka(Ar6$b*OYNkO> z;SDD1tfJ3%|DF&NPUJR)lgGAMy9zILX z>d2Tzp}%hf&41g#dCi6G&KUYzcnV7>lmU&!zXoYInmo7EPng640jy ?c*e+r}QRKZ*Px^C3UVUCpJD0)CztRcOWF4m92~WigQ<;F*!M5J^;9ycpkAt>d*2 zjYjo^Z5~iooBcMfaS*c}HT(H`1>yeQtK#!-MRDdsytlHI4k&pbV=}UF8z~|i+0Mv! zv9P)kp#`~EUX4Qo)ZA|UU&admlAHBa@;-_jkvLM2ueRUs2Fuq=l@@?5!IQ$)m=6 !ULZDtv%!W_kiZTG~+O0=o>)DLy2>f)$qh1?P^~LU|iK* zuP~dwJH-D%RHI|6wg}{6nNNEP-5Z8mNYb5oUBpz@0~+8zxA#=1EASts$_$x#f!+hD zes3QzU;xJj<$cKx08`qYA pb>J310qmjJz&-i#=V$V#N;Ri z1 ))LyojiO%kOtn|iI-U5 z=lG|Z6cU}7UDL9y;uhn&7xKH!2)XW{eYDirx*{J>z#SWHNV< f?*`_bT48O6E2a}|JMvw( zC}3iFr%%KPcD`{DchzUt8UKCM^FsmvG7WFu$A6k&SMa3}cD6^98|&Bp|8f S;{P_6)=)Q(i4Y1z$nMem<+Y(^3FiP&{6MMSaU|JI-S}Y z%#vYjR6$}<=5$!go=T~x*eCDj#P3Wss;{Dk0d5V9S}}LbEP`(!LQn7a#>0r7&wI zV(W6ouFelXZTP^p0UU@3K|%7MGgUH-nSr(qyVJ1T(bLC;Nemureem?gcfp5J7%Q4c zJVB;42R8Qqt>!;mw|NzH^!l1+3`#%G-8Jun_O0EKx@elA#jPp^}EZ_nvJ# zOOwxHw{+f5&s|WE6jW%dNKw_7=VjM{<`-Y$ew_az`}t~gGRP`^APQnlu8LZ9tSFLh zghYip9|aM&y??m3n3dIT*Sv$dJ?BEZPdW4WCnu!Hifa)AihY{LOY)}n3?N#S%Hl@f zuKc@u{TH_2fK+SNF 1PK}FonOl@nGsZ+W3m; zpBg?tKcbKALf5tSJ&Yj>tKFFliD0?<%vq)&%`=aki2GTu2)xCUu^7q+46#Ip lvT z3G=?v0PWUa_s5|hkiAV4R#6!}rhh+aBheu&c0W ycIn_(Xcoj2o>ILjG*Tl z=Q#5LqHCl1Oh)FtNP7ch^zyN8B4%S~$4K1IE#JsFC&;@_(?%^8P4`FCr&TS>@(SUb z=F)lHKuPTe(0@$I^ByJYay!b2zTa1Cx;}Koxr`s6y R^Z%=%DiNOO-vsF;DY!P>?L^gwI{#EH-#3 zp!G@cEOh9$5US)b;oGQ~GPL>*Y#^;Cfryi{H#7Ef{iUI@5fT`{upcgtJS?_D#}Z9b zhtcnvfYf5FSSV{TBRM(%SM#B7)|ny5tkG$QIUBqDHt3G4uxrT+BdD`zvTl0T?x9lp z^|yy@KVQqvApH)sLRvVa 6OY<(fm3aV)%6RqrL 84P_OQJ@mCI$#n|BRBpIzF55YrgC2)L(BQXH?W`$u1l1F< @x4vCYzqq#h=nmuIdbX^&X>r(G-K0i`!8fuKr zfho4Y4U$B-DPlDRU4Kha>! jV>#4W)IeQJj9EmwE|A8P7h;w z87ho10fpr%?URq)d(V(@g=N*7#-{=;XC0-2czmX1Y`pX=wi9J6rRfVRQ2(+tPswVe z^V}N-z}dJ>TjV$vfc#QQ%~^FBujh;UNsTb%(bvl#(6N1ANc-!x