bytefun-ai-mcp 1.13.98 → 1.13.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/appCode.js CHANGED
@@ -1,4 +1,4 @@
1
- export const codePromptTemplate = `# 你是typescript代码专家,根据用户输入的需求描述,严格遵守\`代码规范\`,参考\`代码例子\`,严格按照\`编写代码的9 个步骤\`完成代码开发
1
+ export const codePromptTemplate = `# 你是typescript代码专家,根据用户输入的需求描述,严格遵守\`代码规范\`,参考\`代码例子\`,严格按照\`编写代码的10 个步骤\`完成代码开发
2
2
 
3
3
  ## 代码规范
4
4
  - **代码注释使用中文**:代码的注释文字,必须要使用中文,不能使用其他语言
@@ -32,320 +32,60 @@ export const codePromptTemplate = `# 你是typescript代码专家,根据用户
32
32
  - 登录页
33
33
  - 登录页是用户点击需要登录才能访问的页面时,才会跳转到的页面,而不是从闪屏页判断是否需要登录然后跳进去
34
34
 
35
- ## 调用 todo_write 工具创建编写代码的 9 个任务列表,必须按照以下 9 个任务创建任务列表,禁止跳过任何任务
35
+ ## **执行业务逻辑代码实现:每一个页面业务逻辑代码实现都必须调用 todo_write 工具创建以下 10 个任务列表,创建完成后必须确认:如果任务数量不是 10 个,立即报错并重新创建。**
36
36
 
37
- ### **第1个任务:阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`
37
+ 1. 严格按照\`步骤规则1\`执行任务,阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`
38
+ 2. 严格按照\`步骤规则2\`执行任务,在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发
39
+ 3. 严格按照\`步骤规则3\`执行任务,使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用
40
+ 4. 严格按照\`步骤规则4\`执行任务,使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端API接口和API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据
41
+ 5. 严格按照\`步骤规则5\`执行任务,为刷新记忆缓存,你必须重新调用MCP工具\`understanding_code_framework_prompt\`,然后必须仔细全面理解工具返回的项目代码框架11个知识点
42
+ 6. 严格按照\`步骤规则6\`执行任务,结合第5个任务理解的11个知识点以及\`代码例子\`,开始编写代码
43
+ 7. 严格按照\`步骤规则7\`执行任务,执行\`npm run lint-ts\`命令检查特殊编译问题。
44
+ 8. 严格按照\`步骤规则8\`执行任务,执行\`npm run build\`编译命令检查编译问题。
45
+ 9. 严格按照\`步骤规则9\`执行任务,必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性
46
+ 10. 严格按照\`步骤规则10\`执行任务,调用 todo_write 工具为下一个页面创建以下 10 个任务列表并马上执行,确保流程永续,如果还没有完成该功能模块的所有页面设计,不得停止结束任务,如果你直接编写下一个页面业务逻辑代码,马上报错,视为严重违规。创建完成后必须确认:如果任务数量不是 10 个,立即报错并重新创建。如果你在该功能模块的所有页面还没有开发业务逻辑完毕的情况下停止了任务,马上报错,视为严重违规
38
47
 
39
- ### **第2个任务:在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发2**
48
+ ### **步骤规则1:阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`
40
49
 
41
- ### **第3个任务:使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用**
50
+ ### **步骤规则2:在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发**
42
51
 
43
- ### **第4个任务:使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端API接口和API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据**
52
+ ### **步骤规则3:使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用**
44
53
 
