plain.postgres 0.84.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. plain/postgres/CHANGELOG.md +1028 -0
  2. plain/postgres/README.md +925 -0
  3. plain/postgres/__init__.py +120 -0
  4. plain/postgres/agents/.claude/rules/plain-postgres.md +78 -0
  5. plain/postgres/aggregates.py +236 -0
  6. plain/postgres/backups/__init__.py +0 -0
  7. plain/postgres/backups/cli.py +148 -0
  8. plain/postgres/backups/clients.py +94 -0
  9. plain/postgres/backups/core.py +172 -0
  10. plain/postgres/base.py +1415 -0
  11. plain/postgres/cli/__init__.py +3 -0
  12. plain/postgres/cli/db.py +142 -0
  13. plain/postgres/cli/migrations.py +1085 -0
  14. plain/postgres/config.py +18 -0
  15. plain/postgres/connection.py +1331 -0
  16. plain/postgres/connections.py +77 -0
  17. plain/postgres/constants.py +13 -0
  18. plain/postgres/constraints.py +495 -0
  19. plain/postgres/database_url.py +94 -0
  20. plain/postgres/db.py +59 -0
  21. plain/postgres/default_settings.py +38 -0
  22. plain/postgres/deletion.py +475 -0
  23. plain/postgres/dialect.py +640 -0
  24. plain/postgres/entrypoints.py +4 -0
  25. plain/postgres/enums.py +103 -0
  26. plain/postgres/exceptions.py +217 -0
  27. plain/postgres/expressions.py +1912 -0
  28. plain/postgres/fields/__init__.py +2118 -0
  29. plain/postgres/fields/encrypted.py +354 -0
  30. plain/postgres/fields/json.py +413 -0
  31. plain/postgres/fields/mixins.py +30 -0
  32. plain/postgres/fields/related.py +1192 -0
  33. plain/postgres/fields/related_descriptors.py +290 -0
  34. plain/postgres/fields/related_lookups.py +223 -0
  35. plain/postgres/fields/related_managers.py +661 -0
  36. plain/postgres/fields/reverse_descriptors.py +229 -0
  37. plain/postgres/fields/reverse_related.py +328 -0
  38. plain/postgres/fields/timezones.py +143 -0
  39. plain/postgres/forms.py +773 -0
  40. plain/postgres/functions/__init__.py +189 -0
  41. plain/postgres/functions/comparison.py +127 -0
  42. plain/postgres/functions/datetime.py +454 -0
  43. plain/postgres/functions/math.py +140 -0
  44. plain/postgres/functions/mixins.py +59 -0
  45. plain/postgres/functions/text.py +282 -0
  46. plain/postgres/functions/window.py +125 -0
  47. plain/postgres/indexes.py +286 -0
  48. plain/postgres/lookups.py +758 -0
  49. plain/postgres/meta.py +584 -0
  50. plain/postgres/migrations/__init__.py +53 -0
  51. plain/postgres/migrations/autodetector.py +1379 -0
  52. plain/postgres/migrations/exceptions.py +54 -0
  53. plain/postgres/migrations/executor.py +188 -0
  54. plain/postgres/migrations/graph.py +364 -0
  55. plain/postgres/migrations/loader.py +377 -0
  56. plain/postgres/migrations/migration.py +180 -0
  57. plain/postgres/migrations/operations/__init__.py +34 -0
  58. plain/postgres/migrations/operations/base.py +139 -0
  59. plain/postgres/migrations/operations/fields.py +373 -0
  60. plain/postgres/migrations/operations/models.py +798 -0
  61. plain/postgres/migrations/operations/special.py +184 -0
  62. plain/postgres/migrations/optimizer.py +74 -0
  63. plain/postgres/migrations/questioner.py +340 -0
  64. plain/postgres/migrations/recorder.py +119 -0
  65. plain/postgres/migrations/serializer.py +378 -0
  66. plain/postgres/migrations/state.py +882 -0
  67. plain/postgres/migrations/utils.py +147 -0
  68. plain/postgres/migrations/writer.py +302 -0
  69. plain/postgres/options.py +207 -0
  70. plain/postgres/otel.py +231 -0
  71. plain/postgres/preflight.py +336 -0
  72. plain/postgres/query.py +2242 -0
  73. plain/postgres/query_utils.py +456 -0
  74. plain/postgres/registry.py +217 -0
  75. plain/postgres/schema.py +1885 -0
  76. plain/postgres/sql/__init__.py +40 -0
  77. plain/postgres/sql/compiler.py +1869 -0
  78. plain/postgres/sql/constants.py +22 -0
  79. plain/postgres/sql/datastructures.py +222 -0
  80. plain/postgres/sql/query.py +2947 -0
  81. plain/postgres/sql/where.py +374 -0
  82. plain/postgres/test/__init__.py +0 -0
  83. plain/postgres/test/pytest.py +117 -0
  84. plain/postgres/test/utils.py +18 -0
  85. plain/postgres/transaction.py +222 -0
  86. plain/postgres/types.py +92 -0
  87. plain/postgres/types.pyi +751 -0
  88. plain/postgres/utils.py +345 -0
  89. plain_postgres-0.84.0.dist-info/METADATA +937 -0
  90. plain_postgres-0.84.0.dist-info/RECORD +93 -0
  91. plain_postgres-0.84.0.dist-info/WHEEL +4 -0
  92. plain_postgres-0.84.0.dist-info/entry_points.txt +5 -0
  93. plain_postgres-0.84.0.dist-info/licenses/LICENSE +61 -0
