From e9022df6c3f41423da708371a4211c45c1eeb221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= <34892635+fa0311@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:13:53 +0900 Subject: [PATCH 01/11] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4735cf0..6e49199 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ Twitter OpenAPI(Swagger) specification +- [Python](https://github.com/fa0311/twitter_openapi_python) - [Dart](https://github.com/fa0311/twitter_openapi_dart) - [TypeScript](https://github.com/fa0311/twitter-openapi-typescript) - [React Documents](https://github.com/fa0311/twitter-openapi-docs) From f54325771ac70efeb90722f53186146d74e4273d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Sun, 6 Aug 2023 19:44:19 +0900 Subject: [PATCH 02/11] add UserUnavailable #28 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- src/openapi/schemas/typename.yaml | 1 + src/openapi/schemas/user.yaml | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/openapi/schemas/typename.yaml b/src/openapi/schemas/typename.yaml index ff3f29e..7be38b1 100644 --- a/src/openapi/schemas/typename.yaml +++ b/src/openapi/schemas/typename.yaml @@ -20,4 +20,5 @@ components: TimelineMessagePrompt, Tweet, User, + UserUnavailable, ] diff --git a/src/openapi/schemas/user.yaml b/src/openapi/schemas/user.yaml index 1349108..2171f07 100644 --- a/src/openapi/schemas/user.yaml +++ b/src/openapi/schemas/user.yaml @@ -17,7 +17,17 @@ components: - "result" properties: result: - $ref: "#/components/schemas/User" + $ref: "#/components/schemas/UserUnion" + + UserUnion: + oneOf: + - $ref: "#/components/schemas/User" + - $ref: "#/components/schemas/UserUnavailable" + discriminator: + propertyName: __typename + mapping": # deprecated + User: "#/components/schemas/User" + UserUnavailable: "#/components/schemas/UserUnavailable" User: required: @@ -211,3 +221,13 @@ components: want_retweets: type: boolean default: false + + UserUnavailable: + required: + - "__typename" + - "reason" + properties: + __typename: + $ref: "./typename.yaml#/components/schemas/TypeName" # UserUnavailable + reason: + type: string From 1560a47a48e7f7b87f8a8eed7582d90a9b72a5ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Sun, 6 Aug 2023 19:44:44 +0900 Subject: [PATCH 03/11] remove other MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- src/openapi/paths/other.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/openapi/paths/other.yaml b/src/openapi/paths/other.yaml index 280b3a8..643005e 100644 --- a/src/openapi/paths/other.yaml +++ b/src/openapi/paths/other.yaml @@ -16,7 +16,6 @@ paths: schema: oneOf: - $ref: "#/components/schemas/OtherResponse" - - $ref: "./../schemas/error.yaml#/components/schemas/Errors" tags: - "other" From 47aeff70c456bda9227f42696db878d1eb57ec86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Sun, 6 Aug 2023 19:44:48 +0900 Subject: [PATCH 04/11] build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- dist/compatible/schemas/typename.yaml | 1 + dist/compatible/schemas/user.yaml | 20 +++++++++++++++++++- dist/docs/schemas/typename.yaml | 1 + dist/docs/schemas/user.yaml | 20 +++++++++++++++++++- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/dist/compatible/schemas/typename.yaml b/dist/compatible/schemas/typename.yaml index 197eaaa..663cb75 100644 --- a/dist/compatible/schemas/typename.yaml +++ b/dist/compatible/schemas/typename.yaml @@ -13,6 +13,7 @@ components: - TimelineMessagePrompt - Tweet - User + - UserUnavailable type: string info: title: Twitter OpenAPI diff --git a/dist/compatible/schemas/user.yaml b/dist/compatible/schemas/user.yaml index b60ab45..3584f3f 100644 --- a/dist/compatible/schemas/user.yaml +++ b/dist/compatible/schemas/user.yaml @@ -199,9 +199,27 @@ components: UserResults: properties: result: - $ref: '#/components/schemas/User' + $ref: '#/components/schemas/UserUnion' required: - result + UserUnavailable: + properties: + __typename: + $ref: ./typename.yaml#/components/schemas/TypeName + reason: + type: string + required: + - __typename + - reason + UserUnion: + discriminator: + mapping": + User: '#/components/schemas/User' + UserUnavailable: '#/components/schemas/UserUnavailable' + propertyName: __typename + oneOf: + - $ref: '#/components/schemas/User' + - $ref: '#/components/schemas/UserUnavailable' info: title: Twitter OpenAPI version: 0.0.1 diff --git a/dist/docs/schemas/typename.yaml b/dist/docs/schemas/typename.yaml index 197eaaa..663cb75 100644 --- a/dist/docs/schemas/typename.yaml +++ b/dist/docs/schemas/typename.yaml @@ -13,6 +13,7 @@ components: - TimelineMessagePrompt - Tweet - User + - UserUnavailable type: string info: title: Twitter OpenAPI diff --git a/dist/docs/schemas/user.yaml b/dist/docs/schemas/user.yaml index b60ab45..3584f3f 100644 --- a/dist/docs/schemas/user.yaml +++ b/dist/docs/schemas/user.yaml @@ -199,9 +199,27 @@ components: UserResults: properties: result: - $ref: '#/components/schemas/User' + $ref: '#/components/schemas/UserUnion' required: - result + UserUnavailable: + properties: + __typename: + $ref: ./typename.yaml#/components/schemas/TypeName + reason: + type: string + required: + - __typename + - reason + UserUnion: + discriminator: + mapping": + User: '#/components/schemas/User' + UserUnavailable: '#/components/schemas/UserUnavailable' + propertyName: __typename + oneOf: + - $ref: '#/components/schemas/User' + - $ref: '#/components/schemas/UserUnavailable' info: title: Twitter OpenAPI version: 0.0.1 From 0431f498c52a8f4f8b2903a57a65f8f8d3130c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Sun, 6 Aug 2023 20:16:54 +0900 Subject: [PATCH 05/11] build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- dist/compatible/paths/other.yaml | 1 - dist/docs/paths/other.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/dist/compatible/paths/other.yaml b/dist/compatible/paths/other.yaml index 0d28120..33e5aa9 100644 --- a/dist/compatible/paths/other.yaml +++ b/dist/compatible/paths/other.yaml @@ -92,7 +92,6 @@ paths: schema: oneOf: - $ref: '#/components/schemas/OtherResponse' - - $ref: ./../schemas/error.yaml#/components/schemas/Errors description: Successful operation tags: - other diff --git a/dist/docs/paths/other.yaml b/dist/docs/paths/other.yaml index 0d28120..33e5aa9 100644 --- a/dist/docs/paths/other.yaml +++ b/dist/docs/paths/other.yaml @@ -92,7 +92,6 @@ paths: schema: oneOf: - $ref: '#/components/schemas/OtherResponse' - - $ref: ./../schemas/error.yaml#/components/schemas/Errors description: Successful operation tags: - other From 354121c996165ed5c969bbb7c7915381e486eb89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Sun, 6 Aug 2023 20:24:07 +0900 Subject: [PATCH 06/11] fix action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- .github/workflows/test-python.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test-python.yaml b/.github/workflows/test-python.yaml index 442e7eb..c028a06 100644 --- a/.github/workflows/test-python.yaml +++ b/.github/workflows/test-python.yaml @@ -3,6 +3,7 @@ name: test-python on: pull_request_target: types: [labeled] + workflow_dispatch: jobs: build_and_preview: @@ -12,6 +13,8 @@ jobs: steps: - uses: actions/checkout@v3 + with: + path: refs/remotes/pull/${{ github.event.pull_request.number }}/merge # Openapi Generator Setup - name: Get OpenJDK 11 From 9fc0ce87f8e814bfcb0a33ca2beb202e283dcd04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Sun, 6 Aug 2023 20:34:00 +0900 Subject: [PATCH 07/11] fix action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- .github/workflows/test-python.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-python.yaml b/.github/workflows/test-python.yaml index c028a06..3c22d6a 100644 --- a/.github/workflows/test-python.yaml +++ b/.github/workflows/test-python.yaml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - path: refs/remotes/pull/${{ github.event.pull_request.number }}/merge + ref: "${{ github.event.pull_request.merge_commit_sha }}" # Openapi Generator Setup - name: Get OpenJDK 11 From 59e1e2b8e2e4fd932f23887d91224aff79427b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Mon, 7 Aug 2023 00:41:20 +0900 Subject: [PATCH 08/11] update tags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- dist/compatible/openapi-3.0.yaml | 8 +++++--- dist/compatible/paths/user.yaml | 2 +- dist/docs/openapi-3.0.yaml | 8 +++++--- dist/docs/paths/user.yaml | 2 +- src/openapi/openapi-3.0.yaml | 8 +++++--- src/openapi/paths/user.yaml | 2 +- test/python/test_serialize.py | 3 +-- tools/build_config.py | 2 +- 8 files changed, 20 insertions(+), 15 deletions(-) diff --git a/dist/compatible/openapi-3.0.yaml b/dist/compatible/openapi-3.0.yaml index 2d9be8e..f634fb7 100644 --- a/dist/compatible/openapi-3.0.yaml +++ b/dist/compatible/openapi-3.0.yaml @@ -135,11 +135,13 @@ security: servers: - url: https://twitter.com/i/api tags: -- description: response User +- description: Responses containing User objects. name: user -- description: response User list +- description: Responses containing List[User] objects. + name: users +- description: Responses containing instruction objects. name: user-list -- description: response tweet +- description: Responses containing instruction objects. name: tweet - description: post name: post diff --git a/dist/compatible/paths/user.yaml b/dist/compatible/paths/user.yaml index 7226106..e7720ea 100644 --- a/dist/compatible/paths/user.yaml +++ b/dist/compatible/paths/user.yaml @@ -230,4 +230,4 @@ paths: schema: type: string tags: - - user + - users diff --git a/dist/docs/openapi-3.0.yaml b/dist/docs/openapi-3.0.yaml index 2d9be8e..f634fb7 100644 --- a/dist/docs/openapi-3.0.yaml +++ b/dist/docs/openapi-3.0.yaml @@ -135,11 +135,13 @@ security: servers: - url: https://twitter.com/i/api tags: -- description: response User +- description: Responses containing User objects. name: user -- description: response User list +- description: Responses containing List[User] objects. + name: users +- description: Responses containing instruction objects. name: user-list -- description: response tweet +- description: Responses containing instruction objects. name: tweet - description: post name: post diff --git a/dist/docs/paths/user.yaml b/dist/docs/paths/user.yaml index cb999a3..46d3227 100644 --- a/dist/docs/paths/user.yaml +++ b/dist/docs/paths/user.yaml @@ -335,4 +335,4 @@ paths: schema: type: string tags: - - user + - users diff --git a/src/openapi/openapi-3.0.yaml b/src/openapi/openapi-3.0.yaml index 4f58931..5104625 100644 --- a/src/openapi/openapi-3.0.yaml +++ b/src/openapi/openapi-3.0.yaml @@ -56,11 +56,13 @@ security: - AuthType: [] tags: - name: user - description: response User + description: Responses containing User objects. + - name: users + description: Responses containing List[User] objects. - name: user-list - description: response User list + description: Responses containing instruction objects. - name: tweet - description: response tweet + description: Responses containing instruction objects. - name: post description: post - name: v1.1-get diff --git a/src/openapi/paths/user.yaml b/src/openapi/paths/user.yaml index d12620d..a8c8755 100644 --- a/src/openapi/paths/user.yaml +++ b/src/openapi/paths/user.yaml @@ -50,7 +50,7 @@ paths: - $ref: "#/components/schemas/UsersResponse" - $ref: "./../schemas/error.yaml#/components/schemas/Errors" tags: - - "user" + - "users" components: schemas: diff --git a/test/python/test_serialize.py b/test/python/test_serialize.py index a746ace..763828c 100644 --- a/test/python/test_serialize.py +++ b/test/python/test_serialize.py @@ -3,7 +3,6 @@ import os import logging import base64 import openapi_client as pt -from pydantic import BaseModel from pathlib import Path import time @@ -91,7 +90,7 @@ api_client.user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/5 error_count = 0 -for x in [pt.DefaultApi, pt.TweetApi, pt.UserApi, pt.UserListApi]: +for x in [pt.DefaultApi, pt.TweetApi, pt.UserApi, pt.UsersApi, pt.UserListApi]: for props, fn in x.__dict__.items(): if not callable(fn): continue diff --git a/tools/build_config.py b/tools/build_config.py index 5f771ad..7f053ac 100644 --- a/tools/build_config.py +++ b/tools/build_config.py @@ -39,7 +39,7 @@ class Config: AddPathQueryIdOnParameters(split=-1), getParamHook, ] - for key in ["default", "user", "user-list", "tweet"] + for key in ["default", "user", "users", "user-list", "tweet"] } | { key: [ From fc5f4c5ae708cf12706a5cae462c412a60881862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Mon, 7 Aug 2023 05:16:39 +0900 Subject: [PATCH 09/11] update hook and test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- test/python/test_serialize.py | 39 ++++++++++++++++++++++++++++------- tools/hooks.py | 14 +++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/test/python/test_serialize.py b/test/python/test_serialize.py index 763828c..5e9668d 100644 --- a/test/python/test_serialize.py +++ b/test/python/test_serialize.py @@ -74,6 +74,17 @@ def get_kwargs(key, additional): return kwargs +def error_dump(e): + if ERROR_UNCATCHED: + raise + import traceback + + logger.error("==========[STACK TRACE]==========") + for trace in traceback.format_exc().split("\n"): + logger.error(trace) + logger.info("================================") + + api_conf = pt.Configuration( api_key={ "ClientLanguage": "en", @@ -123,15 +134,27 @@ for x in [pt.DefaultApi, pt.TweetApi, pt.UserApi, pt.UsersApi, pt.UserListApi]: time.sleep(SLEEP_TIME) except Exception as e: - if ERROR_UNCATCHED: - raise - import traceback - - logger.error("==========[STACK TRACE]==========") - for trace in traceback.format_exc().split("\n"): - logger.error(trace) - logger.info("================================") + error_dump(e) error_count += 1 + +try: + logger.info(f"Try: Self UserByScreenName Test") + kwargs = get_kwargs("UserByScreenName", {"screen_name": "a810810931931"}) + res = pt.UserApi(api_client).get_user_by_screen_name(**kwargs).to_dict() + if not res["data"]["user"]["result"]["legacy"]["screen_name"] == "a810810931931": + raise Exception("UserByScreenName failed") +except Exception as e: + error_dump(e) + error_count += 1 + +try: + logger.info(f"Try: Self UserTweets Test") + kwargs = get_kwargs("UserTweets", {"userId": "1180389371481976833"}) + pt.TweetApi(api_client).get_user_tweets(**kwargs) +except Exception as e: + error_dump(e) + error_count += 1 + if error_count > 0: exit(1) diff --git a/tools/hooks.py b/tools/hooks.py index 2e35c27..4546554 100644 --- a/tools/hooks.py +++ b/tools/hooks.py @@ -118,6 +118,20 @@ class SchemasCheck(SchemasHookBase): return value +class RequiredCheck(SchemasHookBase): + def hook(self, value: dict): + required = value.get("required", []) + + for key, property in value.get("properties", {}).items(): + if key in required and property.get("default") is not None: + print(f"{key} is required and has default value") + d = property.get("default") is None and property.get("nullable", False) + if property not in required and d: + print(f"{key} is not required and has no default value") + + return value + + # RequestHookBase extends From 58cc6a409bb857f83fdb8d7f477a3bb4a59cf453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Mon, 7 Aug 2023 05:17:07 +0900 Subject: [PATCH 10/11] remove required UserLegacy some properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- dist/compatible/schemas/user.yaml | 5 ----- dist/docs/schemas/user.yaml | 5 ----- src/openapi/schemas/user.yaml | 10 +++++----- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/dist/compatible/schemas/user.yaml b/dist/compatible/schemas/user.yaml index 3584f3f..61409b7 100644 --- a/dist/compatible/schemas/user.yaml +++ b/dist/compatible/schemas/user.yaml @@ -165,10 +165,7 @@ components: - entities - fast_followers_count - favourites_count - - follow_request_sent - - followed_by - followers_count - - following - friends_count - has_custom_timelines - is_translator @@ -178,12 +175,10 @@ components: - muting - name - normal_followers_count - - notifications - pinned_tweet_ids_str - possibly_sensitive - profile_image_url_https - profile_interstitial_type - - protected - screen_name - status - statuses_count diff --git a/dist/docs/schemas/user.yaml b/dist/docs/schemas/user.yaml index 3584f3f..61409b7 100644 --- a/dist/docs/schemas/user.yaml +++ b/dist/docs/schemas/user.yaml @@ -165,10 +165,7 @@ components: - entities - fast_followers_count - favourites_count - - follow_request_sent - - followed_by - followers_count - - following - friends_count - has_custom_timelines - is_translator @@ -178,12 +175,10 @@ components: - muting - name - normal_followers_count - - notifications - pinned_tweet_ids_str - possibly_sensitive - profile_image_url_https - profile_interstitial_type - - protected - screen_name - status - statuses_count diff --git a/src/openapi/schemas/user.yaml b/src/openapi/schemas/user.yaml index 2171f07..9a94fab 100644 --- a/src/openapi/schemas/user.yaml +++ b/src/openapi/schemas/user.yaml @@ -89,10 +89,10 @@ components: - "entities" - "fast_followers_count" - "favourites_count" - - "follow_request_sent" - - "followed_by" + # 31 # - "follow_request_sent" + # 31 # - "followed_by" - "followers_count" - - "following" + # 31 # - "following" - "friends_count" - "has_custom_timelines" - "is_translator" @@ -102,12 +102,12 @@ components: - "muting" - "name" - "normal_followers_count" - - "notifications" + # 31 # - "notifications" - "pinned_tweet_ids_str" - "possibly_sensitive" - "profile_image_url_https" - "profile_interstitial_type" - - "protected" + # 31 # - "protected" - "screen_name" - "status" - "statuses_count" From 936eb7f9404c61a761752fa3f7c59d32d6b7efe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Wed, 9 Aug 2023 17:00:47 +0900 Subject: [PATCH 11/11] update build version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ふぁ --- .github/workflows/test-build.yaml | 2 +- .github/workflows/test-python.yaml | 2 +- .vscode/tasks.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-build.yaml b/.github/workflows/test-build.yaml index d74973e..2eb23f5 100644 --- a/.github/workflows/test-build.yaml +++ b/.github/workflows/test-build.yaml @@ -39,7 +39,7 @@ jobs: - name: Get Openapi Generator run: | - wget https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.2.0/openapi-generator-cli.jar -O openapi-generator-cli.jar --no-verbose + wget https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.3.0/openapi-generator-cli.jar -O openapi-generator-cli.jar --no-verbose if: steps.openapi-generator-cache.outputs.cache-hit != 'true' # Python Setup diff --git a/.github/workflows/test-python.yaml b/.github/workflows/test-python.yaml index 3c22d6a..815a532 100644 --- a/.github/workflows/test-python.yaml +++ b/.github/workflows/test-python.yaml @@ -40,7 +40,7 @@ jobs: - name: Get Openapi Generator run: | - wget https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.2.0/openapi-generator-cli.jar -O openapi-generator-cli.jar --no-verbose + wget https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.3.0/openapi-generator-cli.jar -O openapi-generator-cli.jar --no-verbose if: steps.openapi-generator-cache.outputs.cache-hit != 'true' # Python Setup diff --git a/.vscode/tasks.json b/.vscode/tasks.json index e7dff9e..e5d109e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -30,14 +30,14 @@ "command": [ "python3 -m venv .venv;", ".venv/bin/python3 -m pip install -r requirements.txt;", - "wget https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.2.0/openapi-generator-cli.jar -O openapi-generator-cli.jar;" + "wget https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.3.0/openapi-generator-cli.jar -O openapi-generator-cli.jar;" ] }, "windows": { "command": [ "python -m venv .venv;", ".venv/Scripts/python -m pip install -r requirements.txt;", - "Invoke-WebRequest https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.2.0/openapi-generator-cli.jar -OutFile openapi-generator-cli.jar;" + "Invoke-WebRequest https://github.com/fa0311/openapi-generator/releases/download/twitter_openapi_python_1.3.0/openapi-generator-cli.jar -OutFile openapi-generator-cli.jar;" ] } }