diff options
15 files changed, 82 insertions, 35 deletions
diff --git a/client/src/app/shared/forms/form-validators/user-validators.service.ts b/client/src/app/shared/forms/form-validators/user-validators.service.ts index 1fd1cdf68..d14fa4777 100644 --- a/client/src/app/shared/forms/form-validators/user-validators.service.ts +++ b/client/src/app/shared/forms/form-validators/user-validators.service.ts | |||
@@ -101,11 +101,11 @@ export class UserValidatorsService { | |||
101 | this.USER_DESCRIPTION = { | 101 | this.USER_DESCRIPTION = { |
102 | VALIDATORS: [ | 102 | VALIDATORS: [ |
103 | Validators.minLength(3), | 103 | Validators.minLength(3), |
104 | Validators.maxLength(250) | 104 | Validators.maxLength(1000) |
105 | ], | 105 | ], |
106 | MESSAGES: { | 106 | MESSAGES: { |
107 | 'minlength': this.i18n('Description must be at least 3 characters long.'), | 107 | 'minlength': this.i18n('Description must be at least 3 characters long.'), |
108 | 'maxlength': this.i18n('Description cannot be more than 250 characters long.') | 108 | 'maxlength': this.i18n('Description cannot be more than 1000 characters long.') |
109 | } | 109 | } |
110 | } | 110 | } |
111 | 111 | ||
diff --git a/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts b/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts index 1ce3a0dca..f62ff65f7 100644 --- a/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts +++ b/client/src/app/shared/forms/form-validators/video-channel-validators.service.ts | |||
@@ -42,22 +42,22 @@ export class VideoChannelValidatorsService { | |||
42 | this.VIDEO_CHANNEL_DESCRIPTION = { | 42 | this.VIDEO_CHANNEL_DESCRIPTION = { |
43 | VALIDATORS: [ | 43 | VALIDATORS: [ |
44 | Validators.minLength(3), | 44 | Validators.minLength(3), |
45 | Validators.maxLength(500) | 45 | Validators.maxLength(1000) |
46 | ], | 46 | ], |
47 | MESSAGES: { | 47 | MESSAGES: { |
48 | 'minlength': i18n('Description must be at least 3 characters long.'), | 48 | 'minlength': i18n('Description must be at least 3 characters long.'), |
49 | 'maxlength': i18n('Description cannot be more than 500 characters long.') | 49 | 'maxlength': i18n('Description cannot be more than 1000 characters long.') |
50 | } | 50 | } |
51 | } | 51 | } |
52 | 52 | ||
53 | this.VIDEO_CHANNEL_SUPPORT = { | 53 | this.VIDEO_CHANNEL_SUPPORT = { |
54 | VALIDATORS: [ | 54 | VALIDATORS: [ |
55 | Validators.minLength(3), | 55 | Validators.minLength(3), |
56 | Validators.maxLength(500) | 56 | Validators.maxLength(1000) |
57 | ], | 57 | ], |
58 | MESSAGES: { | 58 | MESSAGES: { |
59 | 'minlength': i18n('Support text must be at least 3 characters long.'), | 59 | 'minlength': i18n('Support text must be at least 3 characters long.'), |
60 | 'maxlength': i18n('Support text cannot be more than 500 characters long.') | 60 | 'maxlength': i18n('Support text cannot be more than 1000 characters long.') |
61 | } | 61 | } |
62 | } | 62 | } |
63 | } | 63 | } |
diff --git a/client/src/app/shared/forms/form-validators/video-validators.service.ts b/client/src/app/shared/forms/form-validators/video-validators.service.ts index 396be6f3b..81ed0666f 100644 --- a/client/src/app/shared/forms/form-validators/video-validators.service.ts +++ b/client/src/app/shared/forms/form-validators/video-validators.service.ts | |||
@@ -79,10 +79,10 @@ export class VideoValidatorsService { | |||
79 | } | 79 | } |
80 | 80 | ||
81 | this.VIDEO_SUPPORT = { | 81 | this.VIDEO_SUPPORT = { |
82 | VALIDATORS: [ Validators.minLength(3), Validators.maxLength(500) ], | 82 | VALIDATORS: [ Validators.minLength(3), Validators.maxLength(1000) ], |
83 | MESSAGES: { | 83 | MESSAGES: { |
84 | 'minlength': this.i18n('Video support must be at least 3 characters long.'), | 84 | 'minlength': this.i18n('Video support must be at least 3 characters long.'), |
85 | 'maxlength': this.i18n('Video support cannot be more than 500 characters long.') | 85 | 'maxlength': this.i18n('Video support cannot be more than 1000 characters long.') |
86 | } | 86 | } |
87 | } | 87 | } |
88 | 88 | ||
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 03158e356..e8843a3ab 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts | |||
@@ -16,7 +16,7 @@ let config: IConfig = require('config') | |||
16 | 16 | ||
17 | // --------------------------------------------------------------------------- | 17 | // --------------------------------------------------------------------------- |
18 | 18 | ||
19 | const LAST_MIGRATION_VERSION = 280 | 19 | const LAST_MIGRATION_VERSION = 285 |
20 | 20 | ||
21 | // --------------------------------------------------------------------------- | 21 | // --------------------------------------------------------------------------- |
22 | 22 | ||
@@ -295,7 +295,7 @@ const CONFIG = { | |||
295 | const CONSTRAINTS_FIELDS = { | 295 | const CONSTRAINTS_FIELDS = { |
296 | USERS: { | 296 | USERS: { |
297 | NAME: { min: 3, max: 120 }, // Length | 297 | NAME: { min: 3, max: 120 }, // Length |
298 | DESCRIPTION: { min: 3, max: 250 }, // Length | 298 | DESCRIPTION: { min: 3, max: 1000 }, // Length |
299 | USERNAME: { min: 3, max: 20 }, // Length | 299 | USERNAME: { min: 3, max: 20 }, // Length |
300 | PASSWORD: { min: 6, max: 255 }, // Length | 300 | PASSWORD: { min: 6, max: 255 }, // Length |
301 | VIDEO_QUOTA: { min: -1 }, | 301 | VIDEO_QUOTA: { min: -1 }, |
@@ -311,8 +311,8 @@ const CONSTRAINTS_FIELDS = { | |||
311 | }, | 311 | }, |
312 | VIDEO_CHANNELS: { | 312 | VIDEO_CHANNELS: { |
313 | NAME: { min: 3, max: 120 }, // Length | 313 | NAME: { min: 3, max: 120 }, // Length |
314 | DESCRIPTION: { min: 3, max: 500 }, // Length | 314 | DESCRIPTION: { min: 3, max: 1000 }, // Length |
315 | SUPPORT: { min: 3, max: 500 }, // Length | 315 | SUPPORT: { min: 3, max: 1000 }, // Length |
316 | URL: { min: 3, max: 2000 } // Length | 316 | URL: { min: 3, max: 2000 } // Length |
317 | }, | 317 | }, |
318 | VIDEO_CAPTIONS: { | 318 | VIDEO_CAPTIONS: { |
@@ -341,7 +341,7 @@ const CONSTRAINTS_FIELDS = { | |||
341 | LANGUAGE: { min: 1, max: 10 }, // Length | 341 | LANGUAGE: { min: 1, max: 10 }, // Length |
342 | TRUNCATED_DESCRIPTION: { min: 3, max: 250 }, // Length | 342 | TRUNCATED_DESCRIPTION: { min: 3, max: 250 }, // Length |
343 | DESCRIPTION: { min: 3, max: 10000 }, // Length | 343 | DESCRIPTION: { min: 3, max: 10000 }, // Length |
344 | SUPPORT: { min: 3, max: 500 }, // Length | 344 | SUPPORT: { min: 3, max: 1000 }, // Length |
345 | IMAGE: { | 345 | IMAGE: { |
346 | EXTNAME: [ '.jpg', '.jpeg' ], | 346 | EXTNAME: [ '.jpg', '.jpeg' ], |
347 | FILE_SIZE: { | 347 | FILE_SIZE: { |
diff --git a/server/initializers/migrations/0120-video-null.ts b/server/initializers/migrations/0120-video-null.ts index 63f3984dd..6d253f04f 100644 --- a/server/initializers/migrations/0120-video-null.ts +++ b/server/initializers/migrations/0120-video-null.ts | |||
@@ -1,5 +1,4 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import { CONSTRAINTS_FIELDS } from '../constants' | ||
3 | 2 | ||
4 | async function up (utils: { | 3 | async function up (utils: { |
5 | transaction: Sequelize.Transaction, | 4 | transaction: Sequelize.Transaction, |
@@ -28,7 +27,7 @@ async function up (utils: { | |||
28 | 27 | ||
29 | { | 28 | { |
30 | const data = { | 29 | const data = { |
31 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEOS.DESCRIPTION.max), | 30 | type: Sequelize.STRING(10000), |
32 | allowNull: true, | 31 | allowNull: true, |
33 | defaultValue: null | 32 | defaultValue: null |
34 | } | 33 | } |
diff --git a/server/initializers/migrations/0195-support.ts b/server/initializers/migrations/0195-support.ts index 8722a5f22..3b9eabe79 100644 --- a/server/initializers/migrations/0195-support.ts +++ b/server/initializers/migrations/0195-support.ts | |||
@@ -1,5 +1,4 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import { CONSTRAINTS_FIELDS } from '../index' | ||
3 | 2 | ||
4 | async function up (utils: { | 3 | async function up (utils: { |
5 | transaction: Sequelize.Transaction, | 4 | transaction: Sequelize.Transaction, |
@@ -8,7 +7,7 @@ async function up (utils: { | |||
8 | }): Promise<void> { | 7 | }): Promise<void> { |
9 | { | 8 | { |
10 | const data = { | 9 | const data = { |
11 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEOS.SUPPORT.max), | 10 | type: Sequelize.STRING(500), |
12 | allowNull: true, | 11 | allowNull: true, |
13 | defaultValue: null | 12 | defaultValue: null |
14 | } | 13 | } |
@@ -17,7 +16,7 @@ async function up (utils: { | |||
17 | 16 | ||
18 | { | 17 | { |
19 | const data = { | 18 | const data = { |
20 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEO_CHANNELS.SUPPORT.max), | 19 | type: Sequelize.STRING(500), |
21 | allowNull: true, | 20 | allowNull: true, |
22 | defaultValue: null | 21 | defaultValue: null |
23 | } | 22 | } |
@@ -26,7 +25,7 @@ async function up (utils: { | |||
26 | 25 | ||
27 | { | 26 | { |
28 | const data = { | 27 | const data = { |
29 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.USERS.DESCRIPTION.max), | 28 | type: Sequelize.STRING(250), |
30 | allowNull: true, | 29 | allowNull: true, |
31 | defaultValue: null | 30 | defaultValue: null |
32 | } | 31 | } |
@@ -35,7 +34,7 @@ async function up (utils: { | |||
35 | 34 | ||
36 | { | 35 | { |
37 | const data = { | 36 | const data = { |
38 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEOS.DESCRIPTION.max), | 37 | type: Sequelize.STRING(10000), |
39 | allowNull: true, | 38 | allowNull: true, |
40 | defaultValue: null | 39 | defaultValue: null |
41 | } | 40 | } |
diff --git a/server/initializers/migrations/0245-user-blocked.ts b/server/initializers/migrations/0245-user-blocked.ts index 5a04ecd2b..19c7d5b9c 100644 --- a/server/initializers/migrations/0245-user-blocked.ts +++ b/server/initializers/migrations/0245-user-blocked.ts | |||
@@ -1,5 +1,4 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import { CONSTRAINTS_FIELDS } from '../constants' | ||
3 | 2 | ||
4 | async function up (utils: { | 3 | async function up (utils: { |
5 | transaction: Sequelize.Transaction | 4 | transaction: Sequelize.Transaction |
@@ -31,7 +30,7 @@ async function up (utils: { | |||
31 | 30 | ||
32 | { | 31 | { |
33 | const data = { | 32 | const data = { |
34 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.USERS.BLOCKED_REASON.max), | 33 | type: Sequelize.STRING(250), |
35 | allowNull: true, | 34 | allowNull: true, |
36 | defaultValue: null | 35 | defaultValue: null |
37 | } | 36 | } |
diff --git a/server/initializers/migrations/0250-video-abuse-state.ts b/server/initializers/migrations/0250-video-abuse-state.ts index acb668ae1..50de25182 100644 --- a/server/initializers/migrations/0250-video-abuse-state.ts +++ b/server/initializers/migrations/0250-video-abuse-state.ts | |||
@@ -1,5 +1,4 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import { CONSTRAINTS_FIELDS } from '../constants' | ||
3 | import { VideoAbuseState } from '../../../shared/models/videos' | 2 | import { VideoAbuseState } from '../../../shared/models/videos' |
4 | 3 | ||
5 | async function up (utils: { | 4 | async function up (utils: { |
@@ -32,7 +31,7 @@ async function up (utils: { | |||
32 | 31 | ||
33 | { | 32 | { |
34 | const data = { | 33 | const data = { |
35 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.MODERATION_COMMENT.max), | 34 | type: Sequelize.STRING(300), |
36 | allowNull: true, | 35 | allowNull: true, |
37 | defaultValue: null | 36 | defaultValue: null |
38 | } | 37 | } |
diff --git a/server/initializers/migrations/0255-video-blacklist-reason.ts b/server/initializers/migrations/0255-video-blacklist-reason.ts index a380e620e..69d6efb9e 100644 --- a/server/initializers/migrations/0255-video-blacklist-reason.ts +++ b/server/initializers/migrations/0255-video-blacklist-reason.ts | |||
@@ -1,5 +1,4 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import { CONSTRAINTS_FIELDS } from '../constants' | ||
3 | import { VideoAbuseState } from '../../../shared/models/videos' | 2 | import { VideoAbuseState } from '../../../shared/models/videos' |
4 | 3 | ||
5 | async function up (utils: { | 4 | async function up (utils: { |
@@ -10,7 +9,7 @@ async function up (utils: { | |||
10 | 9 | ||
11 | { | 10 | { |
12 | const data = { | 11 | const data = { |
13 | type: Sequelize.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max), | 12 | type: Sequelize.STRING(300), |
14 | allowNull: true, | 13 | allowNull: true, |
15 | defaultValue: null | 14 | defaultValue: null |
16 | } | 15 | } |
diff --git a/server/initializers/migrations/0260-upload-quota-daily.ts b/server/initializers/migrations/0260-upload-quota-daily.ts index d25154ba6..cbbe391ef 100644 --- a/server/initializers/migrations/0260-upload-quota-daily.ts +++ b/server/initializers/migrations/0260-upload-quota-daily.ts | |||
@@ -1,5 +1,4 @@ | |||
1 | import * as Sequelize from 'sequelize' | 1 | import * as Sequelize from 'sequelize' |
2 | import { CONSTRAINTS_FIELDS } from '../constants' | ||
3 | 2 | ||
4 | async function up (utils: { | 3 | async function up (utils: { |
5 | transaction: Sequelize.Transaction | 4 | transaction: Sequelize.Transaction |
diff --git a/server/initializers/migrations/0285-description-support.ts b/server/initializers/migrations/0285-description-support.ts new file mode 100644 index 000000000..85ef4ef39 --- /dev/null +++ b/server/initializers/migrations/0285-description-support.ts | |||
@@ -0,0 +1,53 @@ | |||
1 | import * as Sequelize from 'sequelize' | ||
2 | |||
3 | async function up (utils: { | ||
4 | transaction: Sequelize.Transaction, | ||
5 | queryInterface: Sequelize.QueryInterface, | ||
6 | sequelize: Sequelize.Sequelize, | ||
7 | db: any | ||
8 | }): Promise<void> { | ||
9 | { | ||
10 | const data = { | ||
11 | type: Sequelize.STRING(1000), | ||
12 | allowNull: true, | ||
13 | defaultValue: null | ||
14 | } | ||
15 | await utils.queryInterface.changeColumn('video', 'support', data) | ||
16 | } | ||
17 | |||
18 | { | ||
19 | const data = { | ||
20 | type: Sequelize.STRING(1000), | ||
21 | allowNull: true, | ||
22 | defaultValue: null | ||
23 | } | ||
24 | await utils.queryInterface.changeColumn('videoChannel', 'support', data) | ||
25 | } | ||
26 | |||
27 | { | ||
28 | const data = { | ||
29 | type: Sequelize.STRING(1000), | ||
30 | allowNull: true, | ||
31 | defaultValue: null | ||
32 | } | ||
33 | await utils.queryInterface.changeColumn('videoChannel', 'description', data) | ||
34 | } | ||
35 | |||
36 | { | ||
37 | const data = { | ||
38 | type: Sequelize.STRING(1000), | ||
39 | allowNull: true, | ||
40 | defaultValue: null | ||
41 | } | ||
42 | await utils.queryInterface.changeColumn('account', 'description', data) | ||
43 | } | ||
44 | } | ||
45 | |||
46 | function down (options) { | ||
47 | throw new Error('Not implemented.') | ||
48 | } | ||
49 | |||
50 | export { | ||
51 | up, | ||
52 | down | ||
53 | } | ||
diff --git a/server/tests/api/check-params/users.ts b/server/tests/api/check-params/users.ts index cbfa0c137..ec46609a4 100644 --- a/server/tests/api/check-params/users.ts +++ b/server/tests/api/check-params/users.ts | |||
@@ -315,7 +315,7 @@ describe('Test users API validators', function () { | |||
315 | 315 | ||
316 | it('Should fail with a too long description', async function () { | 316 | it('Should fail with a too long description', async function () { |
317 | const fields = { | 317 | const fields = { |
318 | description: 'super'.repeat(60) | 318 | description: 'super'.repeat(201) |
319 | } | 319 | } |
320 | 320 | ||
321 | await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) | 321 | await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) |
diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts index 3a7942945..e5696224d 100644 --- a/server/tests/api/check-params/video-channels.ts +++ b/server/tests/api/check-params/video-channels.ts | |||
@@ -118,12 +118,12 @@ describe('Test video channels API validator', function () { | |||
118 | }) | 118 | }) |
119 | 119 | ||
120 | it('Should fail with a long description', async function () { | 120 | it('Should fail with a long description', async function () { |
121 | const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(150) }) | 121 | const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(201) }) |
122 | await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields }) | 122 | await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields }) |
123 | }) | 123 | }) |
124 | 124 | ||
125 | it('Should fail with a long support text', async function () { | 125 | it('Should fail with a long support text', async function () { |
126 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) | 126 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) }) |
127 | await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields }) | 127 | await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields }) |
128 | }) | 128 | }) |
129 | 129 | ||
@@ -185,12 +185,12 @@ describe('Test video channels API validator', function () { | |||
185 | }) | 185 | }) |
186 | 186 | ||
187 | it('Should fail with a long description', async function () { | 187 | it('Should fail with a long description', async function () { |
188 | const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(150) }) | 188 | const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(201) }) |
189 | await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) | 189 | await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) |
190 | }) | 190 | }) |
191 | 191 | ||
192 | it('Should fail with a long support text', async function () { | 192 | it('Should fail with a long support text', async function () { |
193 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) | 193 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) }) |
194 | await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) | 194 | await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) |
195 | }) | 195 | }) |
196 | 196 | ||
diff --git a/server/tests/api/check-params/video-imports.ts b/server/tests/api/check-params/video-imports.ts index 44645b0e2..b51f3d2cd 100644 --- a/server/tests/api/check-params/video-imports.ts +++ b/server/tests/api/check-params/video-imports.ts | |||
@@ -140,7 +140,7 @@ describe('Test video imports API validator', function () { | |||
140 | }) | 140 | }) |
141 | 141 | ||
142 | it('Should fail with a long support text', async function () { | 142 | it('Should fail with a long support text', async function () { |
143 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) | 143 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) }) |
144 | 144 | ||
145 | await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) | 145 | await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) |
146 | }) | 146 | }) |
diff --git a/server/tests/api/check-params/videos.ts b/server/tests/api/check-params/videos.ts index 904d22870..699f135c7 100644 --- a/server/tests/api/check-params/videos.ts +++ b/server/tests/api/check-params/videos.ts | |||
@@ -233,7 +233,7 @@ describe('Test videos API validator', function () { | |||
233 | }) | 233 | }) |
234 | 234 | ||
235 | it('Should fail with a long support text', async function () { | 235 | it('Should fail with a long support text', async function () { |
236 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) | 236 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) }) |
237 | const attaches = baseCorrectAttaches | 237 | const attaches = baseCorrectAttaches |
238 | 238 | ||
239 | await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches }) | 239 | await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches }) |
@@ -482,7 +482,7 @@ describe('Test videos API validator', function () { | |||
482 | }) | 482 | }) |
483 | 483 | ||
484 | it('Should fail with a long support text', async function () { | 484 | it('Should fail with a long support text', async function () { |
485 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(150) }) | 485 | const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(201) }) |
486 | 486 | ||
487 | await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields }) | 487 | await makePutBodyRequest({ url: server.url, path: path + videoId, token: server.accessToken, fields }) |
488 | }) | 488 | }) |