738 lines
22 KiB
JSON
738 lines
22 KiB
JSON
{
|
|
"_meta": {
|
|
"description": "This file contains a serialized version of schema entities for drift.",
|
|
"version": "1.3.0"
|
|
},
|
|
"options": {
|
|
"store_date_time_values_as_text": false
|
|
},
|
|
"entities": [
|
|
{
|
|
"id": 0,
|
|
"references": [],
|
|
"type": "table",
|
|
"data": {
|
|
"name": "feed",
|
|
"was_declared_in_moor": true,
|
|
"columns": [
|
|
{
|
|
"name": "url",
|
|
"getter_name": "url",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": "PRIMARY KEY NOT NULL",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [
|
|
"primary-key"
|
|
],
|
|
"type_converter": {
|
|
"dart_expr": "const UriConverter()",
|
|
"dart_type_name": "Uri"
|
|
}
|
|
},
|
|
{
|
|
"name": "title",
|
|
"getter_name": "title",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "description",
|
|
"getter_name": "description",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "icon",
|
|
"getter_name": "icon",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const UriConverterNullable()",
|
|
"dart_type_name": "Uri?"
|
|
}
|
|
},
|
|
{
|
|
"name": "site_link",
|
|
"getter_name": "siteLink",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const UriConverterNullable()",
|
|
"dart_type_name": "Uri?"
|
|
}
|
|
},
|
|
{
|
|
"name": "authors",
|
|
"getter_name": "authors",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedAuthorsConverter()",
|
|
"dart_type_name": "List<FeedAuthor>"
|
|
}
|
|
},
|
|
{
|
|
"name": "tags",
|
|
"getter_name": "tags",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedCategoriesConverter()",
|
|
"dart_type_name": "List<FeedCategory>"
|
|
}
|
|
},
|
|
{
|
|
"name": "last_fetched",
|
|
"getter_name": "lastFetched",
|
|
"moor_type": "dateTime",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
}
|
|
],
|
|
"is_virtual": false,
|
|
"without_rowid": false,
|
|
"constraints": []
|
|
}
|
|
},
|
|
{
|
|
"id": 1,
|
|
"references": [
|
|
0
|
|
],
|
|
"type": "table",
|
|
"data": {
|
|
"name": "article",
|
|
"was_declared_in_moor": true,
|
|
"columns": [
|
|
{
|
|
"name": "id",
|
|
"getter_name": "id",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": "PRIMARY KEY NOT NULL",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [
|
|
"primary-key"
|
|
]
|
|
},
|
|
{
|
|
"name": "feed_id",
|
|
"getter_name": "feedId",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": "NOT NULL REFERENCES feed(url)ON DELETE CASCADE",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [
|
|
{
|
|
"foreign_key": {
|
|
"to": {
|
|
"table": "feed",
|
|
"column": "url"
|
|
},
|
|
"initially_deferred": false,
|
|
"on_update": null,
|
|
"on_delete": "cascade"
|
|
}
|
|
}
|
|
],
|
|
"type_converter": {
|
|
"dart_expr": "const UriConverter()",
|
|
"dart_type_name": "Uri"
|
|
}
|
|
},
|
|
{
|
|
"name": "fetched",
|
|
"getter_name": "fetched",
|
|
"moor_type": "dateTime",
|
|
"nullable": false,
|
|
"customConstraints": "NOT NULL",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "created",
|
|
"getter_name": "created",
|
|
"moor_type": "dateTime",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "updated",
|
|
"getter_name": "updated",
|
|
"moor_type": "dateTime",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "last_read",
|
|
"getter_name": "lastRead",
|
|
"moor_type": "dateTime",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "title",
|
|
"getter_name": "title",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "authors",
|
|
"getter_name": "authors",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedAuthorsConverter()",
|
|
"dart_type_name": "List<FeedAuthor>"
|
|
}
|
|
},
|
|
{
|
|
"name": "tags",
|
|
"getter_name": "tags",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedCategoriesConverter()",
|
|
"dart_type_name": "List<FeedCategory>"
|
|
}
|
|
},
|
|
{
|
|
"name": "links",
|
|
"getter_name": "links",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedLinksConverter()",
|
|
"dart_type_name": "List<FeedLink>"
|
|
}
|
|
},
|
|
{
|
|
"name": "summaryHtml",
|
|
"getter_name": "summaryHtml",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "summaryMarkdown",
|
|
"getter_name": "summaryMarkdown",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "summaryPlain",
|
|
"getter_name": "summaryPlain",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "contentHtml",
|
|
"getter_name": "contentHtml",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "contentMarkdown",
|
|
"getter_name": "contentMarkdown",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "contentPlain",
|
|
"getter_name": "contentPlain",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
}
|
|
],
|
|
"is_virtual": false,
|
|
"without_rowid": false,
|
|
"constraints": []
|
|
}
|
|
},
|
|
{
|
|
"id": 2,
|
|
"references": [
|
|
1,
|
|
0
|
|
],
|
|
"type": "view",
|
|
"data": {
|
|
"name": "article_view",
|
|
"sql": "CREATE VIEW article_view AS SELECT a.*, f.icon, f.site_link FROM article AS a INNER JOIN feed AS f ON f.url = a.feed_id",
|
|
"dart_info_name": "ArticleView",
|
|
"columns": [
|
|
{
|
|
"name": "id",
|
|
"getter_name": "id",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "feed_id",
|
|
"getter_name": "feedId",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const UriConverter()",
|
|
"dart_type_name": "Uri"
|
|
}
|
|
},
|
|
{
|
|
"name": "fetched",
|
|
"getter_name": "fetched",
|
|
"moor_type": "dateTime",
|
|
"nullable": false,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "created",
|
|
"getter_name": "created",
|
|
"moor_type": "dateTime",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "updated",
|
|
"getter_name": "updated",
|
|
"moor_type": "dateTime",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "last_read",
|
|
"getter_name": "lastRead",
|
|
"moor_type": "dateTime",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "title",
|
|
"getter_name": "title",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "authors",
|
|
"getter_name": "authors",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedAuthorsConverter()",
|
|
"dart_type_name": "List<FeedAuthor>"
|
|
}
|
|
},
|
|
{
|
|
"name": "tags",
|
|
"getter_name": "tags",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedCategoriesConverter()",
|
|
"dart_type_name": "List<FeedCategory>"
|
|
}
|
|
},
|
|
{
|
|
"name": "links",
|
|
"getter_name": "links",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const FeedLinksConverter()",
|
|
"dart_type_name": "List<FeedLink>"
|
|
}
|
|
},
|
|
{
|
|
"name": "summaryHtml",
|
|
"getter_name": "summaryHtml",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "summaryMarkdown",
|
|
"getter_name": "summaryMarkdown",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "summaryPlain",
|
|
"getter_name": "summaryPlain",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "contentHtml",
|
|
"getter_name": "contentHtml",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "contentMarkdown",
|
|
"getter_name": "contentMarkdown",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "contentPlain",
|
|
"getter_name": "contentPlain",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "icon",
|
|
"getter_name": "icon",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const UriConverterNullable()",
|
|
"dart_type_name": "Uri?"
|
|
}
|
|
},
|
|
{
|
|
"name": "site_link",
|
|
"getter_name": "siteLink",
|
|
"moor_type": "string",
|
|
"nullable": true,
|
|
"customConstraints": null,
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": [],
|
|
"type_converter": {
|
|
"dart_expr": "const UriConverterNullable()",
|
|
"dart_type_name": "Uri?"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"id": 3,
|
|
"references": [
|
|
1
|
|
],
|
|
"type": "index",
|
|
"data": {
|
|
"on": 1,
|
|
"name": "article_feed_id",
|
|
"sql": "CREATE INDEX article_feed_id ON article (feed_id);",
|
|
"unique": false,
|
|
"columns": []
|
|
}
|
|
},
|
|
{
|
|
"id": 4,
|
|
"references": [
|
|
1
|
|
],
|
|
"type": "table",
|
|
"data": {
|
|
"name": "article_fts",
|
|
"was_declared_in_moor": true,
|
|
"columns": [
|
|
{
|
|
"name": "title",
|
|
"getter_name": "title",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "summaryPlain",
|
|
"getter_name": "summaryPlain",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
},
|
|
{
|
|
"name": "contentPlain",
|
|
"getter_name": "contentPlain",
|
|
"moor_type": "string",
|
|
"nullable": false,
|
|
"customConstraints": "",
|
|
"default_dart": null,
|
|
"default_client_dart": null,
|
|
"dsl_features": []
|
|
}
|
|
],
|
|
"is_virtual": true,
|
|
"create_virtual_stmt": "CREATE VIRTUAL TABLE \"article_fts\" USING fts5(title, summaryPlain, contentPlain, content=article, tokenize=\"trigram\")",
|
|
"without_rowid": false,
|
|
"constraints": []
|
|
}
|
|
},
|
|
{
|
|
"id": 5,
|
|
"references": [
|
|
1,
|
|
4
|
|
],
|
|
"type": "trigger",
|
|
"data": {
|
|
"on": 1,
|
|
"references_in_body": [
|
|
1,
|
|
4
|
|
],
|
|
"name": "article_after_insert",
|
|
"sql": "CREATE TRIGGER article_after_insert AFTER INSERT ON article BEGIN\n INSERT INTO \n article_fts(rowid, title, summaryPlain, contentPlain) \n VALUES (new.rowid, new.title, new.summaryPlain, new.contentPlain);\nEND;"
|
|
}
|
|
},
|
|
{
|
|
"id": 6,
|
|
"references": [
|
|
1,
|
|
4
|
|
],
|
|
"type": "trigger",
|
|
"data": {
|
|
"on": 1,
|
|
"references_in_body": [
|
|
1,
|
|
4
|
|
],
|
|
"name": "article_after_delete",
|
|
"sql": "CREATE TRIGGER article_after_delete AFTER DELETE ON article BEGIN\n INSERT INTO \n article_fts(article_fts, rowid, title, summaryPlain, contentPlain) \n VALUES('delete', old.rowid, old.title, old.summaryPlain, old.contentPlain);\nEND;"
|
|
}
|
|
},
|
|
{
|
|
"id": 7,
|
|
"references": [
|
|
1,
|
|
4
|
|
],
|
|
"type": "trigger",
|
|
"data": {
|
|
"on": 1,
|
|
"references_in_body": [
|
|
1,
|
|
4
|
|
],
|
|
"name": "article_after_update",
|
|
"sql": "CREATE TRIGGER article_after_update AFTER UPDATE ON article BEGIN\n INSERT INTO \n article_fts(article_fts, rowid, title, summaryPlain, contentPlain) \n VALUES('delete', old.rowid, old.title, old.summaryPlain, old.contentPlain);\n INSERT INTO \n article_fts(rowid, title, summaryPlain, contentPlain) \n VALUES (new.rowid, new.title, new.summaryPlain, new.contentPlain);\nEND;"
|
|
}
|
|
}
|
|
],
|
|
"fixed_sql": [
|
|
{
|
|
"name": "feed",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE TABLE IF NOT EXISTS \"feed\" (\"url\" TEXT PRIMARY KEY NOT NULL, \"title\" TEXT, \"description\" TEXT, \"icon\" TEXT, \"site_link\" TEXT, \"authors\" TEXT, \"tags\" TEXT, \"last_fetched\" INTEGER);"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "article",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE TABLE IF NOT EXISTS \"article\" (\"id\" TEXT PRIMARY KEY NOT NULL, \"feed_id\" TEXT NOT NULL REFERENCES feed(url)ON DELETE CASCADE, \"fetched\" INTEGER NOT NULL, \"created\" INTEGER, \"updated\" INTEGER, \"last_read\" INTEGER, \"title\" TEXT, \"authors\" TEXT, \"tags\" TEXT, \"links\" TEXT, \"summaryHtml\" TEXT, \"summaryMarkdown\" TEXT, \"summaryPlain\" TEXT, \"contentHtml\" TEXT, \"contentMarkdown\" TEXT, \"contentPlain\" TEXT);"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "article_view",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE VIEW article_view AS SELECT a.*, f.icon, f.site_link FROM article AS a INNER JOIN feed AS f ON f.url = a.feed_id"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "article_feed_id",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE INDEX article_feed_id ON article (feed_id)"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "article_fts",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE VIRTUAL TABLE IF NOT EXISTS \"article_fts\" USING fts5(title, summaryPlain, contentPlain, content=article, tokenize=\"trigram\");"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "article_after_insert",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE TRIGGER article_after_insert AFTER INSERT ON article BEGIN INSERT INTO article_fts (\"rowid\", title, summaryPlain, contentPlain) VALUES (new.\"rowid\", new.title, new.summaryPlain, new.contentPlain);END"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "article_after_delete",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE TRIGGER article_after_delete AFTER DELETE ON article BEGIN INSERT INTO article_fts (article_fts, \"rowid\", title, summaryPlain, contentPlain) VALUES ('delete', old.\"rowid\", old.title, old.summaryPlain, old.contentPlain);END"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "article_after_update",
|
|
"sql": [
|
|
{
|
|
"dialect": "sqlite",
|
|
"sql": "CREATE TRIGGER article_after_update AFTER UPDATE ON article BEGIN INSERT INTO article_fts (article_fts, \"rowid\", title, summaryPlain, contentPlain) VALUES ('delete', old.\"rowid\", old.title, old.summaryPlain, old.contentPlain);INSERT INTO article_fts (\"rowid\", title, summaryPlain, contentPlain) VALUES (new.\"rowid\", new.title, new.summaryPlain, new.contentPlain);END"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
} |