@@ -0,0 +1,93 @@
1
+ plain/postgres/CHANGELOG.md,sha256=tV2Be1op541YBfjRAY1Tu5csa0d4zTj6yf_fLGMKFXw,67359
2
+ plain/postgres/README.md,sha256=W_wSelWoumY_ZjOKtqfNHNxWqeiHxWOTWYHGOVO862Q,29893
3
+ plain/postgres/__init__.py,sha256=58ZhstM9TY7hZtKcs6GIprjc5ZPqcp4b53VYNP343Lk,2911
4
+ plain/postgres/aggregates.py,sha256=nRSsBra5crNneIGuPeoQQG2lZ3hETc4aQUw9JoWUtvg,8095
5
+ plain/postgres/base.py,sha256=DhiT8XGif1GeDdujVWx-Dtf2l44ijURC3voURLdIhqU,55479
6
+ plain/postgres/config.py,sha256=xrWdOR6aEz7gdZmT5wTkYXHAfIcsbnZ7xDsWdM7Ju3A,427
7
+ plain/postgres/connection.py,sha256=gjD_OlQUKltwqyTm4Vo8VzRgyOwHWwTaD4nGEL9h-ls,50032
8
+ plain/postgres/connections.py,sha256=WqU_DxY5a4P4ir2aHyjelme98HbwCjYMQH6CYvr1ySA,2608
9
+ plain/postgres/constants.py,sha256=ndnj9TOTKW0p4YcIPLOLEbsH6mOgFi6B1-rIzr_iwwU,210
10
+ plain/postgres/constraints.py,sha256=UcOVKDO9LId_vzla-kpy3tGNHn6XwWbCF9nAX9uJKl8,19423
11
+ plain/postgres/database_url.py,sha256=D6sGqhowM8Ulz-P3vvGGMjVgHrpyWunIVR8RC0DGXqM,3770
12
+ plain/postgres/db.py,sha256=bakTG1kmq3wK_q2qG8ASnC_KWYWoQ_8NEYVJDyQoJXo,1329
13
+ plain/postgres/default_settings.py,sha256=johUcg-19H_8v-P7GktzaGzbBNbaJADG64lBnnoqKUk,1323
14
+ plain/postgres/deletion.py,sha256=MOQdkQ1ZsE_H-WHOOxuk7f1-BY6pcw-0SSrCxKJifuY,19008
15
+ plain/postgres/dialect.py,sha256=5gpTn93nKcvnAVkCUO0d8r45IzPyGQ_ep7RHp1YM5n8,20871
16
+ plain/postgres/entrypoints.py,sha256=Jl1vHkAQX4M3dgHX5vKDalOh4kgsuuK88eucukQ4C1g,159
17
+ plain/postgres/enums.py,sha256=RJ7clhxsLFpBQ_vxD9HduDT4u_yJLO7K37v8rO--6OU,3236
18
+ plain/postgres/exceptions.py,sha256=7iaGYTfiWtODlGwKxcO4eB-C97qFKOVF8YqtUb-6mRo,5793
19
+ plain/postgres/expressions.py,sha256=t6WArp1sV4Z0Smctr95l7voSXJMWW9TaO8GE36y3lc0,64996
20
+ plain/postgres/forms.py,sha256=EDhrx8zu3Bw9BlOfsj5GUvbqI7sUQg6jAvYD-OxEMp8,27912
21
+ plain/postgres/indexes.py,sha256=2wBlFP1ijTkDiEWXYi7tJ9Uaj5J_507HM1CKzAYaPqE,11472
22
+ plain/postgres/lookups.py,sha256=1NqCFGE-15r9tFbfsscR1JxaSgeo5QaRV8N-1EdJfMs,26138
23
+ plain/postgres/meta.py,sha256=JK3ZDpQ6wfbGewGbAxuO9XC_pvttpEswtsXuQNj8BwE,22507
24
+ plain/postgres/options.py,sha256=FHYrpr-ccM8fVus5va5LZjun8K441kst_yRKN9JMsQ4,7429
25
+ plain/postgres/otel.py,sha256=l-6qgwt4iuSk3DUBsGRDx_ZmCLbC_JwyLFB-gJkUI3o,7192
26
+ plain/postgres/preflight.py,sha256=42vaUBJfAeN38QaNx7zI0-c-sWJzcqhpLmgg0u4qFOo,12890
27
+ plain/postgres/query.py,sha256=1TE84R13QdEK98ahTeL_QJdJ_IB4Ze97n5FWCXA_ARM,88126
28
+ plain/postgres/query_utils.py,sha256=7mye7YpXvifml5fpaYKvyO42B__Nb0LLtVoByMYapVE,16188
29
+ plain/postgres/registry.py,sha256=YHnXseyLAMv3eGCec2l_9nNc5q6DucJGRd3kEJKu3tI,8661
30
+ plain/postgres/schema.py,sha256=8kBzZ9JAp6X4AzT4_5B04B7Ii6wBTzLLXBkxrcVJx-I,72659
31
+ plain/postgres/transaction.py,sha256=SWmjIoKowmI13kjJfa-PDNWQVDijx2I6m4d6t3FRMaw,8603
32
+ plain/postgres/types.py,sha256=4-UVLtCTWF5_a2ZYPbDKnLsX0cy17iNCQLZGPaskkDo,2254
33
+ plain/postgres/types.pyi,sha256=jGi-WBIKVGIK1SWnWezk1dIip-UDXhCDjicSI-VsfN8,21225
34
+ plain/postgres/utils.py,sha256=tiBsnMma9bTEJ9SDmpNvX0W_JNo9-z9aPR2qmC__MHg,11303
35
+ plain/postgres/agents/.claude/rules/plain-postgres.md,sha256=rDDd7qX2dLc5s8IRTfe18oMwGsYunqG-rqps7qLbcb8,3430
36
+ plain/postgres/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ plain/postgres/backups/cli.py,sha256=LixGTTvla0szg6ph4P-YzP0_eBVmGIKyYngqrxj33Wo,4269
38
+ plain/postgres/backups/clients.py,sha256=k-xlQHrVRcMM3PcXs8qOjZhhxRP-8glb85RD2Mb7zcg,3374
39
+ plain/postgres/backups/core.py,sha256=z_8RAkHd4m0Ep8Gg27a6rcZwOGYMJ2QVIXxaECY6LAM,5290
40
+ plain/postgres/cli/__init__.py,sha256=DOhkcCid5_jtnMd7QJ8HKV5414He0bFqzFbCxsd2n4o,61
41
+ plain/postgres/cli/db.py,sha256=DPTEode-vLerwTOk-83B-8Jx_o4WwjxfRwTOzNA-C20,4414
42
+ plain/postgres/cli/migrations.py,sha256=qz4el_D-wV5KF6Tip6r5qRlCHnsVbszmomUxVlDCI80,40600
43
+ plain/postgres/fields/__init__.py,sha256=nnFqOF52qa-QHVWI_xPOML-lOIZvmocY8gpjocgjlxc,74429
44
+ plain/postgres/fields/encrypted.py,sha256=PjNWmyRN1I6ds_v7mpdIITLI1lUhdupE2wYq3IpX5s0,13122
45
+ plain/postgres/fields/json.py,sha256=tu2MK5A6ngFTNEzhdDLVfJdRwgsT5ceMPL5O7_eMb98,12939
46
+ plain/postgres/fields/mixins.py,sha256=9T1BFOAVika1AJodKIe7IzVE-PVh_j7KIwyAxolE5rk,946
47
+ plain/postgres/fields/related.py,sha256=7WKnkk3agLaAeyEYll6QoIadjpxbOblLGE_xJMfqGm0,47573
48
+ plain/postgres/fields/related_descriptors.py,sha256=x0MROuQS5LMq6SXbtZyIXU-qOopaJ92xniX2fcESgXA,11938
49
+ plain/postgres/fields/related_lookups.py,sha256=wPKS2zb_TGOL0PsjpxOL9_4CC5AXaVbxxVBpHLkenMs,8699
50
+ plain/postgres/fields/related_managers.py,sha256=XNJHMVqigl-MH6ew-lSEPAhT50oFlALBXxajNpriF0U,25645
51
+ plain/postgres/fields/reverse_descriptors.py,sha256=9OpxJq8Ps-m8eqVAqUqGciHmXWADEqQDljhrEyN_nlA,8924
52
+ plain/postgres/fields/reverse_related.py,sha256=PNA0hM_QOvw_CZ8v9iCSUe3R0w7q3465F8ufbtwLTPg,11056
53
+ plain/postgres/fields/timezones.py,sha256=zKBsKxARQqYYnBcMUp-NkV-ZMLqOV2hio1FnKp-iHf8,5124
54
+ plain/postgres/functions/__init__.py,sha256=Ol_5eeRDCn4dqcZvbeY8pYvk49cfRo1o-HYjKp8ktOQ,2634
55
+ plain/postgres/functions/comparison.py,sha256=ZKqJ32i8K2qSTp_Fe5W4Sfv1yJPTZgLbvdz8DMwo-2E,3947
56
+ plain/postgres/functions/datetime.py,sha256=dy1YA34OEbCDqQiGEk30PbE4B9hlla95PTqYfawo9CI,13861
57
+ plain/postgres/functions/math.py,sha256=D1rPp3ixEktD2TNDXKzbnxBde_qvj2FYVqkB7lJ7ZY4,2830
58
+ plain/postgres/functions/mixins.py,sha256=1RaydLkYLQQ3y-U0SWgI8trer_t67ETYYbLLN8saDdo,1942
59
+ plain/postgres/functions/text.py,sha256=V4G5ROl6S9gMinaQCEZgZgD352CTt67Mhzi69QJ9qx4,7471
60
+ plain/postgres/functions/window.py,sha256=MTKxtx7csaKD5cMkLZbwIZIjW3buDKwbuA9b71IO6kg,2989
61
+ plain/postgres/migrations/__init__.py,sha256=WrxehdOjTUmnVMp5ovTYS22xbT2yTGItmR5d06sPiDA,1106
62
+ plain/postgres/migrations/autodetector.py,sha256=2uELmfgj9JegE7ydI9rWGyhc47FgX-_KYzTwC7rEy-g,61674
63
+ plain/postgres/migrations/exceptions.py,sha256=rRejeiddtq-MKYD8EiPO6wxbxaTzfUFR3KBMxTaEGKw,1145
64
+ plain/postgres/migrations/executor.py,sha256=SXjp5wQ6ZlywKJdBskZiMc1zQz-CRoEA1-Ktu7e7GbE,7560
65
+ plain/postgres/migrations/graph.py,sha256=FQOkrVX2Q6nOXfJjTyasgaL7AYG1TJoYnHKJn-zj-Ws,14486
66
+ plain/postgres/migrations/loader.py,sha256=D9Q_1fhwDup2uDTN6Drk2ig6Ig6tqymdQDjLy81l2aw,17123
67
+ plain/postgres/migrations/migration.py,sha256=eH6jCV_z0mP30BKu381ZZc45otXJpI4Yes38HKqaf10,6897
68
+ plain/postgres/migrations/optimizer.py,sha256=Kk8-KBB51mYiR96hp8F7ZhFvdVg7DYyujpKmp8b9T6A,3385
69
+ plain/postgres/migrations/questioner.py,sha256=n5M6Klrdks-a8U7dbI95_r3TzBf_1y4BlYalEgYtrlE,12950
70
+ plain/postgres/migrations/recorder.py,sha256=TcX0KfO_zb0_i288PZQXWofamIOYW-R8SNH9POn3gSA,4237
71
+ plain/postgres/migrations/serializer.py,sha256=sp5PeSBxr3UafmcL8fsEqtjYjcq4t2kgL4PiQlIs9HU,13517
72
+ plain/postgres/migrations/state.py,sha256=kr2I-2Ti4Pu5e_mqIjtTMdERLklgHoUr1xZng3HR9f8,35468
73
+ plain/postgres/migrations/utils.py,sha256=9N3fI_z-I6YglvpMXmMofCbcpYy0DtkeiABB4bR7L54,5157
74
+ plain/postgres/migrations/writer.py,sha256=415aV--wAKm4aNKj6dJv5RV6ONF3BC0nFWjTf2uuLFI,11239
75
+ plain/postgres/migrations/operations/__init__.py,sha256=kJGN1yzXDzUbYjxzVBUnI6ovV4gazHfsqakzZGaX_Lc,694
76
+ plain/postgres/migrations/operations/base.py,sha256=YEc7DY-jScb4H1kR0hSZfSi-v_H9oJJtootoMCHwAJ0,4967
77
+ plain/postgres/migrations/operations/fields.py,sha256=mqqcXfxAz-ULiR2-ofl2CNviEX70DXwm9jbcAxlNiCA,12748
78
+ plain/postgres/migrations/operations/models.py,sha256=ifwxabuibq4jnpbwy44bj4nn-Ul4woYOQWysgyyIdlc,26884
79
+ plain/postgres/migrations/operations/special.py,sha256=bRj2OUv1uCL_eX3xkyL-rgCw_btNV3nKGAWz_52J2YM,6444
80
+ plain/postgres/sql/__init__.py,sha256=z-4o51xhbWNE3_wEIfDBL0qcyapYWyriEwKQ4lvwpnA,655
81
+ plain/postgres/sql/compiler.py,sha256=x5Pew5NkAaWAuhXRXrdBipauC1M6jFPT9bWUK1hbMQw,76844
82
+ plain/postgres/sql/constants.py,sha256=W9e3iB5uyapFBbF8cA7tvxVh03ccTVHtS49IGXfB8Bk,494
83
+ plain/postgres/sql/datastructures.py,sha256=PeCdnlk_Uub427P_0HjvpXeCU0FwEAVDmVmgUeTjsQs,7581
84
+ plain/postgres/sql/query.py,sha256=gyuMDrZRjHHO7OMWM5t43dKauLk7x4aRt_AfZp37tu8,123316
85
+ plain/postgres/sql/where.py,sha256=fnuiv1OxWz4Y5hf4p7pNL5XV4jNzJpsYr8OCfhsHamc,13407
86
+ plain/postgres/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
+ plain/postgres/test/pytest.py,sha256=wYUcKc5hip3kcFAk0ed7uZ7ysfMhYQw-1rMcKHIHtqM,3758
88
+ plain/postgres/test/utils.py,sha256=XkEGIDBLrcBJips4JhwLPnpVYV0DeTNXymVYnCFj-n0,635
89
+ plain_postgres-0.84.0.dist-info/METADATA,sha256=qCJWwWV1rOrK63geh2G8fsSC60f5frcgGtAq9OjvJ68,30240
90
+ plain_postgres-0.84.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
91
+ plain_postgres-0.84.0.dist-info/entry_points.txt,sha256=HcOLa6GeRTohG8SMW-1sYAKk63kCC62IoAlXatUimMk,120
92
+ plain_postgres-0.84.0.dist-info/licenses/LICENSE,sha256=m0D5O7QoH9l5Vz_rrX_9r-C8d9UNr_ciK6Qwac7o6yo,3175
93
+ plain_postgres-0.84.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,5 @@
1
+ [plain.setup]
2
+ postgres-setup = plain.postgres.entrypoints:setup
3
+
4
+ [pytest11]
5
+ plain.postgres = plain.postgres.test.pytest
@@ -0,0 +1,61 @@
1
+ ## Plain is released under the BSD 3-Clause License
2
+
3
+ BSD 3-Clause License
4
+
5
+ Copyright (c) 2023, Dropseed, LLC
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are met:
9
+
10
+ 1. Redistributions of source code must retain the above copyright notice, this
11
+ list of conditions and the following disclaimer.
12
+
13
+ 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ this list of conditions and the following disclaimer in the documentation
15
+ and/or other materials provided with the distribution.
16
+
17
+ 3. Neither the name of the copyright holder nor the names of its
18
+ contributors may be used to endorse or promote products derived from
19
+ this software without specific prior written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+
32
+
33
+ ## This package contains code forked from github.com/django/django
34
+
35
+ Copyright (c) Django Software Foundation and individual contributors.
36
+ All rights reserved.
37
+
38
+ Redistribution and use in source and binary forms, with or without modification,
39
+ are permitted provided that the following conditions are met:
40
+
41
+ 1. Redistributions of source code must retain the above copyright notice,
42
+ this list of conditions and the following disclaimer.
43
+
44
+ 2. Redistributions in binary form must reproduce the above copyright
45
+ notice, this list of conditions and the following disclaimer in the
46
+ documentation and/or other materials provided with the distribution.
47
+
48
+ 3. Neither the name of Django nor the names of its contributors may be used
49
+ to endorse or promote products derived from this software without
50
+ specific prior written permission.
51
+
52
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
53
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
54
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
55
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
56
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
57
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
58
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
59
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
61
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.