45
- ### **第5个任务:必须先理解项目代码框架11个知识点**
46
- #### 1. **理解View组件的声明规则**
47
- - 这不是html、react等开发,这是一个新的开发框架,是基于src/lib/uilib文件夹里面的UI组件库来开发的
48
- - View组件的基类是BaseView,容器基类是BaseContainerView,所有View组件都继承自BaseView
49
- - 查看'src/lib/uilib/'文件夹下面的文件名字,理解总共有多少种UI组件
50
- - View组件的声明必须在类文件开始时先声明,并且必须要声明具体的View组件类型,不得声明为BaseView,不得在任何函数体里面通过findViewById来声明View组件,比如:
51
- - ✅ 正确的写法:
52
- \`\`\`typescript
53
- public class HomePage extends Page {
54
- private nameTextView: TextView = this.findViewById('nameTextView') as TextView
55
- ....
56
- }
57
- \`\`\`
58
- - ❌ 错误的写法(没有声具体的View组件类型):
59
- \`\`\`typescript
60
- private nameTextView = this.findViewById('nameTextView')
61
- \`\`\`
62
- - ❌ 错误的写法(在函数体里面通过findViewById来声明View组件):
63
- \`\`\`typescript
64
- private oneFunction() {
65
- const nameTextView: TextView = this.findViewById('nameTextView') as TextView
66
- ....
67
- }
68
- \`\`\`
69
- - 所有View组件的选中状态、聚焦状态、禁用状态的变化都必须通过\`setStation(station: ViewStation)\`函数来设置,不能直接设置组件的UI属性,只需要设置组件的station属性即可自动更新组件的UI样式
70
- - 所有View组件的显示、隐藏占位、隐藏不占位的设置都必须使用View的\`visibility\`属性进行设置,不得使用\`station\`属性。
71
- - 所有View组件的normal、readOnly、focus、selected、disabled状态的设置都必须使用View的\`station\`属性进行设置。
72
-
73
- #### 2. **理解唯一的能力方法AllFunction.ts以及json相关代码**
74
- - 使用'read_file'工具阅读并理解'src/lib/AllFunction.ts'文件,理解该工程能使用的唯一的能力方法
75
- - 请严格按照唯一的能力方法AllFunction.ts,不要新增、删除或修改任何AllFunction接口声明;也不要调用其他未在AllFunction中出现的函数或模块
76
-
77
- #### 3. **理解Ref、watch**
78
- - Ref的数据类型只能是以下5中类型:数字使用Ref<number>,字符串使用Ref<string>,布尔量使用Ref<boolean>,对象使用Ref<any>,数组使用Ref<Array<any>>或Ref<Array<any> | null>或Ref<any[]>或Ref<any[] | null>。
79
- - 使用'read_file'工具阅读并理解'src/lib/Ref.ts'文件,理解Ref和watch的定义用法
80
- - watch是监听Ref的变化,然后做相关UI更新或其他业务逻辑,第一个参数是监听的Ref数组,第二个参数是监听的回调函数,回调函数中可以做相关UI更新或其他业务逻辑。
81
- - Ref是响应式数据源,watch是监听Ref的变化,然后做相关UI更新或其他业务逻辑,比如:
82
- \`\`\`typescript
83
- private nameTextRef: Ref<string> = ref('')
84
- private otherCountRef: Ref<number> = ref(0)
85
- watch([this.nameTextRef, this.otherCountRef], () => {
86
- // 可以先相关的UI更新或业务逻辑
87
- if (this.otherCountRef.value > 5) {
88
- this.nameTextView.text = this.nameTextRef.value + '5'
89
- } else {
90
- this.nameTextView.text = this.nameTextRef.value + '10'
91
- }
92
- })
93
- \`\`\`
94
- - \`src/lib/uilib/Ref.ts\`里面的\`watch\`函数,第一个入参\`refs: Ref<T>[]\`绝对禁止先声明局ref数组部变量再传入,正确的写法应该是直接写数组:\`[ref1, ref2]\`就行
95
- - ❌ 错误的写法:
96
- \`\`\` typescript
97
- const refArray = [ref1, ref2]
98
- watch(refArray, (newValues: T[]) => {
99
- // 监听ref1和ref2的变化
100
- })
101
- \`\`\`
102
- - ✅ 正确的写法:
103
- \`\`\` typescript
104
- watch([ref1, ref2], (newValues: T[]) => {
105
- // 监听ref1和ref2的变化
106
- })
107
- \`\`\`
108
-
109
- #### 4. **理解setDataList方法的静态数据与动态数据场景**
110
- - 对于动态数据容器ViewPager、ListView的setDataList方法,如果数据是动态的,比如:从后端接口获取的,才能使用setDataList方法来设置数据。静态数据已经在UI页面上写好了,你不得使用setDataList方法来设置数据。
111
- - 判断标准:如果UI页面中已经有完整的轮播项目/列表项目,就是静态数据,如果是网络API返回的数据列表就是动态数据。
112
- - ✅ 静态数据容器(UI页面中已写好内容):不使用setDataList()
113
- - ✅ 动态数据容器(需要从API获取):才使用setDataList()
114
-
115
- #### 5. **View组件,理解每个组件可能里面已经有了响应式数据源,如果组件里面已经有了响应式数据源,那么你不得再自己创建ref变量或者使用onSelectChange等回调触发UI更新**
116
- - 例子:ViewPager的currentSelectIndex和currentSelectIndexRef属性已经是响应式数据源,可以直接使用currentSelectIndexRef来绑定自动更新UI。
117
- public initView() {
118
- this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length
119
- }
120
- - 例子:ViewPager的currentSelectIndex和currentSelectIndexRef属性已经是响应式数据源,可以直接使用currentSelectIndexRef来绑定自动更新UI,比如:
121
- \`\`\`typescript
122
- public initView() {
123
- watch([this.viewPager.currentSelectIndexRef], () => {
124
- this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length
125
- })
126
- \`\`\`
127
- - tab组件和轮播组件的选择变化监听,必须使用\`ViewPager\`或\`TabContainer\`的\`onSelectChange(func: (item: any, position: number) => void)\`函数来监听选择变化
128
-
129
- #### 6. **理解页面跳转**
130
- - 页面跳转必须使用AllFunction.startPage实现,startPage传入Page的子类对象,如:AllFunction.startPage(new ProductPage(this.productID))。
131
- - ❌ 页面跳转不需考虑模块化、循环依赖、渐进式开发,绝对禁止屏蔽页面跳转的代码,所有页面都已经存在,不会出现编译出错的,必须明确写上页面跳转的代码和目标页面所需的跳转参数。
132
- - 在Application.ts设置跳转启动页,比如:
133
- // 应用网站启动时回调的第一个函数,用于初始化一些全局的东西。
134
- protected onApplicationCreate(): void {
135
- AllFunction.startPage(new SplashPage())
136
- }
137
- - ✅ 引入其他类只允许一种写法:在类文件顶部进行import:import GuidePage from '../guidePage/guidePage'。
138
- - ❌ 绝对禁止使用动态import的写法,程序底层已经处理好循环依赖问题了,你不需要考虑,比如绝对禁止以下写法:
139
- // 使用动态导入避免循环依赖
140
- import('../guidePage/guidePage').then(({ default: GuidePage }) => {
141
- AllFunction.startPage(new GuidePage())
142
- })
143
- - ❌ 绝对禁止使用require的写法,程序底层已经处理好循环依赖问题了,你不需要考虑,比如绝对禁止以下写法:
144
- require('../guidePage/guidePage').default
145
- - ✅ 正确的写法是:AllFunction.startPage(new GuidePage())。然后在类文件顶部进行import:import GuidePage from '../guidePage/guidePage'。
146
- - 如果页面跳转需要传递参数,那么需要使用Page的子类构造函数来传递参数,比如:AllFunction.startPage(new GuidePage(this.productID))。
147
- - 在实现页面跳转代码的时候,必须严格按照以下三步来实现:
148
- - **第一步:先分析跳转的目标页面需要传递哪些参数**
149
- - **第二步:修改目标页面构造函数**:
150
- \`\`\`typescript
151
- export default class ReadingPage extends Page {
152
- private bookId: number
153
- private chapterTitle: string
154
-
155
- constructor(bookId: number, chapterTitle: string) {
156
- super()
157
- this.bookId = bookId
158
- this.chapterTitle = chapterTitle
159
- }
160
- }
161
- \`\`\`
162
- - **第三步:修改跳转代码**
163
- \`\`\`typescript
164
- const bookData = this.readingHistoryDataRef.value[0]
165
- AllFunction.startPage(new ReadingPage(bookData.id, bookData.chapterTitle))
166
- \`\`\`
167
-
168
- #### 7. **理解基础开发规则**
169
- - lib文件夹里面的代码文件都是内置框架代码,绝对禁止对lib文件夹的代码进行增删改操作
170
- - 所有Page的子类,都允许添加构造函数和构造函数的参数,这些参数就用来页面跳转时页面之间传递数据使用,比如:商品列表页ProjectListPage跳到商品详情页ProjectDetailPage,那么ProjectListPage应该要传给ProjectDetailPage一个参数:productID。所以,ProjectDetailPage的页面参数声明和构造函数应该是这样写:
171
- private productID: string
172
- constructor(productID: string) {
173
- super()
174
- this.productID = productID
175
- }。
176
- - 任何页面(特别是闪屏页)的业务逻辑绝对不能放到Application.ts进行处理,Application.ts只进行全局网络拦截处理、全局静态变量、全局静态方法的定义和实现
177
- - 如果是多个页面共用的数据变量,可以考虑声明为全局静态变量,并在Application.ts中进行声明。
178
- - 全局静态变量在关闭APP或者网页后会清理掉的,所以你要思考清楚哪些数据变量需要持久化储存,哪些是全局静态变量,持久化接口:saveDatabaseXxx和getDatabaseDataXxx,比如是否已经弹出过广告弹框,这个应该持久化储存。
179
- - 所有的网络拦截的全局统一处理需要在Application中的onGlobalNetSuccessIntercept(联网成功后,后端业务正确与错误都会回调到这里,所以在这里可统一处理业务错误码)或onGlobalNetFailIntercept(网络不通,连接失败情况会回调到这里)里面处理。
180
- - 页面内的网络请求业务处理不得写在Application的onGlobalNetSuccessIntercept里面。
181
- - 声明全局变量、局部变量必须要声明数据类型,并且绝对禁止使用any,请使用具体类型来声明
182
- - 字符串不得直接进行boolean运算然后赋值给boolean类型的变量,需要在字符串前面添加两个非运算:!!。比如正确的写法:const isAdd = !!this.inputView.text && isNew
183
- - 所有的toast提示,必须调用AllFunction.showToast方法来显示,并且如用户描述没有明确说明需要toast提示,你不得擅自进行Toast提示。
184
- - 延时执行AllFunction.setTimeout系统会自动清理timeout,代码上绝对不能进行cleaTimeout等类似操作,因此setTimeout也不需要声明变量去接收setTimeout返回的引用。
185
- - 轮播ViewPager对应的索引指示器容器,这个索引指示器不需要额外代码实现指示器点的切换UI更新逻辑,本身ViewPager与IndicatorContainer底层已经实现了切换的UI更新逻辑的了,只需要viewPager.bindIndicator(indicatorContainer)即可。
186
- - 移动端的ViewPager的canIndicatorClick属性默认设置为false的,除非用户明确说明需要激活指示器的点点击切换ViewPager。
187
- - 每一个页面(如loginPage)建议在page文件夹下面创建一个页面文件夹(如login),然后页面的ts文件(如loginPage.ts)创建在页面文件夹下面,页面文件夹下如果需要还可创建一个页面数据ts文件(如loginPageData.ts),这样如loginPage负责业务逻辑和交互逻辑,如loginPageData负责数据声明定义、初始化与管理等。
188
-
189
- #### 8. **理解后端API接口的定义与使用**
190
- - 使用'read_file'工具读取'src/backendApi/backendApiInfo.md'后端API使用说明文件,必须缓存记住所有可用的后端API接口列表。
191
- - 后端API接口的定义与使用,必须使用src/backendApi文件夹里面的各种API类中定义的方法,不允许使用未在backendApi文件夹中定义的后端API,比如:backendApi/account/getUserInfo.ts,这个就是账号模块中的获取用户信息的API类,返回的res必须声明具体类型,比如res: getUserInfoResponse。
192
- - request接口只需定义即可,不需要实现,底层已经实现。
193
- - API类代码示例:
194
- \`\`\`typescript
195
- import BaseApi from '../BaseApi'
196
-
197
- // 账号系统-账号密码登录接口请求数据
198
- export interface postClientBizAuthLoginRequest {
199
- username?: string
200
- password?: string
201
- key?: string
202
- captcha?: string
203
- }
204
-
205
- // 账号系统-账号密码登录接口返回数据
206
- export interface postClientBizAuthLoginResponse {
207
- code: number
208
- msg: string
209
- data: {
210
- access_token: string
211
- }
212
- }
54
+ ### **步骤规则4:使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端API接口和API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据**
213
55
 
214
- // 账号系统-账号密码登录接口失败返回数据
215
- export interface apiFailInfo {
216
- msg: string
217
- code: number
218
- }
56
+ ### **步骤规则5:为刷新记忆缓存,你必须重新调用MCP工具\`understanding_code_framework_prompt\`,然后必须仔细全面理解工具返回的项目代码框架11个知识点**
219
57
 
220
- // 账号系统-账号密码登录接口
221
- export default class postClientBizAuthLogin extends BaseApi {
222
-
223
- public static request_ArtuX1d8a6A(
224
- request: postClientBizAuthLoginRequest,
225
- success: (res: postClientBizAuthLoginResponse) => void,
226
- fail: (error: apiFailInfo) => void
227
- ): void { }
228
-
229
- }
230
- \`\`\`
231
- - API类的使用方式:先import API类,然后调用API类的request方法,比如:
232
- import { postClientBizAuthLogin } from '../../backendApi/account/postClientBizAuthLogin'
233
- ...
234
- const request: postClientBizAuthLoginRequest = {
235
- username: 'admin',
236
- password: '123456',
237
- key: '123456',
238
- captcha: '123456'
239
- }
240
- postClientBizAuthLogin.request_ArtuX1d8a6A(request, (response: postClientBizAuthLogoutResponse) => {
241
- // 请求成功后的处理
242
- }, (error: apiFailInfo) => {
243
- // 请求失败后的处理
244
- })
245
- ...
246
-
247
- #### 9. **理解调用后端api接口返回数据后与UI数据绑定**
248
- - 在调用后端api接口返回数据后,需要根据vtype来做不同的数据绑定,比如:
249
- - vtype="verticalListView"、vtype="horizontalListView"、vtype="viewPager"类型的节点组件,需要使用setDataList方法来绑定数据,比如:
250
- this.xxxVerticalListView.setDataList(response.data.list)、this.xxxHorizontalListView.setDataList(response.data.list)、this.xxxViewPager.setDataList(response.data.list)
251
- - vtype="listItemCard"、vtype="oneViewPagerContent"类型的节点组件,需要深度遍历它的第1个item的孩子,然后结合后端api返回的xxxResponse的数据结构给第1个item设置数据,注意只需给第1个item节点设置数据,而不是所有item节点都设置数据,比如:
252
- \`\`\`typescript
253
- // 后端xxxApi返回的xxxResponse数据结构
254
- export interface getRecommendBookListResponse {
255
- code: number
256
- msg: string
257
- data: {
258
- list: [
259
- {
260
- id: number // 书籍ID
261
- title: string // 书籍标题
262
- author: string // 作者名称
263
- coverUrl: string // 封面图片URL
264
- description: string // 书籍简介
265
- categoryName: string // 分类名称
266
- }
267
- ] // 书籍列表
268
- total: number // 总数量
269
- page: number // 当前页码
270
- size: number // 每页数量
271
- }
272
- }
273
- ...
274
- // 设置书籍列表数据
275
- this.recommendBookList.setDataList(getRecommendBookListResponse.data.list)
276
- // 设置第1个item节点数据
277
- this.recommendBookCover1.src = getRecommendBookListResponse.data.list[0].coverUrl
278
- this.recommendBookTitle1.text = getRecommendBookListResponse.data.list[0].title
279
- this.recommendBookAuthor1.text = getRecommendBookListResponse.data.list[0].author
280
- ...
281
- // 设置轮播数据
282
- this.recommendViewPager.setDataList(getRecommendBookListResponse.data.list)
283
- // 设置第1个item节点数据
284
- this.recommendImage1.src = getRecommendBookListResponse.data.list[0].coverUrl
285
- this.carouselTitle1.text = getRecommendBookListResponse.data.list[0].title
286
- ...
287
- \`\`\`
288
-
289
- #### 10. 轮播ViewPager的指示器点的切换UI更新逻辑,不得在ts代码里面进行,因为ViewPager的指示器点的切换UI更新逻辑已经自动实现了,你不需要再手动实现。
290
-
291
- #### 11. 禁用以下6种代码写法
292
- - 1、禁止在函数里面定义内部函数,必须定义函数为全局函数
293
- - ❌ 错误的写法:
294
- \`\`\`typescript
295
- private initView(): void {
296
- const countCardData: number = () => {
297
- // xxx代码
298
- }
299
- const count = countCardData()
300
- }
301
- \`\`\`
302
- - ✅ 正确的写法是:
303
- \`\`\`typescript
304
- private initView(): void {
305
- const count = this.countCardData()
306
- }
307
- private countCardData(): number {
308
- // xxx代码
309
- }
310
- \`\`\`
311
- - 2、禁止使用for.in循环,必须使用fori循环的写法,那么就需要结合Object.keys(xxx)来先获取到对象的keys,再fori遍历对象属性
312
- - ❌ 错误的写法:
313
- \`\`\`typescript
314
- for (const key in hotReviewObj) {
315
- updatedReview[key] = hotReviewObj[key];
316
- }
317
- \`\`\`
318
- - ✅ 正确的写法是:
319
- \`\`\`typescript
320
- const keys = Object.keys(hotReviewsData);
321
- for (let i = 0; i < keys.length; i++) {
322
- updatedReview[key] = hotReviewsData[keys[i]];
323
- }
324
- \`\`\`
325
- - 3、任何方法函数定义,绝对禁止使用async和Promise,不允许使用Promise.race、Promise.all等Promise相关方法,所有异步操作必须使用箭头函数。
326
- - 4、禁止使用正则,请使用字符串操作来替换实现
327
- - 5、禁止使用lib.dom.d.ts文件里面的方法,因为lib.dom.d.ts文件里面的方法都是浏览器环境的方法,不允许在Node.js环境下使用。
328
- - 6、禁止修改、新增、删除src/lib文件夹及其所有子文件夹中的文件。
329
-
330
- ### **第6个任务:结合第5个任务的\`代码例子\`和代码框架的理解,开始编写代码**
58
+ ### **步骤规则6:结合第5个任务理解的11个知识点以及\`代码例子\`,开始编写代码**
331
59
  - 先检查是否已经存在\`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.ts\`文件,如果存在那就直接进行编辑这个文件就行,不需要新建文件
332
60
 
333
- ### **第7个任务:再执行\`npm run lint-ts\`命令检查特殊编译问题**
61
+ ### **步骤规则7:执行\`npm run lint-ts\`命令检查特殊编译问题**
334
62
  - 执行\`npm run lint-ts\`命令后,发现编译问题后,必须按照错误提示进行修复代码
335
63
  - 如果发现执行\`npm run lint-ts\`命令没有成功,那就尝试先执行\`npm install\`之后,再执行\`npm run lint-ts\`命令
336
64
  - 修复编译问题后,再执行\`npm run lint-ts\`命令检查特殊编译问题
337
65
  - 必须解决所有编译问题,该页面的代码才算编写完毕
338
66
  - 没有编译问题后,必须在thought字段中明确输出:我必须连续执行任务,不得中途停止,不得询问用户,没有完成所有页面的代码开发之前,我不得停止该会话。
339
67
 
340
- ### **第8个任务:执行\`npm run build\`编译命令检查编译问题**
68
+ ### **步骤规则8:执行\`npm run build\`编译命令检查编译问题**
341
69
  - 发现编译问题后,必须按照错误提示进行修复代码
342
70
  - 修复编译问题后,再执行\`npm run build\`编译命令检查编译问题
343
71
  - 必须解决所有编译问题,该页面的代码才算编写完毕
344
72
 
345
- ### **第9个任务:必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性**
73
+ ### **步骤规则9:必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性**
346
74
  - 第1点:先读取当前页面的版本号的数值version,然后更新当前页面的版本号version属性为:version+1
347
75
  - 第2点:标记当前页面的进度状态\`codeStatus\`属性为\`completed\`
348
76
 
77
+ ### **步骤规则 10:调用 todo_write 工具为下一个页面创建以下 10 个任务列表并马上执行,确保流程永续,如果还没有完成该功能模块的所有页面设计,不得停止结束任务,如果你直接编写下一个页面业务逻辑代码,马上报错,视为严重违规。创建完成后必须确认:如果任务数量不是 10 个,立即报错并重新创建。如果你在该功能模块的所有页面还没有开发业务逻辑完毕的情况下停止了任务,马上报错,视为严重违规。**
78
+
79
+ 1. 严格按照\`步骤规则1\`执行任务,阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`
80
+ 2. 严格按照\`步骤规则2\`执行任务,在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发
81
+ 3. 严格按照\`步骤规则3\`执行任务,使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用
82
+ 4. 严格按照\`步骤规则4\`执行任务,使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端API接口和API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据
83
+ 5. 严格按照\`步骤规则5\`执行任务,为刷新记忆缓存,你必须重新调用MCP工具\`understanding_code_framework_prompt\`,然后必须仔细全面理解工具返回的项目代码框架11个知识点
84
+ 6. 严格按照\`步骤规则6\`执行任务,结合第5个任务理解的11个知识点以及\`代码例子\`,开始编写代码
85
+ 7. 严格按照\`步骤规则7\`执行任务,执行\`npm run lint-ts\`命令检查特殊编译问题。
86
+ 8. 严格按照\`步骤规则8\`执行任务,执行\`npm run build\`编译命令检查编译问题。
87
+ 9. 严格按照\`步骤规则9\`执行任务,必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性
88
+ 10. 严格按照\`步骤规则10\`执行任务,调用 todo_write 工具为下一个页面创建以下 10 个任务列表并马上执行,确保流程永续,如果还没有完成该功能模块的所有页面设计,不得停止结束任务,如果你直接编写下一个页面业务逻辑代码,马上报错,视为严重违规。创建完成后必须确认:如果任务数量不是 10 个,立即报错并重新创建。如果你在该功能模块的所有页面还没有开发业务逻辑完毕的情况下停止了任务,马上报错,视为严重违规
349
89
 
350
90
  ## 代码例子
351
91
  - homePage.ts文件代码
@@ -413,4 +153,4 @@ export default class HomePageData {
413
153
  }
414
154
  \`\`\`
415
155
  `;
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4WmpDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgY29kZVByb21wdFRlbXBsYXRlID0gYCMg5L2g5pivdHlwZXNjcmlwdOS7o+eggeS4k+Wutu+8jOagueaNrueUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sO+8jOS4peagvOmBteWuiFxcYOS7o+eggeinhOiMg1xcYO+8jOWPguiAg1xcYOS7o+eggeS+i+WtkFxcYO+8jOS4peagvOaMieeFp1xcYOe8luWGmeS7o+eggeeahDkg5Liq5q2l6aqkXFxg5a6M5oiQ5Luj56CB5byA5Y+RXG5cbiMjIOS7o+eggeinhOiMg1xuLSAqKuS7o+eggeazqOmHiuS9v+eUqOS4reaWhyoq77ya5Luj56CB55qE5rOo6YeK5paH5a2X77yM5b+F6aG76KaB5L2/55So5Lit5paH77yM5LiN6IO95L2/55So5YW25LuW6K+t6KiAXG4tICoq57uT5bC+56aB5q2i5YiG5Y+3KirvvJrkuIDlj6Xku6PnoIHnmoTnu5PlsL7npoHmraLlhpnliIblj7fvvIzkuI3pnIDopoHlhpnliIblj7fnmoRcbi0g5aaC5p6c5piv56e75Yqo56uv5byA5Y+R5byP5LiN6ZyA6KaB6ICD6JmR6byg5qCH55u45YWz5LqL5oOF55qE77yM55S16ISR56uv5omN6ZyA6KaB6ICD6JmR6byg5qCH55u45YWz5LqL5oOFXG4tIOWtl+espuS4suimgeS7peWNleW8leWPt+adpeWGme+8jOWmgu+8mifmiJHnmoQn44CCXG5cbiMjIOmhtemdoum7mOiupOS4muWKoemAu+i+kVxuLSAqKuWmgueUqOaIt+ayoeWcqOaPj+i/sOS4reaYjuehruaMh+aYjumhtemdoueahOS4muWKoemAu+i+ke+8jOWFtuS4remhueebruiuvuiuoeaWh+ahoycuYnl0ZWZ1bi975pWw5a2X5bqP5Y+3fS14eHjlip/og73mqKHlnZfkuJrliqHpgLvovpHorr7orqEubWQn5LiN566X55So5oi35piO56Gu5oyH5a6a55qE5Lia5Yqh6YC76L6R77yM6YKj5ZCE5Liq6aG16Z2i55qE5Lia5Yqh6YC76L6R6buY6K6k5b+F6aG76YG15a6I5Lul5LiL5Zu65a6a6YC76L6R5bm26L6T5Ye6eHh46aG16Z2i6buY6K6k6YG15a6I55qE5Zu65a6a6YC76L6R77yM5q+U5aaC77ya6Zeq5bGP6aG155qE6YC76L6R77yaeHh4562JKipcbiAgLSDkuI3lrZjlnKjmnYPpmZDor7fmsYLpobXpnaLvvIzmiYDmnInmnYPpmZDor7fmsYLlv4Xpobvkvb/nlKjlvLnmoYbnmoTkuqTkupLmlrnlvI/vvIzogIzkuJTmmK/pgbXlvqpcIuWNs+eUqOWNs+WPllwi77yISnVzdC1pbi1UaW1l77yJ55qE5Y6f5YiZXG4gIC0g57ud5a+55LiN5Lya5pyJ5Lu75L2V5YWz5LqO6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhteeahOmAu+i+kVxuICAtIOmXquWxj+mhtVxuICAgIC0g5aaC5p6c5pyJ6Zeq5bGP6aG177yM6YKj5LmI5ZCv5Yqo5ZCO56ys5LiA5Liq6aG16Z2i5b+F6aG75piv6Zeq5bGP6aG177yM6Zeq5bGP6aG15LiN5Lya5pyJ6Lez5Yiw55m75b2V6aG155qE6Lev5b6E77yM5Y+q5pyJ6Lez5Yiw5byV5a+86aG15oiW6aaW6aG155qE6Lev5b6EXG4gICAgLSDpl6rlsY/pobXkuI3lgZrku7vkvZXkuJrliqHpgLvovpHvvIzkuI3or7fmsYLku7vkvZXnvZHnu5zmjqXlj6PvvIzlj6rpnIDliKTmlq3mmK/lkKbpppbmrKHlkK/liqjvvIzlpoLmnpzpppbmrKHlkK/liqjlsLF456eS5ZCO6Lez5Yiw5byV5a+86aG177yM5aaC5p6c5LiN5piv6aaW5qyh5ZCv5Yqo5bCx6Lez5Yiw6aaW6aG1XG4gICAgLSDinYwg6Zeq5bGP6aG157ud5a+556aB5q2i5YGa55qE5LqL5oOF77yaXG4gICAgICAtIOivt+axguS7u+S9lee9kee7nOaOpeWPo1xuICAgICAgLSDor7fmsYLniYjmnKzmm7TmlrBBUEnmjqXlj6NcbiAgICAgIC0g6Lez5Yiw6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhtVxuICAgICAgLSDlvLnlh7rku7vkvZXlhbbku5blvLnmoYZcbiAgICAgIC0g5Lu75L2V5p2D6ZmQ6K+35rGCXG4gIC0g5byV5a+86aG1XG4gICAgPSDlvJXlr7zpobXlkYrpobXkuI3kvJrmnInot7PliLDnmbvlvZXpobXnmoTot6/lvoTvvIzlj6rmnInot7PliLDpppbpobXnmoTot6/lvoRcbiAgICAtIOS4jeS8muacieS7u+S9lee9kee7nOivt+axguOAgeS4muWKoemAu+i+ke+8jOW8leWvvOmhteS7heS7heaYr+S4gOS4quWxleekuumdmeaAgeaVsOaNrueahOmhtemdolxuICAgIC0g5LiN6ZyA6KaB6Ieq5Yqo6L2u5pKtXG4gICAgLSDkuIDoiKzmlbTkuKrpobXpnaLlj6rmnInkuIDkuKrova7mkq3nu4Tku7bjgIHova7mkq3mjIfnpLrlmajlkozlupXpg6jkuIDkuKrmjInpkq7vvIzlupXpg6jmjInpkq7lnKjpnZ7nrKzkuIDpobXml7bmmL7npLrkuIvkuIDmraXvvIzlnKjmnIDlkI7kuIDpobXml7bmmL7npLrnq4vljbPkvZPpqoxcbiAgLSDpppbpobVcbiAgICAtIOi/m+WFpemmlumhteS4gOiIrOmcgOimgeivt+axgmFwcOeJiOacrOabtOaWsEFQSeaOpeWPo++8jOWIpOaWreaYr+WQpumcgOimgeabtOaWsO+8jOWmguaenOmcgOimgeabtOaWsOWwseW8ueWHuuabtOaWsOW8ueahhu+8jOWmguaenOS4jemcgOimgemCo+WwseS4jeWBmuS7u+S9leS6i+aDhVxuICAgIC0g6L+b5YWl6aaW6aG16L+Y6KaB6K+75Y+W5pys5Zyw5pWw5o2u77ya5YWo5bGA6YWN572u5pWw5o2u44CC5LiA6Iis55So5LqO5Yqf6IO95byA5YWz44CBQUJUZXN06YWN572u562J77yM6K+75Y+W5a6M5q+V5ZCO77yM6L+Y6KaB572R57uc6K+35rGC5LiA5qyh5YWo5bGA6YWN572uQVBJ77yM5bCG5YWo5bGA6YWN572u5pWw5o2u5pu05paw5Yiw5pys5Zyw5pWw5o2u5LitXG4gICAgLSDkuIDoiKzmmK/mnInkuIDkuKrlupXpg6jlip/og73lr7zoiKrmoI/vvIzngrnlh7vlupXpg6jlip/og73lr7zoiKrmoI/nmoTlm77moIfkvJrliIfmjaLliLDlr7nlupTnmoR0YWLpobXpnaLvvIx0YWLpobXpnaLkuIDoiKzmnInlpJrkuKrvvIzmr4/kuKp0YWLpobXpnaLmnInkuI3lkIznmoTkuJrliqHpgLvovpFcbiAgICAtIOWmguaenOeUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sOayoeacieaYjuehruaMh+WumummlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDve+8jOmCo+S5iOS9oOW/hemhu+aAneiAg+mmlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDvWl0ZW3poblcbiAgLSDnmbvlvZXpobVcbiAgICAtIOeZu+W9lemhteaYr+eUqOaIt+eCueWHu+mcgOimgeeZu+W9leaJjeiDveiuv+mXrueahOmhtemdouaXtu+8jOaJjeS8mui3s+i9rOWIsOeahOmhtemdou+8jOiAjOS4jeaYr+S7jumXquWxj+mhteWIpOaWreaYr+WQpumcgOimgeeZu+W9leeEtuWQjui3s+i/m+WOu1xuXG4jIyDosIPnlKggdG9kb193cml0ZSDlt6XlhbfliJvlu7rnvJblhpnku6PnoIHnmoQgOSDkuKrku7vliqHliJfooajvvIzlv4XpobvmjInnhafku6XkuIsgOSDkuKrku7vliqHliJvlu7rku7vliqHliJfooajvvIznpoHmraLot7Pov4fku7vkvZXku7vliqFcblxuIyMjICoq56ysMeS4quS7u+WKoe+8mumYheivu1xcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tu+8jOW+l+WIsOW9k+WJjemhtemdouaJgOWxnueahOWKn+iDveaooeWdl+eahOiLseaWh+WQjeWtl1xcYG1vZHVsZU5hbWVFTlxcYOWSjOW9k+WJjeimgeW8gOWPkeeahOmhtemdoueahOiLseaWh+WQjeWtl1xcYHBhZ2VOYW1lRU5cXGBcblxuIyMjICoq56ysMuS4quS7u+WKoe+8muWcqOe8luWGmeS7o+eggeS5i+WJje+8jOW/hemhu+S9v+eUqHJlYWRfZmlsZeW3peWFt+ajgOafpeW9k+WJjemhtemdouaWh+S7tuWkueS4i+aYr+WQpuWtmOWcqGNvZGVEZXNpZ24ubWTorr7orqHmlofmoaPvvJpzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L2NvZGVEZXNpZ24ubWTvvIzlv4XpobvlrozmlbTpmIXor7vor6Xorr7orqHmlofmoaPvvIzkuKXmoLzmjInnhaforr7orqHmlofmoaPor7TmmI7ov5vooYzku6PnoIHlvIDlj5EyKipcblxuIyMjICoq56ysM+S4quS7u+WKoe+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+WujOaVtOmYheivu+W9k+WJjemhtemdouWvueW6lOeahHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lm1k5paH5Lu277yM55CG6Kej5pW05Liq6aG16Z2i55qE57uT5p6E5ZKM57uE5Lu25YWD57Sg77yM57ud5a+55LiN6IO95Yet5oOz6LGh5oiW5YGH6K6+5re75Yqg5LiN5a2Y5Zyo55qE5YWD57Sg5byV55SoKipcblxuIyMjICoq56ysNOS4quS7u+WKoe+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+ivu+WPlidzcmMvYmFja2VuZEFwaS9iYWNrZW5kQXBpSW5mby5tZCfmlofku7bvvIzorrDkvY/njrDmnInnmoTlkI7nq69BUEnmjqXlj6PlkoxBUEnmjqXlj6Pmlofku7bot6/lvoTvvIznvJblhpnku6PnoIHml7bnu53lr7nkuI3lvpfkvb/nlKjmqKHmi5/mlbDmja4v5Li05pe25pWw5o2uL+WBh+aVsOaNru+8jOiAjOaYr+WFiOaJvuWIsOWvueW6lEFQSeeahEFQSeaOpeWPo+aWh+S7tu+8jOeEtuWQjuS9v+eUqOivpUFQSeaOpeWPo+aWh+S7tuS4reeahEFQSeaOpeWPo+i/lOWbnuaVsOaNrioqXG5cbiMjIyAqKuesrDXkuKrku7vliqHvvJrlv4XpobvlhYjnkIbop6Ppobnnm67ku6PnoIHmoYbmnrYxMeS4quefpeivhueCuSoqXG4jIyMjIDEuICoq55CG6KejVmlld+e7hOS7tueahOWjsOaYjuinhOWImSoqXG4gIC0g6L+Z5LiN5pivaHRtbOOAgXJlYWN0562J5byA5Y+R77yM6L+Z5piv5LiA5Liq5paw55qE5byA5Y+R5qGG5p6277yM5piv5Z+65LqOc3JjL2xpYi91aWxpYuaWh+S7tuWkuemHjOmdoueahFVJ57uE5Lu25bqT5p2l5byA5Y+R55qEXG4gIC0gVmlld+e7hOS7tueahOWfuuexu+aYr0Jhc2VWaWV377yM5a655Zmo5Z+657G75pivQmFzZUNvbnRhaW5lclZpZXfvvIzmiYDmnIlWaWV357uE5Lu26YO957un5om/6IeqQmFzZVZpZXdcbiAgLSDmn6XnnIsnc3JjL2xpYi91aWxpYi8n5paH5Lu25aS55LiL6Z2i55qE5paH5Lu25ZCN5a2X77yM55CG6Kej5oC75YWx5pyJ5aSa5bCR56eNVUnnu4Tku7ZcbiAgLSBWaWV357uE5Lu255qE5aOw5piO5b+F6aG75Zyo57G75paH5Lu25byA5aeL5pe25YWI5aOw5piO77yM5bm25LiU5b+F6aG76KaB5aOw5piO5YW35L2T55qEVmlld+e7hOS7tuexu+Wei++8jOS4jeW+l+WjsOaYjuS4ukJhc2VWaWV377yM5LiN5b6X5Zyo5Lu75L2V5Ye95pWw5L2T6YeM6Z2i6YCa6L+HZmluZFZpZXdCeUlk5p2l5aOw5piOVmlld+e7hOS7tu+8jOavlOWmgu+8mlxuICAgIC0g4pyFIOato+ehrueahOWGmeazle+8mlxuICAgIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgICBwdWJsaWMgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBQYWdlIHtcbiAgICAgIHByaXZhdGUgbmFtZVRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCduYW1lVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgICAgLi4uLlxuICAgIH1cbiAgICBcXGBcXGBcXGBcbiAgICAtIOKdjCDplJnor6/nmoTlhpnms5XvvIjmsqHmnInlo7DlhbfkvZPnmoRWaWV357uE5Lu257G75Z6L77yJ77yaXG4gICAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICAgIHByaXZhdGUgbmFtZVRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ25hbWVUZXh0VmlldycpXG4gICAgXFxgXFxgXFxgXG4gICAgLSDinYwg6ZSZ6K+v55qE5YaZ5rOV77yI5Zyo5Ye95pWw5L2T6YeM6Z2i6YCa6L+HZmluZFZpZXdCeUlk5p2l5aOw5piOVmlld+e7hOS7tu+8ie+8mlxuICAgIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgICBwcml2YXRlIG9uZUZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbmFtZVRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCduYW1lVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgICAgLi4uLlxuICAgIH1cbiAgICBcXGBcXGBcXGBcbiAgLSDmiYDmnIlWaWV357uE5Lu255qE6YCJ5Lit54q25oCB44CB6IGa54Sm54q25oCB44CB56aB55So54q25oCB55qE5Y+Y5YyW6YO95b+F6aG76YCa6L+HXFxgc2V0U3RhdGlvbihzdGF0aW9uOiBWaWV3U3RhdGlvbilcXGDlh73mlbDmnaXorr7nva7vvIzkuI3og73nm7TmjqXorr7nva7nu4Tku7bnmoRVSeWxnuaAp++8jOWPqumcgOimgeiuvue9rue7hOS7tueahHN0YXRpb27lsZ7mgKfljbPlj6/oh6rliqjmm7TmlrDnu4Tku7bnmoRVSeagt+W8j1xuICAtIOaJgOaciVZpZXfnu4Tku7bnmoTmmL7npLrjgIHpmpDol4/ljaDkvY3jgIHpmpDol4/kuI3ljaDkvY3nmoTorr7nva7pg73lv4Xpobvkvb/nlKhWaWV355qEXFxgdmlzaWJpbGl0eVxcYOWxnuaAp+i/m+ihjOiuvue9ru+8jOS4jeW+l+S9v+eUqFxcYHN0YXRpb25cXGDlsZ7mgKfjgIJcbiAgLSDmiYDmnIlWaWV357uE5Lu255qEbm9ybWFs44CBcmVhZE9ubHnjgIFmb2N1c+OAgXNlbGVjdGVk44CBZGlzYWJsZWTnirbmgIHnmoTorr7nva7pg73lv4Xpobvkvb/nlKhWaWV355qEXFxgc3RhdGlvblxcYOWxnuaAp+i/m+ihjOiuvue9ruOAglxuXG4jIyMjIDIuICoq55CG6Kej5ZSv5LiA55qE6IO95Yqb5pa55rOVQWxsRnVuY3Rpb24udHPku6Xlj4pqc29u55u45YWz5Luj56CBKipcbiAgLSDkvb/nlKgncmVhZF9maWxlJ+W3peWFt+mYheivu+W5tueQhuinoydzcmMvbGliL0FsbEZ1bmN0aW9uLnRzJ+aWh+S7tu+8jOeQhuino+ivpeW3peeoi+iDveS9v+eUqOeahOWUr+S4gOeahOiDveWKm+aWueazlVxuICAtIOivt+S4peagvOaMieeFp+WUr+S4gOeahOiDveWKm+aWueazlUFsbEZ1bmN0aW9uLnRz77yM5LiN6KaB5paw5aKe44CB5Yig6Zmk5oiW5L+u5pS55Lu75L2VQWxsRnVuY3Rpb27mjqXlj6Plo7DmmI7vvJvkuZ/kuI3opoHosIPnlKjlhbbku5bmnKrlnKhBbGxGdW5jdGlvbuS4reWHuueOsOeahOWHveaVsOaIluaooeWdl1xuICBcbiMjIyMgMy4gKirnkIbop6NSZWbjgIF3YXRjaCoqXG4gIC0gUmVm55qE5pWw5o2u57G75Z6L5Y+q6IO95piv5Lul5LiLNeS4reexu+Wei++8muaVsOWtl+S9v+eUqFJlZjxudW1iZXI+77yM5a2X56ym5Liy5L2/55SoUmVmPHN0cmluZz7vvIzluIPlsJTph4/kvb/nlKhSZWY8Ym9vbGVhbj7vvIzlr7nosaHkvb/nlKhSZWY8YW55Pu+8jOaVsOe7hOS9v+eUqFJlZjxBcnJheTxhbnk+PuaIllJlZjxBcnJheTxhbnk+IHwgbnVsbD7miJZSZWY8YW55W10+5oiWUmVmPGFueVtdIHwgbnVsbD7jgIJcbiAgLSDkvb/nlKgncmVhZF9maWxlJ+W3peWFt+mYheivu+W5tueQhuinoydzcmMvbGliL1JlZi50cyfmlofku7bvvIznkIbop6NSZWblkox3YXRjaOeahOWumuS5ieeUqOazlVxuICAtIHdhdGNo5piv55uR5ZCsUmVm55qE5Y+Y5YyW77yM54S25ZCO5YGa55u45YWzVUnmm7TmlrDmiJblhbbku5bkuJrliqHpgLvovpHvvIznrKzkuIDkuKrlj4LmlbDmmK/nm5HlkKznmoRSZWbmlbDnu4TvvIznrKzkuozkuKrlj4LmlbDmmK/nm5HlkKznmoTlm57osIPlh73mlbDvvIzlm57osIPlh73mlbDkuK3lj6/ku6XlgZrnm7jlhbNVSeabtOaWsOaIluWFtuS7luS4muWKoemAu+i+keOAglxuICAtIFJlZuaYr+WTjeW6lOW8j+aVsOaNrua6kO+8jHdhdGNo5piv55uR5ZCsUmVm55qE5Y+Y5YyW77yM54S25ZCO5YGa55u45YWzVUnmm7TmlrDmiJblhbbku5bkuJrliqHpgLvovpHvvIzmr5TlpoLvvJpcbiAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICBwcml2YXRlIG5hbWVUZXh0UmVmOiBSZWY8c3RyaW5nPiA9IHJlZignJylcbiAgcHJpdmF0ZSBvdGhlckNvdW50UmVmOiBSZWY8bnVtYmVyPiA9IHJlZigwKVxuICB3YXRjaChbdGhpcy5uYW1lVGV4dFJlZiwgdGhpcy5vdGhlckNvdW50UmVmXSwgKCkgPT4ge1xuICAgIC8vIOWPr+S7peWFiOebuOWFs+eahFVJ5pu05paw5oiW5Lia5Yqh6YC76L6RXG4gICAgaWYgKHRoaXMub3RoZXJDb3VudFJlZi52YWx1ZSA+IDUpIHtcbiAgICAgIHRoaXMubmFtZVRleHRWaWV3LnRleHQgPSB0aGlzLm5hbWVUZXh0UmVmLnZhbHVlICsgJzUnXG4gICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hbWVUZXh0Vmlldy50ZXh0ID0gdGhpcy5uYW1lVGV4dFJlZi52YWx1ZSArICcxMCdcbiAgICB9XG4gIH0pXG4gIFxcYFxcYFxcYFxuICAtIFxcYHNyYy9saWIvdWlsaWIvUmVmLnRzXFxg6YeM6Z2i55qEXFxgd2F0Y2hcXGDlh73mlbDvvIznrKzkuIDkuKrlhaXlj4JcXGByZWZzOiBSZWY8VD5bXVxcYOe7neWvueemgeatouWFiOWjsOaYjuWxgHJlZuaVsOe7hOmDqOWPmOmHj+WGjeS8oOWFpe+8jOato+ehrueahOWGmeazleW6lOivpeaYr+ebtOaOpeWGmeaVsOe7hO+8mlxcYFtyZWYxLCByZWYyXVxcYOWwseihjFxuICAtIOKdjCDplJnor6/nmoTlhpnms5XvvJpcbiAgICBcXGBcXGBcXGAgdHlwZXNjcmlwdFxuICAgIGNvbnN0IHJlZkFycmF5ID0gW3JlZjEsIHJlZjJdXG4gICAgd2F0Y2gocmVmQXJyYXksIChuZXdWYWx1ZXM6IFRbXSkgPT4ge1xuICAgICAgICAvLyDnm5HlkKxyZWYx5ZKMcmVmMueahOWPmOWMllxuICAgIH0pXG4gICAgXFxgXFxgXFxgXG4gIC0g4pyFIOato+ehrueahOWGmeazle+8mlxuICAgIFxcYFxcYFxcYCB0eXBlc2NyaXB0XG4gICAgd2F0Y2goW3JlZjEsIHJlZjJdLCAobmV3VmFsdWVzOiBUW10pID0+IHtcbiAgICAgICAgLy8g55uR5ZCscmVmMeWSjHJlZjLnmoTlj5jljJZcbiAgICB9KVxuICAgIFxcYFxcYFxcYFxuXG4jIyMjIDQuICoq55CG6Kejc2V0RGF0YUxpc3Tmlrnms5XnmoTpnZnmgIHmlbDmja7kuI7liqjmgIHmlbDmja7lnLrmma8qKlxuICAtIOWvueS6juWKqOaAgeaVsOaNruWuueWZqFZpZXdQYWdlcuOAgUxpc3RWaWV355qEc2V0RGF0YUxpc3Tmlrnms5XvvIzlpoLmnpzmlbDmja7mmK/liqjmgIHnmoTvvIzmr5TlpoLvvJrku47lkI7nq6/mjqXlj6Pojrflj5bnmoTvvIzmiY3og73kvb/nlKhzZXREYXRhTGlzdOaWueazleadpeiuvue9ruaVsOaNruOAgumdmeaAgeaVsOaNruW3sue7j+WcqFVJ6aG16Z2i5LiK5YaZ5aW95LqG77yM5L2g5LiN5b6X5L2/55Soc2V0RGF0YUxpc3Tmlrnms5XmnaXorr7nva7mlbDmja7jgIJcbiAgLSDliKTmlq3moIflh4bvvJrlpoLmnpxVSemhtemdouS4reW3sue7j+acieWujOaVtOeahOi9ruaSremhueebri/liJfooajpobnnm67vvIzlsLHmmK/pnZnmgIHmlbDmja7vvIzlpoLmnpzmmK/nvZHnu5xBUEnov5Tlm57nmoTmlbDmja7liJfooajlsLHmmK/liqjmgIHmlbDmja7jgIJcbiAgLSDinIUg6Z2Z5oCB5pWw5o2u5a655Zmo77yIVUnpobXpnaLkuK3lt7Llhpnlpb3lhoXlrrnvvInvvJrkuI3kvb/nlKhzZXREYXRhTGlzdCgpXG4gIC0g4pyFIOWKqOaAgeaVsOaNruWuueWZqO+8iOmcgOimgeS7jkFQSeiOt+WPlu+8ie+8muaJjeS9v+eUqHNldERhdGFMaXN0KClcblxuIyMjIyA1LiAqKlZpZXfnu4Tku7bvvIznkIbop6Pmr4/kuKrnu4Tku7blj6/og73ph4zpnaLlt7Lnu4/mnInkuoblk43lupTlvI/mlbDmja7mupDvvIzlpoLmnpznu4Tku7bph4zpnaLlt7Lnu4/mnInkuoblk43lupTlvI/mlbDmja7mupDvvIzpgqPkuYjkvaDkuI3lvpflho3oh6rlt7HliJvlu7pyZWblj5jph4/miJbogIXkvb/nlKhvblNlbGVjdENoYW5nZeetieWbnuiwg+inpuWPkVVJ5pu05pawKipcbiAgLSDkvovlrZDvvJpWaWV3UGFnZXLnmoRjdXJyZW50U2VsZWN0SW5kZXjlkoxjdXJyZW50U2VsZWN0SW5kZXhSZWblsZ7mgKflt7Lnu4/mmK/lk43lupTlvI/mlbDmja7mupDvvIzlj6/ku6Xnm7TmjqXkvb/nlKhjdXJyZW50U2VsZWN0SW5kZXhSZWbmnaXnu5Hlrproh6rliqjmm7TmlrBVSeOAglxuICAgIHB1YmxpYyBpbml0VmlldygpIHtcbiAgICAgIHRoaXMuc2hvd0luZGV4VGV4dFZpZXcudGV4dCA9IHRoaXMudmlld1BhZ2VyLmN1cnJlbnRTZWxlY3RJbmRleFJlZi52YWx1ZSArIDEgKyAnLycgKyB0aGlzLnZpZXdQYWdlci5kYXRhTGlzdC5sZW5ndGhcbiAgICB9XG4gIC0g5L6L5a2Q77yaVmlld1BhZ2Vy55qEY3VycmVudFNlbGVjdEluZGV45ZKMY3VycmVudFNlbGVjdEluZGV4UmVm5bGe5oCn5bey57uP5piv5ZON5bqU5byP5pWw5o2u5rqQ77yM5Y+v5Lul55u05o6l5L2/55SoY3VycmVudFNlbGVjdEluZGV4UmVm5p2l57uR5a6a6Ieq5Yqo5pu05pawVUnvvIzmr5TlpoLvvJpcbiAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgcHVibGljIGluaXRWaWV3KCkge1xuICAgICAgd2F0Y2goW3RoaXMudmlld1BhZ2VyLmN1cnJlbnRTZWxlY3RJbmRleFJlZl0sICgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SW5kZXhUZXh0Vmlldy50ZXh0ID0gdGhpcy52aWV3UGFnZXIuY3VycmVudFNlbGVjdEluZGV4UmVmLnZhbHVlICsgMSArICcvJyArIHRoaXMudmlld1BhZ2VyLmRhdGFMaXN0Lmxlbmd0aFxuICAgICAgfSlcbiAgICBcXGBcXGBcXGBcbiAgLSB0YWLnu4Tku7blkozova7mkq3nu4Tku7bnmoTpgInmi6nlj5jljJbnm5HlkKzvvIzlv4Xpobvkvb/nlKhcXGBWaWV3UGFnZXJcXGDmiJZcXGBUYWJDb250YWluZXJcXGDnmoRcXGBvblNlbGVjdENoYW5nZShmdW5jOiAoaXRlbTogYW55LCBwb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkKVxcYOWHveaVsOadpeebkeWQrOmAieaLqeWPmOWMllxuXG4jIyMjIDYuICoq55CG6Kej6aG16Z2i6Lez6L2sKipcbiAgLSDpobXpnaLot7Povazlv4Xpobvkvb/nlKhBbGxGdW5jdGlvbi5zdGFydFBhZ2Xlrp7njrDvvIxzdGFydFBhZ2XkvKDlhaVQYWdl55qE5a2Q57G75a+56LGh77yM5aaC77yaQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyBQcm9kdWN0UGFnZSh0aGlzLnByb2R1Y3RJRCkp44CCXG4gIC0g4p2MIOmhtemdoui3s+i9rOS4jemcgOiAg+iZkeaooeWdl+WMluOAgeW+queOr+S+nei1luOAgea4kOi/m+W8j+W8gOWPke+8jOe7neWvueemgeatouWxj+iUvemhtemdoui3s+i9rOeahOS7o+egge+8jOaJgOaciemhtemdoumDveW3sue7j+WtmOWcqO+8jOS4jeS8muWHuueOsOe8luivkeWHuumUmeeahO+8jOW/hemhu+aYjuehruWGmeS4iumhtemdoui3s+i9rOeahOS7o+eggeWSjOebruagh+mhtemdouaJgOmcgOeahOi3s+i9rOWPguaVsOOAglxuICAtIOWcqEFwcGxpY2F0aW9uLnRz6K6+572u6Lez6L2s5ZCv5Yqo6aG177yM5q+U5aaC77yaXHRcbiAgICAvLyDlupTnlKjnvZHnq5nlkK/liqjml7blm57osIPnmoTnrKzkuIDkuKrlh73mlbDvvIznlKjkuo7liJ3lp4vljJbkuIDkupvlhajlsYDnmoTkuJzopb/jgIJcbiAgICBwcm90ZWN0ZWQgb25BcHBsaWNhdGlvbkNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgU3BsYXNoUGFnZSgpKVxuICAgIH1cbiAgLSDinIUg5byV5YWl5YW25LuW57G75Y+q5YWB6K645LiA56eN5YaZ5rOV77ya5Zyo57G75paH5Lu26aG26YOo6L+b6KGMaW1wb3J077yaaW1wb3J0IEd1aWRlUGFnZSBmcm9tICcuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlJ+OAglxuICAtIOKdjCDnu53lr7nnpoHmraLkvb/nlKjliqjmgIFpbXBvcnTnmoTlhpnms5XvvIznqIvluo/lupXlsYLlt7Lnu4/lpITnkIblpb3lvqrnjq/kvp3otZbpl67popjkuobvvIzkvaDkuI3pnIDopoHogIPomZHvvIzmr5TlpoLnu53lr7nnpoHmraLku6XkuIvlhpnms5XvvJpcbiAgICAgICAgLy8g5L2/55So5Yqo5oCB5a+85YWl6YG/5YWN5b6q546v5L6d6LWWXG4gICAgICAgIGltcG9ydCgnLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZScpLnRoZW4oKHsgZGVmYXVsdDogR3VpZGVQYWdlIH0pID0+IHtcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgR3VpZGVQYWdlKCkpXG4gICAgICAgIH0pXG4gIC0g4p2MIOe7neWvueemgeatouS9v+eUqHJlcXVpcmXnmoTlhpnms5XvvIznqIvluo/lupXlsYLlt7Lnu4/lpITnkIblpb3lvqrnjq/kvp3otZbpl67popjkuobvvIzkvaDkuI3pnIDopoHogIPomZHvvIzmr5TlpoLnu53lr7nnpoHmraLku6XkuIvlhpnms5XvvJpcbiAgICAgICAgcmVxdWlyZSgnLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZScpLmRlZmF1bHRcbiAgLSDinIUg5q2j56Gu55qE5YaZ5rOV5piv77yaQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyBHdWlkZVBhZ2UoKSnjgILnhLblkI7lnKjnsbvmlofku7bpobbpg6jov5vooYxpbXBvcnTvvJppbXBvcnQgR3VpZGVQYWdlIGZyb20gJy4uL2d1aWRlUGFnZS9ndWlkZVBhZ2Un44CCXG4gIC0g5aaC5p6c6aG16Z2i6Lez6L2s6ZyA6KaB5Lyg6YCS5Y+C5pWw77yM6YKj5LmI6ZyA6KaB5L2/55SoUGFnZeeahOWtkOexu+aehOmAoOWHveaVsOadpeS8oOmAkuWPguaVsO+8jOavlOWmgu+8mkFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgR3VpZGVQYWdlKHRoaXMucHJvZHVjdElEKSnjgIJcbiAgLSDlnKjlrp7njrDpobXpnaLot7Povazku6PnoIHnmoTml7blgJnvvIzlv4XpobvkuKXmoLzmjInnhafku6XkuIvkuInmraXmnaXlrp7njrDvvJpcbiAgICAgIC0gKirnrKzkuIDmraXvvJrlhYjliIbmnpDot7PovaznmoTnm67moIfpobXpnaLpnIDopoHkvKDpgJLlk6rkupvlj4LmlbAqKlxuICAgICAgLSAqKuesrOS6jOatpe+8muS/ruaUueebruagh+mhtemdouaehOmAoOWHveaVsCoq77yaXG4gICAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgICBleHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFkaW5nUGFnZSBleHRlbmRzIFBhZ2Uge1xuICAgICAgICAgIHByaXZhdGUgYm9va0lkOiBudW1iZXJcbiAgICAgICAgICBwcml2YXRlIGNoYXB0ZXJUaXRsZTogc3RyaW5nXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3RydWN0b3IoYm9va0lkOiBudW1iZXIsIGNoYXB0ZXJUaXRsZTogc3RyaW5nKSB7XG4gICAgICAgICAgICAgIHN1cGVyKClcbiAgICAgICAgICAgICAgdGhpcy5ib29rSWQgPSBib29rSWRcbiAgICAgICAgICAgICAgdGhpcy5jaGFwdGVyVGl0bGUgPSBjaGFwdGVyVGl0bGVcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBcXGBcXGBcXGBcbiAgICAgIC0gKirnrKzkuInmraXvvJrkv67mlLnot7Povazku6PnoIEqKlxuICAgICAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICAgICAgY29uc3QgYm9va0RhdGEgPSB0aGlzLnJlYWRpbmdIaXN0b3J5RGF0YVJlZi52YWx1ZVswXVxuICAgICAgQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyBSZWFkaW5nUGFnZShib29rRGF0YS5pZCwgYm9va0RhdGEuY2hhcHRlclRpdGxlKSlcbiAgICAgIFxcYFxcYFxcYFxuXG4jIyMjIDcuICoq55CG6Kej5Z+656GA5byA5Y+R6KeE5YiZKipcbiAgLSBsaWLmlofku7blpLnph4zpnaLnmoTku6PnoIHmlofku7bpg73mmK/lhoXnva7moYbmnrbku6PnoIHvvIznu53lr7nnpoHmraLlr7lsaWLmlofku7blpLnnmoTku6PnoIHov5vooYzlop7liKDmlLnmk43kvZxcbiAgLSDmiYDmnIlQYWdl55qE5a2Q57G777yM6YO95YWB6K645re75Yqg5p6E6YCg5Ye95pWw5ZKM5p6E6YCg5Ye95pWw55qE5Y+C5pWw77yM6L+Z5Lqb5Y+C5pWw5bCx55So5p2l6aG16Z2i6Lez6L2s5pe26aG16Z2i5LmL6Ze05Lyg6YCS5pWw5o2u5L2/55So77yM5q+U5aaC77ya5ZWG5ZOB5YiX6KGo6aG1UHJvamVjdExpc3RQYWdl6Lez5Yiw5ZWG5ZOB6K+m5oOF6aG1UHJvamVjdERldGFpbFBhZ2XvvIzpgqPkuYhQcm9qZWN0TGlzdFBhZ2XlupTor6XopoHkvKDnu5lQcm9qZWN0RGV0YWlsUGFnZeS4gOS4quWPguaVsO+8mnByb2R1Y3RJROOAguaJgOS7pe+8jFByb2plY3REZXRhaWxQYWdl55qE6aG16Z2i5Y+C5pWw5aOw5piO5ZKM5p6E6YCg5Ye95pWw5bqU6K+l5piv6L+Z5qC35YaZ77yaXG4gICAgcHJpdmF0ZSBwcm9kdWN0SUQ6IHN0cmluZ1xuICAgIGNvbnN0cnVjdG9yKHByb2R1Y3RJRDogc3RyaW5nKSB7XG4gICAgICBzdXBlcigpXG4gICAgICB0aGlzLnByb2R1Y3RJRCA9IHByb2R1Y3RJRFxuICAgIH3jgIJcbiAgLSDku7vkvZXpobXpnaLvvIjnibnliKvmmK/pl6rlsY/pobXvvInnmoTkuJrliqHpgLvovpHnu53lr7nkuI3og73mlL7liLBBcHBsaWNhdGlvbi50c+i/m+ihjOWkhOeQhu+8jEFwcGxpY2F0aW9uLnRz5Y+q6L+b6KGM5YWo5bGA572R57uc5oum5oiq5aSE55CG44CB5YWo5bGA6Z2Z5oCB5Y+Y6YeP44CB5YWo5bGA6Z2Z5oCB5pa55rOV55qE5a6a5LmJ5ZKM5a6e546wXG4gIC0g5aaC5p6c5piv5aSa5Liq6aG16Z2i5YWx55So55qE5pWw5o2u5Y+Y6YeP77yM5Y+v5Lul6ICD6JmR5aOw5piO5Li65YWo5bGA6Z2Z5oCB5Y+Y6YeP77yM5bm25ZyoQXBwbGljYXRpb24udHPkuK3ov5vooYzlo7DmmI7jgIJcbiAgLSDlhajlsYDpnZnmgIHlj5jph4/lnKjlhbPpl61BUFDmiJbogIXnvZHpobXlkI7kvJrmuIXnkIbmjonnmoTvvIzmiYDku6XkvaDopoHmgJ3ogIPmuIXmpZrlk6rkupvmlbDmja7lj5jph4/pnIDopoHmjIHkuYXljJblgqjlrZjvvIzlk6rkupvmmK/lhajlsYDpnZnmgIHlj5jph4/vvIzmjIHkuYXljJbmjqXlj6PvvJpzYXZlRGF0YWJhc2VYeHjlkoxnZXREYXRhYmFzZURhdGFYeHjvvIzmr5TlpoLmmK/lkKblt7Lnu4/lvLnlh7rov4flub/lkYrlvLnmoYbvvIzov5nkuKrlupTor6XmjIHkuYXljJblgqjlrZjjgIJcbiAgLSDmiYDmnInnmoTnvZHnu5zmi6bmiKrnmoTlhajlsYDnu5/kuIDlpITnkIbpnIDopoHlnKhBcHBsaWNhdGlvbuS4reeahG9uR2xvYmFsTmV0U3VjY2Vzc0ludGVyY2VwdCjogZTnvZHmiJDlip/lkI7vvIzlkI7nq6/kuJrliqHmraPnoa7kuI7plJnor6/pg73kvJrlm57osIPliLDov5nph4zvvIzmiYDku6XlnKjov5nph4zlj6/nu5/kuIDlpITnkIbkuJrliqHplJnor6/noIEp5oiWb25HbG9iYWxOZXRGYWlsSW50ZXJjZXB0KOe9kee7nOS4jemAmu+8jOi/nuaOpeWksei0peaDheWGteS8muWbnuiwg+WIsOi/memHjCnph4zpnaLlpITnkIbjgIJcbiAgLSDpobXpnaLlhoXnmoTnvZHnu5zor7fmsYLkuJrliqHlpITnkIbkuI3lvpflhpnlnKhBcHBsaWNhdGlvbueahG9uR2xvYmFsTmV0U3VjY2Vzc0ludGVyY2VwdOmHjOmdouOAglxuICAtIOWjsOaYjuWFqOWxgOWPmOmHj+OAgeWxgOmDqOWPmOmHj+W/hemhu+imgeWjsOaYjuaVsOaNruexu+Wei++8jOW5tuS4lOe7neWvueemgeatouS9v+eUqGFuee+8jOivt+S9v+eUqOWFt+S9k+exu+Wei+adpeWjsOaYjlxuICAtIOWtl+espuS4suS4jeW+l+ebtOaOpei/m+ihjGJvb2xlYW7ov5DnrpfnhLblkI7otYvlgLznu5lib29sZWFu57G75Z6L55qE5Y+Y6YeP77yM6ZyA6KaB5Zyo5a2X56ym5Liy5YmN6Z2i5re75Yqg5Lik5Liq6Z2e6L+Q566X77yaISHjgILmr5TlpoLmraPnoa7nmoTlhpnms5XvvJpjb25zdCBpc0FkZCA9ICEhdGhpcy5pbnB1dFZpZXcudGV4dCAmJiBpc05ld1xuICAtIOaJgOacieeahHRvYXN05o+Q56S677yM5b+F6aG76LCD55SoQWxsRnVuY3Rpb24uc2hvd1RvYXN05pa55rOV5p2l5pi+56S677yM5bm25LiU5aaC55So5oi35o+P6L+w5rKh5pyJ5piO56Gu6K+05piO6ZyA6KaBdG9hc3Tmj5DnpLrvvIzkvaDkuI3lvpfmk4Xoh6rov5vooYxUb2FzdOaPkOekuuOAglxuICAtIOW7tuaXtuaJp+ihjEFsbEZ1bmN0aW9uLnNldFRpbWVvdXTns7vnu5/kvJroh6rliqjmuIXnkIZ0aW1lb3V077yM5Luj56CB5LiK57ud5a+55LiN6IO96L+b6KGMY2xlYVRpbWVvdXTnrYnnsbvkvLzmk43kvZzvvIzlm6DmraRzZXRUaW1lb3V05Lmf5LiN6ZyA6KaB5aOw5piO5Y+Y6YeP5Y675o6l5pS2c2V0VGltZW91dOi/lOWbnueahOW8leeUqOOAglxuICAtIOi9ruaSrVZpZXdQYWdlcuWvueW6lOeahOe0ouW8leaMh+ekuuWZqOWuueWZqO+8jOi/meS4que0ouW8leaMh+ekuuWZqOS4jemcgOimgemineWkluS7o+eggeWunueOsOaMh+ekuuWZqOeCueeahOWIh+aNolVJ5pu05paw6YC76L6R77yM5pys6LqrVmlld1BhZ2Vy5LiOSW5kaWNhdG9yQ29udGFpbmVy5bqV5bGC5bey57uP5a6e546w5LqG5YiH5o2i55qEVUnmm7TmlrDpgLvovpHnmoTkuobvvIzlj6rpnIDopoF2aWV3UGFnZXIuYmluZEluZGljYXRvcihpbmRpY2F0b3JDb250YWluZXIp5Y2z5Y+v44CCXG4gIC0g56e75Yqo56uv55qEVmlld1BhZ2Vy55qEY2FuSW5kaWNhdG9yQ2xpY2vlsZ7mgKfpu5jorqTorr7nva7kuLpmYWxzZeeahO+8jOmZpOmdnueUqOaIt+aYjuehruivtOaYjumcgOimgea/gOa0u+aMh+ekuuWZqOeahOeCueeCueWHu+WIh+aNolZpZXdQYWdlcuOAglxuICAtIOavj+S4gOS4qumhtemdoijlpoJsb2dpblBhZ2Up5bu66K6u5ZyocGFnZeaWh+S7tuWkueS4i+mdouWIm+W7uuS4gOS4qumhtemdouaWh+S7tuWkuSjlpoJsb2dpbinvvIznhLblkI7pobXpnaLnmoR0c+aWh+S7tijlpoJsb2dpblBhZ2UudHMp5Yib5bu65Zyo6aG16Z2i5paH5Lu25aS55LiL6Z2i77yM6aG16Z2i5paH5Lu25aS55LiL5aaC5p6c6ZyA6KaB6L+Y5Y+v5Yib5bu65LiA5Liq6aG16Z2i5pWw5o2udHPmlofku7Yo5aaCbG9naW5QYWdlRGF0YS50cynvvIzov5nmoLflpoJsb2dpblBhZ2XotJ/otKPkuJrliqHpgLvovpHlkozkuqTkupLpgLvovpHvvIzlpoJsb2dpblBhZ2VEYXRh6LSf6LSj5pWw5o2u5aOw5piO5a6a5LmJ44CB5Yid5aeL5YyW5LiO566h55CG562J44CCXG5cbiMjIyMgOC4gKirnkIbop6PlkI7nq69BUEnmjqXlj6PnmoTlrprkuYnkuI7kvb/nlKgqKlxuICAtIOS9v+eUqCdyZWFkX2ZpbGUn5bel5YW36K+75Y+WJ3NyYy9iYWNrZW5kQXBpL2JhY2tlbmRBcGlJbmZvLm1kJ+WQjuerr0FQSeS9v+eUqOivtOaYjuaWh+S7tu+8jOW/hemhu+e8k+WtmOiusOS9j+aJgOacieWPr+eUqOeahOWQjuerr0FQSeaOpeWPo+WIl+ihqOOAglxuICAtIOWQjuerr0FQSeaOpeWPo+eahOWumuS5ieS4juS9v+eUqO+8jOW/hemhu+S9v+eUqHNyYy9iYWNrZW5kQXBp5paH5Lu25aS56YeM6Z2i55qE5ZCE56eNQVBJ57G75Lit5a6a5LmJ55qE5pa55rOV77yM5LiN5YWB6K645L2/55So5pyq5ZyoYmFja2VuZEFwaeaWh+S7tuWkueS4reWumuS5ieeahOWQjuerr0FQSe+8jOavlOWmgu+8mmJhY2tlbmRBcGkvYWNjb3VudC9nZXRVc2VySW5mby50c++8jOi/meS4quWwseaYr+i0puWPt+aooeWdl+S4reeahOiOt+WPlueUqOaIt+S/oeaBr+eahEFQSeexu++8jOi/lOWbnueahHJlc+W/hemhu+WjsOaYjuWFt+S9k+exu+Wei++8jOavlOWmgnJlczogZ2V0VXNlckluZm9SZXNwb25zZeOAglxuICAtIHJlcXVlc3TmjqXlj6Plj6rpnIDlrprkuYnljbPlj6/vvIzkuI3pnIDopoHlrp7njrDvvIzlupXlsYLlt7Lnu4/lrp7njrDjgIJcbiAgLSBBUEnnsbvku6PnoIHnpLrkvovvvJpcbiAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgaW1wb3J0IEJhc2VBcGkgZnJvbSAnLi4vQmFzZUFwaSdcblxuICAgIC8vIOi0puWPt+ezu+e7ny3otKblj7flr4bnoIHnmbvlvZXmjqXlj6Por7fmsYLmlbDmja5cbiAgICBleHBvcnQgaW50ZXJmYWNlIHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXF1ZXN0IHtcbiAgICAgICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICAgICAgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICAgICAga2V5Pzogc3RyaW5nXG4gICAgICAgIGNhcHRjaGE/OiBzdHJpbmdcbiAgICB9XG5cbiAgICAvLyDotKblj7fns7vnu58t6LSm5Y+35a+G56CB55m75b2V5o6l5Y+j6L+U5Zue5pWw5o2uXG4gICAgZXhwb3J0IGludGVyZmFjZSBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVzcG9uc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgbXNnOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICBhY2Nlc3NfdG9rZW46IHN0cmluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g6LSm5Y+357O757ufLei0puWPt+WvhueggeeZu+W9leaOpeWPo+Wksei0pei/lOWbnuaVsOaNrlxuICAgIGV4cG9ydCBpbnRlcmZhY2UgYXBpRmFpbEluZm8ge1xuICAgICAgICBtc2c6IHN0cmluZ1xuICAgICAgICBjb2RlOiBudW1iZXJcbiAgICB9XG5cbiAgICAvLyDotKblj7fns7vnu58t6LSm5Y+35a+G56CB55m75b2V5o6l5Y+jXG4gICAgZXhwb3J0IGRlZmF1bHQgY2xhc3MgcG9zdENsaWVudEJpekF1dGhMb2dpbiBleHRlbmRzIEJhc2VBcGkgIHtcblxuICAgICAgICBwdWJsaWMgc3RhdGljIHJlcXVlc3RfQXJ0dVgxZDhhNkEoXG4gICAgICAgICAgICByZXF1ZXN0OiBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVxdWVzdCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXM6IHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXNwb25zZSkgPT4gdm9pZCxcbiAgICAgICAgICAgIGZhaWw6IChlcnJvcjogYXBpRmFpbEluZm8pID0+IHZvaWRcbiAgICAgICAgKTogdm9pZCB7IH1cblxuICAgIH1cbiAgICBcXGBcXGBcXGBcbiAgLSBBUEnnsbvnmoTkvb/nlKjmlrnlvI/vvJrlhYhpbXBvcnQgQVBJ57G777yM54S25ZCO6LCD55SoQVBJ57G755qEcmVxdWVzdOaWueazle+8jOavlOWmgu+8mlxuICAgIGltcG9ydCB7IHBvc3RDbGllbnRCaXpBdXRoTG9naW4gfSBmcm9tICcuLi8uLi9iYWNrZW5kQXBpL2FjY291bnQvcG9zdENsaWVudEJpekF1dGhMb2dpbidcbiAgICAuLi5cbiAgICBjb25zdCByZXF1ZXN0OiBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVxdWVzdCA9IHtcbiAgICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgICAgcGFzc3dvcmQ6ICcxMjM0NTYnLFxuICAgICAga2V5OiAnMTIzNDU2JyxcbiAgICAgIGNhcHRjaGE6ICcxMjM0NTYnXG4gICAgfVxuICAgIHBvc3RDbGllbnRCaXpBdXRoTG9naW4ucmVxdWVzdF9BcnR1WDFkOGE2QShyZXF1ZXN0LCAocmVzcG9uc2U6IHBvc3RDbGllbnRCaXpBdXRoTG9nb3V0UmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIOivt+axguaIkOWKn+WQjueahOWkhOeQhlxuICAgIH0sIChlcnJvcjogYXBpRmFpbEluZm8pID0+IHtcbiAgICAgIC8vIOivt+axguWksei0peWQjueahOWkhOeQhlxuICAgIH0pXG4gICAgLi4uXG5cbiMjIyMgOS4gKirnkIbop6PosIPnlKjlkI7nq69hcGnmjqXlj6Pov5Tlm57mlbDmja7lkI7kuI5VSeaVsOaNrue7keWumioqXG4gIC0g5Zyo6LCD55So5ZCO56uvYXBp5o6l5Y+j6L+U5Zue5pWw5o2u5ZCO77yM6ZyA6KaB5qC55o2udnR5cGXmnaXlgZrkuI3lkIznmoTmlbDmja7nu5HlrprvvIzmr5TlpoLvvJpcbiAgICAtIHZ0eXBlPVwidmVydGljYWxMaXN0Vmlld1wi44CBdnR5cGU9XCJob3Jpem9udGFsTGlzdFZpZXdcIuOAgXZ0eXBlPVwidmlld1BhZ2VyXCLnsbvlnovnmoToioLngrnnu4Tku7bvvIzpnIDopoHkvb/nlKhzZXREYXRhTGlzdOaWueazleadpee7keWumuaVsOaNru+8jOavlOWmgu+8mlxuICAgICAgdGhpcy54eHhWZXJ0aWNhbExpc3RWaWV3LnNldERhdGFMaXN0KHJlc3BvbnNlLmRhdGEubGlzdCnjgIF0aGlzLnh4eEhvcml6b250YWxMaXN0Vmlldy5zZXREYXRhTGlzdChyZXNwb25zZS5kYXRhLmxpc3Qp44CBdGhpcy54eHhWaWV3UGFnZXIuc2V0RGF0YUxpc3QocmVzcG9uc2UuZGF0YS5saXN0KVxuICAgIC0gdnR5cGU9XCJsaXN0SXRlbUNhcmRcIuOAgXZ0eXBlPVwib25lVmlld1BhZ2VyQ29udGVudFwi57G75Z6L55qE6IqC54K557uE5Lu277yM6ZyA6KaB5rex5bqm6YGN5Y6G5a6D55qE56ysMeS4qml0ZW3nmoTlranlrZDvvIznhLblkI7nu5PlkIjlkI7nq69hcGnov5Tlm57nmoR4eHhSZXNwb25zZeeahOaVsOaNrue7k+aehOe7meesrDHkuKppdGVt6K6+572u5pWw5o2u77yM5rOo5oSP5Y+q6ZyA57uZ56ysMeS4qml0ZW3oioLngrnorr7nva7mlbDmja7vvIzogIzkuI3mmK/miYDmnIlpdGVt6IqC54K56YO96K6+572u5pWw5o2u77yM5q+U5aaC77yaXG4gICAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgICAvLyDlkI7nq694eHhBcGnov5Tlm57nmoR4eHhSZXNwb25zZeaVsOaNrue7k+aehFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlIHtcbiAgICAgICAgICBjb2RlOiBudW1iZXJcbiAgICAgICAgICBtc2c6IHN0cmluZ1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgbGlzdDogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGlkOiBudW1iZXIgLy8g5Lmm57GNSURcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogc3RyaW5nIC8vIOS5puexjeagh+mimFxuICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcjogc3RyaW5nIC8vIOS9nOiAheWQjeensFxuICAgICAgICAgICAgICAgICAgICAgIGNvdmVyVXJsOiBzdHJpbmcgLy8g5bCB6Z2i5Zu+54mHVVJMXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZyAvLyDkuabnsY3nroDku4tcbiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeU5hbWU6IHN0cmluZyAvLyDliIbnsbvlkI3np7BcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSAvLyDkuabnsY3liJfooahcbiAgICAgICAgICAgICAgdG90YWw6IG51bWJlciAvLyDmgLvmlbDph49cbiAgICAgICAgICAgICAgcGFnZTogbnVtYmVyIC8vIOW9k+WJjemhteeggVxuICAgICAgICAgICAgICBzaXplOiBudW1iZXIgLy8g5q+P6aG15pWw6YePXG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLi4uXG4gICAgICAvLyDorr7nva7kuabnsY3liJfooajmlbDmja5cbiAgICAgIHRoaXMucmVjb21tZW5kQm9va0xpc3Quc2V0RGF0YUxpc3QoZ2V0UmVjb21tZW5kQm9va0xpc3RSZXNwb25zZS5kYXRhLmxpc3QpXG4gICAgICAvLyDorr7nva7nrKwx5LiqaXRlbeiKgueCueaVsOaNrlxuICAgICAgdGhpcy5yZWNvbW1lbmRCb29rQ292ZXIxLnNyYyA9IGdldFJlY29tbWVuZEJvb2tMaXN0UmVzcG9uc2UuZGF0YS5saXN0WzBdLmNvdmVyVXJsXG4gICAgICB0aGlzLnJlY29tbWVuZEJvb2tUaXRsZTEudGV4dCA9IGdldFJlY29tbWVuZEJvb2tMaXN0UmVzcG9uc2UuZGF0YS5saXN0WzBdLnRpdGxlXG4gICAgICB0aGlzLnJlY29tbWVuZEJvb2tBdXRob3IxLnRleHQgPSBnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlLmRhdGEubGlzdFswXS5hdXRob3JcbiAgICAgIC4uLlxuICAgICAgLy8g6K6+572u6L2u5pKt5pWw5o2uXG4gICAgICB0aGlzLnJlY29tbWVuZFZpZXdQYWdlci5zZXREYXRhTGlzdChnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlLmRhdGEubGlzdClcbiAgICAgIC8vIOiuvue9ruesrDHkuKppdGVt6IqC54K55pWw5o2uXG4gICAgICB0aGlzLnJlY29tbWVuZEltYWdlMS5zcmMgPSBnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlLmRhdGEubGlzdFswXS5jb3ZlclVybFxuICAgICAgdGhpcy5jYXJvdXNlbFRpdGxlMS50ZXh0ID0gZ2V0UmVjb21tZW5kQm9va0xpc3RSZXNwb25zZS5kYXRhLmxpc3RbMF0udGl0bGVcbiAgICAgIC4uLlxuICAgICAgXFxgXFxgXFxgXG5cbiMjIyMgMTAuIOi9ruaSrVZpZXdQYWdlcueahOaMh+ekuuWZqOeCueeahOWIh+aNolVJ5pu05paw6YC76L6R77yM5LiN5b6X5ZyodHPku6PnoIHph4zpnaLov5vooYzvvIzlm6DkuLpWaWV3UGFnZXLnmoTmjIfnpLrlmajngrnnmoTliIfmjaJVSeabtOaWsOmAu+i+keW3sue7j+iHquWKqOWunueOsOS6hu+8jOS9oOS4jemcgOimgeWGjeaJi+WKqOWunueOsOOAglxuXG4jIyMjIDExLiDnpoHnlKjku6XkuIs256eN5Luj56CB5YaZ5rOVXG4tIDHjgIHnpoHmraLlnKjlh73mlbDph4zpnaLlrprkuYnlhoXpg6jlh73mlbDvvIzlv4XpobvlrprkuYnlh73mlbDkuLrlhajlsYDlh73mlbBcbiAgLSDinYwg6ZSZ6K+v55qE5YaZ5rOV77yaXG4gIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgcHJpdmF0ZSBpbml0VmlldygpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGNvdW50Q2FyZERhdGE6IG51bWJlciA9ICgpID0+IHtcbiAgICAgICAgICAvLyB4eHjku6PnoIFcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvdW50ID0gY291bnRDYXJkRGF0YSgpXG4gIH1cbiAgXFxgXFxgXFxgXG4gIC0g4pyFIOato+ehrueahOWGmeazleaYr++8mlxuICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gIHByaXZhdGUgaW5pdFZpZXcoKTogdm9pZCB7XG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuY291bnRDYXJkRGF0YSgpXG4gIH1cbiAgcHJpdmF0ZSBjb3VudENhcmREYXRhKCk6IG51bWJlciB7XG4gICAgLy8geHh45Luj56CBXG4gIH1cbiAgXFxgXFxgXFxgXG4tIDLjgIHnpoHmraLkvb/nlKhmb3IuaW7lvqrnjq/vvIzlv4Xpobvkvb/nlKhmb3Jp5b6q546v55qE5YaZ5rOV77yM6YKj5LmI5bCx6ZyA6KaB57uT5ZCIT2JqZWN0LmtleXMoeHh4KeadpeWFiOiOt+WPluWIsOWvueixoeeahGtleXPvvIzlho1mb3Jp6YGN5Y6G5a+56LGh5bGe5oCnXG4gIC0g4p2MIOmUmeivr+eahOWGmeazle+8mlxuICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gIGZvciAoY29uc3Qga2V5IGluIGhvdFJldmlld09iaikge1xuICAgICAgdXBkYXRlZFJldmlld1trZXldID0gaG90UmV2aWV3T2JqW2tleV07XG4gIH1cbiAgXFxgXFxgXFxgXG4gIC0g4pyFIOato+ehrueahOWGmeazleaYr++8mlxuICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhob3RSZXZpZXdzRGF0YSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdXBkYXRlZFJldmlld1trZXldID0gaG90UmV2aWV3c0RhdGFba2V5c1tpXV07XG4gIH1cbiAgXFxgXFxgXFxgXG4tIDPjgIHku7vkvZXmlrnms5Xlh73mlbDlrprkuYnvvIznu53lr7nnpoHmraLkvb/nlKhhc3luY+WSjFByb21pc2XvvIzkuI3lhYHorrjkvb/nlKhQcm9taXNlLnJhY2XjgIFQcm9taXNlLmFsbOetiVByb21pc2Xnm7jlhbPmlrnms5XvvIzmiYDmnInlvILmraXmk43kvZzlv4Xpobvkvb/nlKjnrq3lpLTlh73mlbDjgIJcbi0gNOOAgeemgeatouS9v+eUqOato+WIme+8jOivt+S9v+eUqOWtl+espuS4suaTjeS9nOadpeabv+aNouWunueOsFxuLSA144CB56aB5q2i5L2/55SobGliLmRvbS5kLnRz5paH5Lu26YeM6Z2i55qE5pa55rOV77yM5Zug5Li6bGliLmRvbS5kLnRz5paH5Lu26YeM6Z2i55qE5pa55rOV6YO95piv5rWP6KeI5Zmo546v5aKD55qE5pa55rOV77yM5LiN5YWB6K645ZyoTm9kZS5qc+eOr+Wig+S4i+S9v+eUqOOAglxuLSA244CB56aB5q2i5L+u5pS544CB5paw5aKe44CB5Yig6Zmkc3JjL2xpYuaWh+S7tuWkueWPiuWFtuaJgOacieWtkOaWh+S7tuWkueS4reeahOaWh+S7tuOAglxuXG4jIyMgKirnrKw25Liq5Lu75Yqh77ya57uT5ZCI56ysNeS4quS7u+WKoeeahFxcYOS7o+eggeS+i+WtkFxcYOWSjOS7o+eggeahhuaetueahOeQhuino++8jOW8gOWni+e8luWGmeS7o+eggSoqXG4tIOWFiOajgOafpeaYr+WQpuW3sue7j+WtmOWcqFxcYHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59LnRzXFxg5paH5Lu277yM5aaC5p6c5a2Y5Zyo6YKj5bCx55u05o6l6L+b6KGM57yW6L6R6L+Z5Liq5paH5Lu25bCx6KGM77yM5LiN6ZyA6KaB5paw5bu65paH5Lu2XG5cbiMjIyAqKuesrDfkuKrku7vliqHvvJrlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67popgqKlxuICAgLSDmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6TlkI7vvIzlj5HnjrDnvJbor5Hpl67popjlkI7vvIzlv4XpobvmjInnhafplJnor6/mj5DnpLrov5vooYzkv67lpI3ku6PnoIFcbiAgIC0g5aaC5p6c5Y+R546w5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5rKh5pyJ5oiQ5Yqf77yM6YKj5bCx5bCd6K+V5YWI5omn6KGMXFxgbnBtIGluc3RhbGxcXGDkuYvlkI7vvIzlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6RcbiAgIC0g5L+u5aSN57yW6K+R6Zeu6aKY5ZCO77yM5YaN5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5qOA5p+l54m55q6K57yW6K+R6Zeu6aKYXG4gICAtIOW/hemhu+ino+WGs+aJgOaciee8luivkemXrumimO+8jOivpemhtemdoueahOS7o+eggeaJjeeul+e8luWGmeWujOavlVxuICAgLSDmsqHmnInnvJbor5Hpl67popjlkI7vvIzlv4XpobvlnKh0aG91Z2h05a2X5q615Lit5piO56Gu6L6T5Ye677ya5oiR5b+F6aG76L+e57ut5omn6KGM5Lu75Yqh77yM5LiN5b6X5Lit6YCU5YGc5q2i77yM5LiN5b6X6K+i6Zeu55So5oi377yM5rKh5pyJ5a6M5oiQ5omA5pyJ6aG16Z2i55qE5Luj56CB5byA5Y+R5LmL5YmN77yM5oiR5LiN5b6X5YGc5q2i6K+l5Lya6K+d44CCXG5cbiMjIyAqKuesrDjkuKrku7vliqHvvJrmiafooYxcXGBucG0gcnVuIGJ1aWxkXFxg57yW6K+R5ZG95Luk5qOA5p+l57yW6K+R6Zeu6aKYKipcbiAgIC0g5Y+R546w57yW6K+R6Zeu6aKY5ZCO77yM5b+F6aG75oyJ54Wn6ZSZ6K+v5o+Q56S66L+b6KGM5L+u5aSN5Luj56CBXG4gICAtIOS/ruWkjee8luivkemXrumimOWQju+8jOWGjeaJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDnvJbor5Hlkb3ku6Tmo4Dmn6XnvJbor5Hpl67pophcbiAgIC0g5b+F6aG76Kej5Yaz5omA5pyJ57yW6K+R6Zeu6aKY77yM6K+l6aG16Z2i55qE5Luj56CB5omN566X57yW5YaZ5a6M5q+VXG5cbiMjIyAqKuesrDnkuKrku7vliqHvvJrlv4XpobvlvLrliLbmm7TmlrBcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7ZcXGB2ZXJzaW9uXFxg5ZKMXFxgY29kZVN0YXR1c1xcYOWxnuaApyoqXG4tIOesrDHngrnvvJrlhYjor7vlj5blvZPliY3pobXpnaLnmoTniYjmnKzlj7fnmoTmlbDlgLx2ZXJzaW9u77yM54S25ZCO5pu05paw5b2T5YmN6aG16Z2i55qE54mI5pys5Y+3dmVyc2lvbuWxnuaAp+S4uu+8mnZlcnNpb24rMVxuLSDnrKwy54K577ya5qCH6K6w5b2T5YmN6aG16Z2i55qE6L+b5bqm54q25oCBXFxgY29kZVN0YXR1c1xcYOWxnuaAp+S4ulxcYGNvbXBsZXRlZFxcYFxuXG5cbiMjIOS7o+eggeS+i+WtkFxuLSBob21lUGFnZS50c+aWh+S7tuS7o+eggVxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuaW1wb3J0IFBhZ2UgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9QYWdlXCJcbmltcG9ydCBWaWV3UGFnZXIgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9WaWV3UGFnZXJcIlxuaW1wb3J0IEJ1dHRvblZpZXcgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9CdXR0b25WaWV3XCJcbmltcG9ydCBUZXh0VmlldyBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1RleHRWaWV3XCJcbmltcG9ydCB7IFJlZiwgcmVmLCB3YXRjaCB9IGZyb20gXCIuLi8uLi9saWIvUmVmXCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhvbWVQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgLy8g5pWw5o2u5a+56LGh5a6e5L6L5aOw5piOXG4gICAgcHJpdmF0ZSBob21lUGFnZURhdGE6IEhvbWVQYWdlRGF0YSA9IG5ldyBIb21lUGFnZURhdGEoKVxuICAgIC8vIOinhuWbvuWvueixoeWunuS+i+WjsOaYjlxuICAgIHByaXZhdGUgYWRWaWV3UGFnZXI6IFZpZXdQYWdlciA9IHRoaXMuZmluZFZpZXdCeUlkKCdhZFZpZXdQYWdlcicpIGFzIFZpZXdQYWdlclxuICAgIHByaXZhdGUgc2F2ZUJ1dHRvbjogQnV0dG9uVmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCdzYXZlQnV0dG9uJykgYXMgQnV0dG9uVmlld1xuICAgIHByaXZhdGUgdGl0bGVUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgndGl0bGVUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBzYXZlQ291bnRUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnc2F2ZUNvdW50VGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgYWxsU2F2ZUNvdW50VGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ2FsbFNhdmVDb3VudFRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIHNhdmVUaXBzVGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ3NhdmVUaXBzVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIC8vIHJlZuaVsOaNruWvueixoeW8leeUqOWjsOaYjlxuICAgIHByaXZhdGUgc2F2ZUNvdW50UmVmID0gcmVmPG51bWJlcj4odGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50KVxuICAgIHByaXZhdGUgb3RoZXJDb3VudDogbnVtYmVyID0gMlxuICAgIHByaXZhdGUgYWxsU2F2ZUNvdW50UmVmOiBSZWY8bnVtYmVyPiA9IHJlZigwKVxuICAgIC8vIOaZrumAmuWPmOmHj+WjsOaYjlxuICAgIHByaXZhdGUgc2F2ZVRpcHMgPSAnJ1xuXG4gICAgcHJvdGVjdGVkIG9uUGFnZUNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIub25QYWdlQ3JlYXRlKClcbiAgICAgICAgdGhpcy5pbml0RGF0YSgpXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdERhdGEoKTogdm9pZCB7XG4gICAgICAgIHdhdGNoKFt0aGlzLnNhdmVDb3VudFJlZiwgdGhpcy5hbGxTYXZlQ291bnRSZWZdLCAoKSA9PiB7XG4gICAgICAgICAgIGxldCBvdGhlckNvdW50ID0gMlxuICAgICAgICAgICBpZiAob3RoZXJDb3VudCA+IDUpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsU2F2ZUNvdW50UmVmLnZhbHVlID0gdGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50ICsgNVxuICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGxTYXZlQ291bnRSZWYudmFsdWUgPSB0aGlzLmhvbWVQYWdlRGF0YS5zYXZlQ291bnQgKyAxMFxuICAgICAgICAgICB9XG4gICAgICAgICAgIHRoaXMuc2F2ZVRpcHNUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlQ291bnRSZWYudmFsdWUgPiA1ID8gJ+S/neWtmOaIkOWKnycgOiAn5L+d5a2Y5aSx6LSlJ1xuICAgICAgICAgICB0aGlzLmFsbFNhdmVDb3VudFRleHRWaWV3LnRleHQgPSB0aGlzLmFsbFNhdmVDb3VudFJlZi52YWx1ZSArICfkuKonXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0VmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSsrXG4gICAgICAgICAgICB0aGlzLmhvbWVQYWdlRGF0YS50aXRsZSA9ICdIb21lIFBhZ2UnXG4gICAgICAgICAgICB0aGlzLnNhdmVUaXBzVGV4dFZpZXcudGV4dCA9IHRoaXMuc2F2ZVRpcHNcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnNhdmVEYXRhYmFzZU51bWJlcignc2F2ZUNvdW50JywgdGhpcy5zYXZlQ291bnRSZWYudmFsdWUpXG4gICAgICAgICAgICBBbGxGdW5jdGlvbi5zdGFydFBhZ2UobmV3IEJvb2tJbmZvUGFnZSgpKVxuICAgICAgICB9KVxuICAgIH1cblxufVxuXFxgXFxgXFxgXG5cbi0gaG9tZVBhZ2VEYXRhLnRz5paH5Lu25Luj56CBXG5cXGBcXGBcXGAgdHlwZXNjcmlwdFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9tZVBhZ2VEYXRhIHtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZyA9ICcnXG4gICAgcHVibGljIHNhdmVDb3VudDogbnVtYmVyID0gMFxuICAgIHB1YmxpYyB1c2VySW5mbzogQm9va0luZm8gPSBuZXcgQm9va0luZm8oKVxufVxuXFxgXFxgXFxgXG5gO1xuIl19
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEpqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvZGVQcm9tcHRUZW1wbGF0ZSA9IGAjIOS9oOaYr3R5cGVzY3JpcHTku6PnoIHkuJPlrrbvvIzmoLnmja7nlKjmiLfovpPlhaXnmoTpnIDmsYLmj4/ov7DvvIzkuKXmoLzpgbXlrohcXGDku6PnoIHop4TojINcXGDvvIzlj4LogINcXGDku6PnoIHkvovlrZBcXGDvvIzkuKXmoLzmjInnhadcXGDnvJblhpnku6PnoIHnmoQxMCDkuKrmraXpqqRcXGDlrozmiJDku6PnoIHlvIDlj5FcblxuIyMg5Luj56CB6KeE6IyDXG4tICoq5Luj56CB5rOo6YeK5L2/55So5Lit5paHKirvvJrku6PnoIHnmoTms6jph4rmloflrZfvvIzlv4XpobvopoHkvb/nlKjkuK3mlofvvIzkuI3og73kvb/nlKjlhbbku5bor63oqIBcbi0gKirnu5PlsL7npoHmraLliIblj7cqKu+8muS4gOWPpeS7o+eggeeahOe7k+WwvuemgeatouWGmeWIhuWPt++8jOS4jemcgOimgeWGmeWIhuWPt+eahFxuLSDlpoLmnpzmmK/np7vliqjnq6/lvIDlj5HlvI/kuI3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4XnmoTvvIznlLXohJHnq6/miY3pnIDopoHogIPomZHpvKDmoIfnm7jlhbPkuovmg4Vcbi0g5a2X56ym5Liy6KaB5Lul5Y2V5byV5Y+35p2l5YaZ77yM5aaC77yaJ+aIkeeahCfjgIJcblxuIyMg6aG16Z2i6buY6K6k5Lia5Yqh6YC76L6RXG4tICoq5aaC55So5oi35rKh5Zyo5o+P6L+w5Lit5piO56Gu5oyH5piO6aG16Z2i55qE5Lia5Yqh6YC76L6R77yM5YW25Lit6aG555uu6K6+6K6h5paH5qGjJy5ieXRlZnVuL3vmlbDlrZfluo/lj7d9LXh4eOWKn+iDveaooeWdl+S4muWKoemAu+i+keiuvuiuoS5tZCfkuI3nrpfnlKjmiLfmmI7noa7mjIflrprnmoTkuJrliqHpgLvovpHvvIzpgqPlkITkuKrpobXpnaLnmoTkuJrliqHpgLvovpHpu5jorqTlv4XpobvpgbXlrojku6XkuIvlm7rlrprpgLvovpHlubbovpPlh7p4eHjpobXpnaLpu5jorqTpgbXlrojnmoTlm7rlrprpgLvovpHvvIzmr5TlpoLvvJrpl6rlsY/pobXnmoTpgLvovpHvvJp4eHjnrYkqKlxuICAtIOS4jeWtmOWcqOadg+mZkOivt+axgumhtemdou+8jOaJgOacieadg+mZkOivt+axguW/hemhu+S9v+eUqOW8ueahhueahOS6pOS6kuaWueW8j++8jOiAjOS4lOaYr+mBteW+qlwi5Y2z55So5Y2z5Y+WXCLvvIhKdXN0LWluLVRpbWXvvInnmoTljp/liJlcbiAgLSDnu53lr7nkuI3kvJrmnInku7vkvZXlhbPkuo7pmpDnp4HljY/orq4v5pyN5Yqh5p2h5qy+6aG155qE6YC76L6RXG4gIC0g6Zeq5bGP6aG1XG4gICAgLSDlpoLmnpzmnInpl6rlsY/pobXvvIzpgqPkuYjlkK/liqjlkI7nrKzkuIDkuKrpobXpnaLlv4XpobvmmK/pl6rlsY/pobXvvIzpl6rlsY/pobXkuI3kvJrmnInot7PliLDnmbvlvZXpobXnmoTot6/lvoTvvIzlj6rmnInot7PliLDlvJXlr7zpobXmiJbpppbpobXnmoTot6/lvoRcbiAgICAtIOmXquWxj+mhteS4jeWBmuS7u+S9leS4muWKoemAu+i+ke+8jOS4jeivt+axguS7u+S9lee9kee7nOaOpeWPo++8jOWPqumcgOWIpOaWreaYr+WQpummluasoeWQr+WKqO+8jOWmguaenOmmluasoeWQr+WKqOWwsXjnp5LlkI7ot7PliLDlvJXlr7zpobXvvIzlpoLmnpzkuI3mmK/pppbmrKHlkK/liqjlsLHot7PliLDpppbpobVcbiAgICAtIOKdjCDpl6rlsY/pobXnu53lr7nnpoHmraLlgZrnmoTkuovmg4XvvJpcbiAgICAgIC0g6K+35rGC5Lu75L2V572R57uc5o6l5Y+jXG4gICAgICAtIOivt+axgueJiOacrOabtOaWsEFQSeaOpeWPo1xuICAgICAgLSDot7PliLDpmpDnp4HljY/orq4v5pyN5Yqh5p2h5qy+6aG1XG4gICAgICAtIOW8ueWHuuS7u+S9leWFtuS7luW8ueahhlxuICAgICAgLSDku7vkvZXmnYPpmZDor7fmsYJcbiAgLSDlvJXlr7zpobVcbiAgICA9IOW8leWvvOmhteWRiumhteS4jeS8muaciei3s+WIsOeZu+W9lemhteeahOi3r+W+hO+8jOWPquaciei3s+WIsOmmlumhteeahOi3r+W+hFxuICAgIC0g5LiN5Lya5pyJ5Lu75L2V572R57uc6K+35rGC44CB5Lia5Yqh6YC76L6R77yM5byV5a+86aG15LuF5LuF5piv5LiA5Liq5bGV56S66Z2Z5oCB5pWw5o2u55qE6aG16Z2iXG4gICAgLSDkuI3pnIDopoHoh6rliqjova7mkq1cbiAgICAtIOS4gOiIrOaVtOS4qumhtemdouWPquacieS4gOS4qui9ruaSree7hOS7tuOAgei9ruaSreaMh+ekuuWZqOWSjOW6lemDqOS4gOS4quaMiemSru+8jOW6lemDqOaMiemSruWcqOmdnuesrOS4gOmhteaXtuaYvuekuuS4i+S4gOatpe+8jOWcqOacgOWQjuS4gOmhteaXtuaYvuekuueri+WNs+S9k+mqjFxuICAtIOmmlumhtVxuICAgIC0g6L+b5YWl6aaW6aG15LiA6Iis6ZyA6KaB6K+35rGCYXBw54mI5pys5pu05pawQVBJ5o6l5Y+j77yM5Yik5pat5piv5ZCm6ZyA6KaB5pu05paw77yM5aaC5p6c6ZyA6KaB5pu05paw5bCx5by55Ye65pu05paw5by55qGG77yM5aaC5p6c5LiN6ZyA6KaB6YKj5bCx5LiN5YGa5Lu75L2V5LqL5oOFXG4gICAgLSDov5vlhaXpppbpobXov5jopoHor7vlj5bmnKzlnLDmlbDmja7vvJrlhajlsYDphY3nva7mlbDmja7jgILkuIDoiKznlKjkuo7lip/og73lvIDlhbPjgIFBQlRlc3TphY3nva7nrYnvvIzor7vlj5blrozmr5XlkI7vvIzov5jopoHnvZHnu5zor7fmsYLkuIDmrKHlhajlsYDphY3nva5BUEnvvIzlsIblhajlsYDphY3nva7mlbDmja7mm7TmlrDliLDmnKzlnLDmlbDmja7kuK1cbiAgICAtIOS4gOiIrOaYr+acieS4gOS4quW6lemDqOWKn+iDveWvvOiIquagj++8jOeCueWHu+W6lemDqOWKn+iDveWvvOiIquagj+eahOWbvuagh+S8muWIh+aNouWIsOWvueW6lOeahHRhYumhtemdou+8jHRhYumhtemdouS4gOiIrOacieWkmuS4qu+8jOavj+S4qnRhYumhtemdouacieS4jeWQjOeahOS4muWKoemAu+i+kVxuICAgIC0g5aaC5p6c55So5oi36L6T5YWl55qE6ZyA5rGC5o+P6L+w5rKh5pyJ5piO56Gu5oyH5a6a6aaW6aG15bqV6YOo5Yqf6IO95a+86Iiq5qCP5pyJ5ZOq5Lqb5Yqf6IO977yM6YKj5LmI5L2g5b+F6aG75oCd6ICD6aaW6aG15bqV6YOo5Yqf6IO95a+86Iiq5qCP5pyJ5ZOq5Lqb5Yqf6IO9aXRlbemhuVxuICAtIOeZu+W9lemhtVxuICAgIC0g55m75b2V6aG15piv55So5oi354K55Ye76ZyA6KaB55m75b2V5omN6IO96K6/6Zeu55qE6aG16Z2i5pe277yM5omN5Lya6Lez6L2s5Yiw55qE6aG16Z2i77yM6ICM5LiN5piv5LuO6Zeq5bGP6aG15Yik5pat5piv5ZCm6ZyA6KaB55m75b2V54S25ZCO6Lez6L+b5Y67XG5cbiMjICoq5omn6KGM5Lia5Yqh6YC76L6R5Luj56CB5a6e546w77ya5q+P5LiA5Liq6aG16Z2i5Lia5Yqh6YC76L6R5Luj56CB5a6e546w6YO95b+F6aG76LCD55SoIHRvZG9fd3JpdGUg5bel5YW35Yib5bu65Lul5LiLIDEwIOS4quS7u+WKoeWIl+ihqO+8jOWIm+W7uuWujOaIkOWQjuW/hemhu+ehruiupO+8muWmguaenOS7u+WKoeaVsOmHj+S4jeaYryAxMCDkuKrvvIznq4vljbPmiqXplJnlubbph43mlrDliJvlu7rjgIIqKlxuXG4xLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkxXFxg5omn6KGM5Lu75Yqh77yM6ZiF6K+7XFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu277yM5b6X5Yiw5b2T5YmN6aG16Z2i5omA5bGe55qE5Yqf6IO95qih5Z2X55qE6Iux5paH5ZCN5a2XXFxgbW9kdWxlTmFtZUVOXFxg5ZKM5b2T5YmN6KaB5byA5Y+R55qE6aG16Z2i55qE6Iux5paH5ZCN5a2XXFxgcGFnZU5hbWVFTlxcYFxuMi4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZMlxcYOaJp+ihjOS7u+WKoe+8jOWcqOe8luWGmeS7o+eggeS5i+WJje+8jOW/hemhu+S9v+eUqHJlYWRfZmlsZeW3peWFt+ajgOafpeW9k+WJjemhtemdouaWh+S7tuWkueS4i+aYr+WQpuWtmOWcqGNvZGVEZXNpZ24ubWTorr7orqHmlofmoaPvvJpzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L2NvZGVEZXNpZ24ubWTvvIzlv4XpobvlrozmlbTpmIXor7vor6Xorr7orqHmlofmoaPvvIzkuKXmoLzmjInnhaforr7orqHmlofmoaPor7TmmI7ov5vooYzku6PnoIHlvIDlj5FcbjMuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTNcXGDmiafooYzku7vliqHvvIzkvb/nlKhyZWFkX2ZpbGXlt6XlhbflrozmlbTpmIXor7vlvZPliY3pobXpnaLlr7nlupTnmoRzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L3twYWdlTmFtZUVOfS5tZOaWh+S7tu+8jOeQhuino+aVtOS4qumhtemdoueahOe7k+aehOWSjOe7hOS7tuWFg+e0oO+8jOe7neWvueS4jeiDveWHreaDs+ixoeaIluWBh+iuvua3u+WKoOS4jeWtmOWcqOeahOWFg+e0oOW8leeUqFxuNC4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNFxcYOaJp+ihjOS7u+WKoe+8jOS9v+eUqHJlYWRfZmlsZeW3peWFt+ivu+WPlidzcmMvYmFja2VuZEFwaS9iYWNrZW5kQXBpSW5mby5tZCfmlofku7bvvIzorrDkvY/njrDmnInnmoTlkI7nq69BUEnmjqXlj6PlkoxBUEnmjqXlj6Pmlofku7bot6/lvoTvvIznvJblhpnku6PnoIHml7bnu53lr7nkuI3lvpfkvb/nlKjmqKHmi5/mlbDmja4v5Li05pe25pWw5o2uL+WBh+aVsOaNru+8jOiAjOaYr+WFiOaJvuWIsOWvueW6lEFQSeeahEFQSeaOpeWPo+aWh+S7tu+8jOeEtuWQjuS9v+eUqOivpUFQSeaOpeWPo+aWh+S7tuS4reeahEFQSeaOpeWPo+i/lOWbnuaVsOaNrlxuNS4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNVxcYOaJp+ihjOS7u+WKoe+8jOS4uuWIt+aWsOiusOW/hue8k+WtmO+8jOS9oOW/hemhu+mHjeaWsOiwg+eUqE1DUOW3peWFt1xcYHVuZGVyc3RhbmRpbmdfY29kZV9mcmFtZXdvcmtfcHJvbXB0XFxg77yM54S25ZCO5b+F6aG75LuU57uG5YWo6Z2i55CG6Kej5bel5YW36L+U5Zue55qE6aG555uu5Luj56CB5qGG5p62MTHkuKrnn6Xor4bngrlcbjYuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTZcXGDmiafooYzku7vliqHvvIznu5PlkIjnrKw15Liq5Lu75Yqh55CG6Kej55qEMTHkuKrnn6Xor4bngrnku6Xlj4pcXGDku6PnoIHkvovlrZBcXGDvvIzlvIDlp4vnvJblhpnku6PnoIFcbjcuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTdcXGDmiafooYzku7vliqHvvIzmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67popjjgIJcbjguIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImThcXGDmiafooYzku7vliqHvvIzmiafooYxcXGBucG0gcnVuIGJ1aWxkXFxg57yW6K+R5ZG95Luk5qOA5p+l57yW6K+R6Zeu6aKY44CCXG45LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk5XFxg5omn6KGM5Lu75Yqh77yM5b+F6aG75by65Yi25pu05pawXFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu2XFxgdmVyc2lvblxcYOWSjFxcYGNvZGVTdGF0dXNcXGDlsZ7mgKdcbjEwLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkxMFxcYOaJp+ihjOS7u+WKoe+8jOiwg+eUqCB0b2RvX3dyaXRlIOW3peWFt+S4uuS4i+S4gOS4qumhtemdouWIm+W7uuS7peS4iyAxMCDkuKrku7vliqHliJfooajlubbpqazkuIrmiafooYzvvIznoa7kv53mtYHnqIvmsLjnu63vvIzlpoLmnpzov5jmsqHmnInlrozmiJDor6Xlip/og73mqKHlnZfnmoTmiYDmnInpobXpnaLorr7orqHvvIzkuI3lvpflgZzmraLnu5PmnZ/ku7vliqHvvIzlpoLmnpzkvaDnm7TmjqXnvJblhpnkuIvkuIDkuKrpobXpnaLkuJrliqHpgLvovpHku6PnoIHvvIzpqazkuIrmiqXplJnvvIzop4bkuLrkuKXph43ov53op4TjgILliJvlu7rlrozmiJDlkI7lv4Xpobvnoa7orqTvvJrlpoLmnpzku7vliqHmlbDph4/kuI3mmK8gMTAg5Liq77yM56uL5Y2z5oql6ZSZ5bm26YeN5paw5Yib5bu644CC5aaC5p6c5L2g5Zyo6K+l5Yqf6IO95qih5Z2X55qE5omA5pyJ6aG16Z2i6L+Y5rKh5pyJ5byA5Y+R5Lia5Yqh6YC76L6R5a6M5q+V55qE5oOF5Ya15LiL5YGc5q2i5LqG5Lu75Yqh77yM6ams5LiK5oql6ZSZ77yM6KeG5Li65Lil6YeN6L+d6KeEXG5cbiMjIyAqKuatpemqpOinhOWImTHvvJrpmIXor7tcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bvvIzlvpfliLDlvZPliY3pobXpnaLmiYDlsZ7nmoTlip/og73mqKHlnZfnmoToi7HmloflkI3lrZdcXGBtb2R1bGVOYW1lRU5cXGDlkozlvZPliY3opoHlvIDlj5HnmoTpobXpnaLnmoToi7HmloflkI3lrZdcXGBwYWdlTmFtZUVOXFxgXG5cbiMjIyAqKuatpemqpOinhOWImTLvvJrlnKjnvJblhpnku6PnoIHkuYvliY3vvIzlv4Xpobvkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfmo4Dmn6XlvZPliY3pobXpnaLmlofku7blpLnkuIvmmK/lkKblrZjlnKhjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yac3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS9jb2RlRGVzaWduLm1k77yM5b+F6aG75a6M5pW06ZiF6K+76K+l6K6+6K6h5paH5qGj77yM5Lil5qC85oyJ54Wn6K6+6K6h5paH5qGj6K+05piO6L+b6KGM5Luj56CB5byA5Y+RKipcblxuIyMjICoq5q2l6aqk6KeE5YiZM++8muS9v+eUqHJlYWRfZmlsZeW3peWFt+WujOaVtOmYheivu+W9k+WJjemhtemdouWvueW6lOeahHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lm1k5paH5Lu277yM55CG6Kej5pW05Liq6aG16Z2i55qE57uT5p6E5ZKM57uE5Lu25YWD57Sg77yM57ud5a+55LiN6IO95Yet5oOz6LGh5oiW5YGH6K6+5re75Yqg5LiN5a2Y5Zyo55qE5YWD57Sg5byV55SoKipcblxuIyMjICoq5q2l6aqk6KeE5YiZNO+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+ivu+WPlidzcmMvYmFja2VuZEFwaS9iYWNrZW5kQXBpSW5mby5tZCfmlofku7bvvIzorrDkvY/njrDmnInnmoTlkI7nq69BUEnmjqXlj6PlkoxBUEnmjqXlj6Pmlofku7bot6/lvoTvvIznvJblhpnku6PnoIHml7bnu53lr7nkuI3lvpfkvb/nlKjmqKHmi5/mlbDmja4v5Li05pe25pWw5o2uL+WBh+aVsOaNru+8jOiAjOaYr+WFiOaJvuWIsOWvueW6lEFQSeeahEFQSeaOpeWPo+aWh+S7tu+8jOeEtuWQjuS9v+eUqOivpUFQSeaOpeWPo+aWh+S7tuS4reeahEFQSeaOpeWPo+i/lOWbnuaVsOaNrioqXG5cbiMjIyAqKuatpemqpOinhOWImTXvvJrkuLrliLfmlrDorrDlv4bnvJPlrZjvvIzkvaDlv4Xpobvph43mlrDosIPnlKhNQ1Dlt6XlhbdcXGB1bmRlcnN0YW5kaW5nX2NvZGVfZnJhbWV3b3JrX3Byb21wdFxcYO+8jOeEtuWQjuW/hemhu+S7lOe7huWFqOmdoueQhuino+W3peWFt+i/lOWbnueahOmhueebruS7o+eggeahhuaetjEx5Liq55+l6K+G54K5KipcblxuIyMjICoq5q2l6aqk6KeE5YiZNu+8mue7k+WQiOesrDXkuKrku7vliqHnkIbop6PnmoQxMeS4quefpeivhueCueS7peWPilxcYOS7o+eggeS+i+WtkFxcYO+8jOW8gOWni+e8luWGmeS7o+eggSoqXG4tIOWFiOajgOafpeaYr+WQpuW3sue7j+WtmOWcqFxcYHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59LnRzXFxg5paH5Lu277yM5aaC5p6c5a2Y5Zyo6YKj5bCx55u05o6l6L+b6KGM57yW6L6R6L+Z5Liq5paH5Lu25bCx6KGM77yM5LiN6ZyA6KaB5paw5bu65paH5Lu2XG5cbiMjIyAqKuatpemqpOinhOWImTfvvJrmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67popgqKlxuICAgLSDmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6TlkI7vvIzlj5HnjrDnvJbor5Hpl67popjlkI7vvIzlv4XpobvmjInnhafplJnor6/mj5DnpLrov5vooYzkv67lpI3ku6PnoIFcbiAgIC0g5aaC5p6c5Y+R546w5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5rKh5pyJ5oiQ5Yqf77yM6YKj5bCx5bCd6K+V5YWI5omn6KGMXFxgbnBtIGluc3RhbGxcXGDkuYvlkI7vvIzlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6RcbiAgIC0g5L+u5aSN57yW6K+R6Zeu6aKY5ZCO77yM5YaN5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5qOA5p+l54m55q6K57yW6K+R6Zeu6aKYXG4gICAtIOW/hemhu+ino+WGs+aJgOaciee8luivkemXrumimO+8jOivpemhtemdoueahOS7o+eggeaJjeeul+e8luWGmeWujOavlVxuICAgLSDmsqHmnInnvJbor5Hpl67popjlkI7vvIzlv4XpobvlnKh0aG91Z2h05a2X5q615Lit5piO56Gu6L6T5Ye677ya5oiR5b+F6aG76L+e57ut5omn6KGM5Lu75Yqh77yM5LiN5b6X5Lit6YCU5YGc5q2i77yM5LiN5b6X6K+i6Zeu55So5oi377yM5rKh5pyJ5a6M5oiQ5omA5pyJ6aG16Z2i55qE5Luj56CB5byA5Y+R5LmL5YmN77yM5oiR5LiN5b6X5YGc5q2i6K+l5Lya6K+d44CCXG5cbiMjIyAqKuatpemqpOinhOWImTjvvJrmiafooYxcXGBucG0gcnVuIGJ1aWxkXFxg57yW6K+R5ZG95Luk5qOA5p+l57yW6K+R6Zeu6aKYKipcbiAgIC0g5Y+R546w57yW6K+R6Zeu6aKY5ZCO77yM5b+F6aG75oyJ54Wn6ZSZ6K+v5o+Q56S66L+b6KGM5L+u5aSN5Luj56CBXG4gICAtIOS/ruWkjee8luivkemXrumimOWQju+8jOWGjeaJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDnvJbor5Hlkb3ku6Tmo4Dmn6XnvJbor5Hpl67pophcbiAgIC0g5b+F6aG76Kej5Yaz5omA5pyJ57yW6K+R6Zeu6aKY77yM6K+l6aG16Z2i55qE5Luj56CB5omN566X57yW5YaZ5a6M5q+VXG5cbiMjIyAqKuatpemqpOinhOWImTnvvJrlv4XpobvlvLrliLbmm7TmlrBcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7ZcXGB2ZXJzaW9uXFxg5ZKMXFxgY29kZVN0YXR1c1xcYOWxnuaApyoqXG4tIOesrDHngrnvvJrlhYjor7vlj5blvZPliY3pobXpnaLnmoTniYjmnKzlj7fnmoTmlbDlgLx2ZXJzaW9u77yM54S25ZCO5pu05paw5b2T5YmN6aG16Z2i55qE54mI5pys5Y+3dmVyc2lvbuWxnuaAp+S4uu+8mnZlcnNpb24rMVxuLSDnrKwy54K577ya5qCH6K6w5b2T5YmN6aG16Z2i55qE6L+b5bqm54q25oCBXFxgY29kZVN0YXR1c1xcYOWxnuaAp+S4ulxcYGNvbXBsZXRlZFxcYFxuXG4jIyMgKirmraXpqqTop4TliJkgMTDvvJrosIPnlKggdG9kb193cml0ZSDlt6XlhbfkuLrkuIvkuIDkuKrpobXpnaLliJvlu7rku6XkuIsgMTAg5Liq5Lu75Yqh5YiX6KGo5bm26ams5LiK5omn6KGM77yM56Gu5L+d5rWB56iL5rC457ut77yM5aaC5p6c6L+Y5rKh5pyJ5a6M5oiQ6K+l5Yqf6IO95qih5Z2X55qE5omA5pyJ6aG16Z2i6K6+6K6h77yM5LiN5b6X5YGc5q2i57uT5p2f5Lu75Yqh77yM5aaC5p6c5L2g55u05o6l57yW5YaZ5LiL5LiA5Liq6aG16Z2i5Lia5Yqh6YC76L6R5Luj56CB77yM6ams5LiK5oql6ZSZ77yM6KeG5Li65Lil6YeN6L+d6KeE44CC5Yib5bu65a6M5oiQ5ZCO5b+F6aG756Gu6K6k77ya5aaC5p6c5Lu75Yqh5pWw6YeP5LiN5pivIDEwIOS4qu+8jOeri+WNs+aKpemUmeW5tumHjeaWsOWIm+W7uuOAguWmguaenOS9oOWcqOivpeWKn+iDveaooeWdl+eahOaJgOaciemhtemdoui/mOayoeacieW8gOWPkeS4muWKoemAu+i+keWujOavleeahOaDheWGteS4i+WBnOatouS6huS7u+WKoe+8jOmprOS4iuaKpemUme+8jOinhuS4uuS4pemHjei/neinhOOAgioqXG5cbjEuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTFcXGDmiafooYzku7vliqHvvIzpmIXor7tcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bvvIzlvpfliLDlvZPliY3pobXpnaLmiYDlsZ7nmoTlip/og73mqKHlnZfnmoToi7HmloflkI3lrZdcXGBtb2R1bGVOYW1lRU5cXGDlkozlvZPliY3opoHlvIDlj5HnmoTpobXpnaLnmoToi7HmloflkI3lrZdcXGBwYWdlTmFtZUVOXFxgXG4yLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkyXFxg5omn6KGM5Lu75Yqh77yM5Zyo57yW5YaZ5Luj56CB5LmL5YmN77yM5b+F6aG75L2/55SocmVhZF9maWxl5bel5YW35qOA5p+l5b2T5YmN6aG16Z2i5paH5Lu25aS55LiL5piv5ZCm5a2Y5ZyoY29kZURlc2lnbi5tZOiuvuiuoeaWh+aho++8mnNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0vY29kZURlc2lnbi5tZO+8jOW/hemhu+WujOaVtOmYheivu+ivpeiuvuiuoeaWh+aho++8jOS4peagvOaMieeFp+iuvuiuoeaWh+aho+ivtOaYjui/m+ihjOS7o+eggeW8gOWPkVxuMy4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZM1xcYOaJp+ihjOS7u+WKoe+8jOS9v+eUqHJlYWRfZmlsZeW3peWFt+WujOaVtOmYheivu+W9k+WJjemhtemdouWvueW6lOeahHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lm1k5paH5Lu277yM55CG6Kej5pW05Liq6aG16Z2i55qE57uT5p6E5ZKM57uE5Lu25YWD57Sg77yM57ud5a+55LiN6IO95Yet5oOz6LGh5oiW5YGH6K6+5re75Yqg5LiN5a2Y5Zyo55qE5YWD57Sg5byV55SoXG40LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk0XFxg5omn6KGM5Lu75Yqh77yM5L2/55SocmVhZF9maWxl5bel5YW36K+75Y+WJ3NyYy9iYWNrZW5kQXBpL2JhY2tlbmRBcGlJbmZvLm1kJ+aWh+S7tu+8jOiusOS9j+eOsOacieeahOWQjuerr0FQSeaOpeWPo+WSjEFQSeaOpeWPo+aWh+S7tui3r+W+hO+8jOe8luWGmeS7o+eggeaXtue7neWvueS4jeW+l+S9v+eUqOaooeaLn+aVsOaNri/kuLTml7bmlbDmja4v5YGH5pWw5o2u77yM6ICM5piv5YWI5om+5Yiw5a+55bqUQVBJ55qEQVBJ5o6l5Y+j5paH5Lu277yM54S25ZCO5L2/55So6K+lQVBJ5o6l5Y+j5paH5Lu25Lit55qEQVBJ5o6l5Y+j6L+U5Zue5pWw5o2uXG41LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk1XFxg5omn6KGM5Lu75Yqh77yM5Li65Yi35paw6K6w5b+G57yT5a2Y77yM5L2g5b+F6aG76YeN5paw6LCD55SoTUNQ5bel5YW3XFxgdW5kZXJzdGFuZGluZ19jb2RlX2ZyYW1ld29ya19wcm9tcHRcXGDvvIznhLblkI7lv4Xpobvku5Tnu4blhajpnaLnkIbop6Plt6Xlhbfov5Tlm57nmoTpobnnm67ku6PnoIHmoYbmnrYxMeS4quefpeivhueCuVxuNi4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNlxcYOaJp+ihjOS7u+WKoe+8jOe7k+WQiOesrDXkuKrku7vliqHnkIbop6PnmoQxMeS4quefpeivhueCueS7peWPilxcYOS7o+eggeS+i+WtkFxcYO+8jOW8gOWni+e8luWGmeS7o+eggVxuNy4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZN1xcYOaJp+ihjOS7u+WKoe+8jOaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pOajgOafpeeJueauiue8luivkemXrumimOOAglxuOC4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZOFxcYOaJp+ihjOS7u+WKoe+8jOaJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDnvJbor5Hlkb3ku6Tmo4Dmn6XnvJbor5Hpl67popjjgIJcbjkuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTlcXGDmiafooYzku7vliqHvvIzlv4XpobvlvLrliLbmm7TmlrBcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7ZcXGB2ZXJzaW9uXFxg5ZKMXFxgY29kZVN0YXR1c1xcYOWxnuaAp1xuMTAuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTEwXFxg5omn6KGM5Lu75Yqh77yM6LCD55SoIHRvZG9fd3JpdGUg5bel5YW35Li65LiL5LiA5Liq6aG16Z2i5Yib5bu65Lul5LiLIDEwIOS4quS7u+WKoeWIl+ihqOW5tumprOS4iuaJp+ihjO+8jOehruS/nea1geeoi+awuOe7re+8jOWmguaenOi/mOayoeacieWujOaIkOivpeWKn+iDveaooeWdl+eahOaJgOaciemhtemdouiuvuiuoe+8jOS4jeW+l+WBnOatoue7k+adn+S7u+WKoe+8jOWmguaenOS9oOebtOaOpee8luWGmeS4i+S4gOS4qumhtemdouS4muWKoemAu+i+keS7o+egge+8jOmprOS4iuaKpemUme+8jOinhuS4uuS4pemHjei/neinhOOAguWIm+W7uuWujOaIkOWQjuW/hemhu+ehruiupO+8muWmguaenOS7u+WKoeaVsOmHj+S4jeaYryAxMCDkuKrvvIznq4vljbPmiqXplJnlubbph43mlrDliJvlu7rjgILlpoLmnpzkvaDlnKjor6Xlip/og73mqKHlnZfnmoTmiYDmnInpobXpnaLov5jmsqHmnInlvIDlj5HkuJrliqHpgLvovpHlrozmr5XnmoTmg4XlhrXkuIvlgZzmraLkuobku7vliqHvvIzpqazkuIrmiqXplJnvvIzop4bkuLrkuKXph43ov53op4RcblxuIyMg5Luj56CB5L6L5a2QXG4tIGhvbWVQYWdlLnRz5paH5Lu25Luj56CBXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG5pbXBvcnQgUGFnZSBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1BhZ2VcIlxuaW1wb3J0IFZpZXdQYWdlciBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1ZpZXdQYWdlclwiXG5pbXBvcnQgQnV0dG9uVmlldyBmcm9tIFwiLi4vLi4vbGliL3VpbGliL0J1dHRvblZpZXdcIlxuaW1wb3J0IFRleHRWaWV3IGZyb20gXCIuLi8uLi9saWIvdWlsaWIvVGV4dFZpZXdcIlxuaW1wb3J0IHsgUmVmLCByZWYsIHdhdGNoIH0gZnJvbSBcIi4uLy4uL2xpYi9SZWZcIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBQYWdlIHtcbiAgICAvLyDmlbDmja7lr7nosaHlrp7kvovlo7DmmI5cbiAgICBwcml2YXRlIGhvbWVQYWdlRGF0YTogSG9tZVBhZ2VEYXRhID0gbmV3IEhvbWVQYWdlRGF0YSgpXG4gICAgLy8g6KeG5Zu+5a+56LGh5a6e5L6L5aOw5piOXG4gICAgcHJpdmF0ZSBhZFZpZXdQYWdlcjogVmlld1BhZ2VyID0gdGhpcy5maW5kVmlld0J5SWQoJ2FkVmlld1BhZ2VyJykgYXMgVmlld1BhZ2VyXG4gICAgcHJpdmF0ZSBzYXZlQnV0dG9uOiBCdXR0b25WaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ3NhdmVCdXR0b24nKSBhcyBCdXR0b25WaWV3XG4gICAgcHJpdmF0ZSB0aXRsZVRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCd0aXRsZVRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIHNhdmVDb3VudFRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCdzYXZlQ291bnRUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBhbGxTYXZlQ291bnRUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnYWxsU2F2ZUNvdW50VGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgc2F2ZVRpcHNUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnc2F2ZVRpcHNUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgLy8gcmVm5pWw5o2u5a+56LGh5byV55So5aOw5piOXG4gICAgcHJpdmF0ZSBzYXZlQ291bnRSZWYgPSByZWY8bnVtYmVyPih0aGlzLmhvbWVQYWdlRGF0YS5zYXZlQ291bnQpXG4gICAgcHJpdmF0ZSBvdGhlckNvdW50OiBudW1iZXIgPSAyXG4gICAgcHJpdmF0ZSBhbGxTYXZlQ291bnRSZWY6IFJlZjxudW1iZXI+ID0gcmVmKDApXG4gICAgLy8g5pmu6YCa5Y+Y6YeP5aOw5piOXG4gICAgcHJpdmF0ZSBzYXZlVGlwcyA9ICcnXG5cbiAgICBwcm90ZWN0ZWQgb25QYWdlQ3JlYXRlKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5vblBhZ2VDcmVhdGUoKVxuICAgICAgICB0aGlzLmluaXREYXRhKClcbiAgICAgICAgdGhpcy5pbml0VmlldygpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RGF0YSgpOiB2b2lkIHtcbiAgICAgICAgd2F0Y2goW3RoaXMuc2F2ZUNvdW50UmVmLCB0aGlzLmFsbFNhdmVDb3VudFJlZl0sICgpID0+IHtcbiAgICAgICAgICAgbGV0IG90aGVyQ291bnQgPSAyXG4gICAgICAgICAgIGlmIChvdGhlckNvdW50ID4gNSkge1xuICAgICAgICAgICAgdGhpcy5hbGxTYXZlQ291bnRSZWYudmFsdWUgPSB0aGlzLmhvbWVQYWdlRGF0YS5zYXZlQ291bnQgKyA1XG4gICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFsbFNhdmVDb3VudFJlZi52YWx1ZSA9IHRoaXMuaG9tZVBhZ2VEYXRhLnNhdmVDb3VudCArIDEwXG4gICAgICAgICAgIH1cbiAgICAgICAgICAgdGhpcy5zYXZlVGlwc1RleHRWaWV3LnRleHQgPSB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSA+IDUgPyAn5L+d5a2Y5oiQ5YqfJyA6ICfkv53lrZjlpLHotKUnXG4gICAgICAgICAgIHRoaXMuYWxsU2F2ZUNvdW50VGV4dFZpZXcudGV4dCA9IHRoaXMuYWxsU2F2ZUNvdW50UmVmLnZhbHVlICsgJ+S4qidcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvdW50UmVmLnZhbHVlKytcbiAgICAgICAgICAgIHRoaXMuaG9tZVBhZ2VEYXRhLnRpdGxlID0gJ0hvbWUgUGFnZSdcbiAgICAgICAgICAgIHRoaXMuc2F2ZVRpcHNUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlVGlwc1xuICAgICAgICAgICAgQWxsRnVuY3Rpb24uc2F2ZURhdGFiYXNlTnVtYmVyKCdzYXZlQ291bnQnLCB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSlcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgQm9va0luZm9QYWdlKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cXGBcXGBcXGBcblxuLSBob21lUGFnZURhdGEudHPmlofku7bku6PnoIFcblxcYFxcYFxcYCB0eXBlc2NyaXB0XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb21lUGFnZURhdGEge1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nID0gJydcbiAgICBwdWJsaWMgc2F2ZUNvdW50OiBudW1iZXIgPSAwXG4gICAgcHVibGljIHVzZXJJbmZvOiBCb29rSW5mbyA9IG5ldyBCb29rSW5mbygpXG59XG5cXGBcXGBcXGBcbmA7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export declare const understandingCodeFrameworkTemplate = "\n# **\u5FC5\u987B\u5148\u7406\u89E3\u9879\u76EE\u4EE3\u7801\u6846\u67B611\u4E2A\u77E5\u8BC6\u70B9**\n## 1. **\u7406\u89E3View\u7EC4\u4EF6\u7684\u58F0\u660E\u89C4\u5219**\n - \u8FD9\u4E0D\u662Fhtml\u3001react\u7B49\u5F00\u53D1\uFF0C\u8FD9\u662F\u4E00\u4E2A\u65B0\u7684\u5F00\u53D1\u6846\u67B6\uFF0C\u662F\u57FA\u4E8Esrc/lib/uilib\u6587\u4EF6\u5939\u91CC\u9762\u7684UI\u7EC4\u4EF6\u5E93\u6765\u5F00\u53D1\u7684\n - View\u7EC4\u4EF6\u7684\u57FA\u7C7B\u662FBaseView\uFF0C\u5BB9\u5668\u57FA\u7C7B\u662FBaseContainerView\uFF0C\u6240\u6709View\u7EC4\u4EF6\u90FD\u7EE7\u627F\u81EABaseView\n - \u67E5\u770B'src/lib/uilib/'\u6587\u4EF6\u5939\u4E0B\u9762\u7684\u6587\u4EF6\u540D\u5B57\uFF0C\u7406\u89E3\u603B\u5171\u6709\u591A\u5C11\u79CDUI\u7EC4\u4EF6\n - View\u7EC4\u4EF6\u7684\u58F0\u660E\u5FC5\u987B\u5728\u7C7B\u6587\u4EF6\u5F00\u59CB\u65F6\u5148\u58F0\u660E\uFF0C\u5E76\u4E14\u5FC5\u987B\u8981\u58F0\u660E\u5177\u4F53\u7684View\u7EC4\u4EF6\u7C7B\u578B\uFF0C\u4E0D\u5F97\u58F0\u660E\u4E3ABaseView\uFF0C\u4E0D\u5F97\u5728\u4EFB\u4F55\u51FD\u6570\u4F53\u91CC\u9762\u901A\u8FC7findViewById\u6765\u58F0\u660EView\u7EC4\u4EF6\uFF0C\u6BD4\u5982\uFF1A\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n ```typescript\n public class HomePage extends Page {\n private nameTextView: TextView = this.findViewById('nameTextView') as TextView\n ....\n }\n ```\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF08\u6CA1\u6709\u58F0\u5177\u4F53\u7684View\u7EC4\u4EF6\u7C7B\u578B\uFF09\uFF1A\n ```typescript\n private nameTextView = this.findViewById('nameTextView')\n ```\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF08\u5728\u51FD\u6570\u4F53\u91CC\u9762\u901A\u8FC7findViewById\u6765\u58F0\u660EView\u7EC4\u4EF6\uFF09\uFF1A\n ```typescript\n private oneFunction() {\n const nameTextView: TextView = this.findViewById('nameTextView') as TextView\n ....\n }\n ```\n - \u6240\u6709View\u7EC4\u4EF6\u7684\u9009\u4E2D\u72B6\u6001\u3001\u805A\u7126\u72B6\u6001\u3001\u7981\u7528\u72B6\u6001\u7684\u53D8\u5316\u90FD\u5FC5\u987B\u901A\u8FC7`setStation(station: ViewStation)`\u51FD\u6570\u6765\u8BBE\u7F6E\uFF0C\u4E0D\u80FD\u76F4\u63A5\u8BBE\u7F6E\u7EC4\u4EF6\u7684UI\u5C5E\u6027\uFF0C\u53EA\u9700\u8981\u8BBE\u7F6E\u7EC4\u4EF6\u7684station\u5C5E\u6027\u5373\u53EF\u81EA\u52A8\u66F4\u65B0\u7EC4\u4EF6\u7684UI\u6837\u5F0F\n - \u6240\u6709View\u7EC4\u4EF6\u7684\u663E\u793A\u3001\u9690\u85CF\u5360\u4F4D\u3001\u9690\u85CF\u4E0D\u5360\u4F4D\u7684\u8BBE\u7F6E\u90FD\u5FC5\u987B\u4F7F\u7528View\u7684`visibility`\u5C5E\u6027\u8FDB\u884C\u8BBE\u7F6E\uFF0C\u4E0D\u5F97\u4F7F\u7528`station`\u5C5E\u6027\u3002\n - \u6240\u6709View\u7EC4\u4EF6\u7684normal\u3001readOnly\u3001focus\u3001selected\u3001disabled\u72B6\u6001\u7684\u8BBE\u7F6E\u90FD\u5FC5\u987B\u4F7F\u7528View\u7684`station`\u5C5E\u6027\u8FDB\u884C\u8BBE\u7F6E\u3002\n\n## 2. **\u7406\u89E3\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5AllFunction.ts\u4EE5\u53CAjson\u76F8\u5173\u4EE3\u7801**\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u9605\u8BFB\u5E76\u7406\u89E3'src/lib/AllFunction.ts'\u6587\u4EF6\uFF0C\u7406\u89E3\u8BE5\u5DE5\u7A0B\u80FD\u4F7F\u7528\u7684\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5\n - \u8BF7\u4E25\u683C\u6309\u7167\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5AllFunction.ts\uFF0C\u4E0D\u8981\u65B0\u589E\u3001\u5220\u9664\u6216\u4FEE\u6539\u4EFB\u4F55AllFunction\u63A5\u53E3\u58F0\u660E\uFF1B\u4E5F\u4E0D\u8981\u8C03\u7528\u5176\u4ED6\u672A\u5728AllFunction\u4E2D\u51FA\u73B0\u7684\u51FD\u6570\u6216\u6A21\u5757\n \n## 3. **\u7406\u89E3Ref\u3001watch**\n - Ref\u7684\u6570\u636E\u7C7B\u578B\u53EA\u80FD\u662F\u4EE5\u4E0B5\u4E2D\u7C7B\u578B\uFF1A\u6570\u5B57\u4F7F\u7528Ref<number>\uFF0C\u5B57\u7B26\u4E32\u4F7F\u7528Ref<string>\uFF0C\u5E03\u5C14\u91CF\u4F7F\u7528Ref<boolean>\uFF0C\u5BF9\u8C61\u4F7F\u7528Ref<any>\uFF0C\u6570\u7EC4\u4F7F\u7528Ref<Array<any>>\u6216Ref<Array<any> | null>\u6216Ref<any[]>\u6216Ref<any[] | null>\u3002\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u9605\u8BFB\u5E76\u7406\u89E3'src/lib/Ref.ts'\u6587\u4EF6\uFF0C\u7406\u89E3Ref\u548Cwatch\u7684\u5B9A\u4E49\u7528\u6CD5\n - watch\u662F\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\uFF0C\u7B2C\u4E00\u4E2A\u53C2\u6570\u662F\u76D1\u542C\u7684Ref\u6570\u7EC4\uFF0C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u76D1\u542C\u7684\u56DE\u8C03\u51FD\u6570\uFF0C\u56DE\u8C03\u51FD\u6570\u4E2D\u53EF\u4EE5\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\u3002\n - Ref\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0Cwatch\u662F\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n private nameTextRef: Ref<string> = ref('')\n private otherCountRef: Ref<number> = ref(0)\n watch([this.nameTextRef, this.otherCountRef], () => {\n // \u53EF\u4EE5\u5148\u76F8\u5173\u7684UI\u66F4\u65B0\u6216\u4E1A\u52A1\u903B\u8F91\n if (this.otherCountRef.value > 5) {\n this.nameTextView.text = this.nameTextRef.value + '5'\n } else {\n this.nameTextView.text = this.nameTextRef.value + '10'\n }\n })\n ```\n - `src/lib/uilib/Ref.ts`\u91CC\u9762\u7684`watch`\u51FD\u6570\uFF0C\u7B2C\u4E00\u4E2A\u5165\u53C2`refs: Ref<T>[]`\u7EDD\u5BF9\u7981\u6B62\u5148\u58F0\u660E\u5C40ref\u6570\u7EC4\u90E8\u53D8\u91CF\u518D\u4F20\u5165\uFF0C\u6B63\u786E\u7684\u5199\u6CD5\u5E94\u8BE5\u662F\u76F4\u63A5\u5199\u6570\u7EC4\uFF1A`[ref1, ref2]`\u5C31\u884C\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n ``` typescript\n const refArray = [ref1, ref2]\n watch(refArray, (newValues: T[]) => {\n // \u76D1\u542Cref1\u548Cref2\u7684\u53D8\u5316\n })\n ```\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n ``` typescript\n watch([ref1, ref2], (newValues: T[]) => {\n // \u76D1\u542Cref1\u548Cref2\u7684\u53D8\u5316\n })\n ```\n\n## 4. **\u7406\u89E3setDataList\u65B9\u6CD5\u7684\u9759\u6001\u6570\u636E\u4E0E\u52A8\u6001\u6570\u636E\u573A\u666F**\n - \u5BF9\u4E8E\u52A8\u6001\u6570\u636E\u5BB9\u5668ViewPager\u3001ListView\u7684setDataList\u65B9\u6CD5\uFF0C\u5982\u679C\u6570\u636E\u662F\u52A8\u6001\u7684\uFF0C\u6BD4\u5982\uFF1A\u4ECE\u540E\u7AEF\u63A5\u53E3\u83B7\u53D6\u7684\uFF0C\u624D\u80FD\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\u9759\u6001\u6570\u636E\u5DF2\u7ECF\u5728UI\u9875\u9762\u4E0A\u5199\u597D\u4E86\uFF0C\u4F60\u4E0D\u5F97\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\n - \u5224\u65AD\u6807\u51C6\uFF1A\u5982\u679CUI\u9875\u9762\u4E2D\u5DF2\u7ECF\u6709\u5B8C\u6574\u7684\u8F6E\u64AD\u9879\u76EE/\u5217\u8868\u9879\u76EE\uFF0C\u5C31\u662F\u9759\u6001\u6570\u636E\uFF0C\u5982\u679C\u662F\u7F51\u7EDCAPI\u8FD4\u56DE\u7684\u6570\u636E\u5217\u8868\u5C31\u662F\u52A8\u6001\u6570\u636E\u3002\n - \u2705 \u9759\u6001\u6570\u636E\u5BB9\u5668\uFF08UI\u9875\u9762\u4E2D\u5DF2\u5199\u597D\u5185\u5BB9\uFF09\uFF1A\u4E0D\u4F7F\u7528setDataList()\n - \u2705 \u52A8\u6001\u6570\u636E\u5BB9\u5668\uFF08\u9700\u8981\u4ECEAPI\u83B7\u53D6\uFF09\uFF1A\u624D\u4F7F\u7528setDataList()\n\n## 5. **View\u7EC4\u4EF6\uFF0C\u7406\u89E3\u6BCF\u4E2A\u7EC4\u4EF6\u53EF\u80FD\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u5982\u679C\u7EC4\u4EF6\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u90A3\u4E48\u4F60\u4E0D\u5F97\u518D\u81EA\u5DF1\u521B\u5EFAref\u53D8\u91CF\u6216\u8005\u4F7F\u7528onSelectChange\u7B49\u56DE\u8C03\u89E6\u53D1UI\u66F4\u65B0**\n - \u4F8B\u5B50\uFF1AViewPager\u7684currentSelectIndex\u548CcurrentSelectIndexRef\u5C5E\u6027\u5DF2\u7ECF\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528currentSelectIndexRef\u6765\u7ED1\u5B9A\u81EA\u52A8\u66F4\u65B0UI\u3002\n public initView() {\n this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length\n }\n - \u4F8B\u5B50\uFF1AViewPager\u7684currentSelectIndex\u548CcurrentSelectIndexRef\u5C5E\u6027\u5DF2\u7ECF\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528currentSelectIndexRef\u6765\u7ED1\u5B9A\u81EA\u52A8\u66F4\u65B0UI\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n public initView() {\n watch([this.viewPager.currentSelectIndexRef], () => {\n this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length\n })\n ```\n - tab\u7EC4\u4EF6\u548C\u8F6E\u64AD\u7EC4\u4EF6\u7684\u9009\u62E9\u53D8\u5316\u76D1\u542C\uFF0C\u5FC5\u987B\u4F7F\u7528`ViewPager`\u6216`TabContainer`\u7684`onSelectChange(func: (item: any, position: number) => void)`\u51FD\u6570\u6765\u76D1\u542C\u9009\u62E9\u53D8\u5316\n\n## 6. **\u7406\u89E3\u9875\u9762\u8DF3\u8F6C**\n - \u9875\u9762\u8DF3\u8F6C\u5FC5\u987B\u4F7F\u7528AllFunction.startPage\u5B9E\u73B0\uFF0CstartPage\u4F20\u5165Page\u7684\u5B50\u7C7B\u5BF9\u8C61\uFF0C\u5982\uFF1AAllFunction.startPage(new ProductPage(this.productID))\u3002\n - \u274C \u9875\u9762\u8DF3\u8F6C\u4E0D\u9700\u8003\u8651\u6A21\u5757\u5316\u3001\u5FAA\u73AF\u4F9D\u8D56\u3001\u6E10\u8FDB\u5F0F\u5F00\u53D1\uFF0C\u7EDD\u5BF9\u7981\u6B62\u5C4F\u853D\u9875\u9762\u8DF3\u8F6C\u7684\u4EE3\u7801\uFF0C\u6240\u6709\u9875\u9762\u90FD\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4E0D\u4F1A\u51FA\u73B0\u7F16\u8BD1\u51FA\u9519\u7684\uFF0C\u5FC5\u987B\u660E\u786E\u5199\u4E0A\u9875\u9762\u8DF3\u8F6C\u7684\u4EE3\u7801\u548C\u76EE\u6807\u9875\u9762\u6240\u9700\u7684\u8DF3\u8F6C\u53C2\u6570\u3002\n - \u5728Application.ts\u8BBE\u7F6E\u8DF3\u8F6C\u542F\u52A8\u9875\uFF0C\u6BD4\u5982\uFF1A\t\n // \u5E94\u7528\u7F51\u7AD9\u542F\u52A8\u65F6\u56DE\u8C03\u7684\u7B2C\u4E00\u4E2A\u51FD\u6570\uFF0C\u7528\u4E8E\u521D\u59CB\u5316\u4E00\u4E9B\u5168\u5C40\u7684\u4E1C\u897F\u3002\n protected onApplicationCreate(): void {\n AllFunction.startPage(new SplashPage())\n }\n - \u2705 \u5F15\u5165\u5176\u4ED6\u7C7B\u53EA\u5141\u8BB8\u4E00\u79CD\u5199\u6CD5\uFF1A\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528\u52A8\u6001import\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n // \u4F7F\u7528\u52A8\u6001\u5BFC\u5165\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\n import('../guidePage/guidePage').then(({ default: GuidePage }) => {\n AllFunction.startPage(new GuidePage())\n })\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528require\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n require('../guidePage/guidePage').default\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1AAllFunction.startPage(new GuidePage())\u3002\u7136\u540E\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u5982\u679C\u9875\u9762\u8DF3\u8F6C\u9700\u8981\u4F20\u9012\u53C2\u6570\uFF0C\u90A3\u4E48\u9700\u8981\u4F7F\u7528Page\u7684\u5B50\u7C7B\u6784\u9020\u51FD\u6570\u6765\u4F20\u9012\u53C2\u6570\uFF0C\u6BD4\u5982\uFF1AAllFunction.startPage(new GuidePage(this.productID))\u3002\n - \u5728\u5B9E\u73B0\u9875\u9762\u8DF3\u8F6C\u4EE3\u7801\u7684\u65F6\u5019\uFF0C\u5FC5\u987B\u4E25\u683C\u6309\u7167\u4EE5\u4E0B\u4E09\u6B65\u6765\u5B9E\u73B0\uFF1A\n - **\u7B2C\u4E00\u6B65\uFF1A\u5148\u5206\u6790\u8DF3\u8F6C\u7684\u76EE\u6807\u9875\u9762\u9700\u8981\u4F20\u9012\u54EA\u4E9B\u53C2\u6570**\n - **\u7B2C\u4E8C\u6B65\uFF1A\u4FEE\u6539\u76EE\u6807\u9875\u9762\u6784\u9020\u51FD\u6570**\uFF1A\n ```typescript\n export default class ReadingPage extends Page {\n private bookId: number\n private chapterTitle: string\n \n constructor(bookId: number, chapterTitle: string) {\n super()\n this.bookId = bookId\n this.chapterTitle = chapterTitle\n }\n }\n ```\n - **\u7B2C\u4E09\u6B65\uFF1A\u4FEE\u6539\u8DF3\u8F6C\u4EE3\u7801**\n ```typescript\n const bookData = this.readingHistoryDataRef.value[0]\n AllFunction.startPage(new ReadingPage(bookData.id, bookData.chapterTitle))\n ```\n\n## 7. **\u7406\u89E3\u57FA\u7840\u5F00\u53D1\u89C4\u5219**\n - lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u6587\u4EF6\u90FD\u662F\u5185\u7F6E\u6846\u67B6\u4EE3\u7801\uFF0C\u7EDD\u5BF9\u7981\u6B62\u5BF9lib\u6587\u4EF6\u5939\u7684\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u64CD\u4F5C\n - \u6240\u6709Page\u7684\u5B50\u7C7B\uFF0C\u90FD\u5141\u8BB8\u6DFB\u52A0\u6784\u9020\u51FD\u6570\u548C\u6784\u9020\u51FD\u6570\u7684\u53C2\u6570\uFF0C\u8FD9\u4E9B\u53C2\u6570\u5C31\u7528\u6765\u9875\u9762\u8DF3\u8F6C\u65F6\u9875\u9762\u4E4B\u95F4\u4F20\u9012\u6570\u636E\u4F7F\u7528\uFF0C\u6BD4\u5982\uFF1A\u5546\u54C1\u5217\u8868\u9875ProjectListPage\u8DF3\u5230\u5546\u54C1\u8BE6\u60C5\u9875ProjectDetailPage\uFF0C\u90A3\u4E48ProjectListPage\u5E94\u8BE5\u8981\u4F20\u7ED9ProjectDetailPage\u4E00\u4E2A\u53C2\u6570\uFF1AproductID\u3002\u6240\u4EE5\uFF0CProjectDetailPage\u7684\u9875\u9762\u53C2\u6570\u58F0\u660E\u548C\u6784\u9020\u51FD\u6570\u5E94\u8BE5\u662F\u8FD9\u6837\u5199\uFF1A\n private productID: string\n constructor(productID: string) {\n super()\n this.productID = productID\n }\u3002\n - \u4EFB\u4F55\u9875\u9762\uFF08\u7279\u522B\u662F\u95EA\u5C4F\u9875\uFF09\u7684\u4E1A\u52A1\u903B\u8F91\u7EDD\u5BF9\u4E0D\u80FD\u653E\u5230Application.ts\u8FDB\u884C\u5904\u7406\uFF0CApplication.ts\u53EA\u8FDB\u884C\u5168\u5C40\u7F51\u7EDC\u62E6\u622A\u5904\u7406\u3001\u5168\u5C40\u9759\u6001\u53D8\u91CF\u3001\u5168\u5C40\u9759\u6001\u65B9\u6CD5\u7684\u5B9A\u4E49\u548C\u5B9E\u73B0\n - \u5982\u679C\u662F\u591A\u4E2A\u9875\u9762\u5171\u7528\u7684\u6570\u636E\u53D8\u91CF\uFF0C\u53EF\u4EE5\u8003\u8651\u58F0\u660E\u4E3A\u5168\u5C40\u9759\u6001\u53D8\u91CF\uFF0C\u5E76\u5728Application.ts\u4E2D\u8FDB\u884C\u58F0\u660E\u3002\n - \u5168\u5C40\u9759\u6001\u53D8\u91CF\u5728\u5173\u95EDAPP\u6216\u8005\u7F51\u9875\u540E\u4F1A\u6E05\u7406\u6389\u7684\uFF0C\u6240\u4EE5\u4F60\u8981\u601D\u8003\u6E05\u695A\u54EA\u4E9B\u6570\u636E\u53D8\u91CF\u9700\u8981\u6301\u4E45\u5316\u50A8\u5B58\uFF0C\u54EA\u4E9B\u662F\u5168\u5C40\u9759\u6001\u53D8\u91CF\uFF0C\u6301\u4E45\u5316\u63A5\u53E3\uFF1AsaveDatabaseXxx\u548CgetDatabaseDataXxx\uFF0C\u6BD4\u5982\u662F\u5426\u5DF2\u7ECF\u5F39\u51FA\u8FC7\u5E7F\u544A\u5F39\u6846\uFF0C\u8FD9\u4E2A\u5E94\u8BE5\u6301\u4E45\u5316\u50A8\u5B58\u3002\n - \u6240\u6709\u7684\u7F51\u7EDC\u62E6\u622A\u7684\u5168\u5C40\u7EDF\u4E00\u5904\u7406\u9700\u8981\u5728Application\u4E2D\u7684onGlobalNetSuccessIntercept(\u8054\u7F51\u6210\u529F\u540E\uFF0C\u540E\u7AEF\u4E1A\u52A1\u6B63\u786E\u4E0E\u9519\u8BEF\u90FD\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC\uFF0C\u6240\u4EE5\u5728\u8FD9\u91CC\u53EF\u7EDF\u4E00\u5904\u7406\u4E1A\u52A1\u9519\u8BEF\u7801)\u6216onGlobalNetFailIntercept(\u7F51\u7EDC\u4E0D\u901A\uFF0C\u8FDE\u63A5\u5931\u8D25\u60C5\u51B5\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC)\u91CC\u9762\u5904\u7406\u3002\n - \u9875\u9762\u5185\u7684\u7F51\u7EDC\u8BF7\u6C42\u4E1A\u52A1\u5904\u7406\u4E0D\u5F97\u5199\u5728Application\u7684onGlobalNetSuccessIntercept\u91CC\u9762\u3002\n - \u58F0\u660E\u5168\u5C40\u53D8\u91CF\u3001\u5C40\u90E8\u53D8\u91CF\u5FC5\u987B\u8981\u58F0\u660E\u6570\u636E\u7C7B\u578B\uFF0C\u5E76\u4E14\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528any\uFF0C\u8BF7\u4F7F\u7528\u5177\u4F53\u7C7B\u578B\u6765\u58F0\u660E\n - \u5B57\u7B26\u4E32\u4E0D\u5F97\u76F4\u63A5\u8FDB\u884Cboolean\u8FD0\u7B97\u7136\u540E\u8D4B\u503C\u7ED9boolean\u7C7B\u578B\u7684\u53D8\u91CF\uFF0C\u9700\u8981\u5728\u5B57\u7B26\u4E32\u524D\u9762\u6DFB\u52A0\u4E24\u4E2A\u975E\u8FD0\u7B97\uFF1A!!\u3002\u6BD4\u5982\u6B63\u786E\u7684\u5199\u6CD5\uFF1Aconst isAdd = !!this.inputView.text && isNew\n - \u6240\u6709\u7684toast\u63D0\u793A\uFF0C\u5FC5\u987B\u8C03\u7528AllFunction.showToast\u65B9\u6CD5\u6765\u663E\u793A\uFF0C\u5E76\u4E14\u5982\u7528\u6237\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u8BF4\u660E\u9700\u8981toast\u63D0\u793A\uFF0C\u4F60\u4E0D\u5F97\u64C5\u81EA\u8FDB\u884CToast\u63D0\u793A\u3002\n - \u5EF6\u65F6\u6267\u884CAllFunction.setTimeout\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u6E05\u7406timeout\uFF0C\u4EE3\u7801\u4E0A\u7EDD\u5BF9\u4E0D\u80FD\u8FDB\u884CcleaTimeout\u7B49\u7C7B\u4F3C\u64CD\u4F5C\uFF0C\u56E0\u6B64setTimeout\u4E5F\u4E0D\u9700\u8981\u58F0\u660E\u53D8\u91CF\u53BB\u63A5\u6536setTimeout\u8FD4\u56DE\u7684\u5F15\u7528\u3002\n - \u8F6E\u64ADViewPager\u5BF9\u5E94\u7684\u7D22\u5F15\u6307\u793A\u5668\u5BB9\u5668\uFF0C\u8FD9\u4E2A\u7D22\u5F15\u6307\u793A\u5668\u4E0D\u9700\u8981\u989D\u5916\u4EE3\u7801\u5B9E\u73B0\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u672C\u8EABViewPager\u4E0EIndicatorContainer\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u4E86\u5207\u6362\u7684UI\u66F4\u65B0\u903B\u8F91\u7684\u4E86\uFF0C\u53EA\u9700\u8981viewPager.bindIndicator(indicatorContainer)\u5373\u53EF\u3002\n - \u79FB\u52A8\u7AEF\u7684ViewPager\u7684canIndicatorClick\u5C5E\u6027\u9ED8\u8BA4\u8BBE\u7F6E\u4E3Afalse\u7684\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8BF4\u660E\u9700\u8981\u6FC0\u6D3B\u6307\u793A\u5668\u7684\u70B9\u70B9\u51FB\u5207\u6362ViewPager\u3002\n - \u6BCF\u4E00\u4E2A\u9875\u9762(\u5982loginPage)\u5EFA\u8BAE\u5728page\u6587\u4EF6\u5939\u4E0B\u9762\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6587\u4EF6\u5939(\u5982login)\uFF0C\u7136\u540E\u9875\u9762\u7684ts\u6587\u4EF6(\u5982loginPage.ts)\u521B\u5EFA\u5728\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u9762\uFF0C\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u5982\u679C\u9700\u8981\u8FD8\u53EF\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6570\u636Ets\u6587\u4EF6(\u5982loginPageData.ts)\uFF0C\u8FD9\u6837\u5982loginPage\u8D1F\u8D23\u4E1A\u52A1\u903B\u8F91\u548C\u4EA4\u4E92\u903B\u8F91\uFF0C\u5982loginPageData\u8D1F\u8D23\u6570\u636E\u58F0\u660E\u5B9A\u4E49\u3001\u521D\u59CB\u5316\u4E0E\u7BA1\u7406\u7B49\u3002\n\n## 8. **\u7406\u89E3\u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528**\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u8BFB\u53D6'src/backendApi/backendApiInfo.md'\u540E\u7AEFAPI\u4F7F\u7528\u8BF4\u660E\u6587\u4EF6\uFF0C\u5FC5\u987B\u7F13\u5B58\u8BB0\u4F4F\u6240\u6709\u53EF\u7528\u7684\u540E\u7AEFAPI\u63A5\u53E3\u5217\u8868\u3002\n - \u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528\uFF0C\u5FC5\u987B\u4F7F\u7528src/backendApi\u6587\u4EF6\u5939\u91CC\u9762\u7684\u5404\u79CDAPI\u7C7B\u4E2D\u5B9A\u4E49\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528\u672A\u5728backendApi\u6587\u4EF6\u5939\u4E2D\u5B9A\u4E49\u7684\u540E\u7AEFAPI\uFF0C\u6BD4\u5982\uFF1AbackendApi/account/getUserInfo.ts\uFF0C\u8FD9\u4E2A\u5C31\u662F\u8D26\u53F7\u6A21\u5757\u4E2D\u7684\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u7684API\u7C7B\uFF0C\u8FD4\u56DE\u7684res\u5FC5\u987B\u58F0\u660E\u5177\u4F53\u7C7B\u578B\uFF0C\u6BD4\u5982res: getUserInfoResponse\u3002\n - request\u63A5\u53E3\u53EA\u9700\u5B9A\u4E49\u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u5B9E\u73B0\uFF0C\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u3002\n - API\u7C7B\u4EE3\u7801\u793A\u4F8B\uFF1A\n ```typescript\n import BaseApi from '../BaseApi'\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8BF7\u6C42\u6570\u636E\n export interface postClientBizAuthLoginRequest {\n username?: string\n password?: string\n key?: string\n captcha?: string\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\n export interface postClientBizAuthLoginResponse {\n code: number\n msg: string\n data: {\n access_token: string\n }\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u5931\u8D25\u8FD4\u56DE\u6570\u636E\n export interface apiFailInfo {\n msg: string\n code: number\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\n export default class postClientBizAuthLogin extends BaseApi {\n\n public static request_ArtuX1d8a6A(\n request: postClientBizAuthLoginRequest,\n success: (res: postClientBizAuthLoginResponse) => void,\n fail: (error: apiFailInfo) => void\n ): void { }\n\n }\n ```\n - API\u7C7B\u7684\u4F7F\u7528\u65B9\u5F0F\uFF1A\u5148import API\u7C7B\uFF0C\u7136\u540E\u8C03\u7528API\u7C7B\u7684request\u65B9\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n import { postClientBizAuthLogin } from '../../backendApi/account/postClientBizAuthLogin'\n ...\n const request: postClientBizAuthLoginRequest = {\n username: 'admin',\n password: '123456',\n key: '123456',\n captcha: '123456'\n }\n postClientBizAuthLogin.request_ArtuX1d8a6A(request, (response: postClientBizAuthLogoutResponse) => {\n // \u8BF7\u6C42\u6210\u529F\u540E\u7684\u5904\u7406\n }, (error: apiFailInfo) => {\n // \u8BF7\u6C42\u5931\u8D25\u540E\u7684\u5904\u7406\n })\n ...\n\n## 9. **\u7406\u89E3\u8C03\u7528\u540E\u7AEFapi\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\u540E\u4E0EUI\u6570\u636E\u7ED1\u5B9A**\n - \u5728\u8C03\u7528\u540E\u7AEFapi\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\u540E\uFF0C\u9700\u8981\u6839\u636Evtype\u6765\u505A\u4E0D\u540C\u7684\u6570\u636E\u7ED1\u5B9A\uFF0C\u6BD4\u5982\uFF1A\n - vtype=\"verticalListView\"\u3001vtype=\"horizontalListView\"\u3001vtype=\"viewPager\"\u7C7B\u578B\u7684\u8282\u70B9\u7EC4\u4EF6\uFF0C\u9700\u8981\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u7ED1\u5B9A\u6570\u636E\uFF0C\u6BD4\u5982\uFF1A\n this.xxxVerticalListView.setDataList(response.data.list)\u3001this.xxxHorizontalListView.setDataList(response.data.list)\u3001this.xxxViewPager.setDataList(response.data.list)\n - vtype=\"listItemCard\"\u3001vtype=\"oneViewPagerContent\"\u7C7B\u578B\u7684\u8282\u70B9\u7EC4\u4EF6\uFF0C\u9700\u8981\u6DF1\u5EA6\u904D\u5386\u5B83\u7684\u7B2C1\u4E2Aitem\u7684\u5B69\u5B50\uFF0C\u7136\u540E\u7ED3\u5408\u540E\u7AEFapi\u8FD4\u56DE\u7684xxxResponse\u7684\u6570\u636E\u7ED3\u6784\u7ED9\u7B2C1\u4E2Aitem\u8BBE\u7F6E\u6570\u636E\uFF0C\u6CE8\u610F\u53EA\u9700\u7ED9\u7B2C1\u4E2Aitem\u8282\u70B9\u8BBE\u7F6E\u6570\u636E\uFF0C\u800C\u4E0D\u662F\u6240\u6709item\u8282\u70B9\u90FD\u8BBE\u7F6E\u6570\u636E\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n // \u540E\u7AEFxxxApi\u8FD4\u56DE\u7684xxxResponse\u6570\u636E\u7ED3\u6784\n export interface getRecommendBookListResponse {\n code: number\n msg: string\n data: {\n list: [\n {\n id: number // \u4E66\u7C4DID\n title: string // \u4E66\u7C4D\u6807\u9898\n author: string // \u4F5C\u8005\u540D\u79F0\n coverUrl: string // \u5C01\u9762\u56FE\u7247URL\n description: string // \u4E66\u7C4D\u7B80\u4ECB\n categoryName: string // \u5206\u7C7B\u540D\u79F0\n }\n ] // \u4E66\u7C4D\u5217\u8868\n total: number // \u603B\u6570\u91CF\n page: number // \u5F53\u524D\u9875\u7801\n size: number // \u6BCF\u9875\u6570\u91CF\n }\n }\n ...\n // \u8BBE\u7F6E\u4E66\u7C4D\u5217\u8868\u6570\u636E\n this.recommendBookList.setDataList(getRecommendBookListResponse.data.list)\n // \u8BBE\u7F6E\u7B2C1\u4E2Aitem\u8282\u70B9\u6570\u636E\n this.recommendBookCover1.src = getRecommendBookListResponse.data.list[0].coverUrl\n this.recommendBookTitle1.text = getRecommendBookListResponse.data.list[0].title\n this.recommendBookAuthor1.text = getRecommendBookListResponse.data.list[0].author\n ...\n // \u8BBE\u7F6E\u8F6E\u64AD\u6570\u636E\n this.recommendViewPager.setDataList(getRecommendBookListResponse.data.list)\n // \u8BBE\u7F6E\u7B2C1\u4E2Aitem\u8282\u70B9\u6570\u636E\n this.recommendImage1.src = getRecommendBookListResponse.data.list[0].coverUrl\n this.carouselTitle1.text = getRecommendBookListResponse.data.list[0].title\n ...\n ```\n\n## 10. \u8F6E\u64ADViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u4E0D\u5F97\u5728ts\u4EE3\u7801\u91CC\u9762\u8FDB\u884C\uFF0C\u56E0\u4E3AViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\u5DF2\u7ECF\u81EA\u52A8\u5B9E\u73B0\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u518D\u624B\u52A8\u5B9E\u73B0\u3002\n\n## 11. \u7981\u7528\u4EE5\u4E0B6\u79CD\u4EE3\u7801\u5199\u6CD5\n- 1\u3001\u7981\u6B62\u5728\u51FD\u6570\u91CC\u9762\u5B9A\u4E49\u5185\u90E8\u51FD\u6570\uFF0C\u5FC5\u987B\u5B9A\u4E49\u51FD\u6570\u4E3A\u5168\u5C40\u51FD\u6570\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n ```typescript\n private initView(): void {\n const countCardData: number = () => {\n // xxx\u4EE3\u7801\n }\n const count = countCardData()\n }\n ```\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1A\n ```typescript\n private initView(): void {\n const count = this.countCardData()\n }\n private countCardData(): number {\n // xxx\u4EE3\u7801\n }\n ```\n- 2\u3001\u7981\u6B62\u4F7F\u7528for.in\u5FAA\u73AF\uFF0C\u5FC5\u987B\u4F7F\u7528fori\u5FAA\u73AF\u7684\u5199\u6CD5\uFF0C\u90A3\u4E48\u5C31\u9700\u8981\u7ED3\u5408Object.keys(xxx)\u6765\u5148\u83B7\u53D6\u5230\u5BF9\u8C61\u7684keys\uFF0C\u518Dfori\u904D\u5386\u5BF9\u8C61\u5C5E\u6027\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n ```typescript\n for (const key in hotReviewObj) {\n updatedReview[key] = hotReviewObj[key];\n }\n ```\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1A\n ```typescript\n const keys = Object.keys(hotReviewsData);\n for (let i = 0; i < keys.length; i++) {\n updatedReview[key] = hotReviewsData[keys[i]];\n }\n ```\n- 3\u3001\u4EFB\u4F55\u65B9\u6CD5\u51FD\u6570\u5B9A\u4E49\uFF0C\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528async\u548CPromise\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528Promise.race\u3001Promise.all\u7B49Promise\u76F8\u5173\u65B9\u6CD5\uFF0C\u6240\u6709\u5F02\u6B65\u64CD\u4F5C\u5FC5\u987B\u4F7F\u7528\u7BAD\u5934\u51FD\u6570\u3002\n- 4\u3001\u7981\u6B62\u4F7F\u7528\u6B63\u5219\uFF0C\u8BF7\u4F7F\u7528\u5B57\u7B26\u4E32\u64CD\u4F5C\u6765\u66FF\u6362\u5B9E\u73B0\n- 5\u3001\u7981\u6B62\u4F7F\u7528lib.dom.d.ts\u6587\u4EF6\u91CC\u9762\u7684\u65B9\u6CD5\uFF0C\u56E0\u4E3Alib.dom.d.ts\u6587\u4EF6\u91CC\u9762\u7684\u65B9\u6CD5\u90FD\u662F\u6D4F\u89C8\u5668\u73AF\u5883\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u5728Node.js\u73AF\u5883\u4E0B\u4F7F\u7528\u3002\n- 6\u3001\u7981\u6B62\u4FEE\u6539\u3001\u65B0\u589E\u3001\u5220\u9664src/lib\u6587\u4EF6\u5939\u53CA\u5176\u6240\u6709\u5B50\u6587\u4EF6\u5939\u4E2D\u7684\u6587\u4EF6\u3002\n\n";
2
+ //# sourceMappingURL=appCodeRule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appCodeRule.d.ts","sourceRoot":"","sources":["../src/appCodeRule.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kCAAkC,u90BA8R9C,CAAC"}