tms_pproapi
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
tms_pproapi [2016/02/17 13:59] – [GetTransactions] maya | tms_pproapi [2018/03/20 13:20] (current) – removed maya | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | **This work is licensed under a [[http:// | ||
- | ====== PPro8 TMS PProAPI ====== | ||
- | |||
- | =====Important information===== | ||
- | When using the PProAPI, keep the following in mind:\\ | ||
- | * The API user is responsible for all profits/ | ||
- | * API-generated order activity is subjected to all the same checks and surveillance as manual order activity\\ | ||
- | * It is the API user’s responsibility to monitor his or her trade activity in real time\\ | ||
- | * If an API user generates problematic order activity using the API, access may be restricted until such time as the user can demonstrate that corrective action has been taken\\ | ||
- | |||
- | **Disclaimer: | ||
- | |||
- | The assumption is that users of the API have a basic knowledge of programming and how to integrate URL calls with other tools, and as a result the support provided is limited, for the most part, to the documentation found below.\\ | ||
- | |||
- | It is entirely up to the user how they want to interact with the API. It is possible to use the URL calls and process the CSV data using any programming language.\\ | ||
- | |||
- | =====Overview====== | ||
- | |||
- | The __[[ppro8_trading_platform_manuals|PPro8]]__ API is a web service which, when enabled, allows the user to pass commands using a URL format and receive responses in XML, or with data being written to .log files on the local drive for access by third-party applications. | ||
- | |||
- | To launch the PProAPI, a user launches the PPro8 client with the following command:\\ | ||
- | |||
- | < | ||
- | |||
- | **Note:** any port may be used; 8080 is just used in all examples. If you choose to use a different port, we recommend you limit yourself to the range from 1000–65535, | ||
- | |||
- | When logged in, the user can go to the PProAPI portal using this link: // | ||
- | |||
- | **Note:** throughout this instruction manual, example URLs are presented omitting // | ||
- | |||
- | {{ : | ||
- | |||
- | =====UDP functionality===== | ||
- | |||
- | To ensure proper UDP functionality, | ||
- | |||
- | If you want to verify UDP functionality, | ||
- | |||
- | To use NetCat, launch it with the following command line, for example: | ||
- | |||
- | < | ||
- | |||
- | ...where: | ||
- | |||
- | -u is UDP\\ | ||
- | -l means " | ||
- | -p is port, the number of which varies depending on the registration being sent\\ | ||
- | |||
- | ...taken together, this command line means "UDP port 4135 is actively listening." | ||
- | |||
- | You can then use the command line to register and send data to a port you set. | ||
- | |||
- | For example: | ||
- | |||
- | Register L1 data for ZXZZT.NQ and send data to UDP port 4135. | ||
- | |||
- | < | ||
- | =====Data Types===== | ||
- | Use the API to Register/ | ||
- | |||
- | ====Registration==== | ||
- | |||
- | Use the Register command to register for each of the available data types. | ||
- | |||
- | In each registration, | ||
- | |||
- | < | ||
- | |||
- | On the other hand, **bytype** sends all registered symbol data to a specified file. | ||
- | |||
- | Syntax: | ||
- | |||
- | < | ||
- | |||
- | If the specified file contains **TOS**, **L1**, **L2**, and **OSTAT**, you can choose which symbol goes to the specified file (**bytype**), | ||
- | |||
- | The same applies to the Deregister command. | ||
- | ====Register commands==== | ||
- | |||
- | The Register command is split into three separate commands: GetSnapshot, | ||
- | |||
- | Using these commands, you can set the output and enable or disable it being written by setting the status on/off and writing only snapshot, live data, or both depending on the command. | ||
- | |||
- | ===GetSnapshot=== | ||
- | |||
- | Use this command to get existing data (the last 100 records, but no new data) for the symbol. | ||
- | |||
- | Syntax: | ||
- | |||
- | < | ||
- | |||
- | ===Register=== | ||
- | |||
- | Use this command as before, to register live data and get new information for the symbol. | ||
- | |||
- | Syntax: | ||
- | |||
- | < | ||
- | |||
- | ===SetOutput=== | ||
- | |||
- | Use this command to set the output information for the symbol and define where the data should be written, either **bykey** or **bytype**. | ||
- | |||
- | Syntax: | ||
- | |||
- | < | ||
- | |||
- | ===Deregister=== | ||
- | |||
- | The Deregister command is used to deregister for each of the available data types. This stops the API from writing to the relevant log files or making the L1 calls available.\\ | ||
- | |||
- | Syntax: | ||
- | |||
- | < | ||
- | |||
- | Specific examples for each data type appear below.\\ | ||
- | ====Level 1 (L1)==== | ||
- | **Example: | ||
- | |||
- | This command registers the API to receive all Level 1 price/size updates for symbol ZVZZT.NQ. These updates are written to a file in the PPro8 launch directory with the name L1_1_ZVZZT.NQ.log, | ||
- | |||
- | Messages for L1 must include the symbol parameter. | ||
- | |||
- | Each L1 update is a comma-separated line of data with the following fields: | ||
- | * LocalTime=09: | ||
- | * MarketTime=09: | ||
- | * Symbol=XIU.TO <- the symbol the update applies to, in the format < | ||
- | * BidPrice=19.19 <- the bid price of the L1 update\\ | ||
- | * BidSize=8000 <- the bid size of the L1 update\\ | ||
- | * AskPrice=19.24 <- the ask price of the L1 update\\ | ||
- | * AskSize=16000 <- the ask size of the L1 update\\ | ||
- | * Tick=? <- whether the latest update is related to an uptick/ | ||
- | ====Time of Sales (TOS)==== | ||
- | Example: < | ||
- | |||
- | This command registers the API to receive all Time of Sales prints for symbol ZVZZT.NQ. These updates are then written to a file in the PPro8 launch directory with the name TOS_1_ZVZZT.NQ.log. | ||
- | |||
- | Messages for TOS must include the symbol parameter. | ||
- | |||
- | TOS messages are stored in a separate file for each registered symbol. | ||
- | |||
- | Each TOS update is a comma-separated line of data with the following fields:\\ | ||
- | * LocalTime=09: | ||
- | * MarketTime=09: | ||
- | * Type=1 <- the type of snapshot data coming in\\ | ||
- | * Price=8.63 <- the price at which the trade occurred\\ | ||
- | * Size=100 <- the number of shares involved in the trade\\ | ||
- | * Source=17 <- an internal value for mapping to the quote source\\ | ||
- | * Condition=? <- the Sales Condition value, where applicable\\ | ||
- | * Tick=? <- identifies the trade as an uptick/ | ||
- | * MmId=C <- the market center on which the trade occurred\\ | ||
- | * SubMarketId= <- the submarket center on which the trade occurred, if applicable\\ | ||
- | |||
- | Information for the Type parameter: | ||
- | Type 0 = live feed\\ | ||
- | Type 1 = start of snapshot\\ | ||
- | Type 2 = snapshot record\\ | ||
- | Type 3 = end of snapshot\\ | ||
- | |||
- | **Examples: | ||
- | < | ||
- | < | ||
- | < | ||
- | < | ||
- | |||
- | For more information, | ||
- | |||
- | ====Market Depth (L2)==== | ||
- | Example: < | ||
- | |||
- | This command registers the API to receive all Level 2/Market Depth updates for symbol ZVZZT. These updates are then written to a file in the PPro8 launch directory with the name L2_1_ZVZZT.NQ.log.\\ | ||
- | |||
- | Messages for L2 must include the symbol parameter.\\ | ||
- | |||
- | L2 messages are stored in a separate file for each registered symbol.\\ | ||
- | |||
- | Each L2 update is a comma-separated line of data with the following fields:\\ | ||
- | * LocalTime=08: | ||
- | * MarketTime=08: | ||
- | * Mmid=ANON <- the MMID associated with the update\\ | ||
- | * Side=B <- the side of the update\\ | ||
- | * Price=8.6 <- the price of the update\\ | ||
- | * Volume=100 <- the size in shares of the updated quote\\ | ||
- | * Depth=1 <- the number of orders that make up the quote, where applicable\\ | ||
- | * SequenceNumber=27003 <- the sequence number is unique by MMID, Price, and Side, and can be used to correct for out-of-sequence data\\ | ||
- | |||
- | Each update either a) creates a new level, or b) replaces the existing values for that MMID, Price, and Side combination. | ||
- | |||
- | For example, if you already have an ANON Bid @ 8.60 for 400 shares, then the above example data would replace that so the new values would be ANON Bid @ 8.60 for 100 shares. | ||
- | |||
- | === Market Depth snapshot === | ||
- | When the API registers for the L2 feed on a symbol, it first receives a snapshot. This snapshot represents the current quote state of the symbol, and should then be updated with the real-time messages coming in.\\ | ||
- | |||
- | The snapshot begins with a line where Side=s, for example: < | ||
- | |||
- | All messages making up the snapshot have SequenceNumber=0.\\ | ||
- | |||
- | The snapshot ends with a line where Side=e, for example: | ||
- | < | ||
- | ====Imbalance (IMBALANCE)==== | ||
- | **Example: | ||
- | < | ||
- | |||
- | This command registers the API to receive all Imbalance data for region 1 (North America). This data is then written to a file in the PPro8 launch directory with the name: IMBLO_1_ALL.log.\\ | ||
- | |||
- | Messages for IMBALANCE must include the region parameter.\\ | ||
- | |||
- | Each IMBALANCE update is a comma-separated line of data with the following fields:\\ | ||
- | * LocalTime=15: | ||
- | * MarketTime=15: | ||
- | * Side=S <- the side of the imbalance\\ | ||
- | * Type=O <- the type of imbalance, where applicable\\ | ||
- | * Status= | ||
- | * Symbol=LKQ.NQ <- the symbol on which the imbalance exists\\ | ||
- | * Price=32.875 <- the price of the stock\\ | ||
- | * Volume=3578 <- the size of the imbalance in shares\\ | ||
- | * Mmid=Q <- the market of the imbalance (Q=NASDAQ, N=NYSE, A=AMEX, T=Toronto, V=Venture)\\ | ||
- | * AuctionPrice=32.84 <- the theoretical auction price, where applicable\\ | ||
- | * ContinuousPrice=32.86 <- the continuous price on the primary market, where applicable\\ | ||
- | * PairedVolume=67428 <- the size, in shares, already paired off\\ | ||
- | |||
- | Each imbalance update represents the current size of the imbalance. Previous messages for the same symbol can be discarded. | ||
- | ====Order Status (OSTAT)==== | ||
- | Example: < | ||
- | |||
- | **Note:** registering for OSTAT can only be done **bytype**. | ||
- | |||
- | This command registers the API to receive all Order Status (OSTAT) messages for the user in region 1 (North America). This data is then written to a file in the PPro8 launch directory with the name OSTAT_1_< | ||
- | |||
- | Messages for OSTAT must include the region parameter.\\ | ||
- | |||
- | One file is created for each region. In order to see all order updates—including internal rejects—a user will need to monitor both the OSTAT and ORDEREVENT logs.\\ | ||
- | |||
- | Each OSTAT update is a comma-separated line of data with the following fields:\\ | ||
- | * LocalTime=09: | ||
- | * MarketDateTime=20131011-09: | ||
- | * Currency=CAD <- the currency of the order\\ | ||
- | * Symbol=TD <- the symbol on which the order was submitted\\ | ||
- | * Gateway=2028 <- the Gateway ID on which the order was submitted\\ | ||
- | * Side=B <- the side on which the order was submitted\\ | ||
- | * OrderNumber=TESTTEST00000024M1713F3100000 <- the unique order number of the order\\ | ||
- | * Price=92.72 <- the price of the order status update; for a new order it is the order price, for Fill / PartialFill it represents the price of the shares executed\\ | ||
- | * Shares=100 <- the number of shares associated with the order status update; for a new order is it the order size, for a Fill / PartialFill it represents the number of shares executed\\ | ||
- | * Position=2 <- a sequence number for messages related to the unique order number, for example, 1 is first, 2 is second, and so on\\ | ||
- | * OrderState=Filled <- the status of the order represented by the update\\ | ||
- | * MarketID=2 <- the market on which the order was submitted\\ | ||
- | * CurrencyChargeGway=CAD <- the currency of the gateway charge\\ | ||
- | * ChargeGway=-0.31 <- the gateway charge associated with this status update\\ | ||
- | * CurrencyChargeAct=CAD <- the currency of the activity charge\\ | ||
- | * ChargeAct=0.011 <- the activity charge associated with this status update\\ | ||
- | * CurrencyChargeSec=CAD <- the currency of the SEC/ | ||
- | * ChargeSec=0 <- the SEC/ | ||
- | * CurrencyChargeExec=CAD <- the currency of the execution charge\\ | ||
- | * ChargeExec=0.16 <- the execution charge associated with this status update\\ | ||
- | * CurrencyChargeClr=CAD <- the currency of the clearing charge\\ | ||
- | * ChargeClr=0.008 <- the clearing charge associated with this status update\\ | ||
- | * OrderFlags=128 <- the order flags associated with the orders, used for internal processing only and to identify if the order was sent through PPro8 or the API\\ | ||
- | * CurrencyCharge=10 <- internal value, not relevant for external analysis\\ | ||
- | * Account=1TESTOF001TNVTESTTESTCAD1 <- the account associated with this order\\ | ||
- | * InfoCode=255 <- internal value for tracking OSTAT codes, not relevant for external analysis\\ | ||
- | * InfoText= LiqFlags=^Tag6888=20^Tag31=92.720^Tag9730=A <- additional information text, if any, associated with this status update\\ | ||
- | |||
- | **Note:** if the OrderFlags value is between 128 and 255, it means that the order originates from the API.\\ | ||
- | |||
- | You can use the OSTAT log, in combination with the ORDEREVENT log, to monitor the state of orders and track executions and associated fees. This data is also used by the PPro8 client software to update the Summary and History Log windows. | ||
- | ====Order Event (ORDEREVENT)==== | ||
- | **Example: | ||
- | |||
- | This command registers the API to receive all Order Event (ORDEREVENT) messages for the user in region 1 (North America). This data is then written to a file in the PPro8 launch directory with the name ORDEREVENT_1_< | ||
- | |||
- | Messages for ORDEREVENT must include the region parameter.\\ | ||
- | |||
- | One file is created for each region. This log can be combined with the OSTAT log to monitor for all order updates. The ORDEREVENT log includes internal reject messages (e.g., not enough buying power, or no shares available) which are not present in the OSTAT log.\\ | ||
- | |||
- | The primary use of the ORDEREVENT log is to recognize an order as rejected internally where it does not appear in the OSTAT log.\\ | ||
- | |||
- | Each ORDEREVENT update is a comma-separated line of data with the following fields:\\ | ||
- | * LocalTime=08: | ||
- | * MarketDateTime=20131025-08: | ||
- | * EventMessageType=1 <- the nature of the order event: 1 = NewOrder, 2 = CancelOrder, | ||
- | * EventFlavour=2 <- the internal state of the order event: 1 = Accepted, 2 = Rejected, 3 = PendingServer, | ||
- | * EventOriginatorId=1 <- the originator of the order event: 1 = Client, 2 = OPC, 3 = GS, 4 = SS\\ | ||
- | * OriginatorSeqId=0 <- the sequence number of the event sent by the originator\\ | ||
- | * Size=100 <- the size of the order, in shares\\ | ||
- | * Price=861000000 <- the price at which the order was submitted; uses PPro8 native price format, which needs to be divided by 10^8 (100000000) to show human-readable price\\ | ||
- | * OrderNumber=TESTTEST00000003M171401100000 <- the unique number of the order\\ | ||
- | * InfoText= <- additional information text associated with this order event, for example, the reject reason\\ | ||
- | |||
- | |||
- | Order_Event (ORDEREVENT) Flavour Descriptions as follows: | ||
- | |||
- | *0 NoOrderEventFlavour <- the order has no event flavour | ||
- | *1 RequestPending - reports about a request that was made have no effect on the order state (initially Holding) | ||
- | *2 Accepted - the order is on the market | ||
- | *3 PartFill - the order is not open (State to Filled) | ||
- | *4 Filled - order not open (State to Filled) | ||
- | *5 Cancel - the order is not open (State to PartCancelled or Cancelled) | ||
- | *6 RejectedOrderClosed - the request was rejected, and the order number requested is not/no longer open | ||
- | *7 RejectedOrderOpen - the request was rejected, but the order is still live on the market | ||
- | *8 RejectedNoConnection - the request was rejected due to a network issue | ||
- | *9 CancelReplace - (State remains unchanged, either Accepted or PartFilled) | ||
- | *10 Holding - from the PPro8 Client, the order is being held, awaiting an event before being sent (State→Holding) | ||
- | *11 LastOrderEventFlavour - the last order event flavour | ||
- | |||
- | **Note:** when price and sizes are pending OPC, an invalid value appears. This issue is usually corrected when we release a new OSM. If you believe this can affect trading, you may be able to filter them out as Size = -1. The description will also show the message 'New order, OPC Pending' | ||
- | ====PProAPI Index to Order Number (PAPIORDER)==== | ||
- | **Example: | ||
- | |||
- | This command registers the API to receive information on the order number associated with each order request ID. The data is then written to a file in the PPro8 launch directory with the name PAPIORDER_1_< | ||
- | |||
- | Messages for PAPIORDER must include the region parameter.\\ | ||
- | |||
- | You can use this log file to limit the number of ' | ||
- | |||
- | Each PAPIORDER update is a comma-separated line of data with the following fields:\\ | ||
- | * LocalTime=10: | ||
- | * PProApiIndex=3 <- the RequestID associated with an ExecuteOrder event as returned in XML\\ | ||
- | * OrderNumber=DV10600503000002M171407100000 <- the order number associated with the RequestID\\ | ||
- | ====Lv1 & Tos==== | ||
- | These are depreciated, | ||
- | |||
- | ====GetLv1==== | ||
- | |||
- | This command recalls Level 1 snapshot data. | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | This will bring up the following response: | ||
- | |||
- | < | ||
- | |||
- | This GetLv1 response is a comma-separated line of data that includes the following fields: | ||
- | |||
- | * Volume=798304 ← the volume of the symbol | ||
- | * LowPrice=55.1100 ← the low price | ||
- | * HighPrice=55.5000 ← the high price | ||
- | * OpenPrice=55.4000 ← the open price | ||
- | * ClosePrice=55.3400 ← the close price | ||
- | * MaxPermittedPrice=0 ← the maximum permitted price | ||
- | * MinPermittedPrice=0 ← the minimum permitted price | ||
- | * LotSize=100 ← the lot size | ||
- | * LastPrice=55.1100 ← the last price | ||
- | * InstrumentState=Open ← the instrument state | ||
- | * AssetClass=Equity ← the asset class | ||
- | * TickValue=0 ← the tick value | ||
- | * TickSize=0.00500000 ← the tick size | ||
- | * Currency=CAD ← the currency | ||
- | ====GetTransactions==== | ||
- | |||
- | This command recalls all executions for a user ID. This response no longer returns the **Market** parameter. Instead, the **Symbol** parameter returns both symbol and market extension, e.g., ZVZZT.NQ. | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | Response: | ||
- | |||
- | < | ||
- | =====Order-related commands===== | ||
- | |||
- | You can use the API to interact with orders in several ways. For more detailed examples, see the PProAPI Portal (// | ||
- | |||
- | ====ExecuteOrder==== | ||
- | **IMPORTANT**\\ | ||
- | When preparing to send an order using the API, follow these steps:\\ | ||
- | 1. Create a keyboard shortcut for the order type using __[[tms_keyboard_setup|Keyboard Setup]]__\\ | ||
- | 2. Press the keyboard shortcut to open the Order Edit Box in the __[[tms_stock_window|Stock Window]]__\\ | ||
- | 3. Note the fields that appear in the Order Edit Box. It is these fields that you need to define when setting up the URL command for the API.\\ | ||
- | |||
- | The ExecuteOrder command includes a number of values that can be entered depending on the chosen order type:\\ | ||
- | * symbol=< | ||
- | * limitprice=< | ||
- | * ordername=< | ||
- | * shares=< | ||
- | * priceadjust=< | ||
- | * stopprice=< | ||
- | * pegdifference=< | ||
- | * displaysize=< | ||
- | * displayrange=< | ||
- | * minexecsize=< | ||
- | |||
- | Syntax: | ||
- | |||
- | **Example: | ||
- | |||
- | This example would send a Reserve order on the TSX with a limit price of 6.90, size of 1000, and display size of 100 shares.\\ | ||
- | |||
- | ====GetOstats==== | ||
- | |||
- | ====ExecuteBasketOrder==== | ||
- | |||
- | Use this command to send a basket order by name (set using the __[[tms_basket_order|Basket Order]]__ window in PPro8). | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | ====ExecuteListOrder==== | ||
- | |||
- | Use this command to send orders from an order list (set using the __[[tms_orderlist|Order List]]__ window in PPro8). | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | ====CancelOrder==== | ||
- | |||
- | This command reproduces the cancel functionality available through different keystrokes from the __[[tms_stock_window|Stock Window]]__.\\ | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | This example command sends a cancel request for all open orders on ZVZZT.NQ. | ||
- | ====OrderCancelReplace==== | ||
- | |||
- | This command replaces the size of a selected order. With this function, the size can only be reduced. | ||
- | |||
- | **Example: | ||
- | |||
- | ====GetOrderNumber==== | ||
- | |||
- | This command retrieves the order number associated with the request ID generated by the ExecuteOrder command. | ||
- | |||
- | **Note:** with the introduction of the PAPIORDER feed type, you can also monitor the file generated by region using that command to get this data in real time rather than polling the web server. | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | This command retrieves the order number for the order submitted on Request ID 3. | ||
- | ====GetOrderState==== | ||
- | |||
- | This command retrieves the current state for a specific order. | ||
- | |||
- | **Note:** with the introduction of the OSTAT and OrderEvent feed types, you can also monitor the files generated by region using those commands to get this data in real time rather than polling the web server. | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | This example command retrieves the current order state for order number GODOT04503000008M1711F7000000. | ||
- | |||
- | The numerical value of the order state appears. This numerical value represents one of the following: | ||
- | * 0 = eUninitialised\\ | ||
- | * 1 = eHolding, | ||
- | * 2 = ePending, | ||
- | * 3 = eAccepted, %%//!<%% Accepted (open)\\ | ||
- | * 4 = eAP, | ||
- | * 5 = eAPC, %%//!<%% Part Cancelled (terminal eAP)\\ | ||
- | * 6 = eAPF, %%//!<%% Multi Filled (terminal eAP)\\ | ||
- | * 7 = eAF, | ||
- | * 8 = eAC, | ||
- | * 9 = eRejected, %%//!<%% Rejected\\ | ||
- | * 10 = eJunked, | ||
- | |||
- | ====GetOpenOrders==== | ||
- | |||
- | **Example: | ||
- | |||
- | This command retrieves the state of the order. States include the following: | ||
- | |||
- | * Accepted | ||
- | =====Position-related commands===== | ||
- | |||
- | ====GetOpenPositions==== | ||
- | |||
- | This command retrieves a list of the current open positions for a user ID. This response no longer returns the **Market** parameter. Instead, the **Symbol** parameter returns both symbol and market extension, e.g., ZVZZT.NQ. | ||
- | |||
- | **Example: | ||
- | |||
- | ====Flatten==== | ||
- | |||
- | Syntax: < | ||
- | |||
- | **Example: | ||
- | |||
- | This command sends a flattening request for the symbol indicated, resulting in the flattening of the user's position on that symbol. | ||
- | |||
- | This can also be extended to multiple symbols: | ||
- | |||
- | **Example: | ||
- | |||
- | You can also flatten all positions with the following command: | ||
- | |||
- | Syntax: < | ||
- | |||
- | ====Get (Summary)==== | ||
- | Syntax: < | ||
- | |||
- | Example: < | ||
- | |||
- | This command exports the information to a CSV file named < | ||
- | |||
- | =====Additional Notes===== | ||
- | * For more information about markets currently available for trading with PProAPI, see the __[[http:// | ||
- | =====See Also===== | ||
- | |||
- | =====References===== |
tms_pproapi.1455735553.txt.gz · Last modified: 2017/01/19 10:35 (external edit)