@solar-taro/baidu 1.0.2
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/README.md +11 -0
- package/auth.interceptor.d.ts +5 -0
- package/auth.interceptor.js +47 -0
- package/auth.interceptor.js.map +1 -0
- package/auth.service.d.ts +18 -0
- package/auth.service.js +35 -0
- package/auth.service.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.js +4 -0
- package/index.js.map +1 -0
- package/interceptor.d.ts +7 -0
- package/interceptor.js +33 -0
- package/interceptor.js.map +1 -0
- package/model.d.ts +18 -0
- package/model.js +2 -0
- package/model.js.map +1 -0
- package/package.json +20 -0
- package/service.d.ts +17 -0
- package/service.js +33 -0
- package/service.js.map +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { HttpStatusCode } from '@ngify/http';
|
|
2
|
+
import { catchError, finalize, share, switchMap } from 'rxjs';
|
|
3
|
+
import { baiduBCEAuthService } from './auth.service.js';
|
|
4
|
+
/**
|
|
5
|
+
* 负责百度 `ORC` 接口的认证
|
|
6
|
+
*/
|
|
7
|
+
export function useBaiduAuthInterceptor() {
|
|
8
|
+
let refresher = null;
|
|
9
|
+
/**
|
|
10
|
+
* 获取访问令牌
|
|
11
|
+
*/
|
|
12
|
+
function getToken() {
|
|
13
|
+
refresher = baiduBCEAuthService().auth().pipe(finalize(() => refresher = null), share());
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 等待令牌后再发送请求
|
|
17
|
+
* @param request
|
|
18
|
+
* @param next
|
|
19
|
+
*/
|
|
20
|
+
function waitToken(request, next) {
|
|
21
|
+
return refresher.pipe(switchMap(({ access_token }) => (next(request.clone({
|
|
22
|
+
params: request.params.set('access_token', access_token)
|
|
23
|
+
})))));
|
|
24
|
+
}
|
|
25
|
+
return (request, next) => {
|
|
26
|
+
const token = baiduBCEAuthService().token;
|
|
27
|
+
if (!(token === null || token === void 0 ? void 0 : token.accessToken) && !refresher) {
|
|
28
|
+
getToken();
|
|
29
|
+
}
|
|
30
|
+
if (refresher) {
|
|
31
|
+
return waitToken(request, next);
|
|
32
|
+
}
|
|
33
|
+
request = request.clone({
|
|
34
|
+
params: request.params.set('access_token', token.accessToken)
|
|
35
|
+
});
|
|
36
|
+
return next(request).pipe(catchError((error) => {
|
|
37
|
+
if (error.status === HttpStatusCode.Unauthorized) {
|
|
38
|
+
if (!refresher) {
|
|
39
|
+
getToken();
|
|
40
|
+
}
|
|
41
|
+
return waitToken(request, next);
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
}));
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=auth.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.interceptor.js","sourceRoot":"","sources":["../../../packages/baidu/src/auth.interceptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAc,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,SAAS,GAAoE,IAAI,CAAC;IAEtF;;OAEG;IACH,SAAS,QAAQ;QACf,SAAS,GAAG,mBAAmB,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAC3C,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,EAChC,KAAK,EAAE,CACR,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS,SAAS,CAAC,OAA6B,EAAE,IAAmB;QACnE,OAAO,SAAU,CAAC,IAAI,CACpB,SAAS,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACjB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC;SACzD,CAAC,CAAC,CACJ,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,OAA6B,EAAE,IAAmB,EAAkC,EAAE;QAC5F,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC,KAAK,CAAC;QAE1C,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,CAAA,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC;SAC9D,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACvB,UAAU,CAAC,CAAC,KAA4B,EAAE,EAAE;YAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,CAAC,YAAY,EAAE,CAAC;gBACjD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,QAAQ,EAAE,CAAC;gBACb,CAAC;gBAED,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AuthTokens } from '.yalc/@solar-kit/planets/sun';
|
|
2
|
+
import type { BaiduAuth } from './model';
|
|
3
|
+
export interface BaiduConfig {
|
|
4
|
+
/** 公匙 */
|
|
5
|
+
key: string;
|
|
6
|
+
/** 私匙 */
|
|
7
|
+
secret: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const setupBaiduBCEAuth: (config: BaiduConfig) => void, baiduBCEAuthService: () => BaiduBCEAuthService;
|
|
10
|
+
export declare class BaiduBCEAuthService {
|
|
11
|
+
protected config: BaiduConfig;
|
|
12
|
+
private readonly http;
|
|
13
|
+
private _token;
|
|
14
|
+
get token(): AuthTokens;
|
|
15
|
+
private set token(value);
|
|
16
|
+
constructor(config: BaiduConfig);
|
|
17
|
+
auth(): import("rxjs").Observable<BaiduAuth>;
|
|
18
|
+
}
|
package/auth.service.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { HttpClient } from '@ngify/http';
|
|
2
|
+
import { defineService } from '@solar-taro/core';
|
|
3
|
+
import { getStorageSync, setStorage } from '@tarojs/taro';
|
|
4
|
+
import { tap } from 'rxjs';
|
|
5
|
+
const TOKEN_STORAGE_KEY = 'baidubce-token';
|
|
6
|
+
export const [setupBaiduBCEAuth, baiduBCEAuthService] = defineService((config) => new BaiduBCEAuthService(config));
|
|
7
|
+
export class BaiduBCEAuthService {
|
|
8
|
+
get token() {
|
|
9
|
+
return this._token;
|
|
10
|
+
}
|
|
11
|
+
set token(value) {
|
|
12
|
+
this._token = value;
|
|
13
|
+
setStorage({
|
|
14
|
+
key: TOKEN_STORAGE_KEY,
|
|
15
|
+
data: value
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.http = new HttpClient();
|
|
21
|
+
this._token = getStorageSync(TOKEN_STORAGE_KEY) || {};
|
|
22
|
+
}
|
|
23
|
+
auth() {
|
|
24
|
+
return this.http.get('https://aip.baidubce.com/oauth/2.0/token', {
|
|
25
|
+
params: {
|
|
26
|
+
grant_type: 'client_credentials',
|
|
27
|
+
client_id: this.config.key,
|
|
28
|
+
client_secret: this.config.secret
|
|
29
|
+
}
|
|
30
|
+
}).pipe(tap(o => {
|
|
31
|
+
this.token = { accessToken: o.access_token };
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../packages/baidu/src/auth.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAU3B,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAE3C,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,GAAG,aAAa,CAAC,CAAC,MAAmB,EAAE,EAAE,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhI,MAAM,OAAO,mBAAmB;IAI9B,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAY,KAAK,CAAC,KAAiB;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,UAAU,CAAC;YACT,GAAG,EAAE,iBAAiB;YACtB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,YACY,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;QAhBd,SAAI,GAAG,IAAI,UAAU,EAAE,CAAA;QAChC,WAAM,GAAe,cAAc,CAAa,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAgB7E,CAAC;IAEL,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAY,0CAA0C,EAAE;YAC1E,MAAM,EAAE;gBACN,UAAU,EAAE,oBAAoB;gBAChC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;gBAC1B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAClC;SACF,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,EAAE;YACN,IAAI,CAAC,KAAK,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;QAC/C,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
|
package/index.d.ts
ADDED
package/index.js
ADDED
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/baidu/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
|
package/interceptor.d.ts
ADDED
package/interceptor.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { HttpResponse } from '@ngify/http';
|
|
2
|
+
import { overlay, vibrator } from '@solar-taro/core';
|
|
3
|
+
import { catchError, finalize, of, switchMap } from 'rxjs';
|
|
4
|
+
/**
|
|
5
|
+
* 负责百度 `ORC` 接口的拦截
|
|
6
|
+
* - 添加 `Content-Type` 请求头
|
|
7
|
+
* - 捕获响应异常并提示
|
|
8
|
+
*/
|
|
9
|
+
export function useBaiduInterceptor() {
|
|
10
|
+
return (request, next) => {
|
|
11
|
+
const ctrl = overlay.loading('正在识别');
|
|
12
|
+
request = request.clone({
|
|
13
|
+
headers: request.headers.set('Content-Type', 'application/x-www-form-urlencoded')
|
|
14
|
+
});
|
|
15
|
+
return next(request).pipe(switchMap((event) => {
|
|
16
|
+
if (event instanceof HttpResponse) {
|
|
17
|
+
if (event.body.words_result_num < 1) {
|
|
18
|
+
vibrator.short();
|
|
19
|
+
overlay.tips('识别失败,原因:错误的图片类型');
|
|
20
|
+
throw event;
|
|
21
|
+
}
|
|
22
|
+
overlay.success('识别成功');
|
|
23
|
+
}
|
|
24
|
+
return of(event);
|
|
25
|
+
}), catchError((error) => {
|
|
26
|
+
if (![200, 401].includes(error.status)) {
|
|
27
|
+
overlay.tips('识别失败,状态码:' + error.status || '未知');
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}), finalize(() => ctrl.dismiss()));
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../../packages/baidu/src/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,YAAY,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAc,EAAE,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGvE;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,OAA6B,EAAE,IAAmB,EAAkC,EAAE;QAC5F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAErC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,mCAAmC,CAAC;SAClF,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACvB,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,IAAK,KAAK,CAAC,IAAiB,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;oBAClD,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAChC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YAED,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAA4B,EAAE,EAAE;YAC1C,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,EACF,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAC/B,CAAC;IACJ,CAAC,CAAA;AACH,CAAC"}
|
package/model.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface BaiduOCR {
|
|
2
|
+
idcard_number_type: number;
|
|
3
|
+
image_status: string;
|
|
4
|
+
words_result_num: number;
|
|
5
|
+
words_result: Record<string, {
|
|
6
|
+
words: string;
|
|
7
|
+
location: {
|
|
8
|
+
top: number;
|
|
9
|
+
left: number;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
};
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export interface BaiduAuth {
|
|
16
|
+
access_token: string;
|
|
17
|
+
expires_in: number;
|
|
18
|
+
}
|
package/model.js
ADDED
package/model.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../packages/baidu/src/model.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@solar-taro/baidu",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"sideEffects": false,
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.3.0"
|
|
10
|
+
},
|
|
11
|
+
"peerDependencies": {
|
|
12
|
+
"@ngify/http": "^2.0.0",
|
|
13
|
+
"@ngify/http-wx": "^2.0.0",
|
|
14
|
+
"rxjs": "^7.8.0"
|
|
15
|
+
},
|
|
16
|
+
"types": "./index.d.ts",
|
|
17
|
+
"module": "./index.js",
|
|
18
|
+
"type": "module",
|
|
19
|
+
"main": "./index.js"
|
|
20
|
+
}
|
package/service.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HttpClient } from '@ngify/http';
|
|
2
|
+
import { BaiduConfig } from './auth.service';
|
|
3
|
+
import type { BaiduOCR } from './model';
|
|
4
|
+
export declare const setupBaiduOCR: (config: BaiduConfig) => void, baiduOCRService: () => BaiduOCRService;
|
|
5
|
+
export declare class BaiduOCRService {
|
|
6
|
+
protected readonly http: HttpClient;
|
|
7
|
+
/**
|
|
8
|
+
* 识别营业执照
|
|
9
|
+
* @param image base64
|
|
10
|
+
*/
|
|
11
|
+
parseLicense(image: string): import("rxjs").Observable<BaiduOCR>;
|
|
12
|
+
/**
|
|
13
|
+
* 识别身份证
|
|
14
|
+
* @param image base64
|
|
15
|
+
*/
|
|
16
|
+
parseIdcard(image: string): import("rxjs").Observable<BaiduOCR>;
|
|
17
|
+
}
|
package/service.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { HttpClient, withInterceptors } from '@ngify/http';
|
|
2
|
+
import { defineService } from '@solar-taro/core';
|
|
3
|
+
import { useBaiduAuthInterceptor } from './auth.interceptor.js';
|
|
4
|
+
import { setupBaiduBCEAuth } from './auth.service.js';
|
|
5
|
+
import { useBaiduInterceptor } from './interceptor.js';
|
|
6
|
+
const BAIDU_OCR_URL = 'https://aip.baidubce.com/rest/2.0/ocr/v1';
|
|
7
|
+
export const [setupBaiduOCR, baiduOCRService] = defineService((config) => {
|
|
8
|
+
setupBaiduBCEAuth(config);
|
|
9
|
+
return new BaiduOCRService();
|
|
10
|
+
});
|
|
11
|
+
export class BaiduOCRService {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.http = new HttpClient(withInterceptors([
|
|
14
|
+
useBaiduInterceptor(),
|
|
15
|
+
useBaiduAuthInterceptor()
|
|
16
|
+
]));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 识别营业执照
|
|
20
|
+
* @param image base64
|
|
21
|
+
*/
|
|
22
|
+
parseLicense(image) {
|
|
23
|
+
return this.http.post(BAIDU_OCR_URL + '/business_license', { image });
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 识别身份证
|
|
27
|
+
* @param image base64
|
|
28
|
+
*/
|
|
29
|
+
parseIdcard(image) {
|
|
30
|
+
return this.http.post(BAIDU_OCR_URL + '/idcard', { image, id_card_side: 'front' });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=service.js.map
|
package/service.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../packages/baidu/src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAe,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,aAAa,GAAG,0CAA0C,CAAC;AAEjE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,aAAa,CAAC,CAAC,MAAmB,EAAE,EAAE;IACpF,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,eAAe,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,MAAM,OAAO,eAAe;IAA5B;QACqB,SAAI,GAAG,IAAI,UAAU,CACtC,gBAAgB,CAAC;YACf,mBAAmB,EAAE;YACrB,uBAAuB,EAAE;SAC1B,CAAC,CACH,CAAC;IAiBJ,CAAC;IAfC;;;OAGG;IACH,YAAY,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAW,aAAa,GAAG,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAW,aAAa,GAAG,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF"}
|