@things-factory/worklist-client 6.0.24

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.
Files changed (142) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/assets/images/gangsters-512x512.png +0 -0
  3. package/client/bootstrap.ts +1 -0
  4. package/client/index.ts +0 -0
  5. package/client/pages/work-center/work-center-importer.ts +97 -0
  6. package/client/pages/work-center/work-center-list-page.ts +332 -0
  7. package/client/pages/work-center/work-center-page.ts +95 -0
  8. package/client/route.ts +7 -0
  9. package/client/tsconfig.json +11 -0
  10. package/dist-client/bootstrap.d.ts +1 -0
  11. package/dist-client/bootstrap.js +2 -0
  12. package/dist-client/bootstrap.js.map +1 -0
  13. package/dist-client/index.d.ts +0 -0
  14. package/dist-client/index.js +2 -0
  15. package/dist-client/index.js.map +1 -0
  16. package/dist-client/pages/work-center/work-center-importer.d.ts +22 -0
  17. package/dist-client/pages/work-center/work-center-importer.js +100 -0
  18. package/dist-client/pages/work-center/work-center-importer.js.map +1 -0
  19. package/dist-client/pages/work-center/work-center-list-page.d.ts +62 -0
  20. package/dist-client/pages/work-center/work-center-list-page.js +317 -0
  21. package/dist-client/pages/work-center/work-center-list-page.js.map +1 -0
  22. package/dist-client/pages/work-center/work-center-page.d.ts +26 -0
  23. package/dist-client/pages/work-center/work-center-page.js +92 -0
  24. package/dist-client/pages/work-center/work-center-page.js.map +1 -0
  25. package/dist-client/route.d.ts +1 -0
  26. package/dist-client/route.js +8 -0
  27. package/dist-client/route.js.map +1 -0
  28. package/dist-client/tsconfig.tsbuildinfo +1 -0
  29. package/dist-server/controllers/activity-registry.js +17 -0
  30. package/dist-server/controllers/activity-registry.js.map +1 -0
  31. package/dist-server/controllers/graphql-client.js +60 -0
  32. package/dist-server/controllers/graphql-client.js.map +1 -0
  33. package/dist-server/controllers/index.js +8 -0
  34. package/dist-server/controllers/index.js.map +1 -0
  35. package/dist-server/controllers/webhooks/decorators.js +17 -0
  36. package/dist-server/controllers/webhooks/decorators.js.map +1 -0
  37. package/dist-server/controllers/webhooks/index.js +48 -0
  38. package/dist-server/controllers/webhooks/index.js.map +1 -0
  39. package/dist-server/controllers/work-center/connect-work-center.js +17 -0
  40. package/dist-server/controllers/work-center/connect-work-center.js.map +1 -0
  41. package/dist-server/controllers/work-center/get-work-center.js +13 -0
  42. package/dist-server/controllers/work-center/get-work-center.js.map +1 -0
  43. package/dist-server/controllers/work-center/index.js +6 -0
  44. package/dist-server/controllers/work-center/index.js.map +1 -0
  45. package/dist-server/controllers/worklist-api/assign-activity-thread.js +6 -0
  46. package/dist-server/controllers/worklist-api/assign-activity-thread.js.map +1 -0
  47. package/dist-server/controllers/worklist-api/draft-activity-instance.js +6 -0
  48. package/dist-server/controllers/worklist-api/draft-activity-instance.js.map +1 -0
  49. package/dist-server/controllers/worklist-api/get-activity-list.js +6 -0
  50. package/dist-server/controllers/worklist-api/get-activity-list.js.map +1 -0
  51. package/dist-server/controllers/worklist-api/get-activity.js +6 -0
  52. package/dist-server/controllers/worklist-api/get-activity.js.map +1 -0
  53. package/dist-server/controllers/worklist-api/get-todo-list.js +6 -0
  54. package/dist-server/controllers/worklist-api/get-todo-list.js.map +1 -0
  55. package/dist-server/controllers/worklist-api/index.js +11 -0
  56. package/dist-server/controllers/worklist-api/index.js.map +1 -0
  57. package/dist-server/controllers/worklist-api/register-activity.js +6 -0
  58. package/dist-server/controllers/worklist-api/register-activity.js.map +1 -0
  59. package/dist-server/controllers/worklist-api/unregister-activity.js +6 -0
  60. package/dist-server/controllers/worklist-api/unregister-activity.js.map +1 -0
  61. package/dist-server/controllers/worklist-api/update-activity.js +6 -0
  62. package/dist-server/controllers/worklist-api/update-activity.js.map +1 -0
  63. package/dist-server/index.js +8 -0
  64. package/dist-server/index.js.map +1 -0
  65. package/dist-server/middlewares/index.js +8 -0
  66. package/dist-server/middlewares/index.js.map +1 -0
  67. package/dist-server/migrations/index.js +12 -0
  68. package/dist-server/migrations/index.js.map +1 -0
  69. package/dist-server/routes.js +42 -0
  70. package/dist-server/routes.js.map +1 -0
  71. package/dist-server/service/activity/activity-model-type.js +138 -0
  72. package/dist-server/service/activity/activity-model-type.js.map +1 -0
  73. package/dist-server/service/activity/activity-mutation.js +105 -0
  74. package/dist-server/service/activity/activity-mutation.js.map +1 -0
  75. package/dist-server/service/activity/activity-query.js +87 -0
  76. package/dist-server/service/activity/activity-query.js.map +1 -0
  77. package/dist-server/service/activity/activity-type.js +199 -0
  78. package/dist-server/service/activity/activity-type.js.map +1 -0
  79. package/dist-server/service/activity/activity.js +170 -0
  80. package/dist-server/service/activity/activity.js.map +1 -0
  81. package/dist-server/service/activity/index.js +9 -0
  82. package/dist-server/service/activity/index.js.map +1 -0
  83. package/dist-server/service/index.js +28 -0
  84. package/dist-server/service/index.js.map +1 -0
  85. package/dist-server/service/work-center/event-subscriber.js +21 -0
  86. package/dist-server/service/work-center/event-subscriber.js.map +1 -0
  87. package/dist-server/service/work-center/index.js +12 -0
  88. package/dist-server/service/work-center/index.js.map +1 -0
  89. package/dist-server/service/work-center/work-center-history.js +123 -0
  90. package/dist-server/service/work-center/work-center-history.js.map +1 -0
  91. package/dist-server/service/work-center/work-center-mutation.js +168 -0
  92. package/dist-server/service/work-center/work-center-mutation.js.map +1 -0
  93. package/dist-server/service/work-center/work-center-query.js +97 -0
  94. package/dist-server/service/work-center/work-center-query.js.map +1 -0
  95. package/dist-server/service/work-center/work-center-type.js +86 -0
  96. package/dist-server/service/work-center/work-center-type.js.map +1 -0
  97. package/dist-server/service/work-center/work-center.js +86 -0
  98. package/dist-server/service/work-center/work-center.js.map +1 -0
  99. package/dist-server/tsconfig.tsbuildinfo +1 -0
  100. package/helps/worklist-webhook/work-center.md +160 -0
  101. package/package.json +36 -0
  102. package/server/controllers/activity-registry.ts +17 -0
  103. package/server/controllers/graphql-client.ts +68 -0
  104. package/server/controllers/index.ts +4 -0
  105. package/server/controllers/webhooks/decorators.ts +18 -0
  106. package/server/controllers/webhooks/index.ts +30 -0
  107. package/server/controllers/work-center/connect-work-center.ts +15 -0
  108. package/server/controllers/work-center/get-work-center.ts +9 -0
  109. package/server/controllers/work-center/index.ts +2 -0
  110. package/server/controllers/worklist-api/assign-activity-thread.ts +3 -0
  111. package/server/controllers/worklist-api/draft-activity-instance.ts +3 -0
  112. package/server/controllers/worklist-api/get-activity-list.ts +3 -0
  113. package/server/controllers/worklist-api/get-activity.ts +3 -0
  114. package/server/controllers/worklist-api/get-todo-list.ts +4 -0
  115. package/server/controllers/worklist-api/index.ts +7 -0
  116. package/server/controllers/worklist-api/register-activity.ts +3 -0
  117. package/server/controllers/worklist-api/unregister-activity.ts +3 -0
  118. package/server/controllers/worklist-api/update-activity.ts +3 -0
  119. package/server/index.ts +5 -0
  120. package/server/middlewares/index.ts +3 -0
  121. package/server/migrations/index.ts +9 -0
  122. package/server/routes.ts +46 -0
  123. package/server/service/activity/activity-model-type.ts +106 -0
  124. package/server/service/activity/activity-mutation.ts +85 -0
  125. package/server/service/activity/activity-query.ts +61 -0
  126. package/server/service/activity/activity-type.ts +146 -0
  127. package/server/service/activity/activity.ts +135 -0
  128. package/server/service/activity/index.ts +6 -0
  129. package/server/service/index.ts +36 -0
  130. package/server/service/work-center/event-subscriber.ts +17 -0
  131. package/server/service/work-center/index.ts +9 -0
  132. package/server/service/work-center/work-center-history.ts +110 -0
  133. package/server/service/work-center/work-center-mutation.ts +198 -0
  134. package/server/service/work-center/work-center-query.ts +62 -0
  135. package/server/service/work-center/work-center-type.ts +61 -0
  136. package/server/service/work-center/work-center.ts +76 -0
  137. package/server/tsconfig.json +10 -0
  138. package/things-factory.config.js +11 -0
  139. package/translations/en.json +1 -0
  140. package/translations/ko.json +1 -0
  141. package/translations/ms.json +1 -0
  142. package/translations/zh.json +1 -0
