diff --git a/.efrocachemap b/.efrocachemap index 36dffc11..e4f72678 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -2589,12 +2589,12 @@ "assets/build/pylib-android/abc.py": "https://files.ballistica.net/cache/ba1/dd/5d/479e9cf06248ed39cf30d7849609", "assets/build/pylib-android/aifc.py": "https://files.ballistica.net/cache/ba1/e4/58/a75af0c597af1ed6a69b0d0408f3", "assets/build/pylib-android/antigravity.py": "https://files.ballistica.net/cache/ba1/bc/5c/f8951b7abdac55a1a32d74b2fe50", - "assets/build/pylib-android/argparse.py": "https://files.ballistica.net/cache/ba1/5c/48/1c36b200d5658524678417da965e", + "assets/build/pylib-android/argparse.py": "https://files.ballistica.net/cache/ba1/a1/a6/6f3a5154526eaa600b76a533b126", "assets/build/pylib-android/ast.py": "https://files.ballistica.net/cache/ba1/e4/5b/b25a82736f1a9f4e1f1f8b451a3a", "assets/build/pylib-android/asynchat.py": "https://files.ballistica.net/cache/ba1/6a/73/7ba88b8e06566c40987426d73894", "assets/build/pylib-android/asyncio/__init__.py": "https://files.ballistica.net/cache/ba1/03/13/e0b34767cf91bd9a931a7b5fa7a9", "assets/build/pylib-android/asyncio/__main__.py": "https://files.ballistica.net/cache/ba1/00/05/038811ebbd5ac847aaf99cd8f2f9", - "assets/build/pylib-android/asyncio/base_events.py": "https://files.ballistica.net/cache/ba1/b8/aa/c817666fba2e8d017790b7c86f83", + "assets/build/pylib-android/asyncio/base_events.py": "https://files.ballistica.net/cache/ba1/55/96/175d7ac6b04ae9b66a5e00ec6139", "assets/build/pylib-android/asyncio/base_futures.py": "https://files.ballistica.net/cache/ba1/89/ee/3f980b3d7b480c7fe3d34ff876f5", "assets/build/pylib-android/asyncio/base_subprocess.py": "https://files.ballistica.net/cache/ba1/72/c7/ccf47dbfa076fdf5dd38474a18dc", "assets/build/pylib-android/asyncio/base_tasks.py": "https://files.ballistica.net/cache/ba1/f0/b8/3f75f12f1851216b9a16772dfa63", @@ -2611,7 +2611,7 @@ "assets/build/pylib-android/asyncio/protocols.py": "https://files.ballistica.net/cache/ba1/17/b6/4a3fe4965cd04ad1092399ce7316", "assets/build/pylib-android/asyncio/queues.py": "https://files.ballistica.net/cache/ba1/43/4d/26f1ed380b3bda3e2df2e37ca877", "assets/build/pylib-android/asyncio/runners.py": "https://files.ballistica.net/cache/ba1/7f/48/6292d754af0b0344f39a9adc31c5", - "assets/build/pylib-android/asyncio/selector_events.py": "https://files.ballistica.net/cache/ba1/cc/25/b045179279dcf12d6e49c8a0a57d", + "assets/build/pylib-android/asyncio/selector_events.py": "https://files.ballistica.net/cache/ba1/9e/0b/f3f5ae0768044d1335791ad7e194", "assets/build/pylib-android/asyncio/sslproto.py": "https://files.ballistica.net/cache/ba1/c5/2b/1050d935d2f32dcac57b7ac22ef7", "assets/build/pylib-android/asyncio/staggered.py": "https://files.ballistica.net/cache/ba1/f5/44/45851798434a9265934b4bb83368", "assets/build/pylib-android/asyncio/streams.py": "https://files.ballistica.net/cache/ba1/2d/04/1224d72abd97b32e32663254accd", @@ -2644,8 +2644,8 @@ "assets/build/pylib-android/compileall.py": "https://files.ballistica.net/cache/ba1/18/01/0974dc4f20e7417e91459b15952f", "assets/build/pylib-android/concurrent/__init__.py": "https://files.ballistica.net/cache/ba1/37/3e/87f9ab4111608e0442bc82ff572f", "assets/build/pylib-android/concurrent/futures/__init__.py": "https://files.ballistica.net/cache/ba1/0a/eb/2954f0e71c4a1e71db5c13548aec", - "assets/build/pylib-android/concurrent/futures/_base.py": "https://files.ballistica.net/cache/ba1/57/ac/0ba723368916915f826882c29b93", - "assets/build/pylib-android/concurrent/futures/process.py": "https://files.ballistica.net/cache/ba1/83/32/82f0df449e026612d64737bd3e9b", + "assets/build/pylib-android/concurrent/futures/_base.py": "https://files.ballistica.net/cache/ba1/77/02/cd3c13ded2262bb023361a801345", + "assets/build/pylib-android/concurrent/futures/process.py": "https://files.ballistica.net/cache/ba1/fe/ed/9bd137c04de2fa8045a307c50626", "assets/build/pylib-android/concurrent/futures/thread.py": "https://files.ballistica.net/cache/ba1/54/c0/f14c081285722cd0bfdf7a6a3990", "assets/build/pylib-android/configparser.py": "https://files.ballistica.net/cache/ba1/db/70/a2ddcd9e05e9fb0d6d10afc21510", "assets/build/pylib-android/contextlib.py": "https://files.ballistica.net/cache/ba1/4a/ed/5ea5c6e0272355d280fbe712dfb8", @@ -2669,18 +2669,18 @@ "assets/build/pylib-android/curses/panel.py": "https://files.ballistica.net/cache/ba1/42/0f/580d5d6de90a64ade37f0a8e4696", "assets/build/pylib-android/curses/textpad.py": "https://files.ballistica.net/cache/ba1/a9/3f/ac729e39c1c9fcecd8e3525c7079", "assets/build/pylib-android/dataclasses.py": "https://files.ballistica.net/cache/ba1/76/e6/8a82672bae89691b0a0dabd15cc7", - "assets/build/pylib-android/datetime.py": "https://files.ballistica.net/cache/ba1/a6/76/7a8cfa10bdd911d286648c2b4e26", + "assets/build/pylib-android/datetime.py": "https://files.ballistica.net/cache/ba1/31/dc/651eaa03a087f60726a944a2ee92", "assets/build/pylib-android/decimal.py": "https://files.ballistica.net/cache/ba1/92/94/b8be378718b3ede8f05f07aa257b", - "assets/build/pylib-android/difflib.py": "https://files.ballistica.net/cache/ba1/4a/86/a4728b9e0626216560ea205122d2", + "assets/build/pylib-android/difflib.py": "https://files.ballistica.net/cache/ba1/b6/80/e34a54d317e56d1cd9778457afc5", "assets/build/pylib-android/dis.py": "https://files.ballistica.net/cache/ba1/99/a5/3074e813c5188b690b6bac77f7f4", - "assets/build/pylib-android/doctest.py": "https://files.ballistica.net/cache/ba1/c9/12/81d2883b80b606cc85691acb2820", + "assets/build/pylib-android/doctest.py": "https://files.ballistica.net/cache/ba1/dd/f2/64a5506888615fe045917a322b80", "assets/build/pylib-android/email/__init__.py": "https://files.ballistica.net/cache/ba1/2b/f0/8c85ab15e7cdbdaa0e1705223012", - "assets/build/pylib-android/email/_encoded_words.py": "https://files.ballistica.net/cache/ba1/08/fa/de22bc96e1e332bbe1cf76162a1c", - "assets/build/pylib-android/email/_header_value_parser.py": "https://files.ballistica.net/cache/ba1/2d/c8/cbec982a4900ba1c15ea815624d7", + "assets/build/pylib-android/email/_encoded_words.py": "https://files.ballistica.net/cache/ba1/f1/20/54b74af7ab4f03f89f54cfa29b1b", + "assets/build/pylib-android/email/_header_value_parser.py": "https://files.ballistica.net/cache/ba1/31/3a/dbc2461fc26b2e3adf28c4796b1c", "assets/build/pylib-android/email/_parseaddr.py": "https://files.ballistica.net/cache/ba1/ff/35/b427b328dc4c49aae4db0e2bfc72", "assets/build/pylib-android/email/_policybase.py": "https://files.ballistica.net/cache/ba1/19/f9/844a8a848bc5670a810d06f0a6de", "assets/build/pylib-android/email/base64mime.py": "https://files.ballistica.net/cache/ba1/e0/5f/25fbb5f0dde9de81ef3a6177a01f", - "assets/build/pylib-android/email/charset.py": "https://files.ballistica.net/cache/ba1/a0/ba/c0b3f8daa9769adb9ba291937736", + "assets/build/pylib-android/email/charset.py": "https://files.ballistica.net/cache/ba1/d0/28/dac9a2adff3763f6ae413f26df95", "assets/build/pylib-android/email/contentmanager.py": "https://files.ballistica.net/cache/ba1/c2/1d/0acd924b8731b932e4a6ced58d77", "assets/build/pylib-android/email/encoders.py": "https://files.ballistica.net/cache/ba1/7a/9c/eca8d9e60fa733457fc32facd2fe", "assets/build/pylib-android/email/errors.py": "https://files.ballistica.net/cache/ba1/93/32/f046674ffc01766eeb9c54dd0830", @@ -2828,7 +2828,7 @@ "assets/build/pylib-android/enum.py": "https://files.ballistica.net/cache/ba1/56/4c/86116596f3af3892c7d77f5a34b2", "assets/build/pylib-android/filecmp.py": "https://files.ballistica.net/cache/ba1/0e/1e/8f865dd6bcc2d60880839762e007", "assets/build/pylib-android/fileinput.py": "https://files.ballistica.net/cache/ba1/9e/5c/ff3df618103ee025749af647a0d8", - "assets/build/pylib-android/fnmatch.py": "https://files.ballistica.net/cache/ba1/79/a3/778dda2ff1d92a37aa3709ec141c", + "assets/build/pylib-android/fnmatch.py": "https://files.ballistica.net/cache/ba1/7d/7a/889383848f167117d0b473e1bc39", "assets/build/pylib-android/fractions.py": "https://files.ballistica.net/cache/ba1/77/8a/fa5448bc945714954bd2e4bd0fc1", "assets/build/pylib-android/ftplib.py": "https://files.ballistica.net/cache/ba1/15/f9/66c87baf6cd7be154d0b904a131a", "assets/build/pylib-android/functools.py": "https://files.ballistica.net/cache/ba1/5b/5c/09cccab90e637eb0de81deb20cad", @@ -2843,7 +2843,7 @@ "assets/build/pylib-android/heapq.py": "https://files.ballistica.net/cache/ba1/63/79/bb9abc2fb3665fffc59e588aba1f", "assets/build/pylib-android/hmac.py": "https://files.ballistica.net/cache/ba1/1d/a6/4a78ec8815727fd28b0e8c10ef59", "assets/build/pylib-android/html/__init__.py": "https://files.ballistica.net/cache/ba1/63/0b/9695269a02f0ec6d8b2b928d1f3f", - "assets/build/pylib-android/html/entities.py": "https://files.ballistica.net/cache/ba1/02/4d/e42a17593176e35ff5da8d720cf9", + "assets/build/pylib-android/html/entities.py": "https://files.ballistica.net/cache/ba1/51/10/faad91b2e1fe51ade90c4618e88f", "assets/build/pylib-android/html/parser.py": "https://files.ballistica.net/cache/ba1/f3/63/57d38fd5ba0432c401807fdd216e", "assets/build/pylib-android/http/__init__.py": "https://files.ballistica.net/cache/ba1/80/a7/800c5f996f53155c5a626cdd6613", "assets/build/pylib-android/http/client.py": "https://files.ballistica.net/cache/ba1/73/6e/d63677c78de7bebec669debb7d79", @@ -2872,7 +2872,7 @@ "assets/build/pylib-android/importlib/util.py": "https://files.ballistica.net/cache/ba1/5c/13/dc6eb9c324c3a7a30680f56b2712", "assets/build/pylib-android/inspect.py": "https://files.ballistica.net/cache/ba1/68/27/da7d2295c7fa8d60d529f7155d9f", "assets/build/pylib-android/io.py": "https://files.ballistica.net/cache/ba1/9b/0e/b9fb6e1de0991b21e97e9d1997e1", - "assets/build/pylib-android/ipaddress.py": "https://files.ballistica.net/cache/ba1/20/70/ef510c93d0bb97e371a08e2bdbe1", + "assets/build/pylib-android/ipaddress.py": "https://files.ballistica.net/cache/ba1/8e/de/a27a5427d9ef1bb7758e50ba20eb", "assets/build/pylib-android/json/__init__.py": "https://files.ballistica.net/cache/ba1/0a/6b/bb8407abb743492bf84a2e472f7c", "assets/build/pylib-android/json/decoder.py": "https://files.ballistica.net/cache/ba1/3f/bf/6fd2a01d31cd85e4c21cf2c0a5c8", "assets/build/pylib-android/json/encoder.py": "https://files.ballistica.net/cache/ba1/57/77/3f0ccd21441273ff30116fa76ba3", @@ -2898,7 +2898,7 @@ "assets/build/pylib-android/operator.py": "https://files.ballistica.net/cache/ba1/c7/e1/faab3be799d4a4bfd844c2425b04", "assets/build/pylib-android/optparse.py": "https://files.ballistica.net/cache/ba1/0f/08/ec8ce5e48392a3f9bdc3c07f49cc", "assets/build/pylib-android/os.py": "https://files.ballistica.net/cache/ba1/98/a1/d44b87acd1e25e7fe895f0d7ce86", - "assets/build/pylib-android/pathlib.py": "https://files.ballistica.net/cache/ba1/ff/e4/5ff7175e0173b5d9d3789af09275", + "assets/build/pylib-android/pathlib.py": "https://files.ballistica.net/cache/ba1/8a/c7/07ab66e2e8fc2ca436d4c129377f", "assets/build/pylib-android/pdb.py": "https://files.ballistica.net/cache/ba1/bf/d0/f2d06639315624e00183fd69c46d", "assets/build/pylib-android/pickle.py": "https://files.ballistica.net/cache/ba1/b5/c5/6a5af50d16fc23f35633e8c3722b", "assets/build/pylib-android/pickletools.py": "https://files.ballistica.net/cache/ba1/72/c5/182517538ac4e0c1b7d25bde80e4", @@ -2915,19 +2915,19 @@ "assets/build/pylib-android/py_compile.py": "https://files.ballistica.net/cache/ba1/a7/9e/7f4e8da084e2d0761352120a331c", "assets/build/pylib-android/pyclbr.py": "https://files.ballistica.net/cache/ba1/e2/ed/7a1e35b368c6de0b51b9d9edc4a1", "assets/build/pylib-android/pydoc.py": "https://files.ballistica.net/cache/ba1/aa/e3/6409048f80e37ae5737adc9eafc9", - "assets/build/pylib-android/queue.py": "https://files.ballistica.net/cache/ba1/3a/2f/3f5f8f97d6aea42bff93351b960a", + "assets/build/pylib-android/queue.py": "https://files.ballistica.net/cache/ba1/6e/d7/04bd9d41783a2e75af05e14241a9", "assets/build/pylib-android/quopri.py": "https://files.ballistica.net/cache/ba1/0f/ad/93ff84558a4d8ca0607ab2c35df2", "assets/build/pylib-android/random.py": "https://files.ballistica.net/cache/ba1/a8/ed/a10fe4ba8a637263efa5d6b5fec7", "assets/build/pylib-android/re.py": "https://files.ballistica.net/cache/ba1/28/6f/c6088e235e06ea35a34bdd28f73f", "assets/build/pylib-android/reprlib.py": "https://files.ballistica.net/cache/ba1/81/66/44ee9dceee6943006c4500ee3303", "assets/build/pylib-android/rlcompleter.py": "https://files.ballistica.net/cache/ba1/41/1a/6e68fca92c466f362f227621ed81", - "assets/build/pylib-android/runpy.py": "https://files.ballistica.net/cache/ba1/41/67/93f1175414b00680fd8eaacfc485", + "assets/build/pylib-android/runpy.py": "https://files.ballistica.net/cache/ba1/f1/db/abb67fceafd6b354c3851f069884", "assets/build/pylib-android/sched.py": "https://files.ballistica.net/cache/ba1/48/ff/80ac9aee80b53416c702c2a856d4", "assets/build/pylib-android/secrets.py": "https://files.ballistica.net/cache/ba1/e2/1b/ffc4c1422b6ac0eda4924d2f241a", "assets/build/pylib-android/selectors.py": "https://files.ballistica.net/cache/ba1/ba/53/3b7515983548e5de15ccd7d37fb7", "assets/build/pylib-android/shelve.py": "https://files.ballistica.net/cache/ba1/70/fa/16d6647f0b0c8d1db51e54e5db92", "assets/build/pylib-android/shlex.py": "https://files.ballistica.net/cache/ba1/bf/d2/45bdf01bfb2a8d468d6ff0534fb6", - "assets/build/pylib-android/shutil.py": "https://files.ballistica.net/cache/ba1/13/18/0ab42a7897305d9ad11264a82f2a", + "assets/build/pylib-android/shutil.py": "https://files.ballistica.net/cache/ba1/a6/a2/068d0972d8c54309226a95a62f2c", "assets/build/pylib-android/signal.py": "https://files.ballistica.net/cache/ba1/49/e4/1b6cac607c01ffaccfc26f21eede", "assets/build/pylib-android/site.py": "https://files.ballistica.net/cache/ba1/f0/15/6dc1d610a17dcd53be135b7d57a3", "assets/build/pylib-android/smtpd.py": "https://files.ballistica.net/cache/ba1/d3/7b/4881d213384e3e4df8358906ea26", @@ -2935,19 +2935,19 @@ "assets/build/pylib-android/sndhdr.py": "https://files.ballistica.net/cache/ba1/d8/db/7f9e8c520cd68d3cf3308e3a9923", "assets/build/pylib-android/socket.py": "https://files.ballistica.net/cache/ba1/b5/38/017a990c761d8d75af5a969661f3", "assets/build/pylib-android/socketserver.py": "https://files.ballistica.net/cache/ba1/0f/54/a474bf8ddc82d8155de1344e1318", - "assets/build/pylib-android/sqlite3/__init__.py": "https://files.ballistica.net/cache/ba1/ff/a9/7e5749086a4bc2e5921911cb4798", + "assets/build/pylib-android/sqlite3/__init__.py": "https://files.ballistica.net/cache/ba1/7a/d3/a97bad7e5ce8d0e9cde349b1181e", "assets/build/pylib-android/sqlite3/dbapi2.py": "https://files.ballistica.net/cache/ba1/6a/2b/5618418e0c8edfc04b6ff2f1058c", "assets/build/pylib-android/sqlite3/dump.py": "https://files.ballistica.net/cache/ba1/1c/d8/dc3fb256cbb05c8fffb52c52404a", - "assets/build/pylib-android/sre_compile.py": "https://files.ballistica.net/cache/ba1/96/3a/830deabdb104a1d219f88ad9c090", - "assets/build/pylib-android/sre_constants.py": "https://files.ballistica.net/cache/ba1/87/9d/78b7e287798d388ac700586308ce", - "assets/build/pylib-android/sre_parse.py": "https://files.ballistica.net/cache/ba1/81/4a/21861aad12cf254a66c434dac9dd", - "assets/build/pylib-android/ssl.py": "https://files.ballistica.net/cache/ba1/69/f9/22520674c24b0e0a3eb22620349c", + "assets/build/pylib-android/sre_compile.py": "https://files.ballistica.net/cache/ba1/fc/be/bb3ebf34da4f6222e45f1e2e7a65", + "assets/build/pylib-android/sre_constants.py": "https://files.ballistica.net/cache/ba1/fc/54/c33aefcbc2dab38c050d444a3548", + "assets/build/pylib-android/sre_parse.py": "https://files.ballistica.net/cache/ba1/09/5d/b45c4c248ea9c70430f858e950f9", + "assets/build/pylib-android/ssl.py": "https://files.ballistica.net/cache/ba1/6d/a5/0555a143cd530ef6d04dfcfdf278", "assets/build/pylib-android/stat.py": "https://files.ballistica.net/cache/ba1/03/1d/acbfa83d8d94d8a483c6a884b589", "assets/build/pylib-android/statistics.py": "https://files.ballistica.net/cache/ba1/58/75/7788301683ae47efa836ef9cdb7c", "assets/build/pylib-android/string.py": "https://files.ballistica.net/cache/ba1/71/7f/8d19b04aea3ea1fc6bb49534d244", "assets/build/pylib-android/stringprep.py": "https://files.ballistica.net/cache/ba1/20/41/fcfc5f510286ead5f7f4678ac9ec", "assets/build/pylib-android/struct.py": "https://files.ballistica.net/cache/ba1/37/67/74dea8e8f3831e802c3b5288e901", - "assets/build/pylib-android/subprocess.py": "https://files.ballistica.net/cache/ba1/d1/a4/91085325afda3ef429f83d362cde", + "assets/build/pylib-android/subprocess.py": "https://files.ballistica.net/cache/ba1/49/04/1b24f46851ca9d92a4c7559ae349", "assets/build/pylib-android/sunau.py": "https://files.ballistica.net/cache/ba1/e5/20/6b38eb6fd8a07086d219d9ab269b", "assets/build/pylib-android/symtable.py": "https://files.ballistica.net/cache/ba1/51/1e/6efd09781ab558d4ccfdfda3204f", "assets/build/pylib-android/sysconfig.py": "https://files.ballistica.net/cache/ba1/ab/ca/56bd2cc4682412d0ed87ce887e3e", @@ -2957,7 +2957,7 @@ "assets/build/pylib-android/tempfile.py": "https://files.ballistica.net/cache/ba1/67/78/34399b155c0db5f48a0ec8ea5c92", "assets/build/pylib-android/textwrap.py": "https://files.ballistica.net/cache/ba1/3e/86/05b5dfd9776a28ada091b543077c", "assets/build/pylib-android/this.py": "https://files.ballistica.net/cache/ba1/a8/fa/4d1152b689d75bc1a997ff34b799", - "assets/build/pylib-android/threading.py": "https://files.ballistica.net/cache/ba1/c3/db/b53c246ab21d7f8143124dcca0a8", + "assets/build/pylib-android/threading.py": "https://files.ballistica.net/cache/ba1/e4/09/0ae2163973a67d4b686c199caec2", "assets/build/pylib-android/timeit.py": "https://files.ballistica.net/cache/ba1/68/56/ef8e9c86fdd966f0e8fcc03160ac", "assets/build/pylib-android/token.py": "https://files.ballistica.net/cache/ba1/de/5c/e38eb5b2f3f3f4e01dbce7f25c86", "assets/build/pylib-android/tokenize.py": "https://files.ballistica.net/cache/ba1/88/72/7d33fc2a2e89d0eeb2f2c4c20b66", @@ -2970,7 +2970,7 @@ "assets/build/pylib-android/urllib/__init__.py": "https://files.ballistica.net/cache/ba1/b0/56/87601ed47a5181d1e6a40eb4ea40", "assets/build/pylib-android/urllib/error.py": "https://files.ballistica.net/cache/ba1/07/8c/573897fc3bdc6d3e2e8d449f17c7", "assets/build/pylib-android/urllib/parse.py": "https://files.ballistica.net/cache/ba1/b8/d9/6cf19b9e635a9a8dcd9ac2e397de", - "assets/build/pylib-android/urllib/request.py": "https://files.ballistica.net/cache/ba1/5d/d3/e1a8e22fa94dfc9b70a763fd3d2d", + "assets/build/pylib-android/urllib/request.py": "https://files.ballistica.net/cache/ba1/ac/b2/4f16fc515abc96d77d3eb3666cc5", "assets/build/pylib-android/urllib/response.py": "https://files.ballistica.net/cache/ba1/ac/f3/2d5bd4fe5cfcf640e8be71dec9a4", "assets/build/pylib-android/urllib/robotparser.py": "https://files.ballistica.net/cache/ba1/a4/52/f0d03835bb08e08195aeebd05e04", "assets/build/pylib-android/uu.py": "https://files.ballistica.net/cache/ba1/a1/89/070ed8553858a75fcafae4b7bd37", @@ -2990,8 +2990,8 @@ "assets/build/pylib-android/xml/dom/pulldom.py": "https://files.ballistica.net/cache/ba1/69/93/695baf453ca1030e7f6a62eb977b", "assets/build/pylib-android/xml/dom/xmlbuilder.py": "https://files.ballistica.net/cache/ba1/e2/28/cb659e6d308904b5b8349b2fff52", "assets/build/pylib-android/xml/etree/ElementInclude.py": "https://files.ballistica.net/cache/ba1/bf/14/b35813d60c28bb05f1528c80f062", - "assets/build/pylib-android/xml/etree/ElementPath.py": "https://files.ballistica.net/cache/ba1/45/df/c9faaeb5c2ced3983cecd9a5d527", - "assets/build/pylib-android/xml/etree/ElementTree.py": "https://files.ballistica.net/cache/ba1/81/7e/10cfd4e42d6658be3a2004acd383", + "assets/build/pylib-android/xml/etree/ElementPath.py": "https://files.ballistica.net/cache/ba1/37/66/1c977331552663a6d344885a2253", + "assets/build/pylib-android/xml/etree/ElementTree.py": "https://files.ballistica.net/cache/ba1/25/f0/aecd1da0aba9b78b4fa3134ae257", "assets/build/pylib-android/xml/etree/__init__.py": "https://files.ballistica.net/cache/ba1/38/44/1792ae5542c1ae5248568ef5abbd", "assets/build/pylib-android/xml/etree/cElementTree.py": "https://files.ballistica.net/cache/ba1/6f/39/4c840e5eb0e09f709569154159ba", "assets/build/pylib-android/xml/parsers/__init__.py": "https://files.ballistica.net/cache/ba1/db/92/7283051e5e1c7426985835f506b9", @@ -3006,7 +3006,7 @@ "assets/build/pylib-android/xmlrpc/client.py": "https://files.ballistica.net/cache/ba1/4c/e4/4a92e3e83fdbf8e1578c726fd438", "assets/build/pylib-android/xmlrpc/server.py": "https://files.ballistica.net/cache/ba1/eb/1a/fae274a8e90aa97ade20712bfe2e", "assets/build/pylib-android/zipapp.py": "https://files.ballistica.net/cache/ba1/40/ae/178305c27d72cc46ad2220b504ec", - "assets/build/pylib-android/zipfile.py": "https://files.ballistica.net/cache/ba1/f1/ad/05a1db7bc53aaf75eb6d3317f3c0", + "assets/build/pylib-android/zipfile.py": "https://files.ballistica.net/cache/ba1/a2/9f/b75ac1015178f4186f59cf7b1adc", "assets/build/pylib-android/zipimport.py": "https://files.ballistica.net/cache/ba1/20/ce/c481892e53a1422e4b87119b1acf", "assets/build/pylib-android/zoneinfo/__init__.py": "https://files.ballistica.net/cache/ba1/b7/4e/bea553b4c2a2e63902c5cb446579", "assets/build/pylib-android/zoneinfo/_common.py": "https://files.ballistica.net/cache/ba1/ae/e7/6145bfdca63840d5168082339fe0", @@ -3992,50 +3992,50 @@ "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", - "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/70/3b/0c7d541b3856884a747ff4606125", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/af/8b/9191ae1c05ed11d77bf9099abdaf", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/8f/88/e96a5cf5728280557a229c3cd196", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/40/8c/e3932b01bfb03bf3d930fa6b0075", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/4e/dd/cceaa79ecc33d116254129115ab6", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/bc/d5/2992911e42d4019062a5ee7922be", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/2d/75/b81d14e56fac5cb36204b99d438b", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/bd/35/af73fd25f90b260a7e1f2b45604a", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a4/b9/2d9d7fdf7f8fc36a395396c17396", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ac/ec/cbd0cd6b30ffc5e9899df476ff75", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fb/db/28557fffa11dc30193dfdf2bc1cc", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/cb/34/83e11c5a79dcb4a925b05a65741c", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/d5/12/cd06cac7c7bb070397da839850df", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/da/87/5df008ea5c203eb4a97bfa9648fe", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/93/ca/2afe9fc10c37c16a91a556350be0", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/19/cc/c1bb1e323387f590c3ad649cf2b1", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/a0/31/1f941c66e9290a4ae69f5f4b0aa4", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/74/15/89bb4aa1472f0848808b215fbab6", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/25/a3/4c7334e53c11997b7cf292c96da8", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/64/e0/f9f926a34c2e0243419b20a28138", - "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/11/a6/7db8addcd876b1933e16f380696a", - "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/c7/8a/3d8501efecca4f20b9702d24f9db", - "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/74/fb/8ba0b3bddf4e0f1184a68e648959", - "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/24/ab/393d381b77a85cdbba6c47d8a67a", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/da/23/026d70f770273a92def633d57935", - "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/35/e8/37eeb762bbae9daffae6d5d69b7e", - "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3a/6b/0e26e2ab6eab60258ddcab0601fd", - "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/70/38/7ff58456d824e3461c6a1a3f3f5a", - "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/10/39/9501e3afd9a1a0af817989e18c7d", - "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/42/f6/e8943073f00d93b2e2cd1822916a", - "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/67/82/220d9a12ed10c885aadc02b9919b", - "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3f/c5/dc64be0a0f9d09630074e630312b", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/f2/5f/e75027e1f6f31fae1f1d20a8b2ee", - "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1d/11/18a94007cbcaf2e10c46fc367f7a", - "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/51/a8/414d1a0ad00982cd961f0a29a501", - "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4b/0c/26593bd6f6191a19531ce1dd492b", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/62/9e/e8679467880812a2a31266704517", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/56/f1/af68b9666c2ce5038b813719c458", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/d2/a9/9087249ba5a8873f59503a7cb3e4", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/fd/3f/57f64be3b335dbbe0f261edf0861", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/8b/cf/cc26378a8800b0efd14455e7f6b5", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/64/34/18f21d11fda7f1472e0212169904", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/24/71/93680835ec6af90acf9d4e2fd63f", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/af/ae/86b7f88249a684530c6d30831889", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a6/be/d5bc2a6a6d67cb789a71fc2dc799", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/0d/7d/4df2faa615a02cf848940e7b1b76", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/72/74/f9672eddfbb64b63f08a654aa1cb", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5a/b2/a44f6adf17c52e02cefa8a470d6a", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/c1/54/4e2c0df1cc4c88c8527e9544730b", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/8d/49/f27bec9eae7154815f4ef1a696f9", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c9/a6/9509207a918bedc56acd64d91530", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3d/cd/fb1d17ea9dc0e6d8ea567c458b40", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/10/49/029f26b735c3141db821d47ae20c", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/33/e7/2f84fd589ebdd26d8d5f3a4bd01a", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/1e/61/97ba59db0aedfc5762e64a28c4cd", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7d/c4/979fbe7a5f16658cad8f4cc3c6d9", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/10/76/5fe6cadeaba79c24cbeac4b4fb0b", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/39/7e/d5bc410c8ca95106501dc29a3ef3", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c9/80/8900a0cabb1ebbe3fa7f01ca0d18", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7f/fb/35f70beb4b0bb820af29de54f34f", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/2b/79/a09f270f62268b8532ba53e30445", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/fd/4a/42a24526e581b6a0021c0a61c0a2", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/e2/5e/c228d10c06c5a27a8dd790cdd7ac", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/80/17/0f9b987d6feaaa06586d77708a2a", + "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6d/55/43cb804fe2b6b591e8c4713a1f4f", + "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fe/61/9eaaa15072167c2928db497e8d36", + "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/99/f1/ac4818ad69cfe75f7091ee08231b", + "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/19/93/20ef44fccd2fbec462e75eaebb94", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/f5/21/0b5914e203834307064814157891", + "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9b/ec/39c43dc87aa884935ebd41c51a65", + "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0f/47/7cdadc48b80922a35fef02954f55", + "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b5/1a/9237a45253d7fb78caa61dda705d", + "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/76/67/9e81120039eaa5dd2fdea8158920", + "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9c/f0/b700bcf9f82f3569ff65cec8195c", + "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/83/b6/5e554b5077bd5fe5f539250c11e9", + "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/04/24/505ea85abe32bb75db13d76d7b0d", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/52/b6/f0ef528479230a231ad44afd0644", + "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/8b/4a/df2e8786ef7c5594d57bdd50f753", + "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/27/a2/2b5dc6f6be53b109294ce735f59f", + "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/87/e1/2d4766493963104e82f0eaa2b5e9", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/9d/9e/e29c498921f94332eae9a018677a", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/c4/c1/b3de603cacf7f5653d8f6bd04e92", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/49/56/e4f599c6fff94771efb95f3650d6", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/85/5d/dfeae15689ff7e4367b150511668", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/d2/ed/47380a2a0284f6af2066420127a6", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/c8/cc/f347c5b8641c8bb2d182a637c84c", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/00/c5/3c70c8c77994440dd1c9e5f76d18", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/63/58/9d32ce2c6a69ce3702994bfff3dc", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/6e/6f/004b696e9a13b083069374e4bb6a", "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/d3/db/e73d4dcf1280d5f677c3cf8b47c3" } \ No newline at end of file diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml index 10dd41b6..34da2077 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -588,6 +588,7 @@ dereferencing descpos dest + destdir devel devicename devtool @@ -1031,6 +1032,7 @@ getstarttime gettext gettexture + gettime gfile gfxb ghnc @@ -1387,6 +1389,7 @@ loadpackage localconfig localdir + localmodlibs localns localuser locationgroup @@ -1665,6 +1668,7 @@ nowtickets npos nprocessors + nsec nsworkspace ntpath ntriple @@ -2443,6 +2447,7 @@ targetpractice targs tasklabel + tbegin tbtcolor tbtn tbttxt @@ -2454,6 +2459,7 @@ tcombine tdelay tdels + tdiff tdlds tdval teambasesession diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e2075e5..50a02a40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.3 (20629, 2022-07-05) +### 1.7.3 (20634, 2022-07-06) - Fixed an issue with King of the Hill flag regions not working when players entered them (Thanks itsre3!) - Fixed an issue in Chosen One where the flag resetting on top of a player would not cause them to become the chosen one (Thanks Dliwk!) - Fixed an issue where triple-bomb powerup would not flash before wearing off (Thanks Juleskie!). @@ -13,8 +13,7 @@ - The app now issues a warning if unable to establish secure connections to cloud servers (which can be due to aforementioned issue, but could also stem from other network problems). - The Network Testing utility (Settings->Advanced->Network Testing) now tests for more potential issues including ones mentioned above. - The Android version now stores files such as extracted assets and audio caches in the non-backed-up files dir (Android's Context.getNoBackupFilesDir()). These files can always be recreated by the app so they don't need backups, and this makes it more likely that Android will back up what's left in the regular files dir (the app config, etc). - - +- Fixed an issue causing hitches during background SSL network operations (manifesting on the Android version but theoretically possibly anywhere). ### 1.7.2 (20620, 2022-06-25) - Minor fixes in some minigames (Thanks Droopy!) diff --git a/assets/src/ba_data/python/._ba_sources_hash b/assets/src/ba_data/python/._ba_sources_hash index 16f2fbea..a6fb194e 100644 --- a/assets/src/ba_data/python/._ba_sources_hash +++ b/assets/src/ba_data/python/._ba_sources_hash @@ -1 +1 @@ -26390464474167776621039904449805338328 \ No newline at end of file +278132313134406072250536815637474504399 \ No newline at end of file diff --git a/assets/src/ba_data/python/bastd/ui/settings/advanced.py b/assets/src/ba_data/python/bastd/ui/settings/advanced.py index 7336a992..55d08a68 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/advanced.py +++ b/assets/src/ba_data/python/bastd/ui/settings/advanced.py @@ -56,6 +56,7 @@ class AdvancedSettingsWindow(ba.Window): scale=(2.06 if uiscale is ba.UIScale.SMALL else 1.4 if uiscale is ba.UIScale.MEDIUM else 1.0), stack_offset=(0, -25) if uiscale is ba.UIScale.SMALL else (0, 0))) + self._prev_lang = '' self._prev_lang_list: list[str] = [] self._complete_langs_list: list | None = None diff --git a/ballisticacore-cmake/.idea/dictionaries/ericf.xml b/ballisticacore-cmake/.idea/dictionaries/ericf.xml index 07e928a0..4cb8ba44 100644 --- a/ballisticacore-cmake/.idea/dictionaries/ericf.xml +++ b/ballisticacore-cmake/.idea/dictionaries/ericf.xml @@ -311,6 +311,7 @@ demangling denom dernit + destdir dets dfba dffc @@ -527,6 +528,7 @@ getsession getsound gettexture + gettime gettotalrefcount gles glext @@ -686,6 +688,7 @@ linkstoryboards listobj llock + localmodlibs localns lockpath lockstr @@ -846,6 +849,7 @@ notorized nowtickets nptr + nsec nsize nsworkspace ntoa @@ -1239,8 +1243,10 @@ talloc targs tasklabel + tbegin tcls tdels + tdiff tdlds tegra telefonaktiebolaget diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index 196f7d59..5d1913b4 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -21,7 +21,7 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20629; +const int kAppBuildNumber = 20634; const char* kAppVersion = "1.7.3"; // Our standalone globals. diff --git a/src/ballistica/game/game.cc b/src/ballistica/game/game.cc index 34e618fa..4f70532d 100644 --- a/src/ballistica/game/game.cc +++ b/src/ballistica/game/game.cc @@ -498,10 +498,6 @@ void Game::HandleQuitOnIdle() { PushCall([this, idle_seconds] { assert(InGameThread()); - // Special exit value the wrapper script looks for to know we idled out. - // UPDATE: no longer need this. - // g_app_globals->return_value = 154; - // Just go through _ba.quit() // FIXME: Shouldn't need to go out to the python layer here... g_python->obj(Python::ObjID::kQuitCall).Call(); @@ -512,10 +508,10 @@ void Game::HandleQuitOnIdle() { // Bring our scenes, real-time timers, etc up to date. void Game::Update() { + auto startms{Platform::GetCurrentMilliseconds()}; assert(InGameThread()); millisecs_t real_time = GetRealTime(); - g_platform->SetDebugKey("LastUpdateTime", - std::to_string(Platform::GetCurrentMilliseconds())); + g_platform->SetDebugKey("LastUpdateTime", std::to_string(startms)); if (first_update_) { master_time_offset_ = master_time_ - real_time; first_update_ = false; @@ -652,6 +648,20 @@ void Game::Update() { step++; } in_update_ = false; + + // Report excessively long updates. + if (real_time >= next_long_update_report_time_) { + auto duration{Platform::GetCurrentMilliseconds() - startms}; + + // Complain when our full update takes longer than 1/60th second. + if (duration > (1000 / 60)) { + Log("Game update took too long (" + std::to_string(duration) + " ms).", + true, false); + + // Limit these if we want (not doing so for now). + next_long_update_report_time_ = real_time; + } + } } // Reset the game to a blank slate. diff --git a/src/ballistica/game/game.h b/src/ballistica/game/game.h index 7e922ded..697feb9f 100644 --- a/src/ballistica/game/game.h +++ b/src/ballistica/game/game.h @@ -296,6 +296,7 @@ class Game : public Module { millisecs_t largest_draw_time_increment_since_last_reset_{}; millisecs_t last_draw_real_time_{}; millisecs_t first_draw_real_time_{}; + millisecs_t next_long_update_report_time_{}; // *All* existing sessions (including old ones waiting to shut down). std::vector > sessions_; diff --git a/src/ballistica/python/python.cc b/src/ballistica/python/python.cc index bb6f6546..93b067ef 100644 --- a/src/ballistica/python/python.cc +++ b/src/ballistica/python/python.cc @@ -2246,10 +2246,16 @@ void Python::LogContextAuto() { } void Python::AcquireGIL() { + auto startms{Platform::GetCurrentMilliseconds()}; if (thread_state_) { PyEval_RestoreThread(thread_state_); thread_state_ = nullptr; } + auto duration{Platform::GetCurrentMilliseconds() - startms}; + if (duration > (1000 / 120)) { + Log("GIL acquire took too long (" + std::to_string(duration) + " ms).", + true, false); + } } void Python::ReleaseGIL() { assert(thread_state_ == nullptr); @@ -2583,12 +2589,10 @@ auto Python::ValidatedPackageAssetName(PyObject* package, const char* name) class Python::ScopedInterpreterLock::Impl { public: - Impl() : need_lock_(true), gstate_(PyGILState_UNLOCKED) { + Impl() { if (need_lock_) { - if (need_lock_) { - // Grab the python GIL. - gstate_ = PyGILState_Ensure(); - } + // Grab the python GIL. + gstate_ = PyGILState_Ensure(); } } ~Impl() { @@ -2599,8 +2603,8 @@ class Python::ScopedInterpreterLock::Impl { } private: - bool need_lock_ = false; - PyGILState_STATE gstate_; + bool need_lock_{true}; + PyGILState_STATE gstate_{PyGILState_UNLOCKED}; }; Python::ScopedInterpreterLock::ScopedInterpreterLock() diff --git a/tests/test_efro/test_rpc.py b/tests/test_efro/test_rpc.py index 073fb270..8aedbc43 100644 --- a/tests/test_efro/test_rpc.py +++ b/tests/test_efro/test_rpc.py @@ -341,7 +341,7 @@ def test_simultaneous_messages() -> None: ) # This should all go through in the same time that 1 goes through in. - assert (time.monotonic() - starttime) < 1.1 * SLOW_WAIT + assert (time.monotonic() - starttime) < 1.25 * SLOW_WAIT # Make sure we got all correct responses. assert all(r.messagetype is _MessageType.RESPONSE_SLOW diff --git a/tools/batools/pcommand.py b/tools/batools/pcommand.py index e369497b..9d38cc0e 100644 --- a/tools/batools/pcommand.py +++ b/tools/batools/pcommand.py @@ -1,5 +1,6 @@ # Released under the MIT License. See LICENSE for details. # +# pylint: disable=too-many-lines """A nice collection of ready-to-use pcommands for this package.""" from __future__ import annotations @@ -305,6 +306,12 @@ def gen_fulltest_buildfile_linux() -> None: batools.build.gen_fulltest_buildfile_linux() +def python_version_build_base() -> None: + """Print built Python base version.""" + from efrotools.pybuild import PY_VER + print(PY_VER, end='') + + def python_version_android() -> None: """Print Android embedded Python version.""" from efrotools.pybuild import PY_VER_EXACT_ANDROID @@ -734,12 +741,15 @@ def efro_gradle() -> None: target_words = [w.lower() for w in _camel_case_split(args[-1])] if 'google' in target_words: enabled_tags = {'google', 'crashlytics'} + prev_suffix = 'efro_gradle_prev' buildfilename = 'BallisticaCore/build.gradle' # Move the original file out of the way and operate on a copy of it. - subprocess.run(['mv', buildfilename, f'{buildfilename}.prev'], check=True) - subprocess.run(['cp', f'{buildfilename}.prev', buildfilename], check=True) + subprocess.run(['mv', buildfilename, f'{buildfilename}.{prev_suffix}'], + check=True) + subprocess.run(['cp', f'{buildfilename}.{prev_suffix}', buildfilename], + check=True) filter_gradle_file(buildfilename, enabled_tags) @@ -750,7 +760,8 @@ def efro_gradle() -> None: errored = True # Restore the original. - subprocess.run(['mv', f'{buildfilename}.prev', buildfilename], check=True) + subprocess.run(['mv', f'{buildfilename}.{prev_suffix}', buildfilename], + check=True) if errored: sys.exit(1) diff --git a/tools/efrotools/pybuild.py b/tools/efrotools/pybuild.py index fa4d15f8..27387c47 100644 --- a/tools/efrotools/pybuild.py +++ b/tools/efrotools/pybuild.py @@ -15,7 +15,7 @@ if TYPE_CHECKING: # Python version we build here (not necessarily same as we use in repo). PY_VER = '3.10' -PY_VER_EXACT_ANDROID = '3.10.4' +PY_VER_EXACT_ANDROID = '3.10.5' PY_VER_EXACT_APPLE = '3.10.4' ANDROID_PYTHON_REPO = 'https://github.com/GRRedWings/python3-android' @@ -170,8 +170,9 @@ def build_android(rootdir: str, arch: str, debug: bool = False) -> None: ) os.chdir(builddir) - # TEMP - use 3.9.6 branch - # subprocess.run(['git', 'checkout', PY_VER_EXACT_ANDROID], check=True) + # If we need to use a particular branch. + if bool(False): + subprocess.run(['git', 'checkout', PY_VER_EXACT_ANDROID], check=True) # These builds require ANDROID_NDK to be set; make sure that's the case. os.environ['ANDROID_NDK'] = subprocess.check_output( @@ -180,8 +181,6 @@ def build_android(rootdir: str, arch: str, debug: bool = False) -> None: # Disable builds for dependencies we don't use. ftxt = readfile('Android/build_deps.py') - # ftxt = replace_exact(ftxt, ' NCurses,\n', - # '# NCurses,\n',) ftxt = replace_exact( ftxt, ' ' @@ -190,13 +189,6 @@ def build_android(rootdir: str, arch: str, debug: bool = False) -> None: 'BZip2, LibUUID, OpenSSL, SQLite, XZ, ZLib,\n', ) - # Older ssl seems to choke on newer ndk layouts. - if bool(False): - ftxt = replace_exact( - ftxt, - "source = 'https://www.openssl.org/source/openssl-1.1.1h.tar.gz'", - "source = 'https://www.openssl.org/source/openssl-1.1.1l.tar.gz'") - # Give ourselves a handle to patch the OpenSSL build. ftxt = replace_exact( ftxt, @@ -220,7 +212,7 @@ def build_android(rootdir: str, arch: str, debug: bool = False) -> None: f' python_android_patch Python-{PY_VER_EXACT_ANDROID}\n popd\n') writefile('build.sh', ftxt) - # Ok, let 'er rip + # Ok; let 'er rip! exargs = ' --with-pydebug' if debug else '' subprocess.run(f'ARCH={arch} ANDROID_API=21 ./build.sh{exargs}', shell=True, @@ -240,11 +232,64 @@ def apple_patch(arch: str, slc: str) -> None: outfile.write('# cleared by efrotools build\n') _patch_setup_file('apple', arch, slc) + _patch_py_ssl() def android_patch() -> None: """Run necessary patches on an android archive before building.""" _patch_setup_file('android', '?', '?') + _patch_py_ssl() + + +def android_patch_ssl() -> None: + """Run necessary patches on an android ssl before building.""" + + # We bundle our own SSL root certificates on various platforms and use + # the OpenSSL 'SSL_CERT_FILE' env var override to get them to be used + # by default. However, OpenSSL is picky about allowing env-vars to be + # used and something about the Android environment makes it disallow + # them. So we need to force the issue. Alternately we could explicitly + # pass 'cafile' args to SSLContexts whenever we do network-y stuff + # but it seems cleaner to just have things work everywhere by default. + fname = 'crypto/getenv.c' + txt = readfile(fname) + txt = replace_exact( + txt, + ('char *ossl_safe_getenv(const char *name)\n' + '{\n'), + ('char *ossl_safe_getenv(const char *name)\n' + '{\n' + ' // ERICF TWEAK: ALWAYS ALLOW GETENV.\n' + ' return getenv(name);\n'), + ) + writefile(fname, txt) + + +def _patch_py_ssl() -> None: + + # I've tracked down an issue where Python's SSL module + # can spend lots of time in SSL_CTX_set_default_verify_paths() + # while holding the GIL, which hitches the game like crazy. + # On debug builds on older Android devices it can spend up to + # 1-2 seconds there. So its necessary to release the GIL during that + # call to keep things smooth. Will submit a report/patch to the + # Python folks, but for now am just patching it for our Python builds. + # NOTE TO SELF: It would also be good to look into why that call can be + # so slow and if there's anything we can do about that. + fname = 'Modules/_ssl.c' + txt = readfile(fname) + txt = replace_exact( + txt, + ' if (!SSL_CTX_set_default_verify_paths(self->ctx)) {', + ' int ret = 0;\n' + '\n' + ' PySSL_BEGIN_ALLOW_THREADS\n' + ' ret = SSL_CTX_set_default_verify_paths(self->ctx);\n' + ' PySSL_END_ALLOW_THREADS\n' + '\n' + ' if (!ret) {', + ) + writefile(fname, txt) def _patch_setup_file(platform: str, arch: str, slc: str) -> None: @@ -409,30 +454,6 @@ def _patch_setup_file(platform: str, arch: str, slc: str) -> None: writefile(fname, txt) -def android_patch_ssl() -> None: - """Run necessary patches on an android ssl before building.""" - - # We bundle our own SSL root certificates on various platforms and use - # the OpenSSL 'SSL_CERT_FILE' env var override to get them to be used - # by default. However, OpenSSL is picky about allowing env-vars to be - # used and something about the Android environment makes it disallow - # them. So we need to force the issue. Alternately we could explicitly - # pass 'cafile' args to SSLContexts whenever we do network-y stuff - # but it seems cleaner to just have things work by default. - fname = 'crypto/getenv.c' - txt = readfile(fname) - txt = replace_exact( - txt, - ('char *ossl_safe_getenv(const char *name)\n' - '{\n'), - ('char *ossl_safe_getenv(const char *name)\n' - '{\n' - ' // ERICF TWEAK: ALWAYS ALLOW GETENV.\n' - ' return getenv(name);\n'), - ) - writefile(fname, txt) - - def winprune() -> None: """Prune unneeded files from windows python dists.""" for libdir in ('assets/src/windows/Win32/Lib', diff --git a/tools/pcommand b/tools/pcommand index 4d99767c..c0cdc4d7 100755 --- a/tools/pcommand +++ b/tools/pcommand @@ -31,11 +31,11 @@ from batools.pcommand import ( gen_fulltest_buildfile_android, gen_fulltest_buildfile_windows, gen_fulltest_buildfile_apple, gen_fulltest_buildfile_linux, python_version_android, python_version_apple, python_build_apple, - python_build_apple_debug, python_build_android, python_build_android_debug, - python_android_patch, python_android_patch_ssl, python_apple_patch, - python_gather, python_winprune, capitalize, upper, efrocache_update, - efrocache_get, get_modern_make, warm_start_asset_build, gendocs, - list_pip_reqs, install_pip_reqs, checkenv, ensure_prefab_platform, + python_version_build_base, python_build_apple_debug, python_build_android, + python_build_android_debug, python_android_patch, python_android_patch_ssl, + python_apple_patch, python_gather, python_winprune, capitalize, upper, + efrocache_update, efrocache_get, get_modern_make, warm_start_asset_build, + gendocs, list_pip_reqs, install_pip_reqs, checkenv, ensure_prefab_platform, prefab_run_var, make_prefab, lazybuild, android_archive_unstripped_libs, efro_gradle, stage_assets, update_assets_makefile, update_project, update_cmake_prefab_lib, cmake_prep_dir, gen_binding_code,