@be-link/tfs-cli-nodejs 0.0.234 → 0.0.236
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/index.d.ts +1 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/tfs/modules/contract/service.d.ts +5 -1
- package/tfs/modules/contract/service.js +12 -0
- package/tfs/modules/contract/service.js.map +1 -1
- package/tfs/modules/contract/type.d.ts +85 -1
- package/tfs/modules/groupFormationFailure/service.d.ts +1 -0
- package/tfs/modules/groupFormationFailure/service.js +3 -0
- package/tfs/modules/groupFormationFailure/service.js.map +1 -1
- package/tfs/modules/groupFormationFailure/type.d.ts +30 -0
package/index.d.ts
CHANGED
|
@@ -15,5 +15,6 @@ import insuranceRecordService from './tfs/modules/insuranceRecord/service';
|
|
|
15
15
|
import touristMaterialService from './tfs/modules/touristMaterial/service';
|
|
16
16
|
import tencentAdAttributionService from './tfs/modules/tencentAdAttribution/service';
|
|
17
17
|
import groupFormationFailureService from './tfs/modules/groupFormationFailure/service';
|
|
18
|
+
export { Contract } from './tfs/modules/contract/type';
|
|
18
19
|
/** 业务模块 */
|
|
19
20
|
export { BizError, rescheduleService, tourTeamService, tourGroupService, tourismInfoService, itineraryService, departureGroupService, departureGroupSearchService, contractService, jobService, tradeOrderCouponCodeService, groupBookingService, fulfillInfoService, insuranceRecordService, touristMaterialService, tencentAdAttributionService, groupFormationFailureService, };
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,iEAAwC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,iEAAwC;AAqBtC,mBArBK,kBAAQ,CAqBL;AApBV,+EAAgE;AAqB9D,4BArBK,iBAAiB,CAqBL;AApBnB,6EAA4D;AAqB1D,0BArBK,iBAAe,CAqBL;AApBjB,8EAA8D;AAqB5D,2BArBK,iBAAgB,CAqBL;AApBlB,gFAAkE;AAqBhE,6BArBK,iBAAkB,CAqBL;AApBpB,8EAA8D;AAqB5D,2BArBK,iBAAgB,CAqBL;AApBlB,mFAAwE;AAqBtE,gCArBK,iBAAqB,CAqBL;AApBvB,6FAAwF;AAqBtF,sCArBK,iBAA2B,CAqBL;AApB7B,6EAA4D;AAqB1D,0BArBK,iBAAe,CAqBL;AApBjB,wEAAkD;AAqBhD,qBArBK,iBAAU,CAqBL;AApBZ,0FAAoF;AAqBlF,sCArBK,kBAA2B,CAqBL;AApB7B,kFAAoE;AAqBlE,8BArBK,kBAAmB,CAqBL;AApBrB,iFAAkE;AAqBhE,6BArBK,kBAAkB,CAqBL;AApBpB,qFAA0E;AAqBxE,iCArBK,kBAAsB,CAqBL;AApBxB,qFAA0E;AAqBxE,iCArBK,kBAAsB,CAqBL;AApBxB,0FAAoF;AAqBlF,sCArBK,kBAA2B,CAqBL;AApB7B,2FAAsF;AAqBpF,uCArBK,kBAA4B,CAqBL"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Contract } from "./type";
|
|
2
1
|
import BaseService from '../baseService';
|
|
2
|
+
import { Contract } from './type';
|
|
3
3
|
declare class ContractService extends BaseService implements Contract.Controller {
|
|
4
4
|
protected prefixUrl: string;
|
|
5
5
|
exportPdf(request: Contract.Request.IExportPdf): Promise<Contract.Response.IExportPdf>;
|
|
@@ -9,6 +9,10 @@ declare class ContractService extends BaseService implements Contract.Controller
|
|
|
9
9
|
queryContractOperateLogs(request: Contract.Request.IQueryContractOperateLogs): Promise<Contract.Response.IQueryContractOperateLogs>;
|
|
10
10
|
updateContractTravelers(request: Contract.Request.IUpdateTravelerInfo): Promise<void>;
|
|
11
11
|
confirmContract(request: Contract.Request.IConfirmContract): Promise<void>;
|
|
12
|
+
startAgreementRead(request: Contract.Request.IStartAgreementRead): Promise<Contract.Response.IAgreementReadLog>;
|
|
13
|
+
finishAgreementRead(request: Contract.Request.IFinishAgreementRead): Promise<Contract.Response.IAgreementReadLog>;
|
|
14
|
+
acceptAgreementRead(request: Contract.Request.IAcceptAgreementRead): Promise<Contract.Response.IAgreementReadLog>;
|
|
15
|
+
bindAgreementReadOrder(request: Contract.Request.IBindAgreementReadOrder): Promise<void>;
|
|
12
16
|
generateContractByOrderId(request: Contract.Request.IGenerateContractByOrderId): Promise<void>;
|
|
13
17
|
cancelContractByOrderId(request: Contract.Request.IGenerateContractByOrderId): Promise<void>;
|
|
14
18
|
getContractStatusByOrderId(request: Contract.Request.IGenerateContractByOrderId): Promise<Contract.Response.IQueryContractStatus>;
|
|
@@ -31,6 +31,18 @@ class ContractService extends baseService_1.default {
|
|
|
31
31
|
confirmContract(request) {
|
|
32
32
|
return (0, http_1.callApi)(this.getApiUrl(this.confirmContract), request);
|
|
33
33
|
}
|
|
34
|
+
startAgreementRead(request) {
|
|
35
|
+
return (0, http_1.callApi)(this.getApiUrl(this.startAgreementRead), request);
|
|
36
|
+
}
|
|
37
|
+
finishAgreementRead(request) {
|
|
38
|
+
return (0, http_1.callApi)(this.getApiUrl(this.finishAgreementRead), request);
|
|
39
|
+
}
|
|
40
|
+
acceptAgreementRead(request) {
|
|
41
|
+
return (0, http_1.callApi)(this.getApiUrl(this.acceptAgreementRead), request);
|
|
42
|
+
}
|
|
43
|
+
bindAgreementReadOrder(request) {
|
|
44
|
+
return (0, http_1.callApi)(this.getApiUrl(this.bindAgreementReadOrder), request);
|
|
45
|
+
}
|
|
34
46
|
generateContractByOrderId(request) {
|
|
35
47
|
return (0, http_1.callApi)(this.getApiUrl(this.generateContractByOrderId), request);
|
|
36
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/tfs/modules/contract/service.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/tfs/modules/contract/service.ts"],"names":[],"mappings":";;;;;AAAA,qCAAoC;AACpC,iEAAwC;AAGxC,MAAM,eAAgB,SAAQ,qBAAW;IAAzC;;QACY,cAAS,GAAW,WAAW,CAAA;IA8G3C,CAAC;IA5GC,SAAS,CAAC,OAAoC;QAC5C,OAAO,IAAA,cAAO,EAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAA;IAC3F,CAAC;IAED,eAAe,CACb,OAA0C;QAE1C,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,EACpC,OAAO,CACR,CAAA;IACH,CAAC;IAED,mBAAmB,CACjB,OAA8C;QAE9C,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,EACxC,OAAO,CACR,CAAA;IACH,CAAC;IAED,oBAAoB,CAAC,OAA+C;QAClE,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,EACzC,OAAO,CACR,CAAA;IACH,CAAC;IAED,wBAAwB,CACtB,OAAmD;QAEnD,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAC7C,OAAO,CACR,CAAA;IACH,CAAC;IAED,uBAAuB,CAAC,OAA6C;QACnE,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAC5C,OAAO,CACR,CAAA;IACH,CAAC;IAED,eAAe,CAAC,OAA0C;QACxD,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,EACpC,OAAO,CACR,CAAA;IACH,CAAC;IAED,kBAAkB,CAChB,OAA6C;QAE7C,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,EACvC,OAAO,CACR,CAAA;IACH,CAAC;IAED,mBAAmB,CACjB,OAA8C;QAE9C,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,EACxC,OAAO,CACR,CAAA;IACH,CAAC;IAED,mBAAmB,CACjB,OAA8C;QAE9C,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,EACxC,OAAO,CACR,CAAA;IACH,CAAC;IAED,sBAAsB,CAAC,OAAiD;QACtE,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAC3C,OAAO,CACR,CAAA;IACH,CAAC;IAED,yBAAyB,CAAC,OAAoD;QAC5E,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAC9C,OAAO,CACR,CAAA;IACH,CAAC;IAED,uBAAuB,CAAC,OAAoD;QAC1E,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAC5C,OAAO,CACR,CAAA;IACH,CAAC;IAED,0BAA0B,CACxB,OAAoD;QAEpD,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAC/C,OAAO,CACR,CAAA;IACH,CAAC;CACF;AAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;AAE7C,kBAAe,eAAe,CAAA"}
|
|
@@ -1,5 +1,18 @@
|
|
|
1
|
-
import { Fulfill } from
|
|
1
|
+
import { Fulfill } from '../../../types';
|
|
2
2
|
export declare namespace Contract {
|
|
3
|
+
namespace Constants {
|
|
4
|
+
const enum AgreementTypeEnum {
|
|
5
|
+
BOOKING_INSTRUCTIONS = "BOOKING_INSTRUCTIONS",
|
|
6
|
+
CONTRACT_CLAUSE = "CONTRACT_CLAUSE",
|
|
7
|
+
CONTRACT_CHANGE = "CONTRACT_CHANGE",
|
|
8
|
+
DISCLAIMER = "DISCLAIMER"
|
|
9
|
+
}
|
|
10
|
+
const enum AgreementReadStatusEnum {
|
|
11
|
+
OPENED = "OPENED",
|
|
12
|
+
READ_FINISHED = "READ_FINISHED",
|
|
13
|
+
ACCEPTED = "ACCEPTED"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
3
16
|
namespace Request {
|
|
4
17
|
interface IExportPdf {
|
|
5
18
|
orderId: string;
|
|
@@ -45,6 +58,49 @@ export declare namespace Contract {
|
|
|
45
58
|
contractId: string;
|
|
46
59
|
/** 操作人姓名 */
|
|
47
60
|
operateUser: string;
|
|
61
|
+
/** 合同变更阅读会话ID */
|
|
62
|
+
readClientTraceId: string;
|
|
63
|
+
}
|
|
64
|
+
interface IStartAgreementRead {
|
|
65
|
+
/** 订单号,支付前阅读可为空 */
|
|
66
|
+
orderId?: string;
|
|
67
|
+
/** 商品ID,支付前无订单号场景使用 */
|
|
68
|
+
itemId?: string;
|
|
69
|
+
/** 合同ID,合同变更场景使用 */
|
|
70
|
+
contractId?: string;
|
|
71
|
+
/** 下单人/操作用户ID */
|
|
72
|
+
userId: string;
|
|
73
|
+
/** 协议类型 */
|
|
74
|
+
agreementType: Constants.AgreementTypeEnum | string;
|
|
75
|
+
/** 协议版本/快照版本 */
|
|
76
|
+
agreementVersion?: string;
|
|
77
|
+
/** 协议内容快照 */
|
|
78
|
+
contentSnapshot?: unknown;
|
|
79
|
+
/** 客户端阅读会话ID */
|
|
80
|
+
clientTraceId: string;
|
|
81
|
+
/** 设备信息 */
|
|
82
|
+
deviceInfo?: Record<string, any>;
|
|
83
|
+
/** IP */
|
|
84
|
+
ip?: string;
|
|
85
|
+
}
|
|
86
|
+
interface IFinishAgreementRead {
|
|
87
|
+
orderId?: string;
|
|
88
|
+
itemId?: string;
|
|
89
|
+
contractId?: string;
|
|
90
|
+
userId: string;
|
|
91
|
+
agreementType: Constants.AgreementTypeEnum | string;
|
|
92
|
+
agreementVersion?: string;
|
|
93
|
+
contentSnapshot?: unknown;
|
|
94
|
+
clientTraceId: string;
|
|
95
|
+
deviceInfo?: Record<string, any>;
|
|
96
|
+
ip?: string;
|
|
97
|
+
}
|
|
98
|
+
interface IAcceptAgreementRead extends IFinishAgreementRead {
|
|
99
|
+
}
|
|
100
|
+
interface IBindAgreementReadOrder {
|
|
101
|
+
orderId: string;
|
|
102
|
+
userId: string;
|
|
103
|
+
clientTraceId: string;
|
|
48
104
|
}
|
|
49
105
|
}
|
|
50
106
|
namespace Response {
|
|
@@ -77,6 +133,26 @@ export declare namespace Contract {
|
|
|
77
133
|
total: number;
|
|
78
134
|
list: Fulfill.Entity.TravelContractOperateLog[];
|
|
79
135
|
}
|
|
136
|
+
interface IAgreementReadLog {
|
|
137
|
+
id: string;
|
|
138
|
+
orderId: string;
|
|
139
|
+
contractId: string;
|
|
140
|
+
itemId: string;
|
|
141
|
+
userId: string;
|
|
142
|
+
agreementType: Constants.AgreementTypeEnum | string;
|
|
143
|
+
agreementVersion: string;
|
|
144
|
+
contentSnapshot: string;
|
|
145
|
+
openAt: number;
|
|
146
|
+
readFinishedAt: number;
|
|
147
|
+
acceptedAt: number;
|
|
148
|
+
clientTraceId: string;
|
|
149
|
+
deviceInfo?: Record<string, any>;
|
|
150
|
+
ip: string;
|
|
151
|
+
status: Constants.AgreementReadStatusEnum | string;
|
|
152
|
+
createdAt: number;
|
|
153
|
+
updatedAt: number;
|
|
154
|
+
deletedAt: number;
|
|
155
|
+
}
|
|
80
156
|
}
|
|
81
157
|
interface Controller {
|
|
82
158
|
/** 导出合同pdf */
|
|
@@ -93,6 +169,14 @@ export declare namespace Contract {
|
|
|
93
169
|
updateContractTravelers(request: Request.IUpdateTravelerInfo): Promise<void>;
|
|
94
170
|
/** 用户确认合同 */
|
|
95
171
|
confirmContract(request: Request.IConfirmContract): Promise<void>;
|
|
172
|
+
/** 记录协议打开 */
|
|
173
|
+
startAgreementRead(request: Request.IStartAgreementRead): Promise<Response.IAgreementReadLog>;
|
|
174
|
+
/** 记录协议阅读到底 */
|
|
175
|
+
finishAgreementRead(request: Request.IFinishAgreementRead): Promise<Response.IAgreementReadLog>;
|
|
176
|
+
/** 记录协议最终确认 */
|
|
177
|
+
acceptAgreementRead(request: Request.IAcceptAgreementRead): Promise<Response.IAgreementReadLog>;
|
|
178
|
+
/** 绑定支付前阅读会话与订单号 */
|
|
179
|
+
bindAgreementReadOrder(request: Request.IBindAgreementReadOrder): Promise<void>;
|
|
96
180
|
/** 生成合同 */
|
|
97
181
|
generateContractByOrderId(request: Request.IGenerateContractByOrderId): Promise<void>;
|
|
98
182
|
/** 取消合同 */
|
|
@@ -3,6 +3,7 @@ import { GroupFormationFailure } from './type';
|
|
|
3
3
|
declare class GroupFormationFailureService extends BaseService implements GroupFormationFailure.Controller {
|
|
4
4
|
protected prefixUrl: string;
|
|
5
5
|
initiateGroupFormationFailure(request: GroupFormationFailure.Request.initiateGroupFormationFailure): Promise<GroupFormationFailure.Response.initiateGroupFormationFailure>;
|
|
6
|
+
queryDeparturesFormationInfo(request: GroupFormationFailure.Request.queryDeparturesFormationInfo): Promise<GroupFormationFailure.Response.queryDeparturesFormationInfo>;
|
|
6
7
|
}
|
|
7
8
|
declare const groupFormationFailureService: GroupFormationFailureService;
|
|
8
9
|
export default groupFormationFailureService;
|
|
@@ -13,6 +13,9 @@ class GroupFormationFailureService extends baseService_1.default {
|
|
|
13
13
|
initiateGroupFormationFailure(request) {
|
|
14
14
|
return (0, http_1.callApi)(this.getApiUrl(this.initiateGroupFormationFailure), request);
|
|
15
15
|
}
|
|
16
|
+
queryDeparturesFormationInfo(request) {
|
|
17
|
+
return (0, http_1.callApi)(this.getApiUrl(this.queryDeparturesFormationInfo), request);
|
|
18
|
+
}
|
|
16
19
|
}
|
|
17
20
|
const groupFormationFailureService = new GroupFormationFailureService();
|
|
18
21
|
exports.default = groupFormationFailureService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/tfs/modules/groupFormationFailure/service.ts"],"names":[],"mappings":";;;;;AAAA,iEAAwC;AACxC,qCAAoC;AAGpC,MAAM,4BAA6B,SAAQ,qBAAW;IAAtD;;QACY,cAAS,GAAG,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/tfs/modules/groupFormationFailure/service.ts"],"names":[],"mappings":";;;;;AAAA,iEAAwC;AACxC,qCAAoC;AAGpC,MAAM,4BAA6B,SAAQ,qBAAW;IAAtD;;QACY,cAAS,GAAG,0BAA0B,CAAA;IAmBlD,CAAC;IAjBC,6BAA6B,CAC3B,OAAoE;QAEpE,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,6BAA6B,CAAC,EAClD,OAAO,CACR,CAAA;IACH,CAAC;IAED,4BAA4B,CAC1B,OAAmE;QAEnE,OAAO,IAAA,cAAO,EACZ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,EACjD,OAAO,CACR,CAAA;IACH,CAAC;CACF;AAED,MAAM,4BAA4B,GAAG,IAAI,4BAA4B,EAAE,CAAA;AAEvE,kBAAe,4BAA4B,CAAA"}
|
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
export declare namespace GroupFormationFailure {
|
|
2
|
+
/** 发起入口状态:可发起 / 待销售联系 / 不展示 */
|
|
3
|
+
type InitiateStatus = 'CAN_INITIATE' | 'PENDING_SALES' | 'NONE';
|
|
4
|
+
namespace DTO {
|
|
5
|
+
/** 出团团期不成团信息(供出团管理列表补字段) */
|
|
6
|
+
interface IDepartureFormationInfo {
|
|
7
|
+
itemId: string;
|
|
8
|
+
fulfillAt: number;
|
|
9
|
+
/** 出行编号 itemId-fulfillAt */
|
|
10
|
+
bizId: string;
|
|
11
|
+
/** 最低成团人数(非旅游商品 / 未配置为 null) */
|
|
12
|
+
minGroupSize: number | null;
|
|
13
|
+
/** 当前出行人数(活跃订单出行人数之和) */
|
|
14
|
+
travelers: number;
|
|
15
|
+
/** 订单数(活跃订单数) */
|
|
16
|
+
orderCount: number;
|
|
17
|
+
/** 发起入口状态 */
|
|
18
|
+
initiateStatus: InitiateStatus;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
2
21
|
namespace Request {
|
|
3
22
|
/** 商家发起跟团游不成团 */
|
|
4
23
|
interface initiateGroupFormationFailure {
|
|
@@ -11,6 +30,14 @@ export declare namespace GroupFormationFailure {
|
|
|
11
30
|
/** 操作人(商家) */
|
|
12
31
|
operator: string;
|
|
13
32
|
}
|
|
33
|
+
/** 批量查询出团团期不成团信息 */
|
|
34
|
+
interface queryDeparturesFormationInfo {
|
|
35
|
+
/** 待查询的团期(出行编号 = itemId + fulfillAt;tfs 内部按出团日期实时查订单) */
|
|
36
|
+
departures: {
|
|
37
|
+
itemId: string;
|
|
38
|
+
fulfillAt: number;
|
|
39
|
+
}[];
|
|
40
|
+
}
|
|
14
41
|
}
|
|
15
42
|
namespace Response {
|
|
16
43
|
interface initiateGroupFormationFailure {
|
|
@@ -19,6 +46,7 @@ export declare namespace GroupFormationFailure {
|
|
|
19
46
|
/** 本次新标记为不成团的订单数 */
|
|
20
47
|
orderCount: number;
|
|
21
48
|
}
|
|
49
|
+
type queryDeparturesFormationInfo = DTO.IDepartureFormationInfo[];
|
|
22
50
|
}
|
|
23
51
|
interface Controller {
|
|
24
52
|
/**
|
|
@@ -26,5 +54,7 @@ export declare namespace GroupFormationFailure {
|
|
|
26
54
|
* 同一出行编号(itemId + fulfillAt)幂等:重复提交不重复写订单 / 不重复备注 / 不重复通知销售。
|
|
27
55
|
*/
|
|
28
56
|
initiateGroupFormationFailure(request: Request.initiateGroupFormationFailure): Promise<Response.initiateGroupFormationFailure>;
|
|
57
|
+
/** 批量查询出团团期不成团信息(minGroupSize / 出行统计 / 发起入口状态) */
|
|
58
|
+
queryDeparturesFormationInfo(request: Request.queryDeparturesFormationInfo): Promise<Response.queryDeparturesFormationInfo>;
|
|
29
59
|
}
|
|
30
60
|
}
|