@communecter/cocolight-api-client 1.0.54 → 1.0.56
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/dist/401.cocolight-api-client.browser.js +1 -0
- package/dist/401.cocolight-api-client.cjs +1 -0
- package/dist/401.cocolight-api-client.mjs.js +1 -0
- package/dist/588.cocolight-api-client.browser.js +1 -0
- package/dist/588.cocolight-api-client.cjs +1 -0
- package/dist/588.cocolight-api-client.mjs.js +1 -0
- package/dist/593.cocolight-api-client.browser.js +1 -0
- package/dist/593.cocolight-api-client.cjs +1 -0
- package/dist/593.cocolight-api-client.mjs.js +1 -0
- package/dist/839.cocolight-api-client.browser.js +1 -0
- package/dist/839.cocolight-api-client.cjs +1 -0
- package/dist/839.cocolight-api-client.mjs.js +1 -0
- package/dist/cocolight-api-client.browser.js +3 -3
- package/dist/cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
- package/package.json +29 -17
- package/src/{Api.js → Api.ts} +85 -95
- package/src/{ApiClient.js → ApiClient.ts} +436 -247
- package/src/EJSONType.ts +103 -0
- package/src/api/{Badge.js → Badge.ts} +56 -45
- package/src/api/BaseEntity.ts +3890 -0
- package/src/api/Comment.ts +200 -0
- package/src/api/{EndpointApi.js → EndpointApi.ts} +363 -297
- package/src/api/EndpointApi.types.ts +4609 -0
- package/src/api/EntityRegistry.ts +203 -0
- package/src/api/Event.ts +332 -0
- package/src/api/News.ts +331 -0
- package/src/api/{Organization.js → Organization.ts} +155 -119
- package/src/api/{Poi.js → Poi.ts} +68 -60
- package/src/api/{Project.js → Project.ts} +150 -127
- package/src/api/{User.js → User.ts} +321 -256
- package/src/api/UserApi.ts +148 -0
- package/src/api/serverDataType/Comment.ts +88 -0
- package/src/api/serverDataType/Event.ts +80 -0
- package/src/api/serverDataType/News.ts +138 -0
- package/src/api/serverDataType/Organization.ts +80 -0
- package/src/api/serverDataType/Project.ts +71 -0
- package/src/api/serverDataType/User.ts +103 -0
- package/src/api/serverDataType/common.ts +80 -0
- package/src/endpoints.module.ts +2621 -0
- package/src/error.ts +86 -0
- package/src/index.ts +86 -0
- package/src/mixin/UserMixin.ts +4 -0
- package/src/types/api-responses.ts +217 -0
- package/src/types/entities.ts +22 -0
- package/src/types/error-guards.ts +230 -0
- package/src/types/index.ts +39 -0
- package/src/types/payloads.ts +21 -0
- package/src/types/transforms.ts +110 -0
- package/src/utils/{FileOfflineStorageStrategy.node.js → FileOfflineStorageStrategy.node.ts} +15 -12
- package/src/utils/{FileStorageStrategy.node.js → FileStorageStrategy.node.ts} +16 -39
- package/src/utils/MultiServerFileStorageStrategy.node.ts +67 -0
- package/src/utils/MultiServerTokenStorageStrategy.ts +139 -0
- package/src/utils/{OfflineClientManager.js → OfflineClientManager.ts} +82 -86
- package/src/utils/OfflineQueueStorageStrategy.ts +47 -0
- package/src/utils/TokenStorage.ts +77 -0
- package/src/utils/compat.ts +12 -0
- package/src/utils/createDefaultMultiServerTokenStorageStrategy.ts +35 -0
- package/src/utils/{createDefaultOfflineStrategy.js → createDefaultOfflineStrategy.ts} +8 -3
- package/src/utils/createDefaultTokenStorageStrategy.ts +33 -0
- package/src/utils/{reactive.js → reactive.ts} +49 -40
- package/src/utils/stream-utils.node.ts +12 -0
- package/types/Api.d.ts +38 -82
- package/types/Api.d.ts.map +1 -0
- package/types/ApiClient.d.ts +244 -184
- package/types/ApiClient.d.ts.map +1 -0
- package/types/EJSONType.d.ts +48 -22
- package/types/EJSONType.d.ts.map +1 -0
- package/types/api/Badge.d.ts +20 -20
- package/types/api/Badge.d.ts.map +1 -0
- package/types/api/BaseEntity.d.ts +751 -446
- package/types/api/BaseEntity.d.ts.map +1 -0
- package/types/api/Comment.d.ts +36 -0
- package/types/api/EndpointApi.d.ts +347 -295
- package/types/api/EndpointApi.d.ts.map +1 -0
- package/types/api/EndpointApi.types.d.ts +3914 -4133
- package/types/api/EntityRegistry.d.ts +18 -16
- package/types/api/EntityRegistry.d.ts.map +1 -0
- package/types/api/Event.d.ts +119 -35
- package/types/api/Event.d.ts.map +1 -0
- package/types/api/News.d.ts +52 -20
- package/types/api/News.d.ts.map +1 -0
- package/types/api/Organization.d.ts +165 -49
- package/types/api/Organization.d.ts.map +1 -0
- package/types/api/Poi.d.ts +51 -22
- package/types/api/Poi.d.ts.map +1 -0
- package/types/api/Project.d.ts +151 -52
- package/types/api/Project.d.ts.map +1 -0
- package/types/api/User.d.ts +222 -93
- package/types/api/User.d.ts.map +1 -0
- package/types/api/UserApi.d.ts +60 -9
- package/types/api/UserApi.d.ts.map +1 -0
- package/types/api/serverDataType/Comment.d.ts +83 -0
- package/types/api/serverDataType/Event.d.ts +67 -0
- package/types/api/serverDataType/News.d.ts +130 -0
- package/types/api/serverDataType/Organization.d.ts +65 -0
- package/types/api/serverDataType/Organization.d.ts.map +1 -0
- package/types/api/serverDataType/Project.d.ts +58 -0
- package/types/api/serverDataType/Project.d.ts.map +1 -0
- package/types/api/serverDataType/User.d.ts +86 -0
- package/types/api/serverDataType/User.d.ts.map +1 -0
- package/types/api/serverDataType/common.d.ts +71 -0
- package/types/api/serverDataType/common.d.ts.map +1 -0
- package/types/endpoints.module.d.ts +6922 -1215
- package/types/endpoints.module.d.ts.map +1 -0
- package/types/error.d.ts +25 -51
- package/types/error.d.ts.map +1 -0
- package/types/index.d.ts +55 -48
- package/types/index.d.ts.map +1 -0
- package/types/mixin/UserMixin.d.ts +1 -1
- package/types/mixin/UserMixin.d.ts.map +1 -0
- package/types/types/api-responses.d.ts +190 -0
- package/types/types/api-responses.d.ts.map +1 -0
- package/types/types/entities.d.ts +17 -0
- package/types/types/entities.d.ts.map +1 -0
- package/types/types/error-guards.d.ts +99 -0
- package/types/types/error-guards.d.ts.map +1 -0
- package/types/types/index.d.ts +7 -0
- package/types/types/payloads.d.ts +17 -0
- package/types/types/payloads.d.ts.map +1 -0
- package/types/types/transforms.d.ts +79 -0
- package/types/types/transforms.d.ts.map +1 -0
- package/types/utils/FileOfflineStorageStrategy.node.d.ts +10 -9
- package/types/utils/FileOfflineStorageStrategy.node.d.ts.map +1 -0
- package/types/utils/FileStorageStrategy.node.d.ts +9 -20
- package/types/utils/FileStorageStrategy.node.d.ts.map +1 -0
- package/types/utils/MultiServerFileStorageStrategy.node.d.ts +13 -18
- package/types/utils/MultiServerFileStorageStrategy.node.d.ts.map +1 -0
- package/types/utils/MultiServerTokenStorageStrategy.d.ts +30 -51
- package/types/utils/MultiServerTokenStorageStrategy.d.ts.map +1 -0
- package/types/utils/OfflineClientManager.d.ts +52 -88
- package/types/utils/OfflineClientManager.d.ts.map +1 -0
- package/types/utils/OfflineQueueStorageStrategy.d.ts +12 -9
- package/types/utils/OfflineQueueStorageStrategy.d.ts.map +1 -0
- package/types/utils/TokenStorage.d.ts +20 -70
- package/types/utils/TokenStorage.d.ts.map +1 -0
- package/types/utils/compat.d.ts +4 -0
- package/types/utils/compat.d.ts.map +1 -0
- package/types/utils/createDefaultMultiServerTokenStorageStrategy.d.ts +2 -11
- package/types/utils/createDefaultMultiServerTokenStorageStrategy.d.ts.map +1 -0
- package/types/utils/createDefaultOfflineStrategy.d.ts +2 -3
- package/types/utils/createDefaultOfflineStrategy.d.ts.map +1 -0
- package/types/utils/createDefaultTokenStorageStrategy.d.ts +2 -12
- package/types/utils/createDefaultTokenStorageStrategy.d.ts.map +1 -0
- package/types/utils/reactive.d.ts +10 -16
- package/types/utils/reactive.d.ts.map +1 -0
- package/types/utils/stream-utils.node.d.ts +3 -2
- package/types/utils/stream-utils.node.d.ts.map +1 -0
- package/dist/123.cocolight-api-client.browser.js +0 -1
- package/dist/123.cocolight-api-client.cjs +0 -1
- package/dist/22.cocolight-api-client.mjs.js +0 -1
- package/dist/339.cocolight-api-client.mjs.js +0 -1
- package/dist/394.cocolight-api-client.browser.js +0 -1
- package/dist/394.cocolight-api-client.cjs +0 -1
- package/dist/405.cocolight-api-client.browser.js +0 -1
- package/dist/405.cocolight-api-client.cjs +0 -1
- package/dist/774.cocolight-api-client.mjs.js +0 -1
- package/dist/790.cocolight-api-client.mjs.js +0 -1
- package/dist/931.cocolight-api-client.browser.js +0 -1
- package/dist/931.cocolight-api-client.cjs +0 -1
- package/src/EJSONType.js +0 -53
- package/src/api/BaseEntity.js +0 -2828
- package/src/api/EntityRegistry.js +0 -152
- package/src/api/Event.js +0 -226
- package/src/api/News.js +0 -244
- package/src/api/UserApi.js +0 -81
- package/src/endpoints.module.js +0 -5
- package/src/error.js +0 -121
- package/src/index.js +0 -97
- package/src/mixin/UserMixin.js +0 -8
- package/src/utils/MultiServerFileStorageStrategy.node.js +0 -87
- package/src/utils/MultiServerTokenStorageStrategy.js +0 -188
- package/src/utils/OfflineQueueStorageStrategy.js +0 -51
- package/src/utils/TokenStorage.js +0 -153
- package/src/utils/createDefaultMultiServerTokenStorageStrategy.js +0 -51
- package/src/utils/createDefaultTokenStorageStrategy.js +0 -49
- package/src/utils/stream-utils.node.js +0 -10
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { ApiError } from "../error.js";
|
|
2
|
-
import BaseEntity from "./BaseEntity.js";
|
|
2
|
+
import { BaseEntity } from "./BaseEntity.js";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
static entityType = "poi";
|
|
4
|
+
import type { AddPoiData } from "./EndpointApi.types.js";
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
export class Poi extends BaseEntity<any> {
|
|
7
|
+
static override entityType = "poi";
|
|
8
8
|
|
|
9
|
-
static
|
|
9
|
+
static override entityTag = "Poi";
|
|
10
|
+
|
|
11
|
+
static override SCHEMA_CONSTANTS: string[] = [
|
|
10
12
|
"ADD_POI",
|
|
11
13
|
"UPDATE_BLOCK_DESCRIPTION",
|
|
12
14
|
"UPDATE_BLOCK_INFO",
|
|
@@ -18,7 +20,7 @@ export class Poi extends BaseEntity {
|
|
|
18
20
|
static ADD_BLOCKS = new Map([
|
|
19
21
|
["ADD_POI", "addPoi"],
|
|
20
22
|
["PROFIL_IMAGE", "updateImageProfil"]
|
|
21
|
-
]);
|
|
23
|
+
] as const);
|
|
22
24
|
|
|
23
25
|
static UPDATE_BLOCKS = new Map([
|
|
24
26
|
["UPDATE_BLOCK_DESCRIPTION", "updateDescription"],
|
|
@@ -26,29 +28,29 @@ export class Poi extends BaseEntity {
|
|
|
26
28
|
["UPDATE_BLOCK_INFO", "updateInfo"],
|
|
27
29
|
["UPDATE_BLOCK_SLUG", "updateSlug"],
|
|
28
30
|
["PROFIL_IMAGE", "updateImageProfil"]
|
|
29
|
-
]);
|
|
31
|
+
] as const);
|
|
30
32
|
|
|
31
|
-
defaultFields = {
|
|
33
|
+
override defaultFields: Record<string, any> = {
|
|
32
34
|
typeElement: this.getEntityType()
|
|
33
35
|
};
|
|
34
36
|
|
|
35
|
-
removeFields = [
|
|
37
|
+
override removeFields: string[] = [
|
|
36
38
|
"typeElement"
|
|
37
39
|
];
|
|
38
40
|
|
|
39
|
-
transforms = {
|
|
41
|
+
// transforms = {
|
|
40
42
|
|
|
41
|
-
};
|
|
43
|
+
// };
|
|
42
44
|
|
|
43
|
-
async
|
|
45
|
+
override _add = async (payload: Record<string, any>): Promise<void> => {
|
|
44
46
|
if (!this._calledFromSave) {
|
|
45
|
-
throw new ApiError("utilisation invalide de _add, utilisez save");
|
|
47
|
+
throw new ApiError("utilisation invalide de _add, utilisez save", 400);
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
payload.id = this._newId?.();
|
|
49
51
|
if (payload.slug) delete payload.slug;
|
|
50
52
|
|
|
51
|
-
for (const [constant, methodName] of Poi.ADD_BLOCKS) {
|
|
53
|
+
for (const [constant, methodName] of Array.from(Poi.ADD_BLOCKS)) {
|
|
52
54
|
const blockData = this._extractChangedFieldsFromSchema(
|
|
53
55
|
this.apiClient,
|
|
54
56
|
constant,
|
|
@@ -56,27 +58,27 @@ export class Poi extends BaseEntity {
|
|
|
56
58
|
() => {}
|
|
57
59
|
);
|
|
58
60
|
if (blockData && Object.keys(blockData).length > 0) {
|
|
59
|
-
const data = await this
|
|
61
|
+
const data = await this._invokeBlockMethod(Poi.ADD_BLOCKS, methodName, blockData);
|
|
60
62
|
if (!this.id && data?.map?.id) {
|
|
61
63
|
this._draftData.id = data.map.id;
|
|
62
64
|
this._draftData.slug = data.map.slug;
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
}
|
|
66
|
-
}
|
|
68
|
+
};
|
|
67
69
|
|
|
68
|
-
async
|
|
70
|
+
override _update = async (payload: Record<string, any>): Promise<boolean> => {
|
|
69
71
|
if(!this.isAuthor()){
|
|
70
72
|
throw new ApiError("Vous n'avez pas les droits pour modifier ce POI", 403);
|
|
71
73
|
}
|
|
72
74
|
if (!this._calledFromSave) {
|
|
73
|
-
throw new ApiError("utilisation invalide de _update, utilisez save");
|
|
75
|
+
throw new ApiError("utilisation invalide de _update, utilisez save", 400);
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
if (payload.id) delete payload.id;
|
|
77
79
|
let hasChanged = false;
|
|
78
80
|
|
|
79
|
-
for (const [constant, methodName] of Poi.UPDATE_BLOCKS) {
|
|
81
|
+
for (const [constant, methodName] of Array.from(Poi.UPDATE_BLOCKS)) {
|
|
80
82
|
const blockData = this._extractChangedFieldsFromSchema(
|
|
81
83
|
this.apiClient,
|
|
82
84
|
constant,
|
|
@@ -85,100 +87,106 @@ export class Poi extends BaseEntity {
|
|
|
85
87
|
this.removeFields
|
|
86
88
|
);
|
|
87
89
|
if (blockData && Object.keys(blockData).length > 0) {
|
|
88
|
-
await this
|
|
90
|
+
await this._invokeBlockMethod(Poi.UPDATE_BLOCKS, methodName, blockData);
|
|
89
91
|
hasChanged = true;
|
|
90
92
|
}
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
return hasChanged;
|
|
94
|
-
}
|
|
96
|
+
};
|
|
95
97
|
|
|
96
|
-
async addPoi(data = {}) {
|
|
98
|
+
async addPoi(data: Partial<AddPoiData> = {}): Promise<unknown> {
|
|
97
99
|
|
|
98
|
-
if (!this.isMe) {
|
|
99
|
-
data.parent = {};
|
|
100
|
-
data.parent[`${this.parent.id}`] = {
|
|
100
|
+
if (!this.isMe && this.parent) {
|
|
101
|
+
(data as any).parent = {};
|
|
102
|
+
(data as any).parent[`${this.parent.id}`] = {
|
|
101
103
|
type: this.parent.getEntityType(),
|
|
102
|
-
name: this.parent.name
|
|
104
|
+
name: (this.parent as any).name
|
|
103
105
|
};
|
|
104
106
|
}
|
|
105
107
|
|
|
106
|
-
return this.callIsConnected(() => this.endpointApi.addPoi(data));
|
|
108
|
+
return this.callIsConnected(() => this.endpointApi.addPoi(data as AddPoiData));
|
|
107
109
|
}
|
|
108
110
|
|
|
109
|
-
async getOrganizations() {
|
|
110
|
-
throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}
|
|
111
|
+
override async getOrganizations(): Promise<never> {
|
|
112
|
+
throw new ApiError(`getOrganizations n'existe pas dans ${this.constructor.name}`, 501);
|
|
111
113
|
}
|
|
112
114
|
|
|
113
|
-
async getProjects() {
|
|
114
|
-
throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}
|
|
115
|
+
override async getProjects(): Promise<never> {
|
|
116
|
+
throw new ApiError(`getProjects n'existe pas dans ${this.constructor.name}`, 501);
|
|
115
117
|
}
|
|
116
118
|
|
|
117
|
-
async getEvents() {
|
|
118
|
-
throw new ApiError(`getEvents n'existe pas dans${this.constructor.name}
|
|
119
|
+
async getEvents(): Promise<never> {
|
|
120
|
+
throw new ApiError(`getEvents n'existe pas dans ${this.constructor.name}`, 501);
|
|
119
121
|
}
|
|
120
122
|
|
|
121
|
-
async getPois() {
|
|
122
|
-
throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}
|
|
123
|
+
override async getPois(): Promise<never> {
|
|
124
|
+
throw new ApiError(`getPois n'existe pas dans ${this.constructor.name}`, 501);
|
|
123
125
|
}
|
|
124
126
|
|
|
125
|
-
async getBadgesIssuer() {
|
|
126
|
-
throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}
|
|
127
|
+
override async getBadgesIssuer(): Promise<never> {
|
|
128
|
+
throw new ApiError(`getBadgesIssuer n'existe pas dans ${this.constructor.name}`, 501);
|
|
127
129
|
}
|
|
128
130
|
|
|
129
|
-
|
|
131
|
+
/**
|
|
132
|
+
* {@inheritDoc BaseEntity#getNews}
|
|
133
|
+
*
|
|
134
|
+
* Récupère les actualités du POI.
|
|
135
|
+
*/
|
|
136
|
+
override async getNews(data: Parameters<BaseEntity<any>["getNews"]>[0] = {}) {
|
|
130
137
|
return super.getNews(data);
|
|
131
138
|
}
|
|
132
139
|
|
|
133
|
-
|
|
140
|
+
/**
|
|
141
|
+
* {@inheritDoc BaseEntity#getSubscribers}
|
|
142
|
+
*
|
|
143
|
+
* Récupère les abonnés du POI.
|
|
144
|
+
*/
|
|
145
|
+
override async getSubscribers(data: Parameters<BaseEntity<any>["getSubscribers"]>[0] = {}) {
|
|
134
146
|
return super.getSubscribers(data);
|
|
135
147
|
}
|
|
136
148
|
|
|
137
|
-
async project() {
|
|
138
|
-
throw new ApiError(`project n'existe pas dans ${this.constructor.name}
|
|
149
|
+
override async project(): Promise<never> {
|
|
150
|
+
throw new ApiError(`project n'existe pas dans ${this.constructor.name}`, 501);
|
|
139
151
|
}
|
|
140
152
|
|
|
141
|
-
async poi() {
|
|
142
|
-
throw new ApiError(`poi n'existe pas dans ${this.constructor.name}
|
|
153
|
+
override async poi(): Promise<never> {
|
|
154
|
+
throw new ApiError(`poi n'existe pas dans ${this.constructor.name}`, 501);
|
|
143
155
|
}
|
|
144
156
|
|
|
145
|
-
async event() {
|
|
146
|
-
throw new ApiError(`event n'existe pas dans ${this.constructor.name}
|
|
157
|
+
override async event(): Promise<never> {
|
|
158
|
+
throw new ApiError(`event n'existe pas dans ${this.constructor.name}`, 501);
|
|
147
159
|
}
|
|
148
160
|
|
|
149
|
-
async badge() {
|
|
150
|
-
throw new ApiError(`badge n'existe pas dans ${this.constructor.name}
|
|
161
|
+
override async badge(): Promise<never> {
|
|
162
|
+
throw new ApiError(`badge n'existe pas dans ${this.constructor.name}`, 501);
|
|
151
163
|
}
|
|
152
164
|
|
|
153
165
|
/**
|
|
166
|
+
* {@inheritDoc BaseEntity#news}
|
|
167
|
+
*
|
|
154
168
|
* Crée une instance de news et la récupère si nécessaire.
|
|
155
|
-
*
|
|
156
|
-
* @param {Object} newsData - Les données nécessaires pour initialiser la news.
|
|
157
|
-
* @returns {Promise<News>} Une promesse qui résout l'objet News créé.
|
|
158
|
-
* @throws {ApiError} Si une erreur se produit lors de la création de la news.
|
|
159
169
|
*/
|
|
160
|
-
async news(newsData = {}) {
|
|
170
|
+
override async news(newsData: Parameters<BaseEntity<any>["news"]>[0] = {}) {
|
|
161
171
|
return super.news(newsData);
|
|
162
172
|
}
|
|
163
173
|
|
|
164
174
|
/**
|
|
175
|
+
* {@inheritDoc BaseEntity#follow}
|
|
176
|
+
*
|
|
165
177
|
* Suivre un POI.
|
|
166
178
|
* Cette action permet à l'utilisateur de suivre un POI.
|
|
167
|
-
*
|
|
168
|
-
* @returns {Promise<Object>} - Résultat de l'action de suivi.
|
|
169
|
-
* @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité ne supporte pas l'action.
|
|
170
179
|
*/
|
|
171
|
-
async follow() {
|
|
180
|
+
override async follow() {
|
|
172
181
|
return super.follow();
|
|
173
182
|
}
|
|
174
183
|
|
|
175
184
|
/**
|
|
185
|
+
* {@inheritDoc BaseEntity#unfollow}
|
|
186
|
+
*
|
|
176
187
|
* Se désabonne d'un POI.
|
|
177
|
-
*
|
|
178
|
-
* @returns {Promise<Object>} - Résultat de la désinscription.
|
|
179
|
-
* @throws {ApiError} - Si l'utilisateur n'est pas connecté ou si l'entité n'est pas enregistrée.
|
|
180
188
|
*/
|
|
181
|
-
async unfollow() {
|
|
189
|
+
override async unfollow() {
|
|
182
190
|
return super.unfollow();
|
|
183
191
|
}
|
|
184
192
|
|