DiGiAI commited on
Commit
fd8638c
·
1 Parent(s): 888b8c2
Files changed (2) hide show
  1. .gitignore +10 -0
  2. prisma/schema.prisma +569 -0
.gitignore ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ .env
2
+ *.pyc
3
+ __pycache__/
4
+ *.pyo
5
+ *.pyd
6
+ node_modules/
7
+ prisma/migrations/
8
+ dist/
9
+ build/
10
+ .DS_Store
prisma/schema.prisma ADDED
@@ -0,0 +1,569 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ generator client {
2
+ provider = "prisma-client-py"
3
+ previewFeatures = ["multiSchema"]
4
+ }
5
+
6
+ datasource db {
7
+ provider = "postgresql"
8
+ url = env("DATABASE_URL")
9
+ schemas = ["auth", "public"]
10
+ }
11
+
12
+ model audit_log_entries {
13
+ instance_id String? @db.Uuid
14
+ id String @id @db.Uuid
15
+ payload Json? @db.Json
16
+ created_at DateTime? @db.Timestamptz(6)
17
+ ip_address String @default("") @db.VarChar(64)
18
+
19
+ @@index([instance_id], map: "audit_logs_instance_id_idx")
20
+ @@schema("auth")
21
+ }
22
+
23
+ model flow_state {
24
+ id String @id @db.Uuid
25
+ user_id String? @db.Uuid
26
+ auth_code String
27
+ code_challenge_method code_challenge_method
28
+ code_challenge String
29
+ provider_type String
30
+ provider_access_token String?
31
+ provider_refresh_token String?
32
+ created_at DateTime? @db.Timestamptz(6)
33
+ updated_at DateTime? @db.Timestamptz(6)
34
+ authentication_method String
35
+ saml_relay_states saml_relay_states[]
36
+
37
+ @@index([created_at(sort: Desc)])
38
+ @@index([auth_code], map: "idx_auth_code")
39
+ @@index([user_id, authentication_method], map: "idx_user_id_auth_method")
40
+ @@schema("auth")
41
+ }
42
+
43
+ model identities {
44
+ provider_id String
45
+ user_id String @db.Uuid
46
+ identity_data Json
47
+ provider String
48
+ last_sign_in_at DateTime? @db.Timestamptz(6)
49
+ created_at DateTime? @db.Timestamptz(6)
50
+ updated_at DateTime? @db.Timestamptz(6)
51
+ email String? @default(dbgenerated("lower((identity_data ->> 'email'::text))"))
52
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
53
+ users auth_users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
54
+
55
+ @@unique([provider_id, provider], map: "identities_provider_id_provider_unique")
56
+ @@index([email])
57
+ @@index([user_id])
58
+ @@schema("auth")
59
+ }
60
+
61
+ model instances {
62
+ id String @id @db.Uuid
63
+ uuid String? @db.Uuid
64
+ raw_base_config String?
65
+ created_at DateTime? @db.Timestamptz(6)
66
+ updated_at DateTime? @db.Timestamptz(6)
67
+
68
+ @@schema("auth")
69
+ }
70
+
71
+ model mfa_amr_claims {
72
+ session_id String @db.Uuid
73
+ created_at DateTime @db.Timestamptz(6)
74
+ updated_at DateTime @db.Timestamptz(6)
75
+ authentication_method String
76
+ id String @id(map: "amr_id_pk") @db.Uuid
77
+ sessions sessions @relation(fields: [session_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
78
+
79
+ @@unique([session_id, authentication_method], map: "mfa_amr_claims_session_id_authentication_method_pkey")
80
+ @@schema("auth")
81
+ }
82
+
83
+ model mfa_challenges {
84
+ id String @id @db.Uuid
85
+ factor_id String @db.Uuid
86
+ created_at DateTime @db.Timestamptz(6)
87
+ verified_at DateTime? @db.Timestamptz(6)
88
+ ip_address String @db.Inet
89
+ mfa_factors mfa_factors @relation(fields: [factor_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "mfa_challenges_auth_factor_id_fkey")
90
+
91
+ @@index([created_at(sort: Desc)], map: "mfa_challenge_created_at_idx")
92
+ @@schema("auth")
93
+ }
94
+
95
+ model mfa_factors {
96
+ id String @id @db.Uuid
97
+ user_id String @db.Uuid
98
+ friendly_name String?
99
+ factor_type factor_type
100
+ status factor_status
101
+ created_at DateTime @db.Timestamptz(6)
102
+ updated_at DateTime @db.Timestamptz(6)
103
+ secret String?
104
+ mfa_challenges mfa_challenges[]
105
+ users auth_users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
106
+
107
+ @@index([user_id, created_at], map: "factor_id_created_at_idx")
108
+ @@index([user_id])
109
+ @@schema("auth")
110
+ }
111
+
112
+ model refresh_tokens {
113
+ instance_id String? @db.Uuid
114
+ id BigInt @id @default(autoincrement())
115
+ token String? @unique(map: "refresh_tokens_token_unique") @db.VarChar(255)
116
+ user_id String? @db.VarChar(255)
117
+ revoked Boolean?
118
+ created_at DateTime? @db.Timestamptz(6)
119
+ updated_at DateTime? @db.Timestamptz(6)
120
+ parent String? @db.VarChar(255)
121
+ session_id String? @db.Uuid
122
+ sessions sessions? @relation(fields: [session_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
123
+
124
+ @@index([instance_id])
125
+ @@index([instance_id, user_id])
126
+ @@index([parent])
127
+ @@index([session_id, revoked])
128
+ @@index([updated_at(sort: Desc)])
129
+ @@schema("auth")
130
+ }
131
+
132
+ model saml_providers {
133
+ id String @id @db.Uuid
134
+ sso_provider_id String @db.Uuid
135
+ entity_id String @unique
136
+ metadata_xml String
137
+ metadata_url String?
138
+ attribute_mapping Json?
139
+ created_at DateTime? @db.Timestamptz(6)
140
+ updated_at DateTime? @db.Timestamptz(6)
141
+ sso_providers sso_providers @relation(fields: [sso_provider_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
142
+
143
+ @@index([sso_provider_id])
144
+ @@schema("auth")
145
+ }
146
+
147
+ model saml_relay_states {
148
+ id String @id @db.Uuid
149
+ sso_provider_id String @db.Uuid
150
+ request_id String
151
+ for_email String?
152
+ redirect_to String?
153
+ from_ip_address String? @db.Inet
154
+ created_at DateTime? @db.Timestamptz(6)
155
+ updated_at DateTime? @db.Timestamptz(6)
156
+ flow_state_id String? @db.Uuid
157
+ flow_state flow_state? @relation(fields: [flow_state_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
158
+ sso_providers sso_providers @relation(fields: [sso_provider_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
159
+
160
+ @@index([created_at(sort: Desc)])
161
+ @@index([for_email])
162
+ @@index([sso_provider_id])
163
+ @@schema("auth")
164
+ }
165
+
166
+ model schema_migrations {
167
+ version String @id @db.VarChar(255)
168
+
169
+ @@schema("auth")
170
+ }
171
+
172
+ model sessions {
173
+ id String @id @db.Uuid
174
+ user_id String @db.Uuid
175
+ created_at DateTime? @db.Timestamptz(6)
176
+ updated_at DateTime? @db.Timestamptz(6)
177
+ factor_id String? @db.Uuid
178
+ aal aal_level?
179
+ not_after DateTime? @db.Timestamptz(6)
180
+ refreshed_at DateTime? @db.Timestamp(6)
181
+ user_agent String?
182
+ ip String? @db.Inet
183
+ tag String?
184
+ mfa_amr_claims mfa_amr_claims[]
185
+ refresh_tokens refresh_tokens[]
186
+ users auth_users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
187
+
188
+ @@index([not_after(sort: Desc)])
189
+ @@index([user_id])
190
+ @@index([user_id, created_at], map: "user_id_created_at_idx")
191
+ @@schema("auth")
192
+ }
193
+
194
+ model sso_domains {
195
+ id String @id @db.Uuid
196
+ sso_provider_id String @db.Uuid
197
+ domain String
198
+ created_at DateTime? @db.Timestamptz(6)
199
+ updated_at DateTime? @db.Timestamptz(6)
200
+ sso_providers sso_providers @relation(fields: [sso_provider_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
201
+
202
+ @@index([sso_provider_id])
203
+ @@schema("auth")
204
+ }
205
+
206
+ model sso_providers {
207
+ id String @id @db.Uuid
208
+ resource_id String?
209
+ created_at DateTime? @db.Timestamptz(6)
210
+ updated_at DateTime? @db.Timestamptz(6)
211
+ saml_providers saml_providers[]
212
+ saml_relay_states saml_relay_states[]
213
+ sso_domains sso_domains[]
214
+
215
+ @@schema("auth")
216
+ }
217
+
218
+ model auth_users {
219
+ instance_id String? @db.Uuid
220
+ id String @id @db.Uuid
221
+ aud String? @db.VarChar(255)
222
+ role String? @db.VarChar(255)
223
+ email String? @db.VarChar(255)
224
+ encrypted_password String? @db.VarChar(255)
225
+ email_confirmed_at DateTime? @db.Timestamptz(6)
226
+ invited_at DateTime? @db.Timestamptz(6)
227
+ confirmation_token String? @db.VarChar(255)
228
+ confirmation_sent_at DateTime? @db.Timestamptz(6)
229
+ recovery_token String? @db.VarChar(255)
230
+ recovery_sent_at DateTime? @db.Timestamptz(6)
231
+ email_change_token_new String? @db.VarChar(255)
232
+ email_change String? @db.VarChar(255)
233
+ email_change_sent_at DateTime? @db.Timestamptz(6)
234
+ last_sign_in_at DateTime? @db.Timestamptz(6)
235
+ raw_app_meta_data Json?
236
+ raw_user_meta_data Json?
237
+ is_super_admin Boolean?
238
+ created_at DateTime? @db.Timestamptz(6)
239
+ updated_at DateTime? @db.Timestamptz(6)
240
+ phone String? @unique
241
+ phone_confirmed_at DateTime? @db.Timestamptz(6)
242
+ phone_change String? @default("")
243
+ phone_change_token String? @default("") @db.VarChar(255)
244
+ phone_change_sent_at DateTime? @db.Timestamptz(6)
245
+ confirmed_at DateTime? @default(dbgenerated("LEAST(email_confirmed_at, phone_confirmed_at)")) @db.Timestamptz(6)
246
+ email_change_token_current String? @default("") @db.VarChar(255)
247
+ email_change_confirm_status Int? @default(0) @db.SmallInt
248
+ banned_until DateTime? @db.Timestamptz(6)
249
+ reauthentication_token String? @default("") @db.VarChar(255)
250
+ reauthentication_sent_at DateTime? @db.Timestamptz(6)
251
+ is_sso_user Boolean @default(false)
252
+ deleted_at DateTime? @db.Timestamptz(6)
253
+ identities identities[]
254
+ mfa_factors mfa_factors[]
255
+ sessions sessions[]
256
+ customers customers?
257
+ subscriptions subscriptions[]
258
+ users public_users?
259
+
260
+ @@index([instance_id])
261
+ @@map("users")
262
+ @@schema("auth")
263
+ }
264
+
265
+ model Accommodations {
266
+ id BigInt @id(map: "Hotels_pkey") @default(autoincrement())
267
+ created_at DateTime @default(now()) @db.Timestamptz(6)
268
+
269
+ @@schema("public")
270
+ }
271
+
272
+ model Activities {
273
+ id BigInt @id @default(autoincrement())
274
+ created_at DateTime @default(now()) @db.Timestamptz(6)
275
+
276
+ @@schema("public")
277
+ }
278
+
279
+ model Assistants {
280
+ id String @id @db.Uuid
281
+ name String
282
+ description String?
283
+ created_at DateTime @default(now()) @db.Timestamptz(6)
284
+ updated_at DateTime? @db.Timestamptz(6)
285
+ system_message String?
286
+ opening_message String?
287
+ managers String[]
288
+ slug String? @unique
289
+ directory BigInt?
290
+ tools Json[]
291
+ traits String[]
292
+ openai_assistant_id String?
293
+ model String?
294
+ Directories_Assistants_directoryToDirectories Directories? @relation("Assistants_directoryToDirectories", fields: [directory], references: [id], onDelete: NoAction, onUpdate: NoAction)
295
+ Chats Chats[]
296
+ Directories_Directories_assistantToAssistants Directories[] @relation("Directories_assistantToAssistants")
297
+ Pages Pages[]
298
+
299
+ @@schema("public")
300
+ }
301
+
302
+ model Chatbots {
303
+ id BigInt @id @default(autoincrement())
304
+ created_at DateTime @default(now()) @db.Timestamptz(6)
305
+ name String?
306
+ description String?
307
+ customer String? @db.Uuid
308
+ type chatbot_type?
309
+ platform String?
310
+ customers customers? @relation(fields: [customer], references: [id], onDelete: NoAction, onUpdate: NoAction)
311
+
312
+ @@schema("public")
313
+ }
314
+
315
+ model Chats {
316
+ id BigInt @id @default(autoincrement())
317
+ created_at DateTime @default(now()) @db.Timestamptz(6)
318
+ threadId String?
319
+ assistant String? @db.Uuid
320
+ Assistants Assistants? @relation(fields: [assistant], references: [id], onDelete: NoAction, onUpdate: NoAction)
321
+ Messages Messages[]
322
+
323
+ @@schema("public")
324
+ }
325
+
326
+ model Directories {
327
+ id BigInt @id @default(autoincrement())
328
+ created_at DateTime @default(now()) @db.Timestamptz(6)
329
+ assistant String? @db.Uuid
330
+ Assistants_Assistants_directoryToDirectories Assistants[] @relation("Assistants_directoryToDirectories")
331
+ Assistants_Directories_assistantToAssistants Assistants? @relation("Directories_assistantToAssistants", fields: [assistant], references: [id], onDelete: NoAction, onUpdate: NoAction)
332
+ Files Files[]
333
+ Pages Pages[]
334
+
335
+ @@schema("public")
336
+ }
337
+
338
+ model Eateries {
339
+ id BigInt @id @default(autoincrement())
340
+ created_at DateTime @default(now()) @db.Timestamptz(6)
341
+
342
+ @@schema("public")
343
+ }
344
+
345
+ model Files {
346
+ id BigInt @id @default(autoincrement())
347
+ created_at DateTime @default(now()) @db.Timestamptz(6)
348
+ title String?
349
+ description String?
350
+ directory BigInt?
351
+ Directories Directories? @relation(fields: [directory], references: [id], onDelete: NoAction, onUpdate: NoAction)
352
+
353
+ @@schema("public")
354
+ }
355
+
356
+ model Flights {
357
+ id BigInt @id @default(autoincrement())
358
+ created_at DateTime @default(now()) @db.Timestamptz(6)
359
+
360
+ @@schema("public")
361
+ }
362
+
363
+ model Journals {
364
+ id BigInt @id @default(autoincrement())
365
+ created_at DateTime @default(now()) @db.Timestamptz(6)
366
+
367
+ @@schema("public")
368
+ }
369
+
370
+ model Messages {
371
+ id BigInt @id @default(autoincrement())
372
+ created_at DateTime @default(now()) @db.Timestamptz(6)
373
+ text String
374
+ sender String
375
+ chatId BigInt
376
+ Chats Chats @relation(fields: [chatId], references: [id], onDelete: Cascade)
377
+
378
+ @@schema("public")
379
+ }
380
+
381
+ model Pages {
382
+ id BigInt @id @default(autoincrement())
383
+ created_at DateTime @default(now()) @db.Timestamptz(6)
384
+ url String
385
+ title String?
386
+ directoryId BigInt?
387
+ type page_type?
388
+ website_url String?
389
+ links_to String[]
390
+ referring_links String[]
391
+ images String[]
392
+ assistantId String? @db.Uuid
393
+ Assistants Assistants? @relation(fields: [assistantId], references: [id], onDelete: NoAction, onUpdate: NoAction)
394
+ Directories Directories? @relation(fields: [directoryId], references: [id], onDelete: NoAction, onUpdate: NoAction)
395
+
396
+ @@schema("public")
397
+ }
398
+
399
+ model Recommendations {
400
+ id BigInt @id @default(autoincrement())
401
+ created_at DateTime @default(now()) @db.Timestamptz(6)
402
+
403
+ @@schema("public")
404
+ }
405
+
406
+ model TravelPlans {
407
+ id BigInt @id @default(autoincrement())
408
+ created_at DateTime @default(now()) @db.Timestamptz(6)
409
+
410
+ @@schema("public")
411
+ }
412
+
413
+ model customers {
414
+ id String @id @db.Uuid
415
+ stripe_customer_id String?
416
+ Chatbots Chatbots[]
417
+ users auth_users @relation(fields: [id], references: [id], onDelete: NoAction, onUpdate: NoAction)
418
+
419
+ @@schema("public")
420
+ }
421
+
422
+ model prices {
423
+ id String @id
424
+ product_id String?
425
+ active Boolean?
426
+ description String?
427
+ unit_amount BigInt?
428
+ currency String?
429
+ type pricing_type?
430
+ interval pricing_plan_interval?
431
+ interval_count Int?
432
+ trial_period_days Int?
433
+ metadata Json?
434
+ products products? @relation(fields: [product_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
435
+ subscriptions subscriptions[]
436
+
437
+ @@schema("public")
438
+ }
439
+
440
+ model products {
441
+ id String @id
442
+ active Boolean?
443
+ name String?
444
+ description String?
445
+ image String?
446
+ metadata Json?
447
+ prices prices[]
448
+
449
+ @@schema("public")
450
+ }
451
+
452
+ model subscriptions {
453
+ id String @id
454
+ user_id String @db.Uuid
455
+ status subscription_status?
456
+ metadata Json?
457
+ price_id String?
458
+ quantity Int?
459
+ cancel_at_period_end Boolean?
460
+ created DateTime @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
461
+ current_period_start DateTime @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
462
+ current_period_end DateTime @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
463
+ ended_at DateTime? @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
464
+ cancel_at DateTime? @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
465
+ canceled_at DateTime? @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
466
+ trial_start DateTime? @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
467
+ trial_end DateTime? @default(dbgenerated("timezone('utc'::text, now())")) @db.Timestamptz(6)
468
+ prices prices? @relation(fields: [price_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
469
+ users auth_users @relation(fields: [user_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
470
+
471
+ @@schema("public")
472
+ }
473
+
474
+ model public_users {
475
+ id String @id @db.Uuid
476
+ full_name String?
477
+ avatar_url String?
478
+ billing_address Json?
479
+ payment_method Json?
480
+ organization String?
481
+ api_keys String[] @unique(map: "users_apiKeys_key")
482
+ email String? @unique
483
+ apiKey String? @unique
484
+ openai_assistant_id String? @unique
485
+ openai_api_key String? @unique
486
+ users auth_users @relation(fields: [id], references: [id], onDelete: NoAction, onUpdate: NoAction)
487
+
488
+ @@map("users")
489
+ @@schema("public")
490
+ }
491
+
492
+ enum aal_level {
493
+ aal1
494
+ aal2
495
+ aal3
496
+
497
+ @@schema("auth")
498
+ }
499
+
500
+ enum code_challenge_method {
501
+ s256
502
+ plain
503
+
504
+ @@schema("auth")
505
+ }
506
+
507
+ enum factor_status {
508
+ unverified
509
+ verified
510
+
511
+ @@schema("auth")
512
+ }
513
+
514
+ enum factor_type {
515
+ totp
516
+ webauthn
517
+
518
+ @@schema("auth")
519
+ }
520
+
521
+ enum chatbot_type {
522
+ QandA
523
+ Assistant
524
+ CoPilot
525
+
526
+ @@schema("public")
527
+ }
528
+
529
+ enum page_type {
530
+ Post
531
+ Listing
532
+ Product
533
+ Services
534
+ Booking
535
+ Checkout
536
+ Contact
537
+ Other
538
+
539
+ @@schema("public")
540
+ }
541
+
542
+ enum pricing_plan_interval {
543
+ day
544
+ week
545
+ month
546
+ year
547
+
548
+ @@schema("public")
549
+ }
550
+
551
+ enum pricing_type {
552
+ one_time
553
+ recurring
554
+
555
+ @@schema("public")
556
+ }
557
+
558
+ enum subscription_status {
559
+ trialing
560
+ active
561
+ canceled
562
+ incomplete
563
+ incomplete_expired
564
+ past_due
565
+ unpaid
566
+ paused
567
+
568
+ @@schema("public")
569
+ }