@mhbdev/unicms 0.1.0
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/README.md +117 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +30 -0
- package/dist/client.js.map +1 -0
- package/dist/contracts/v1.d.ts +13507 -0
- package/dist/contracts/v1.d.ts.map +1 -0
- package/dist/contracts/v1.js +354 -0
- package/dist/contracts/v1.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/http.d.ts +15 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +129 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/methods/getPageBySlug.d.ts +6 -0
- package/dist/methods/getPageBySlug.d.ts.map +1 -0
- package/dist/methods/getPageBySlug.js +12 -0
- package/dist/methods/getPageBySlug.js.map +1 -0
- package/dist/methods/getPostBySlug.d.ts +6 -0
- package/dist/methods/getPostBySlug.d.ts.map +1 -0
- package/dist/methods/getPostBySlug.js +12 -0
- package/dist/methods/getPostBySlug.js.map +1 -0
- package/dist/methods/getSiteSettings.d.ts +4 -0
- package/dist/methods/getSiteSettings.d.ts.map +1 -0
- package/dist/methods/getSiteSettings.js +9 -0
- package/dist/methods/getSiteSettings.js.map +1 -0
- package/dist/methods/listCategories.d.ts +4 -0
- package/dist/methods/listCategories.d.ts.map +1 -0
- package/dist/methods/listCategories.js +9 -0
- package/dist/methods/listCategories.js.map +1 -0
- package/dist/methods/listFaqs.d.ts +6 -0
- package/dist/methods/listFaqs.d.ts.map +1 -0
- package/dist/methods/listFaqs.js +12 -0
- package/dist/methods/listFaqs.js.map +1 -0
- package/dist/methods/listPosts.d.ts +4 -0
- package/dist/methods/listPosts.d.ts.map +1 -0
- package/dist/methods/listPosts.js +16 -0
- package/dist/methods/listPosts.js.map +1 -0
- package/dist/methods/listTags.d.ts +4 -0
- package/dist/methods/listTags.d.ts.map +1 -0
- package/dist/methods/listTags.js +9 -0
- package/dist/methods/listTags.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PostDTO } from '../contracts/v1.js';
|
|
2
|
+
import type { HttpClient } from '../http.js';
|
|
3
|
+
export declare const getPostBySlug: (http: HttpClient, slug: string, opts?: {
|
|
4
|
+
includeRawContent?: boolean;
|
|
5
|
+
}) => Promise<PostDTO>;
|
|
6
|
+
//# sourceMappingURL=getPostBySlug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPostBySlug.d.ts","sourceRoot":"","sources":["../../src/methods/getPostBySlug.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,eAAO,MAAM,aAAa,GACxB,MAAM,UAAU,EAChB,MAAM,MAAM,EACZ,OAAO;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,KACrC,OAAO,CAAC,OAAO,CAUjB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { postResponseSchema } from '../contracts/v1.js';
|
|
2
|
+
export const getPostBySlug = async (http, slug, opts) => {
|
|
3
|
+
const response = await http.get({
|
|
4
|
+
path: `/api/public/v1/posts/${encodeURIComponent(slug)}`,
|
|
5
|
+
query: {
|
|
6
|
+
includeRawContent: opts?.includeRawContent,
|
|
7
|
+
},
|
|
8
|
+
schema: postResponseSchema,
|
|
9
|
+
});
|
|
10
|
+
return response.data;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=getPostBySlug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPostBySlug.js","sourceRoot":"","sources":["../../src/methods/getPostBySlug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAIvD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,IAAgB,EAChB,IAAY,EACZ,IAAsC,EACpB,EAAE;IACpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,wBAAwB,kBAAkB,CAAC,IAAI,CAAC,EAAE;QACxD,KAAK,EAAE;YACL,iBAAiB,EAAE,IAAI,EAAE,iBAAiB;SAC3C;QACD,MAAM,EAAE,kBAAkB;KAC3B,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAA;AACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSiteSettings.d.ts","sourceRoot":"","sources":["../../src/methods/getSiteSettings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,eAAO,MAAM,eAAe,GAAU,MAAM,UAAU,KAAG,OAAO,CAAC,eAAe,CAO/E,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { siteSettingsResponseSchema } from '../contracts/v1.js';
|
|
2
|
+
export const getSiteSettings = async (http) => {
|
|
3
|
+
const response = await http.get({
|
|
4
|
+
path: '/api/public/v1/site-settings',
|
|
5
|
+
schema: siteSettingsResponseSchema,
|
|
6
|
+
});
|
|
7
|
+
return response.data;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=getSiteSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSiteSettings.js","sourceRoot":"","sources":["../../src/methods/getSiteSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAA;AAI/D,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAgB,EAA4B,EAAE;IAClF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,0BAA0B;KACnC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAA;AACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listCategories.d.ts","sourceRoot":"","sources":["../../src/methods/listCategories.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,eAAO,MAAM,cAAc,GAAU,MAAM,UAAU,KAAG,OAAO,CAAC,WAAW,EAAE,CAO5E,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { categoriesResponseSchema } from '../contracts/v1.js';
|
|
2
|
+
export const listCategories = async (http) => {
|
|
3
|
+
const response = await http.get({
|
|
4
|
+
path: '/api/public/v1/categories',
|
|
5
|
+
schema: categoriesResponseSchema,
|
|
6
|
+
});
|
|
7
|
+
return response.data;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=listCategories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listCategories.js","sourceRoot":"","sources":["../../src/methods/listCategories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAI7D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,IAAgB,EAA0B,EAAE;IAC/E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,wBAAwB;KACjC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAA;AACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listFaqs.d.ts","sourceRoot":"","sources":["../../src/methods/listFaqs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,eAAO,MAAM,QAAQ,GACnB,MAAM,UAAU,EAChB,OAAO;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,KACrC,OAAO,CAAC,MAAM,EAAE,CAUlB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { faqsResponseSchema } from '../contracts/v1.js';
|
|
2
|
+
export const listFaqs = async (http, opts) => {
|
|
3
|
+
const response = await http.get({
|
|
4
|
+
path: '/api/public/v1/faqs',
|
|
5
|
+
query: {
|
|
6
|
+
includeRawContent: opts?.includeRawContent,
|
|
7
|
+
},
|
|
8
|
+
schema: faqsResponseSchema,
|
|
9
|
+
});
|
|
10
|
+
return response.data;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=listFaqs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listFaqs.js","sourceRoot":"","sources":["../../src/methods/listFaqs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAIvD,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAAgB,EAChB,IAAsC,EACnB,EAAE;IACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE;YACL,iBAAiB,EAAE,IAAI,EAAE,iBAAiB;SAC3C;QACD,MAAM,EAAE,kBAAkB;KAC3B,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAA;AACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ListPostsParams, Paginated, PostSummaryDTO } from '../contracts/v1.js';
|
|
2
|
+
import type { HttpClient } from '../http.js';
|
|
3
|
+
export declare const listPosts: (http: HttpClient, params?: ListPostsParams) => Promise<Paginated<PostSummaryDTO>>;
|
|
4
|
+
//# sourceMappingURL=listPosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listPosts.d.ts","sourceRoot":"","sources":["../../src/methods/listPosts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,eAAO,MAAM,SAAS,GACpB,MAAM,UAAU,EAChB,SAAS,eAAe,KACvB,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAcnC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { postsListResponseSchema } from '../contracts/v1.js';
|
|
2
|
+
export const listPosts = async (http, params) => {
|
|
3
|
+
const response = await http.get({
|
|
4
|
+
path: '/api/public/v1/posts',
|
|
5
|
+
query: {
|
|
6
|
+
categorySlug: params?.categorySlug,
|
|
7
|
+
limit: params?.limit,
|
|
8
|
+
page: params?.page,
|
|
9
|
+
q: params?.q,
|
|
10
|
+
tagSlug: params?.tagSlug,
|
|
11
|
+
},
|
|
12
|
+
schema: postsListResponseSchema,
|
|
13
|
+
});
|
|
14
|
+
return response.data;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=listPosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listPosts.js","sourceRoot":"","sources":["../../src/methods/listPosts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAI5D,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,IAAgB,EAChB,MAAwB,EACY,EAAE;IACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE;YACL,YAAY,EAAE,MAAM,EAAE,YAAY;YAClC,KAAK,EAAE,MAAM,EAAE,KAAK;YACpB,IAAI,EAAE,MAAM,EAAE,IAAI;YAClB,CAAC,EAAE,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,MAAM,EAAE,OAAO;SACzB;QACD,MAAM,EAAE,uBAAuB;KAChC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAA;AACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listTags.d.ts","sourceRoot":"","sources":["../../src/methods/listTags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,eAAO,MAAM,QAAQ,GAAU,MAAM,UAAU,KAAG,OAAO,CAAC,MAAM,EAAE,CAOjE,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { tagsResponseSchema } from '../contracts/v1.js';
|
|
2
|
+
export const listTags = async (http) => {
|
|
3
|
+
const response = await http.get({
|
|
4
|
+
path: '/api/public/v1/tags',
|
|
5
|
+
schema: tagsResponseSchema,
|
|
6
|
+
});
|
|
7
|
+
return response.data;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=listTags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listTags.js","sourceRoot":"","sources":["../../src/methods/listTags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAIvD,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAgB,EAAqB,EAAE;IACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,kBAAkB;KAC3B,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAA;AACtB,CAAC,CAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CategoryDTO, FaqDTO, ListPostsParams, Paginated, PageDTO, PostDTO, PostSummaryDTO, SiteSettingsDTO, TagDTO } from './contracts/v1.js';
|
|
2
|
+
export type TenantScope = {
|
|
3
|
+
slug: string;
|
|
4
|
+
} | {
|
|
5
|
+
domain: string;
|
|
6
|
+
};
|
|
7
|
+
export interface UniCmsClientOptions {
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
tenant: TenantScope;
|
|
10
|
+
headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
|
|
11
|
+
fetch?: typeof globalThis.fetch;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface UniCmsClient {
|
|
15
|
+
getSiteSettings(): Promise<SiteSettingsDTO>;
|
|
16
|
+
getPageBySlug(slug: string, opts?: {
|
|
17
|
+
includeRawContent?: boolean;
|
|
18
|
+
}): Promise<PageDTO>;
|
|
19
|
+
listPosts(params?: ListPostsParams): Promise<Paginated<PostSummaryDTO>>;
|
|
20
|
+
getPostBySlug(slug: string, opts?: {
|
|
21
|
+
includeRawContent?: boolean;
|
|
22
|
+
}): Promise<PostDTO>;
|
|
23
|
+
listFaqs(opts?: {
|
|
24
|
+
includeRawContent?: boolean;
|
|
25
|
+
}): Promise<FaqDTO[]>;
|
|
26
|
+
listCategories(): Promise<CategoryDTO[]>;
|
|
27
|
+
listTags(): Promise<TagDTO[]>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,eAAe,EACf,SAAS,EACT,OAAO,EACP,OAAO,EACP,cAAc,EACd,eAAe,EACf,MAAM,EACP,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;IAClE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC,CAAA;IAC3C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrF,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;IACvE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrF,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACnE,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACxC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC9B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mhbdev/unicms",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Typed SDK for UniCMS public API",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"module": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"zod": "^3.25.76"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^24.3.0",
|
|
26
|
+
"tsx": "^4.21.0",
|
|
27
|
+
"typescript": "5.9.3"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"cms",
|
|
34
|
+
"payload",
|
|
35
|
+
"typescript",
|
|
36
|
+
"sdk",
|
|
37
|
+
"headless"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "pnpm -w run sync:public-contracts && node ./scripts/clean-dist.mjs && tsc -p tsconfig.json",
|
|
41
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
42
|
+
"test": "tsx --test src/**/*.test.ts"
|
|
43
|
+
}
|
|
44
|
+
}
|