@@ -0,0 +1,198 @@
1
+ import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+
4
+ import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
5
+
6
+ import { WorkCenter } from './work-center'
7
+ import { NewWorkCenter, WorkCenterPatch } from './work-center-type'
8
+
9
+ @Resolver(WorkCenter)
10
+ export class WorkCenterMutation {
11
+ @Directive('@transaction')
12
+ @Mutation(returns => WorkCenter, { description: 'To create new WorkCenter' })
13
+ async createWorkCenter(@Arg('workCenter') workCenter: NewWorkCenter, @Ctx() context: ResolverContext): Promise<WorkCenter> {
14
+ const { domain, user, tx } = context.state
15
+
16
+ const result = await tx.getRepository(WorkCenter).save({
17
+ ...workCenter,
18
+ domain,
19
+ creator: user,
20
+ updater: user
21
+ })
22
+
23
+ if (workCenter.thumbnail) {
24
+ await createAttachment(
25
+ null,
26
+ {
27
+ attachment: {
28
+ file: workCenter.thumbnail,
29
+ refType: WorkCenter.name,
30
+ refBy: result.id
31
+ }
32
+ },
33
+ context
34
+ )
35
+ }
36
+
37
+ return result
38
+ }
39
+
40
+ @Directive('@transaction')
41
+ @Mutation(returns => WorkCenter, { description: 'To modify WorkCenter information' })
42
+ async updateWorkCenter(
43
+ @Arg('id') id: string,
44
+ @Arg('patch') patch: WorkCenterPatch,
45
+ @Ctx() context: ResolverContext
46
+ ): Promise<WorkCenter> {
47
+ const { domain, user, tx } = context.state
48
+
49
+ const repository = tx.getRepository(WorkCenter)
50
+ const workCenter = await repository.findOne({
51
+ where: { domain: { id: domain.id }, id }
52
+ })
53
+
54
+ const result = await repository.save({
55
+ ...workCenter,
56
+ ...patch,
57
+ updater: user
58
+ })
59
+
60
+ if (patch.thumbnail) {
61
+ await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
62
+ await createAttachment(
63
+ null,
64
+ {
65
+ attachment: {
66
+ file: patch.thumbnail,
67
+ refType: WorkCenter.name,
68
+ refBy: result.id
69
+ }
70
+ },
71
+ context
72
+ )
73
+ }
74
+
75
+ return result
76
+ }
77
+
78
+ @Directive('@transaction')
79
+ @Mutation(returns => [WorkCenter], { description: "To modify multiple WorkCenters' information" })
80
+ async updateMultipleWorkCenter(
81
+ @Arg('patches', type => [WorkCenterPatch]) patches: WorkCenterPatch[],
82
+ @Ctx() context: ResolverContext
83
+ ): Promise<WorkCenter[]> {
84
+ const { domain, user, tx } = context.state
85
+
86
+ let results = []
87
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
88
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
89
+ const workCenterRepo = tx.getRepository(WorkCenter)
90
+
91
+ if (_createRecords.length > 0) {
92
+ for (let i = 0; i < _createRecords.length; i++) {
93
+ const newRecord = _createRecords[i]
94
+
95
+ const result = await workCenterRepo.save({
96
+ ...newRecord,
97
+ domain,
98
+ creator: user,
99
+ updater: user
100
+ })
101
+
102
+ if (newRecord.thumbnail) {
103
+ await createAttachment(
104
+ null,
105
+ {
106
+ attachment: {
107
+ file: newRecord.thumbnail,
108
+ refType: WorkCenter.name,
109
+ refBy: result.id
110
+ }
111
+ },
112
+ context
113
+ )
114
+ }
115
+
116
+ results.push({ ...result, cuFlag: '+' })
117
+ }
118
+ }
119
+
120
+ if (_updateRecords.length > 0) {
121
+ for (let i = 0; i < _updateRecords.length; i++) {
122
+ const updateRecord = _updateRecords[i]
123
+ const workCenter = await workCenterRepo.findOneBy({ id: updateRecord.id })
124
+
125
+ const result = await workCenterRepo.save({
126
+ ...workCenter,
127
+ ...updateRecord,
128
+ updater: user
129
+ })
130
+
131
+ if (updateRecord.thumbnail) {
132
+ await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
133
+ await createAttachment(
134
+ null,
135
+ {
136
+ attachment: {
137
+ file: updateRecord.thumbnail,
138
+ refType: WorkCenter.name,
139
+ refBy: result.id
140
+ }
141
+ },
142
+ context
143
+ )
144
+ }
145
+
146
+ results.push({ ...result, cuFlag: 'M' })
147
+ }
148
+ }
149
+
150
+ return results
151
+ }
152
+
153
+ @Directive('@transaction')
154
+ @Mutation(returns => Boolean, { description: 'To delete WorkCenter' })
155
+ async deleteWorkCenter(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
156
+ const { domain, tx } = context.state
157
+
158
+ await tx.getRepository(WorkCenter).delete({ domain: { id: domain.id }, id })
159
+ await deleteAttachmentsByRef(null, { refBys: [id] }, context)
160
+
161
+ return true
162
+ }
163
+
164
+ @Directive('@transaction')
165
+ @Mutation(returns => Boolean, { description: 'To delete multiple WorkCenters' })
166
+ async deleteWorkCenters(
167
+ @Arg('ids', type => [String]) ids: string[],
168
+ @Ctx() context: ResolverContext
169
+ ): Promise<boolean> {
170
+ const { domain, tx } = context.state
171
+
172
+ await tx.getRepository(WorkCenter).delete({
173
+ domain: { id: domain.id },
174
+ id: In(ids)
175
+ })
176
+
177
+ await deleteAttachmentsByRef(null, { refBys: ids }, context)
178
+
179
+ return true
180
+ }
181
+
182
+ @Directive('@transaction')
183
+ @Mutation(returns => Boolean, { description: 'To import multiple WorkCenters' })
184
+ async importWorkCenters(
185
+ @Arg('workCenters', type => [WorkCenterPatch]) workCenters: WorkCenterPatch[],
186
+ @Ctx() context: ResolverContext
187
+ ): Promise<boolean> {
188
+ const { domain, tx } = context.state
189
+
190
+ await Promise.all(
191
+ workCenters.map(async (workCenter: WorkCenterPatch) => {
192
+ const createdWorkCenter: WorkCenter = await tx.getRepository(WorkCenter).save({ domain, ...workCenter })
193
+ })
194
+ )
195
+
196
+ return true
197
+ }
198
+ }
@@ -0,0 +1,62 @@
1
+ import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { Attachment } from '@things-factory/attachment-base'
3
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
4
+ import { User } from '@things-factory/auth-base'
5
+ import { WorkCenter } from './work-center'
6
+ import { WorkCenterList } from './work-center-type'
7
+
8
+ @Resolver(WorkCenter)
9
+ export class WorkCenterQuery {
10
+ @Query(returns => WorkCenter!, { nullable: true, description: 'To fetch a WorkCenter' })
11
+ async workCenter(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<WorkCenter> {
12
+ const { domain } = context.state
13
+
14
+ return await getRepository(WorkCenter).findOne({
15
+ where: { domain: { id: domain.id }, id }
16
+ })
17
+ }
18
+
19
+ @Query(returns => WorkCenterList, { description: 'To fetch multiple WorkCenters' })
20
+ async workCenters(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<WorkCenterList> {
21
+ const { domain } = context.state
22
+
23
+ const queryBuilder = getQueryBuilderFromListParams({
24
+ domain,
25
+ params,
26
+ repository: await getRepository(WorkCenter),
27
+ searchables: ['name', 'description']
28
+ })
29
+
30
+ const [items, total] = await queryBuilder.getManyAndCount()
31
+
32
+ return { items, total }
33
+ }
34
+
35
+ @FieldResolver(type => String)
36
+ async thumbnail(@Root() workCenter: WorkCenter): Promise<string | undefined> {
37
+ const attachment: Attachment = await getRepository(Attachment).findOne({
38
+ where: {
39
+ domain: { id: workCenter.domainId },
40
+ refType: WorkCenter.name,
41
+ refBy: workCenter.id
42
+ }
43
+ })
44
+
45
+ return attachment?.fullpath
46
+ }
47
+
48
+ @FieldResolver(type => Domain)
49
+ async domain(@Root() workCenter: WorkCenter): Promise<Domain> {
50
+ return await getRepository(Domain).findOneBy({ id: workCenter.domainId })
51
+ }
52
+
53
+ @FieldResolver(type => User)
54
+ async updater(@Root() workCenter: WorkCenter): Promise<User> {
55
+ return await getRepository(User).findOneBy({ id: workCenter.updaterId })
56
+ }
57
+
58
+ @FieldResolver(type => User)
59
+ async creator(@Root() workCenter: WorkCenter): Promise<User> {
60
+ return await getRepository(User).findOneBy({ id: workCenter.creatorId })
61
+ }
62
+ }
@@ -0,0 +1,61 @@
1
+ import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
+ import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
+ import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
4
+
5
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
6
+
7
+ import { WorkCenter, WorkCenterStatus } from './work-center'
8
+
9
+ @InputType()
10
+ export class NewWorkCenter {
11
+ @Field()
12
+ name: string
13
+
14
+ @Field({ nullable: true })
15
+ description?: string
16
+
17
+ @Field(type => WorkCenterStatus, { nullable: true })
18
+ state?: WorkCenterStatus
19
+
20
+ @Field({ nullable: true })
21
+ active?: boolean
22
+
23
+ @Field({ nullable: true })
24
+ params?: string
25
+
26
+ @Field(type => GraphQLUpload, { nullable: true })
27
+ thumbnail?: FileUpload
28
+ }
29
+
30
+ @InputType()
31
+ export class WorkCenterPatch {
32
+ @Field(type => ID, { nullable: true })
33
+ id?: string
34
+
35
+ @Field({ nullable: true })
36
+ name?: string
37
+
38
+ @Field({ nullable: true })
39
+ description?: string
40
+
41
+ @Field(type => WorkCenterStatus, { nullable: true })
42
+ state?: WorkCenterStatus
43
+
44
+ @Field({ nullable: true })
45
+ active?: boolean
46
+
47
+ @Field(type => GraphQLUpload, { nullable: true })
48
+ thumbnail?: FileUpload
49
+
50
+ @Field({ nullable: true })
51
+ cuFlag?: string
52
+ }
53
+
54
+ @ObjectType()
55
+ export class WorkCenterList {
56
+ @Field(type => [WorkCenter])
57
+ items: WorkCenter[]
58
+
59
+ @Field(type => Int)
60
+ total: number
61
+ }
@@ -0,0 +1,76 @@
1
+ import {
2
+ CreateDateColumn,
3
+ UpdateDateColumn,
4
+ DeleteDateColumn,
5
+ Entity,
6
+ Index,
7
+ Column,
8
+ RelationId,
9
+ ManyToOne,
10
+ PrimaryGeneratedColumn,
11
+ VersionColumn
12
+ } from 'typeorm'
13
+ import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
14
+
15
+ import { Domain } from '@things-factory/shell'
16
+ import { User } from '@things-factory/auth-base'
17
+
18
+ export enum WorkCenterStatus {
19
+ STATUS_A = 'STATUS_A',
20
+ STATUS_B = 'STATUS_B'
21
+ }
22
+
23
+ registerEnumType(WorkCenterStatus, {
24
+ name: 'WorkCenterStatus',
25
+ description: 'state enumeration of a workCenter'
26
+ })
27
+
28
+ @Entity()
29
+ @Index('ix_work_center_0', (workCenter: WorkCenter) => [workCenter.domain], { unique: true })
30
+ @ObjectType({ description: 'Entity for WorkCenter' })
31
+ export class WorkCenter {
32
+ @PrimaryGeneratedColumn('uuid')
33
+ @Field(type => ID)
34
+ readonly id: string
35
+
36
+ @VersionColumn()
37
+ @Field({ nullable: true })
38
+ version?: number = 1
39
+
40
+ @ManyToOne(type => Domain)
41
+ @Field({ nullable: true })
42
+ domain?: Domain
43
+
44
+ @RelationId((workCenter: WorkCenter) => workCenter.domain)
45
+ domainId?: string
46
+
47
+ @Column()
48
+ @Field({ nullable: true })
49
+ workCenterId?: string
50
+
51
+ @Column()
52
+ @Field({ nullable: true })
53
+ name?: string
54
+
55
+ @CreateDateColumn()
56
+ @Field({ nullable: true })
57
+ createdAt?: Date
58
+
59
+ @UpdateDateColumn()
60
+ @Field({ nullable: true })
61
+ updatedAt?: Date
62
+
63
+ @ManyToOne(type => User, { nullable: true })
64
+ @Field(type => User, { nullable: true })
65
+ creator?: User
66
+
67
+ @RelationId((workCenter: WorkCenter) => workCenter.creator)
68
+ creatorId?: string
69
+
70
+ @ManyToOne(type => User, { nullable: true })
71
+ @Field(type => User, { nullable: true })
72
+ updater?: User
73
+
74
+ @RelationId((workCenter: WorkCenter) => workCenter.updater)
75
+ updaterId?: string
76
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "strict": false,
5
+ "module": "commonjs",
6
+ "outDir": "../dist-server",
7
+ "baseUrl": "./"
8
+ },
9
+ "include": ["./**/*"]
10
+ }
@@ -0,0 +1,11 @@
1
+ import route from './dist-client/route'
2
+ import bootstrap from './dist-client/bootstrap'
3
+
4
+ export default {
5
+ route,
6
+ routes: [
7
+ { tagname: 'worklist-client-main', page: 'worklist-client-main' },
8
+ { tagname: 'work-center-list-page', page: 'work-center-list' }
9
+ ],
10
+ bootstrap
11
+ }
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}