kaq-quant-common 0.1.84__tar.gz → 0.1.86__tar.gz
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.
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/PKG-INFO +1 -1
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/instruction_client.py +13 -25
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/instruction_server_base.py +24 -23
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/models/order.py +25 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_ddb_stream_write_resources.py +2 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_mysql_resources.py +8 -3
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/pyproject.toml +1 -1
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/README.md +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/common/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/common/api_interface.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/common/auth.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/api_client_base.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/api_server_base.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/helper/order_helper.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/models/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/models/account.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/models/position.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/instruction/models/transfer.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/exchange/models.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/exchange/ws_exchange_client.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/exchange/ws_exchange_server.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/instruction/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/instruction/ws_instruction_client.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/instruction/ws_instruction_server_base.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/models.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/ws_client_base.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/ws_server_base.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/ddb_table_monitor.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/http_monitor.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/modules/limit_order_helper.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/modules/limit_order_symbol_monitor.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/modules/limit_order_symbol_monitor_group.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/monitor_base.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/monitor_group.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/redis_table_monitor.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/statistics/funding_rate_history_statistics.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/statistics/kline_history_statistics.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/ws_wrapper.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/config/config.yaml +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_ddb_pool_stream_read_resources.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_ddb_stream_init_resources.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_ddb_stream_read_resources.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_mysql_init_resources.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_postgresql_resources.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_quant_hive_resources.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/resources/kaq_redis_resources.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/__init__.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/dagster_job_check_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/dagster_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/date_util.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/enums_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/error_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/hash_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/log_time_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/logger_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/mytt_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/signal_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/sqlite_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/uuid_utils.py +0 -0
- {kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/yml_utils.py +0 -0
|
@@ -4,35 +4,19 @@ from typing import Type, TypeVar
|
|
|
4
4
|
|
|
5
5
|
from kaq_quant_common.api.rest.api_client_base import ApiClientBase
|
|
6
6
|
from kaq_quant_common.api.rest.instruction.models import (
|
|
7
|
-
InstructionRequestBase,
|
|
8
|
-
InstructionResponseBase,
|
|
9
|
-
)
|
|
7
|
+
InstructionRequestBase, InstructionResponseBase)
|
|
10
8
|
from kaq_quant_common.api.rest.instruction.models.account import (
|
|
11
|
-
ContractBalanceRequest,
|
|
12
|
-
ContractBalanceResponse,
|
|
13
|
-
)
|
|
9
|
+
ContractBalanceRequest, ContractBalanceResponse)
|
|
14
10
|
from kaq_quant_common.api.rest.instruction.models.order import (
|
|
15
|
-
AllOpenOrdersRequest,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
ChangeLeverageResponse,
|
|
21
|
-
ModifyOrderRequest,
|
|
22
|
-
ModifyOrderResponse,
|
|
23
|
-
OrderRequest,
|
|
24
|
-
OrderResponse,
|
|
25
|
-
QuerySymbolConfigRequest,
|
|
26
|
-
QuerySymbolConfigResponse,
|
|
27
|
-
)
|
|
11
|
+
AllOpenOrdersRequest, AllOpenOrdersResponse, CancelOrderRequest,
|
|
12
|
+
CancelOrderResponse, ChangeLeverageRequest, ChangeLeverageResponse,
|
|
13
|
+
LimitOrderBookRequest, LimitOrderBookResponse, ModifyOrderRequest,
|
|
14
|
+
ModifyOrderResponse, OrderRequest, OrderResponse, QuerySymbolConfigRequest,
|
|
15
|
+
QuerySymbolConfigResponse)
|
|
28
16
|
from kaq_quant_common.api.rest.instruction.models.position import (
|
|
29
|
-
QueryPositionRequest,
|
|
30
|
-
QueryPositionResponse,
|
|
31
|
-
)
|
|
17
|
+
QueryPositionRequest, QueryPositionResponse)
|
|
32
18
|
from kaq_quant_common.api.rest.instruction.models.transfer import (
|
|
33
|
-
TransferRequest,
|
|
34
|
-
TransferResponse,
|
|
35
|
-
)
|
|
19
|
+
TransferRequest, TransferResponse)
|
|
36
20
|
from kaq_quant_common.utils import uuid_utils
|
|
37
21
|
|
|
38
22
|
R = TypeVar("R", bound=InstructionResponseBase)
|
|
@@ -86,3 +70,7 @@ class InstructionClient(ApiClientBase):
|
|
|
86
70
|
# 查询合约账户余额
|
|
87
71
|
def contract_balance(self, request: ContractBalanceRequest) -> ContractBalanceResponse:
|
|
88
72
|
return self._make_request("contract_balance", request, ContractBalanceResponse)
|
|
73
|
+
|
|
74
|
+
# 查询5档深度
|
|
75
|
+
def get_limit_order(self, request: LimitOrderBookRequest) -> LimitOrderBookResponse:
|
|
76
|
+
return self._make_request("get_limit_order", request, LimitOrderBookResponse)
|
|
@@ -4,32 +4,24 @@ from abc import ABC, abstractmethod
|
|
|
4
4
|
|
|
5
5
|
from kaq_quant_common.api.common.api_interface import ApiInterface, api_method
|
|
6
6
|
from kaq_quant_common.api.rest.api_server_base import ApiServerBase
|
|
7
|
-
from kaq_quant_common.api.rest.instruction.helper.order_helper import
|
|
8
|
-
|
|
7
|
+
from kaq_quant_common.api.rest.instruction.helper.order_helper import \
|
|
8
|
+
OrderHelper
|
|
9
|
+
from kaq_quant_common.api.rest.instruction.models import \
|
|
10
|
+
InstructionResponseBase
|
|
9
11
|
from kaq_quant_common.api.rest.instruction.models.account import (
|
|
10
|
-
ContractBalanceRequest,
|
|
11
|
-
ContractBalanceResponse,
|
|
12
|
-
)
|
|
12
|
+
ContractBalanceRequest, ContractBalanceResponse)
|
|
13
13
|
from kaq_quant_common.api.rest.instruction.models.order import (
|
|
14
|
-
AllOpenOrdersRequest,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
ChangeLeverageResponse,
|
|
20
|
-
ModifyOrderRequest,
|
|
21
|
-
ModifyOrderResponse,
|
|
22
|
-
OrderRequest,
|
|
23
|
-
OrderResponse,
|
|
24
|
-
QuerySymbolConfigRequest,
|
|
25
|
-
QuerySymbolConfigResponse,
|
|
26
|
-
)
|
|
14
|
+
AllOpenOrdersRequest, AllOpenOrdersResponse, CancelOrderRequest,
|
|
15
|
+
CancelOrderResponse, ChangeLeverageRequest, ChangeLeverageResponse,
|
|
16
|
+
LimitOrderBookRequest, LimitOrderBookResponse, ModifyOrderRequest,
|
|
17
|
+
ModifyOrderResponse, OrderRequest, OrderResponse, QuerySymbolConfigRequest,
|
|
18
|
+
QuerySymbolConfigResponse)
|
|
27
19
|
from kaq_quant_common.api.rest.instruction.models.transfer import (
|
|
28
|
-
TransferRequest,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
from kaq_quant_common.resources.
|
|
32
|
-
|
|
20
|
+
TransferRequest, TransferResponse)
|
|
21
|
+
from kaq_quant_common.resources.kaq_mysql_resources import \
|
|
22
|
+
KaqQuantMysqlRepository
|
|
23
|
+
from kaq_quant_common.resources.kaq_redis_resources import \
|
|
24
|
+
KaqQuantRedisRepository
|
|
33
25
|
|
|
34
26
|
|
|
35
27
|
class InstructionServerBase(ApiServerBase, ApiInterface, ABC):
|
|
@@ -96,6 +88,11 @@ class InstructionServerBase(ApiServerBase, ApiInterface, ABC):
|
|
|
96
88
|
@api_method(ContractBalanceRequest, ContractBalanceResponse)
|
|
97
89
|
def contract_balance(self, request: ContractBalanceRequest) -> ContractBalanceResponse:
|
|
98
90
|
return self._on_contract_balance(request)
|
|
91
|
+
|
|
92
|
+
# 查询5档深度
|
|
93
|
+
@api_method(LimitOrderBookRequest, LimitOrderBookResponse)
|
|
94
|
+
def get_limit_order(self, request: LimitOrderBookRequest) -> LimitOrderBookResponse:
|
|
95
|
+
return self._on_get_limit_order(request)
|
|
99
96
|
|
|
100
97
|
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ abstract methods
|
|
101
98
|
|
|
@@ -130,3 +127,7 @@ class InstructionServerBase(ApiServerBase, ApiInterface, ABC):
|
|
|
130
127
|
@abstractmethod
|
|
131
128
|
def _on_contract_balance(self, request: ContractBalanceRequest) -> ContractBalanceResponse:
|
|
132
129
|
pass
|
|
130
|
+
|
|
131
|
+
@abstractmethod
|
|
132
|
+
def _on_get_limit_order(self, request: LimitOrderBookRequest) -> LimitOrderBookResponse:
|
|
133
|
+
pass
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
|
+
import pandas as pd
|
|
4
5
|
from pydantic import BaseModel
|
|
5
6
|
|
|
6
7
|
from kaq_quant_common.utils import uuid_utils
|
|
@@ -221,3 +222,27 @@ class ChangeMarginModeRequest(InstructionRequestBase):
|
|
|
221
222
|
class ChangeMarginModeResponse(InstructionResponseBase):
|
|
222
223
|
# 是否联合
|
|
223
224
|
is_margin: bool
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 5档深度
|
|
228
|
+
class LimitOrderBookInfo(BaseModel):
|
|
229
|
+
# 价格
|
|
230
|
+
price: float
|
|
231
|
+
# 数量
|
|
232
|
+
vol: float
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class LimitOrderBookRequest(InstructionRequestBase):
|
|
236
|
+
# 交易对
|
|
237
|
+
symbol: str
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
class LimitOrderBookResponse(InstructionResponseBase):
|
|
241
|
+
# 交易对
|
|
242
|
+
symbol: str
|
|
243
|
+
# 接口返回的ts
|
|
244
|
+
event_time: int
|
|
245
|
+
# 买单数据
|
|
246
|
+
bids: list[LimitOrderBookInfo]
|
|
247
|
+
# 卖单数据
|
|
248
|
+
asks: list[LimitOrderBookInfo]
|
|
@@ -48,6 +48,8 @@ class KaqQuantDdbStreamWriteRepository:
|
|
|
48
48
|
self.logger.error(f'KaqQuantDdbStreamWriteRepository.save2stream is occured error: tableName is {ddb_table_name} - {str(e)} - {str(traceback.format_exc())}')
|
|
49
49
|
|
|
50
50
|
def build_insert_values_fast(self, df):
|
|
51
|
+
if df.empty:
|
|
52
|
+
return []
|
|
51
53
|
dtypes = df.dtypes.tolist()
|
|
52
54
|
# 提前确定哪些列需要加引号
|
|
53
55
|
str_idx = {i for i, dt in enumerate(dtypes) if dt == object or dt == 'object' or dt == 'str'}
|
|
@@ -2,7 +2,7 @@ import os
|
|
|
2
2
|
import threading
|
|
3
3
|
import time
|
|
4
4
|
import traceback
|
|
5
|
-
|
|
5
|
+
import datetime
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
import pandas as pd
|
|
@@ -102,8 +102,13 @@ class KaqQuantMysqlRepository:
|
|
|
102
102
|
# 从连接池获取连接
|
|
103
103
|
session = self.session_maker()
|
|
104
104
|
try:
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
# 1. 计算上周一的日期字符串
|
|
106
|
+
today = datetime.date.today()
|
|
107
|
+
# 2. 先计算本周一,再减去 7 天
|
|
108
|
+
last_monday = today - datetime.timedelta(days=today.weekday(), weeks=1)
|
|
109
|
+
# 3. 格式化
|
|
110
|
+
last_monday_str = last_monday.strftime('%Y%m%d')
|
|
111
|
+
sql = f"RENAME TABLE {table_name} TO {table_name}_{last_monday_str};"
|
|
107
112
|
session.execute(text(sql))
|
|
108
113
|
return True
|
|
109
114
|
except Exception as e:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/common/api_interface.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/api_client_base.py
RENAMED
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/rest/api_server_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/exchange/models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/instruction/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/ws_client_base.py
RENAMED
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/api/ws/ws_server_base.py
RENAMED
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/ddb_table_monitor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/monitor_group.py
RENAMED
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/common/redis_table_monitor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kaq_quant_common-0.1.84 → kaq_quant_common-0.1.86}/kaq_quant_common/utils/log_time_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|