From f69fa7cc16371f345037bfde8612f429916b9c43 Mon Sep 17 00:00:00 2001 From: Daniel McNally Date: Mon, 13 Apr 2020 16:21:22 -0400 Subject: [PATCH] feat(rpc): CloseChannel call This introduces the ability to close channels through xud. Currently this is only implemented for lnd, and is implemented in a naive way that relies on the peer we are trying to close channels with being online and cooperative. Closes #1471. Follow-ups are #1472 and #1476. --- docs/api.md | 32 +- lib/cli/commands/closechannel.ts | 32 ++ lib/grpc/GrpcService.ts | 16 + lib/lndclient/LndClient.ts | 64 ++- lib/proto/xudrpc.swagger.json | 20 + lib/proto/xudrpc_grpc_pb.d.ts | 17 + lib/proto/xudrpc_grpc_pb.js | 35 ++ lib/proto/xudrpc_pb.d.ts | 46 ++ lib/proto/xudrpc_pb.js | 316 ++++++++++++ lib/service/Service.ts | 19 + lib/swaps/SwapClientManager.ts | 34 ++ proto/xudrpc.proto | 19 + test/simulation/xudrpc/xudrpc.pb.go | 717 ++++++++++++++++------------ 13 files changed, 1048 insertions(+), 319 deletions(-) create mode 100644 lib/cli/commands/closechannel.ts diff --git a/docs/api.md b/docs/api.md index 51ab27861..f5afc5647 100644 --- a/docs/api.md +++ b/docs/api.md @@ -12,6 +12,8 @@ - [BanResponse](#xudrpc.BanResponse) - [Chain](#xudrpc.Chain) - [Channels](#xudrpc.Channels) + - [CloseChannelRequest](#xudrpc.CloseChannelRequest) + - [CloseChannelResponse](#xudrpc.CloseChannelResponse) - [ConnectRequest](#xudrpc.ConnectRequest) - [ConnectResponse](#xudrpc.ConnectResponse) - [ConnextInfo](#xudrpc.ConnextInfo) @@ -88,11 +90,9 @@ - [OrderSide](#xudrpc.OrderSide) - [SwapSuccess.Role](#xudrpc.SwapSuccess.Role) - - [Xud](#xudrpc.Xud) - [XudInit](#xudrpc.XudInit) - - [Scalar Value Types](#scalar-value-types) @@ -219,6 +219,33 @@ + + +### CloseChannelRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| node_identifier | [string](#string) | | The node pub key or alias of the peer with which to close any channels with. | +| currency | [string](#string) | | The ticker symbol of the currency of the channel to close. | +| force | [bool](#bool) | | Whether to force close the channel in case the peer is offline or unresponsive. | + + + + + + + + +### CloseChannelResponse + + + + + + + ### ConnectRequest @@ -1395,6 +1422,7 @@ The primary service for interacting with a running xud node. | AddCurrency | [Currency](#xudrpc.Currency) | [AddCurrencyResponse](#xudrpc.AddCurrencyResponse) | Adds a currency to the list of supported currencies. Once added, the currency may be used for new trading pairs. shell: xucli addcurrency <currency> <swap_client> [decimal_places] [token_address] | | AddPair | [AddPairRequest](#xudrpc.AddPairRequest) | [AddPairResponse](#xudrpc.AddPairResponse) | Adds a trading pair to the list of supported trading pairs. The newly supported pair is advertised to peers so they may begin sending orders for it. shell: xucli addpair <base_currency> <quote_currency> | | Ban | [BanRequest](#xudrpc.BanRequest) | [BanResponse](#xudrpc.BanResponse) | Bans a node and immediately disconnects from it. This can be used to prevent any connections to a specific node. shell: xucli ban <node_identifier> | +| CloseChannel | [CloseChannelRequest](#xudrpc.CloseChannelRequest) | [CloseChannelResponse](#xudrpc.CloseChannelResponse) | Closes any existing payment channels with a peer for the specified currency. shell: xucli closechannel <node_identifier> <currency> [--force] | | Connect | [ConnectRequest](#xudrpc.ConnectRequest) | [ConnectResponse](#xudrpc.ConnectResponse) | Attempts to connect to a node. Once connected, the node is added to the list of peers and becomes available for swaps and trading. A handshake exchanges information about the peer's supported trading and swap clients. Orders will be shared with the peer upon connection and upon new order placements. shell: xucli connect <node_uri> | | Deposit | [DepositRequest](#xudrpc.DepositRequest) | [DepositResponse](#xudrpc.DepositResponse) | Gets an address to deposit a given currency into the xud wallets. shell: xucli deposit <currency> | | DiscoverNodes | [DiscoverNodesRequest](#xudrpc.DiscoverNodesRequest) | [DiscoverNodesResponse](#xudrpc.DiscoverNodesResponse) | Discover nodes from a specific peer and apply new connections | diff --git a/lib/cli/commands/closechannel.ts b/lib/cli/commands/closechannel.ts new file mode 100644 index 000000000..780df9beb --- /dev/null +++ b/lib/cli/commands/closechannel.ts @@ -0,0 +1,32 @@ +import { Arguments } from 'yargs'; +import { CloseChannelRequest } from '../../proto/xudrpc_pb'; +import { callback, loadXudClient } from '../command'; + +export const command = 'closechannel [--force]'; + +export const describe = 'close any payment channels with a peer'; + +export const builder = { + node_identifier: { + description: 'the node key or alias of the connected peer to close the channel with', + type: 'string', + }, + currency: { + description: 'the ticker symbol for the currency', + type: 'string', + }, + force: { + type: 'boolean', + description: 'whether to force close if the peer is offline', + }, +}; + +export const handler = async (argv: Arguments) => { + const request = new CloseChannelRequest(); + request.setNodeIdentifier(argv.node_identifier); + request.setCurrency(argv.currency.toUpperCase()); + if (argv.force) { + request.setForce(argv.force); + } + (await loadXudClient(argv)).closeChannel(request, callback(argv)); +}; diff --git a/lib/grpc/GrpcService.ts b/lib/grpc/GrpcService.ts index 7a9b21038..eb46ffe53 100644 --- a/lib/grpc/GrpcService.ts +++ b/lib/grpc/GrpcService.ts @@ -216,6 +216,22 @@ class GrpcService { } } + /** + * See [[Service.closeChannel]] + */ + public closeChannel: grpc.handleUnaryCall = async (call, callback) => { + if (!this.isReady(this.service, callback)) { + return; + } + try { + await this.service.closeChannel(call.request.toObject()); + const response = new xudrpc.CloseChannelResponse(); + callback(null, response); + } catch (err) { + callback(getGrpcError(err), null); + } + } + /** * See [[Service.removeOrder]] */ diff --git a/lib/lndclient/LndClient.ts b/lib/lndclient/LndClient.ts index 32e5c42c9..93ef44753 100644 --- a/lib/lndclient/LndClient.ts +++ b/lib/lndclient/LndClient.ts @@ -1027,30 +1027,46 @@ class LndClient extends SwapClient { /** * Attempts to close an open channel. */ - public closeChannel = (fundingTxId: string, outputIndex: number, force: boolean): void => { - if (!this.lightning) { - throw(errors.UNAVAILABLE(this.currency, this.status)); - } - const request = new lndrpc.CloseChannelRequest(); - const channelPoint = new lndrpc.ChannelPoint(); - channelPoint.setFundingTxidStr(fundingTxId); - channelPoint.setOutputIndex(outputIndex); - request.setChannelPoint(channelPoint); - request.setForce(force); - this.lightning.closeChannel(request, this.meta) - // TODO: handle close channel events - .on('data', (message: string) => { - this.logger.info(`closeChannel update: ${message}`); - }) - .on('end', () => { - this.logger.info('closeChannel ended'); - }) - .on('status', (status: string) => { - this.logger.debug(`closeChannel status: ${JSON.stringify(status)}`); - }) - .on('error', (error: any) => { - this.logger.error(`closeChannel error: ${error}`); - }); + public closeChannel = (fundingTxId: string, outputIndex: number, force: boolean): Promise => { + return new Promise((resolve, reject) => { + if (!this.lightning) { + throw(errors.UNAVAILABLE(this.currency, this.status)); + } + const request = new lndrpc.CloseChannelRequest(); + const channelPoint = new lndrpc.ChannelPoint(); + channelPoint.setFundingTxidStr(fundingTxId); + channelPoint.setOutputIndex(outputIndex); + request.setChannelPoint(channelPoint); + request.setForce(force); + + this.lightning.closeChannel(request, this.meta) + .on('data', (message: lndrpc.CloseStatusUpdate) => { + if (message.hasClosePending()) { + const txId = base64ToHex(message.getClosePending()!.getTxid_asB64()); + if (txId) { + this.logger.info(`channel closed with tx id ${txId}`); + resolve(); + } + } + }) + .on('end', () => { + this.logger.debug('closeChannel ended'); + // we should receeive a channel close update above before the end event + // if we don't, assume the call has failed and reject + // if we have already resolved the promise this line will do nothing + reject('channel close ended unexpectedly'); + }) + .on('status', (status: grpc.StatusObject) => { + this.logger.debug(`closeChannel status: ${status.code} ${status.details}`); + if (status.code !== grpc.status.OK) { + reject(status.details); + } + }) + .on('error', (err: any) => { + this.logger.error(`closeChannel error: ${err}`); + reject(err); + }); + }); } /** Lnd specific procedure to disconnect from the server. */ diff --git a/lib/proto/xudrpc.swagger.json b/lib/proto/xudrpc.swagger.json index d9b5b32ed..d11ef0fd6 100644 --- a/lib/proto/xudrpc.swagger.json +++ b/lib/proto/xudrpc.swagger.json @@ -122,6 +122,23 @@ ] } }, + "/v1/closechannel": { + "post": { + "summary": "Closes any existing payment channels with a peer for the specified currency.\nshell: xucli closechannel \u003cnode_identifier\u003e \u003ccurrency\u003e [--force]", + "operationId": "CloseChannel", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/xudrpcCloseChannelResponse" + } + } + }, + "tags": [ + "Xud" + ] + } + }, "/v1/connect": { "post": { "summary": "Attempts to connect to a node. Once connected, the node is added to the list of peers and\nbecomes available for swaps and trading. A handshake exchanges information about the peer's\nsupported trading and swap clients. Orders will be shared with the peer upon connection and\nupon new order placements.\nshell: xucli connect \u003cnode_uri\u003e", @@ -906,6 +923,9 @@ } } }, + "xudrpcCloseChannelResponse": { + "type": "object" + }, "xudrpcConnectRequest": { "type": "object", "properties": { diff --git a/lib/proto/xudrpc_grpc_pb.d.ts b/lib/proto/xudrpc_grpc_pb.d.ts index 23610ee6a..ede6d57a8 100644 --- a/lib/proto/xudrpc_grpc_pb.d.ts +++ b/lib/proto/xudrpc_grpc_pb.d.ts @@ -78,6 +78,7 @@ interface IXudService extends grpc.ServiceDefinition; responseDeserialize: grpc.deserialize; } +interface IXudService_ICloseChannel extends grpc.MethodDefinition { + path: string; // "/xudrpc.Xud/CloseChannel" + requestStream: boolean; // false + responseStream: boolean; // false + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} interface IXudService_IConnect extends grpc.MethodDefinition { path: string; // "/xudrpc.Xud/Connect" requestStream: boolean; // false @@ -364,6 +374,7 @@ export interface IXudServer { addCurrency: grpc.handleUnaryCall; addPair: grpc.handleUnaryCall; ban: grpc.handleUnaryCall; + closeChannel: grpc.handleUnaryCall; connect: grpc.handleUnaryCall; deposit: grpc.handleUnaryCall; discoverNodes: grpc.handleUnaryCall; @@ -401,6 +412,9 @@ export interface IXudClient { ban(request: xudrpc_pb.BanRequest, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.BanResponse) => void): grpc.ClientUnaryCall; ban(request: xudrpc_pb.BanRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.BanResponse) => void): grpc.ClientUnaryCall; ban(request: xudrpc_pb.BanRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.BanResponse) => void): grpc.ClientUnaryCall; + closeChannel(request: xudrpc_pb.CloseChannelRequest, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.CloseChannelResponse) => void): grpc.ClientUnaryCall; + closeChannel(request: xudrpc_pb.CloseChannelRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.CloseChannelResponse) => void): grpc.ClientUnaryCall; + closeChannel(request: xudrpc_pb.CloseChannelRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.CloseChannelResponse) => void): grpc.ClientUnaryCall; connect(request: xudrpc_pb.ConnectRequest, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.ConnectResponse) => void): grpc.ClientUnaryCall; connect(request: xudrpc_pb.ConnectRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.ConnectResponse) => void): grpc.ClientUnaryCall; connect(request: xudrpc_pb.ConnectRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.ConnectResponse) => void): grpc.ClientUnaryCall; @@ -485,6 +499,9 @@ export class XudClient extends grpc.Client implements IXudClient { public ban(request: xudrpc_pb.BanRequest, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.BanResponse) => void): grpc.ClientUnaryCall; public ban(request: xudrpc_pb.BanRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.BanResponse) => void): grpc.ClientUnaryCall; public ban(request: xudrpc_pb.BanRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.BanResponse) => void): grpc.ClientUnaryCall; + public closeChannel(request: xudrpc_pb.CloseChannelRequest, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.CloseChannelResponse) => void): grpc.ClientUnaryCall; + public closeChannel(request: xudrpc_pb.CloseChannelRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.CloseChannelResponse) => void): grpc.ClientUnaryCall; + public closeChannel(request: xudrpc_pb.CloseChannelRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.CloseChannelResponse) => void): grpc.ClientUnaryCall; public connect(request: xudrpc_pb.ConnectRequest, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.ConnectResponse) => void): grpc.ClientUnaryCall; public connect(request: xudrpc_pb.ConnectRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.ConnectResponse) => void): grpc.ClientUnaryCall; public connect(request: xudrpc_pb.ConnectRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: xudrpc_pb.ConnectResponse) => void): grpc.ClientUnaryCall; diff --git a/lib/proto/xudrpc_grpc_pb.js b/lib/proto/xudrpc_grpc_pb.js index 48bffa13c..a05fff963 100644 --- a/lib/proto/xudrpc_grpc_pb.js +++ b/lib/proto/xudrpc_grpc_pb.js @@ -81,6 +81,28 @@ function deserialize_xudrpc_BanResponse(buffer_arg) { return xudrpc_pb.BanResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_xudrpc_CloseChannelRequest(arg) { + if (!(arg instanceof xudrpc_pb.CloseChannelRequest)) { + throw new Error('Expected argument of type xudrpc.CloseChannelRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_xudrpc_CloseChannelRequest(buffer_arg) { + return xudrpc_pb.CloseChannelRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_xudrpc_CloseChannelResponse(arg) { + if (!(arg instanceof xudrpc_pb.CloseChannelResponse)) { + throw new Error('Expected argument of type xudrpc.CloseChannelResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_xudrpc_CloseChannelResponse(buffer_arg) { + return xudrpc_pb.CloseChannelResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_xudrpc_ConnectRequest(arg) { if (!(arg instanceof xudrpc_pb.ConnectRequest)) { throw new Error('Expected argument of type xudrpc.ConnectRequest'); @@ -766,6 +788,19 @@ var XudService = exports.XudService = { responseSerialize: serialize_xudrpc_BanResponse, responseDeserialize: deserialize_xudrpc_BanResponse, }, + // Closes any existing payment channels with a peer for the specified currency. + // shell: xucli closechannel [--force] + closeChannel: { + path: '/xudrpc.Xud/CloseChannel', + requestStream: false, + responseStream: false, + requestType: xudrpc_pb.CloseChannelRequest, + responseType: xudrpc_pb.CloseChannelResponse, + requestSerialize: serialize_xudrpc_CloseChannelRequest, + requestDeserialize: deserialize_xudrpc_CloseChannelRequest, + responseSerialize: serialize_xudrpc_CloseChannelResponse, + responseDeserialize: deserialize_xudrpc_CloseChannelResponse, + }, // Attempts to connect to a node. Once connected, the node is added to the list of peers and // becomes available for swaps and trading. A handshake exchanges information about the peer's // supported trading and swap clients. Orders will be shared with the peer upon connection and diff --git a/lib/proto/xudrpc_pb.d.ts b/lib/proto/xudrpc_pb.d.ts index 6d4b5847d..8661d0bb5 100644 --- a/lib/proto/xudrpc_pb.d.ts +++ b/lib/proto/xudrpc_pb.d.ts @@ -202,6 +202,52 @@ export namespace Channels { } } +export class CloseChannelRequest extends jspb.Message { + getNodeIdentifier(): string; + setNodeIdentifier(value: string): void; + + getCurrency(): string; + setCurrency(value: string): void; + + getForce(): boolean; + setForce(value: boolean): void; + + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CloseChannelRequest.AsObject; + static toObject(includeInstance: boolean, msg: CloseChannelRequest): CloseChannelRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: CloseChannelRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CloseChannelRequest; + static deserializeBinaryFromReader(message: CloseChannelRequest, reader: jspb.BinaryReader): CloseChannelRequest; +} + +export namespace CloseChannelRequest { + export type AsObject = { + nodeIdentifier: string, + currency: string, + force: boolean, + } +} + +export class CloseChannelResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): CloseChannelResponse.AsObject; + static toObject(includeInstance: boolean, msg: CloseChannelResponse): CloseChannelResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: CloseChannelResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): CloseChannelResponse; + static deserializeBinaryFromReader(message: CloseChannelResponse, reader: jspb.BinaryReader): CloseChannelResponse; +} + +export namespace CloseChannelResponse { + export type AsObject = { + } +} + export class ConnectRequest extends jspb.Message { getNodeUri(): string; setNodeUri(value: string): void; diff --git a/lib/proto/xudrpc_pb.js b/lib/proto/xudrpc_pb.js index e2ac0ab79..5483a4a95 100644 --- a/lib/proto/xudrpc_pb.js +++ b/lib/proto/xudrpc_pb.js @@ -21,6 +21,8 @@ goog.exportSymbol('proto.xudrpc.BanRequest', null, global); goog.exportSymbol('proto.xudrpc.BanResponse', null, global); goog.exportSymbol('proto.xudrpc.Chain', null, global); goog.exportSymbol('proto.xudrpc.Channels', null, global); +goog.exportSymbol('proto.xudrpc.CloseChannelRequest', null, global); +goog.exportSymbol('proto.xudrpc.CloseChannelResponse', null, global); goog.exportSymbol('proto.xudrpc.ConnectRequest', null, global); goog.exportSymbol('proto.xudrpc.ConnectResponse', null, global); goog.exportSymbol('proto.xudrpc.ConnextInfo', null, global); @@ -1418,6 +1420,320 @@ proto.xudrpc.Channels.prototype.setClosed = function(value) { +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.xudrpc.CloseChannelRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.xudrpc.CloseChannelRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.xudrpc.CloseChannelRequest.displayName = 'proto.xudrpc.CloseChannelRequest'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.xudrpc.CloseChannelRequest.prototype.toObject = function(opt_includeInstance) { + return proto.xudrpc.CloseChannelRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.xudrpc.CloseChannelRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.xudrpc.CloseChannelRequest.toObject = function(includeInstance, msg) { + var f, obj = { + nodeIdentifier: jspb.Message.getFieldWithDefault(msg, 1, ""), + currency: jspb.Message.getFieldWithDefault(msg, 2, ""), + force: jspb.Message.getFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.xudrpc.CloseChannelRequest} + */ +proto.xudrpc.CloseChannelRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.xudrpc.CloseChannelRequest; + return proto.xudrpc.CloseChannelRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.xudrpc.CloseChannelRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.xudrpc.CloseChannelRequest} + */ +proto.xudrpc.CloseChannelRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setNodeIdentifier(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setCurrency(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setForce(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.xudrpc.CloseChannelRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.xudrpc.CloseChannelRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.xudrpc.CloseChannelRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.xudrpc.CloseChannelRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getNodeIdentifier(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getCurrency(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getForce(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional string node_identifier = 1; + * @return {string} + */ +proto.xudrpc.CloseChannelRequest.prototype.getNodeIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** @param {string} value */ +proto.xudrpc.CloseChannelRequest.prototype.setNodeIdentifier = function(value) { + jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string currency = 2; + * @return {string} + */ +proto.xudrpc.CloseChannelRequest.prototype.getCurrency = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** @param {string} value */ +proto.xudrpc.CloseChannelRequest.prototype.setCurrency = function(value) { + jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool force = 3; + * Note that Boolean fields may be set to 0/1 when serialized from a Java server. + * You should avoid comparisons like {@code val === true/false} in those cases. + * @return {boolean} + */ +proto.xudrpc.CloseChannelRequest.prototype.getForce = function() { + return /** @type {boolean} */ (jspb.Message.getFieldWithDefault(this, 3, false)); +}; + + +/** @param {boolean} value */ +proto.xudrpc.CloseChannelRequest.prototype.setForce = function(value) { + jspb.Message.setProto3BooleanField(this, 3, value); +}; + + + +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.xudrpc.CloseChannelResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.xudrpc.CloseChannelResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + proto.xudrpc.CloseChannelResponse.displayName = 'proto.xudrpc.CloseChannelResponse'; +} + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto suitable for use in Soy templates. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS. + * @param {boolean=} opt_includeInstance Whether to include the JSPB instance + * for transitional soy proto support: http://goto/soy-param-migration + * @return {!Object} + */ +proto.xudrpc.CloseChannelResponse.prototype.toObject = function(opt_includeInstance) { + return proto.xudrpc.CloseChannelResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Whether to include the JSPB + * instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.xudrpc.CloseChannelResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.xudrpc.CloseChannelResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.xudrpc.CloseChannelResponse} + */ +proto.xudrpc.CloseChannelResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.xudrpc.CloseChannelResponse; + return proto.xudrpc.CloseChannelResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.xudrpc.CloseChannelResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.xudrpc.CloseChannelResponse} + */ +proto.xudrpc.CloseChannelResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.xudrpc.CloseChannelResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.xudrpc.CloseChannelResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.xudrpc.CloseChannelResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.xudrpc.CloseChannelResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a diff --git a/lib/service/Service.ts b/lib/service/Service.ts index 393bfc8b2..713f7f7d2 100644 --- a/lib/service/Service.ts +++ b/lib/service/Service.ts @@ -253,6 +253,25 @@ class Service { return txId; } + /* + * Closes any payment channels for a specified node and currency. + */ + public closeChannel = async ( + args: { nodeIdentifier: string, currency: string, force: boolean }, + ) => { + const { nodeIdentifier, currency, force } = args; + argChecks.HAS_NODE_IDENTIFIER({ nodeIdentifier }); + argChecks.VALID_CURRENCY({ currency }); + + const nodePubKey = isNodePubKey(args.nodeIdentifier) ? args.nodeIdentifier : this.pool.resolveAlias(args.nodeIdentifier); + const peer = this.pool.getPeer(nodePubKey); + await this.swapClientManager.closeChannel({ + peer, + currency, + force, + }); + } + /* * Opens a payment channel to a specified node, currency and amount. */ diff --git a/lib/swaps/SwapClientManager.ts b/lib/swaps/SwapClientManager.ts index b2c98e087..0981d2e61 100644 --- a/lib/swaps/SwapClientManager.ts +++ b/lib/swaps/SwapClientManager.ts @@ -469,6 +469,40 @@ class SwapClientManager extends EventEmitter { } } + /** + * Closes any payment channels with a peer for a given currency. + * @param peer a peer to open the payment channel with. + * @param currency a currency for the payment channel. + * @param amount the size of the payment channel local balance + * @returns Nothing upon success, throws otherwise. + */ + public closeChannel = async ( + { peer, currency, force }: + { peer: Peer, currency: string, force: boolean }, + ): Promise => { + const swapClient = this.get(currency); + if (!swapClient) { + throw errors.SWAP_CLIENT_NOT_FOUND(currency); + } + const peerIdentifier = peer.getIdentifier(swapClient.type, currency); + if (!peerIdentifier) { + throw new Error('peer not connected to swap client'); + } + // TODO: temporarily we only support closing lnd channels, make this logic generic + if (isLndClient(swapClient)) { + const lndChannels = (await swapClient.listChannels()).getChannelsList(); + const closePromises: Promise[] = []; + lndChannels.forEach((channel) => { + if (channel.getRemotePubkey() === peerIdentifier) { + const [fundingTxId, outputIndex] = channel.getChannelPoint().split(':'); + const closePromise = swapClient.closeChannel(fundingTxId, Number(outputIndex), force); + closePromises.push(closePromise); + } + }); + await Promise.all(closePromises); + } + } + /** * Opens a payment channel. * @param peer a peer to open the payment channel with. diff --git a/proto/xudrpc.proto b/proto/xudrpc.proto index f2ca58393..45fdf035b 100644 --- a/proto/xudrpc.proto +++ b/proto/xudrpc.proto @@ -73,6 +73,14 @@ service Xud { }; } + /* Closes any existing payment channels with a peer for the specified currency. + * shell: xucli closechannel [--force]*/ + rpc CloseChannel(CloseChannelRequest) returns (CloseChannelResponse) { + option (google.api.http) = { + post: "/v1/closechannel" + }; + } + /* Attempts to connect to a node. Once connected, the node is added to the list of peers and * becomes available for swaps and trading. A handshake exchanges information about the peer's * supported trading and swap clients. Orders will be shared with the peer upon connection and @@ -361,6 +369,17 @@ message Channels { uint32 closed = 4 [json_name = "closed"]; } +message CloseChannelRequest { + // The node pub key or alias of the peer with which to close any channels with. + string node_identifier = 1 [json_name = "node_identifier"]; + // The ticker symbol of the currency of the channel to close. + string currency = 2 [json_name = "currency"]; + // Whether to force close the channel in case the peer is offline or unresponsive. + bool force = 3 [json_name = "force"]; +} + +message CloseChannelResponse {} + message ConnectRequest { // The uri of the node to connect to in "[nodePubKey]@[host]:[port]" format. string node_uri = 1 [json_name = "node_uri"]; diff --git a/test/simulation/xudrpc/xudrpc.pb.go b/test/simulation/xudrpc/xudrpc.pb.go index 238b184b6..978923faa 100644 --- a/test/simulation/xudrpc/xudrpc.pb.go +++ b/test/simulation/xudrpc/xudrpc.pb.go @@ -70,7 +70,7 @@ func (x Currency_SwapClient) String() string { } func (Currency_SwapClient) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{12, 0} + return fileDescriptor_6960a02cc0a63cf6, []int{14, 0} } type ListOrdersRequest_Owner int32 @@ -98,7 +98,7 @@ func (x ListOrdersRequest_Owner) String() string { } func (ListOrdersRequest_Owner) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{26, 0} + return fileDescriptor_6960a02cc0a63cf6, []int{28, 0} } type SwapSuccess_Role int32 @@ -123,7 +123,7 @@ func (x SwapSuccess_Role) String() string { } func (SwapSuccess_Role) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{61, 0} + return fileDescriptor_6960a02cc0a63cf6, []int{63, 0} } type AddCurrencyResponse struct { @@ -509,6 +509,95 @@ func (m *Channels) GetClosed() uint32 { return 0 } +type CloseChannelRequest struct { + // The node pub key or alias of the peer with which to close any channels with. + NodeIdentifier string `protobuf:"bytes,1,opt,name=node_identifier,proto3" json:"node_identifier,omitempty"` + // The ticker symbol of the currency of the channel to close. + Currency string `protobuf:"bytes,2,opt,name=currency,proto3" json:"currency,omitempty"` + // Whether to force close the channel in case the peer is offline or unresponsive. + Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} } +func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) } +func (*CloseChannelRequest) ProtoMessage() {} +func (*CloseChannelRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_6960a02cc0a63cf6, []int{8} +} + +func (m *CloseChannelRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CloseChannelRequest.Unmarshal(m, b) +} +func (m *CloseChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CloseChannelRequest.Marshal(b, m, deterministic) +} +func (m *CloseChannelRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CloseChannelRequest.Merge(m, src) +} +func (m *CloseChannelRequest) XXX_Size() int { + return xxx_messageInfo_CloseChannelRequest.Size(m) +} +func (m *CloseChannelRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CloseChannelRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CloseChannelRequest proto.InternalMessageInfo + +func (m *CloseChannelRequest) GetNodeIdentifier() string { + if m != nil { + return m.NodeIdentifier + } + return "" +} + +func (m *CloseChannelRequest) GetCurrency() string { + if m != nil { + return m.Currency + } + return "" +} + +func (m *CloseChannelRequest) GetForce() bool { + if m != nil { + return m.Force + } + return false +} + +type CloseChannelResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CloseChannelResponse) Reset() { *m = CloseChannelResponse{} } +func (m *CloseChannelResponse) String() string { return proto.CompactTextString(m) } +func (*CloseChannelResponse) ProtoMessage() {} +func (*CloseChannelResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_6960a02cc0a63cf6, []int{9} +} + +func (m *CloseChannelResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CloseChannelResponse.Unmarshal(m, b) +} +func (m *CloseChannelResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CloseChannelResponse.Marshal(b, m, deterministic) +} +func (m *CloseChannelResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CloseChannelResponse.Merge(m, src) +} +func (m *CloseChannelResponse) XXX_Size() int { + return xxx_messageInfo_CloseChannelResponse.Size(m) +} +func (m *CloseChannelResponse) XXX_DiscardUnknown() { + xxx_messageInfo_CloseChannelResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_CloseChannelResponse proto.InternalMessageInfo + type ConnectRequest struct { // The uri of the node to connect to in "[nodePubKey]@[host]:[port]" format. NodeUri string `protobuf:"bytes,1,opt,name=node_uri,proto3" json:"node_uri,omitempty"` @@ -521,7 +610,7 @@ func (m *ConnectRequest) Reset() { *m = ConnectRequest{} } func (m *ConnectRequest) String() string { return proto.CompactTextString(m) } func (*ConnectRequest) ProtoMessage() {} func (*ConnectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{8} + return fileDescriptor_6960a02cc0a63cf6, []int{10} } func (m *ConnectRequest) XXX_Unmarshal(b []byte) error { @@ -559,7 +648,7 @@ func (m *ConnectResponse) Reset() { *m = ConnectResponse{} } func (m *ConnectResponse) String() string { return proto.CompactTextString(m) } func (*ConnectResponse) ProtoMessage() {} func (*ConnectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{9} + return fileDescriptor_6960a02cc0a63cf6, []int{11} } func (m *ConnectResponse) XXX_Unmarshal(b []byte) error { @@ -593,7 +682,7 @@ func (m *CreateNodeRequest) Reset() { *m = CreateNodeRequest{} } func (m *CreateNodeRequest) String() string { return proto.CompactTextString(m) } func (*CreateNodeRequest) ProtoMessage() {} func (*CreateNodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{10} + return fileDescriptor_6960a02cc0a63cf6, []int{12} } func (m *CreateNodeRequest) XXX_Unmarshal(b []byte) error { @@ -637,7 +726,7 @@ func (m *CreateNodeResponse) Reset() { *m = CreateNodeResponse{} } func (m *CreateNodeResponse) String() string { return proto.CompactTextString(m) } func (*CreateNodeResponse) ProtoMessage() {} func (*CreateNodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{11} + return fileDescriptor_6960a02cc0a63cf6, []int{13} } func (m *CreateNodeResponse) XXX_Unmarshal(b []byte) error { @@ -701,7 +790,7 @@ func (m *Currency) Reset() { *m = Currency{} } func (m *Currency) String() string { return proto.CompactTextString(m) } func (*Currency) ProtoMessage() {} func (*Currency) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{12} + return fileDescriptor_6960a02cc0a63cf6, []int{14} } func (m *Currency) XXX_Unmarshal(b []byte) error { @@ -762,7 +851,7 @@ func (m *DepositRequest) Reset() { *m = DepositRequest{} } func (m *DepositRequest) String() string { return proto.CompactTextString(m) } func (*DepositRequest) ProtoMessage() {} func (*DepositRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{13} + return fileDescriptor_6960a02cc0a63cf6, []int{15} } func (m *DepositRequest) XXX_Unmarshal(b []byte) error { @@ -802,7 +891,7 @@ func (m *DepositResponse) Reset() { *m = DepositResponse{} } func (m *DepositResponse) String() string { return proto.CompactTextString(m) } func (*DepositResponse) ProtoMessage() {} func (*DepositResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{14} + return fileDescriptor_6960a02cc0a63cf6, []int{16} } func (m *DepositResponse) XXX_Unmarshal(b []byte) error { @@ -842,7 +931,7 @@ func (m *DiscoverNodesRequest) Reset() { *m = DiscoverNodesRequest{} } func (m *DiscoverNodesRequest) String() string { return proto.CompactTextString(m) } func (*DiscoverNodesRequest) ProtoMessage() {} func (*DiscoverNodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{15} + return fileDescriptor_6960a02cc0a63cf6, []int{17} } func (m *DiscoverNodesRequest) XXX_Unmarshal(b []byte) error { @@ -881,7 +970,7 @@ func (m *DiscoverNodesResponse) Reset() { *m = DiscoverNodesResponse{} } func (m *DiscoverNodesResponse) String() string { return proto.CompactTextString(m) } func (*DiscoverNodesResponse) ProtoMessage() {} func (*DiscoverNodesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{16} + return fileDescriptor_6960a02cc0a63cf6, []int{18} } func (m *DiscoverNodesResponse) XXX_Unmarshal(b []byte) error { @@ -927,7 +1016,7 @@ func (m *ExecuteSwapRequest) Reset() { *m = ExecuteSwapRequest{} } func (m *ExecuteSwapRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteSwapRequest) ProtoMessage() {} func (*ExecuteSwapRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{17} + return fileDescriptor_6960a02cc0a63cf6, []int{19} } func (m *ExecuteSwapRequest) XXX_Unmarshal(b []byte) error { @@ -989,7 +1078,7 @@ func (m *GetBalanceRequest) Reset() { *m = GetBalanceRequest{} } func (m *GetBalanceRequest) String() string { return proto.CompactTextString(m) } func (*GetBalanceRequest) ProtoMessage() {} func (*GetBalanceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{18} + return fileDescriptor_6960a02cc0a63cf6, []int{20} } func (m *GetBalanceRequest) XXX_Unmarshal(b []byte) error { @@ -1029,7 +1118,7 @@ func (m *GetBalanceResponse) Reset() { *m = GetBalanceResponse{} } func (m *GetBalanceResponse) String() string { return proto.CompactTextString(m) } func (*GetBalanceResponse) ProtoMessage() {} func (*GetBalanceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{19} + return fileDescriptor_6960a02cc0a63cf6, []int{21} } func (m *GetBalanceResponse) XXX_Unmarshal(b []byte) error { @@ -1067,7 +1156,7 @@ func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} } func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetInfoRequest) ProtoMessage() {} func (*GetInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{20} + return fileDescriptor_6960a02cc0a63cf6, []int{22} } func (m *GetInfoRequest) XXX_Unmarshal(b []byte) error { @@ -1118,7 +1207,7 @@ func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} } func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetInfoResponse) ProtoMessage() {} func (*GetInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{21} + return fileDescriptor_6960a02cc0a63cf6, []int{23} } func (m *GetInfoResponse) XXX_Unmarshal(b []byte) error { @@ -1235,7 +1324,7 @@ func (m *GetNodeInfoRequest) Reset() { *m = GetNodeInfoRequest{} } func (m *GetNodeInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetNodeInfoRequest) ProtoMessage() {} func (*GetNodeInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{22} + return fileDescriptor_6960a02cc0a63cf6, []int{24} } func (m *GetNodeInfoRequest) XXX_Unmarshal(b []byte) error { @@ -1278,7 +1367,7 @@ func (m *GetNodeInfoResponse) Reset() { *m = GetNodeInfoResponse{} } func (m *GetNodeInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetNodeInfoResponse) ProtoMessage() {} func (*GetNodeInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{23} + return fileDescriptor_6960a02cc0a63cf6, []int{25} } func (m *GetNodeInfoResponse) XXX_Unmarshal(b []byte) error { @@ -1323,7 +1412,7 @@ func (m *ListCurrenciesRequest) Reset() { *m = ListCurrenciesRequest{} } func (m *ListCurrenciesRequest) String() string { return proto.CompactTextString(m) } func (*ListCurrenciesRequest) ProtoMessage() {} func (*ListCurrenciesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{24} + return fileDescriptor_6960a02cc0a63cf6, []int{26} } func (m *ListCurrenciesRequest) XXX_Unmarshal(b []byte) error { @@ -1356,7 +1445,7 @@ func (m *ListCurrenciesResponse) Reset() { *m = ListCurrenciesResponse{} func (m *ListCurrenciesResponse) String() string { return proto.CompactTextString(m) } func (*ListCurrenciesResponse) ProtoMessage() {} func (*ListCurrenciesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{25} + return fileDescriptor_6960a02cc0a63cf6, []int{27} } func (m *ListCurrenciesResponse) XXX_Unmarshal(b []byte) error { @@ -1400,7 +1489,7 @@ func (m *ListOrdersRequest) Reset() { *m = ListOrdersRequest{} } func (m *ListOrdersRequest) String() string { return proto.CompactTextString(m) } func (*ListOrdersRequest) ProtoMessage() {} func (*ListOrdersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{26} + return fileDescriptor_6960a02cc0a63cf6, []int{28} } func (m *ListOrdersRequest) XXX_Unmarshal(b []byte) error { @@ -1454,7 +1543,7 @@ func (m *ListOrdersResponse) Reset() { *m = ListOrdersResponse{} } func (m *ListOrdersResponse) String() string { return proto.CompactTextString(m) } func (*ListOrdersResponse) ProtoMessage() {} func (*ListOrdersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{27} + return fileDescriptor_6960a02cc0a63cf6, []int{29} } func (m *ListOrdersResponse) XXX_Unmarshal(b []byte) error { @@ -1492,7 +1581,7 @@ func (m *ListPairsRequest) Reset() { *m = ListPairsRequest{} } func (m *ListPairsRequest) String() string { return proto.CompactTextString(m) } func (*ListPairsRequest) ProtoMessage() {} func (*ListPairsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{28} + return fileDescriptor_6960a02cc0a63cf6, []int{30} } func (m *ListPairsRequest) XXX_Unmarshal(b []byte) error { @@ -1525,7 +1614,7 @@ func (m *ListPairsResponse) Reset() { *m = ListPairsResponse{} } func (m *ListPairsResponse) String() string { return proto.CompactTextString(m) } func (*ListPairsResponse) ProtoMessage() {} func (*ListPairsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{29} + return fileDescriptor_6960a02cc0a63cf6, []int{31} } func (m *ListPairsResponse) XXX_Unmarshal(b []byte) error { @@ -1563,7 +1652,7 @@ func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} } func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) } func (*ListPeersRequest) ProtoMessage() {} func (*ListPeersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{30} + return fileDescriptor_6960a02cc0a63cf6, []int{32} } func (m *ListPeersRequest) XXX_Unmarshal(b []byte) error { @@ -1596,7 +1685,7 @@ func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} } func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) } func (*ListPeersResponse) ProtoMessage() {} func (*ListPeersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{31} + return fileDescriptor_6960a02cc0a63cf6, []int{33} } func (m *ListPeersResponse) XXX_Unmarshal(b []byte) error { @@ -1636,7 +1725,7 @@ func (m *ListTradesRequest) Reset() { *m = ListTradesRequest{} } func (m *ListTradesRequest) String() string { return proto.CompactTextString(m) } func (*ListTradesRequest) ProtoMessage() {} func (*ListTradesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{32} + return fileDescriptor_6960a02cc0a63cf6, []int{34} } func (m *ListTradesRequest) XXX_Unmarshal(b []byte) error { @@ -1675,7 +1764,7 @@ func (m *ListTradesResponse) Reset() { *m = ListTradesResponse{} } func (m *ListTradesResponse) String() string { return proto.CompactTextString(m) } func (*ListTradesResponse) ProtoMessage() {} func (*ListTradesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{33} + return fileDescriptor_6960a02cc0a63cf6, []int{35} } func (m *ListTradesResponse) XXX_Unmarshal(b []byte) error { @@ -1720,7 +1809,7 @@ func (m *LndInfo) Reset() { *m = LndInfo{} } func (m *LndInfo) String() string { return proto.CompactTextString(m) } func (*LndInfo) ProtoMessage() {} func (*LndInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{34} + return fileDescriptor_6960a02cc0a63cf6, []int{36} } func (m *LndInfo) XXX_Unmarshal(b []byte) error { @@ -1808,7 +1897,7 @@ func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} } func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) } func (*OpenChannelRequest) ProtoMessage() {} func (*OpenChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{35} + return fileDescriptor_6960a02cc0a63cf6, []int{37} } func (m *OpenChannelRequest) XXX_Unmarshal(b []byte) error { @@ -1867,7 +1956,7 @@ func (m *OpenChannelResponse) Reset() { *m = OpenChannelResponse{} } func (m *OpenChannelResponse) String() string { return proto.CompactTextString(m) } func (*OpenChannelResponse) ProtoMessage() {} func (*OpenChannelResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{36} + return fileDescriptor_6960a02cc0a63cf6, []int{38} } func (m *OpenChannelResponse) XXX_Unmarshal(b []byte) error { @@ -1918,7 +2007,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{37} + return fileDescriptor_6960a02cc0a63cf6, []int{39} } func (m *Order) XXX_Unmarshal(b []byte) error { @@ -2060,7 +2149,7 @@ func (m *OrderRemoval) Reset() { *m = OrderRemoval{} } func (m *OrderRemoval) String() string { return proto.CompactTextString(m) } func (*OrderRemoval) ProtoMessage() {} func (*OrderRemoval) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{38} + return fileDescriptor_6960a02cc0a63cf6, []int{40} } func (m *OrderRemoval) XXX_Unmarshal(b []byte) error { @@ -2130,7 +2219,7 @@ func (m *Orders) Reset() { *m = Orders{} } func (m *Orders) String() string { return proto.CompactTextString(m) } func (*Orders) ProtoMessage() {} func (*Orders) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{39} + return fileDescriptor_6960a02cc0a63cf6, []int{41} } func (m *Orders) XXX_Unmarshal(b []byte) error { @@ -2179,7 +2268,7 @@ func (m *OrdersCount) Reset() { *m = OrdersCount{} } func (m *OrdersCount) String() string { return proto.CompactTextString(m) } func (*OrdersCount) ProtoMessage() {} func (*OrdersCount) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{40} + return fileDescriptor_6960a02cc0a63cf6, []int{42} } func (m *OrdersCount) XXX_Unmarshal(b []byte) error { @@ -2228,7 +2317,7 @@ func (m *OrderUpdate) Reset() { *m = OrderUpdate{} } func (m *OrderUpdate) String() string { return proto.CompactTextString(m) } func (*OrderUpdate) ProtoMessage() {} func (*OrderUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{41} + return fileDescriptor_6960a02cc0a63cf6, []int{43} } func (m *OrderUpdate) XXX_Unmarshal(b []byte) error { @@ -2322,7 +2411,7 @@ func (m *Peer) Reset() { *m = Peer{} } func (m *Peer) String() string { return proto.CompactTextString(m) } func (*Peer) ProtoMessage() {} func (*Peer) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{42} + return fileDescriptor_6960a02cc0a63cf6, []int{44} } func (m *Peer) XXX_Unmarshal(b []byte) error { @@ -2431,7 +2520,7 @@ func (m *PlaceOrderRequest) Reset() { *m = PlaceOrderRequest{} } func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) } func (*PlaceOrderRequest) ProtoMessage() {} func (*PlaceOrderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{43} + return fileDescriptor_6960a02cc0a63cf6, []int{45} } func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error { @@ -2519,7 +2608,7 @@ func (m *PlaceOrderResponse) Reset() { *m = PlaceOrderResponse{} } func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) } func (*PlaceOrderResponse) ProtoMessage() {} func (*PlaceOrderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{44} + return fileDescriptor_6960a02cc0a63cf6, []int{46} } func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error { @@ -2584,7 +2673,7 @@ func (m *PlaceOrderEvent) Reset() { *m = PlaceOrderEvent{} } func (m *PlaceOrderEvent) String() string { return proto.CompactTextString(m) } func (*PlaceOrderEvent) ProtoMessage() {} func (*PlaceOrderEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{45} + return fileDescriptor_6960a02cc0a63cf6, []int{47} } func (m *PlaceOrderEvent) XXX_Unmarshal(b []byte) error { @@ -2693,7 +2782,7 @@ func (m *RaidenInfo) Reset() { *m = RaidenInfo{} } func (m *RaidenInfo) String() string { return proto.CompactTextString(m) } func (*RaidenInfo) ProtoMessage() {} func (*RaidenInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{46} + return fileDescriptor_6960a02cc0a63cf6, []int{48} } func (m *RaidenInfo) XXX_Unmarshal(b []byte) error { @@ -2764,7 +2853,7 @@ func (m *ConnextInfo) Reset() { *m = ConnextInfo{} } func (m *ConnextInfo) String() string { return proto.CompactTextString(m) } func (*ConnextInfo) ProtoMessage() {} func (*ConnextInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{47} + return fileDescriptor_6960a02cc0a63cf6, []int{49} } func (m *ConnextInfo) XXX_Unmarshal(b []byte) error { @@ -2832,7 +2921,7 @@ func (m *RemoveCurrencyRequest) Reset() { *m = RemoveCurrencyRequest{} } func (m *RemoveCurrencyRequest) String() string { return proto.CompactTextString(m) } func (*RemoveCurrencyRequest) ProtoMessage() {} func (*RemoveCurrencyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{48} + return fileDescriptor_6960a02cc0a63cf6, []int{50} } func (m *RemoveCurrencyRequest) XXX_Unmarshal(b []byte) error { @@ -2870,7 +2959,7 @@ func (m *RemoveCurrencyResponse) Reset() { *m = RemoveCurrencyResponse{} func (m *RemoveCurrencyResponse) String() string { return proto.CompactTextString(m) } func (*RemoveCurrencyResponse) ProtoMessage() {} func (*RemoveCurrencyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{49} + return fileDescriptor_6960a02cc0a63cf6, []int{51} } func (m *RemoveCurrencyResponse) XXX_Unmarshal(b []byte) error { @@ -2906,7 +2995,7 @@ func (m *RemoveOrderRequest) Reset() { *m = RemoveOrderRequest{} } func (m *RemoveOrderRequest) String() string { return proto.CompactTextString(m) } func (*RemoveOrderRequest) ProtoMessage() {} func (*RemoveOrderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{50} + return fileDescriptor_6960a02cc0a63cf6, []int{52} } func (m *RemoveOrderRequest) XXX_Unmarshal(b []byte) error { @@ -2954,7 +3043,7 @@ func (m *RemoveOrderResponse) Reset() { *m = RemoveOrderResponse{} } func (m *RemoveOrderResponse) String() string { return proto.CompactTextString(m) } func (*RemoveOrderResponse) ProtoMessage() {} func (*RemoveOrderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{51} + return fileDescriptor_6960a02cc0a63cf6, []int{53} } func (m *RemoveOrderResponse) XXX_Unmarshal(b []byte) error { @@ -2994,7 +3083,7 @@ func (m *RemovePairRequest) Reset() { *m = RemovePairRequest{} } func (m *RemovePairRequest) String() string { return proto.CompactTextString(m) } func (*RemovePairRequest) ProtoMessage() {} func (*RemovePairRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{52} + return fileDescriptor_6960a02cc0a63cf6, []int{54} } func (m *RemovePairRequest) XXX_Unmarshal(b []byte) error { @@ -3032,7 +3121,7 @@ func (m *RemovePairResponse) Reset() { *m = RemovePairResponse{} } func (m *RemovePairResponse) String() string { return proto.CompactTextString(m) } func (*RemovePairResponse) ProtoMessage() {} func (*RemovePairResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{53} + return fileDescriptor_6960a02cc0a63cf6, []int{55} } func (m *RemovePairResponse) XXX_Unmarshal(b []byte) error { @@ -3076,7 +3165,7 @@ func (m *RestoreNodeRequest) Reset() { *m = RestoreNodeRequest{} } func (m *RestoreNodeRequest) String() string { return proto.CompactTextString(m) } func (*RestoreNodeRequest) ProtoMessage() {} func (*RestoreNodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{54} + return fileDescriptor_6960a02cc0a63cf6, []int{56} } func (m *RestoreNodeRequest) XXX_Unmarshal(b []byte) error { @@ -3153,7 +3242,7 @@ func (m *RestoreNodeResponse) Reset() { *m = RestoreNodeResponse{} } func (m *RestoreNodeResponse) String() string { return proto.CompactTextString(m) } func (*RestoreNodeResponse) ProtoMessage() {} func (*RestoreNodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{55} + return fileDescriptor_6960a02cc0a63cf6, []int{57} } func (m *RestoreNodeResponse) XXX_Unmarshal(b []byte) error { @@ -3198,7 +3287,7 @@ func (m *ShutdownRequest) Reset() { *m = ShutdownRequest{} } func (m *ShutdownRequest) String() string { return proto.CompactTextString(m) } func (*ShutdownRequest) ProtoMessage() {} func (*ShutdownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{56} + return fileDescriptor_6960a02cc0a63cf6, []int{58} } func (m *ShutdownRequest) XXX_Unmarshal(b []byte) error { @@ -3229,7 +3318,7 @@ func (m *ShutdownResponse) Reset() { *m = ShutdownResponse{} } func (m *ShutdownResponse) String() string { return proto.CompactTextString(m) } func (*ShutdownResponse) ProtoMessage() {} func (*ShutdownResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{57} + return fileDescriptor_6960a02cc0a63cf6, []int{59} } func (m *ShutdownResponse) XXX_Unmarshal(b []byte) error { @@ -3262,7 +3351,7 @@ func (m *SubscribeOrdersRequest) Reset() { *m = SubscribeOrdersRequest{} func (m *SubscribeOrdersRequest) String() string { return proto.CompactTextString(m) } func (*SubscribeOrdersRequest) ProtoMessage() {} func (*SubscribeOrdersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{58} + return fileDescriptor_6960a02cc0a63cf6, []int{60} } func (m *SubscribeOrdersRequest) XXX_Unmarshal(b []byte) error { @@ -3303,7 +3392,7 @@ func (m *SubscribeSwapsRequest) Reset() { *m = SubscribeSwapsRequest{} } func (m *SubscribeSwapsRequest) String() string { return proto.CompactTextString(m) } func (*SubscribeSwapsRequest) ProtoMessage() {} func (*SubscribeSwapsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{59} + return fileDescriptor_6960a02cc0a63cf6, []int{61} } func (m *SubscribeSwapsRequest) XXX_Unmarshal(b []byte) error { @@ -3351,7 +3440,7 @@ func (m *SwapFailure) Reset() { *m = SwapFailure{} } func (m *SwapFailure) String() string { return proto.CompactTextString(m) } func (*SwapFailure) ProtoMessage() {} func (*SwapFailure) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{60} + return fileDescriptor_6960a02cc0a63cf6, []int{62} } func (m *SwapFailure) XXX_Unmarshal(b []byte) error { @@ -3443,7 +3532,7 @@ func (m *SwapSuccess) Reset() { *m = SwapSuccess{} } func (m *SwapSuccess) String() string { return proto.CompactTextString(m) } func (*SwapSuccess) ProtoMessage() {} func (*SwapSuccess) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{61} + return fileDescriptor_6960a02cc0a63cf6, []int{63} } func (m *SwapSuccess) XXX_Unmarshal(b []byte) error { @@ -3569,7 +3658,7 @@ func (m *TradingLimits) Reset() { *m = TradingLimits{} } func (m *TradingLimits) String() string { return proto.CompactTextString(m) } func (*TradingLimits) ProtoMessage() {} func (*TradingLimits) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{62} + return fileDescriptor_6960a02cc0a63cf6, []int{64} } func (m *TradingLimits) XXX_Unmarshal(b []byte) error { @@ -3624,7 +3713,7 @@ func (m *Trade) Reset() { *m = Trade{} } func (m *Trade) String() string { return proto.CompactTextString(m) } func (*Trade) ProtoMessage() {} func (*Trade) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{63} + return fileDescriptor_6960a02cc0a63cf6, []int{65} } func (m *Trade) XXX_Unmarshal(b []byte) error { @@ -3693,7 +3782,7 @@ func (m *TradingLimitsRequest) Reset() { *m = TradingLimitsRequest{} } func (m *TradingLimitsRequest) String() string { return proto.CompactTextString(m) } func (*TradingLimitsRequest) ProtoMessage() {} func (*TradingLimitsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{64} + return fileDescriptor_6960a02cc0a63cf6, []int{66} } func (m *TradingLimitsRequest) XXX_Unmarshal(b []byte) error { @@ -3733,7 +3822,7 @@ func (m *TradingLimitsResponse) Reset() { *m = TradingLimitsResponse{} } func (m *TradingLimitsResponse) String() string { return proto.CompactTextString(m) } func (*TradingLimitsResponse) ProtoMessage() {} func (*TradingLimitsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{65} + return fileDescriptor_6960a02cc0a63cf6, []int{67} } func (m *TradingLimitsResponse) XXX_Unmarshal(b []byte) error { @@ -3775,7 +3864,7 @@ func (m *UnbanRequest) Reset() { *m = UnbanRequest{} } func (m *UnbanRequest) String() string { return proto.CompactTextString(m) } func (*UnbanRequest) ProtoMessage() {} func (*UnbanRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{66} + return fileDescriptor_6960a02cc0a63cf6, []int{68} } func (m *UnbanRequest) XXX_Unmarshal(b []byte) error { @@ -3820,7 +3909,7 @@ func (m *UnbanResponse) Reset() { *m = UnbanResponse{} } func (m *UnbanResponse) String() string { return proto.CompactTextString(m) } func (*UnbanResponse) ProtoMessage() {} func (*UnbanResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{67} + return fileDescriptor_6960a02cc0a63cf6, []int{69} } func (m *UnbanResponse) XXX_Unmarshal(b []byte) error { @@ -3854,7 +3943,7 @@ func (m *UnlockNodeRequest) Reset() { *m = UnlockNodeRequest{} } func (m *UnlockNodeRequest) String() string { return proto.CompactTextString(m) } func (*UnlockNodeRequest) ProtoMessage() {} func (*UnlockNodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{68} + return fileDescriptor_6960a02cc0a63cf6, []int{70} } func (m *UnlockNodeRequest) XXX_Unmarshal(b []byte) error { @@ -3898,7 +3987,7 @@ func (m *UnlockNodeResponse) Reset() { *m = UnlockNodeResponse{} } func (m *UnlockNodeResponse) String() string { return proto.CompactTextString(m) } func (*UnlockNodeResponse) ProtoMessage() {} func (*UnlockNodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{69} + return fileDescriptor_6960a02cc0a63cf6, []int{71} } func (m *UnlockNodeResponse) XXX_Unmarshal(b []byte) error { @@ -3961,7 +4050,7 @@ func (m *WithdrawRequest) Reset() { *m = WithdrawRequest{} } func (m *WithdrawRequest) String() string { return proto.CompactTextString(m) } func (*WithdrawRequest) ProtoMessage() {} func (*WithdrawRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{70} + return fileDescriptor_6960a02cc0a63cf6, []int{72} } func (m *WithdrawRequest) XXX_Unmarshal(b []byte) error { @@ -4029,7 +4118,7 @@ func (m *WithdrawResponse) Reset() { *m = WithdrawResponse{} } func (m *WithdrawResponse) String() string { return proto.CompactTextString(m) } func (*WithdrawResponse) ProtoMessage() {} func (*WithdrawResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6960a02cc0a63cf6, []int{71} + return fileDescriptor_6960a02cc0a63cf6, []int{73} } func (m *WithdrawResponse) XXX_Unmarshal(b []byte) error { @@ -4070,6 +4159,8 @@ func init() { proto.RegisterType((*BanResponse)(nil), "xudrpc.BanResponse") proto.RegisterType((*Chain)(nil), "xudrpc.Chain") proto.RegisterType((*Channels)(nil), "xudrpc.Channels") + proto.RegisterType((*CloseChannelRequest)(nil), "xudrpc.CloseChannelRequest") + proto.RegisterType((*CloseChannelResponse)(nil), "xudrpc.CloseChannelResponse") proto.RegisterType((*ConnectRequest)(nil), "xudrpc.ConnectRequest") proto.RegisterType((*ConnectResponse)(nil), "xudrpc.ConnectResponse") proto.RegisterType((*CreateNodeRequest)(nil), "xudrpc.CreateNodeRequest") @@ -4145,232 +4236,235 @@ func init() { func init() { proto.RegisterFile("xudrpc.proto", fileDescriptor_6960a02cc0a63cf6) } var fileDescriptor_6960a02cc0a63cf6 = []byte{ - // 3593 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0x5b, 0x8f, 0x1c, 0x47, - 0x57, 0xdb, 0x73, 0xd9, 0x99, 0x3d, 0x73, 0xdd, 0xda, 0x5d, 0x7b, 0x3c, 0x76, 0x1c, 0xa7, 0x71, - 0x8c, 0xe3, 0xd8, 0x6b, 0xb3, 0x21, 0x38, 0x76, 0x48, 0x14, 0xef, 0x7a, 0x89, 0x9d, 0xac, 0x2f, - 0xea, 0xb5, 0x13, 0x83, 0x20, 0xad, 0x9e, 0xee, 0xb2, 0xb7, 0x71, 0x4f, 0xf5, 0xa4, 0x2f, 0x7b, - 0xe1, 0x09, 0x25, 0x88, 0x07, 0x78, 0x0c, 0x8f, 0x20, 0x78, 0xe2, 0x05, 0x5e, 0x51, 0x24, 0xfe, - 0x06, 0x12, 0xe2, 0x01, 0x09, 0x21, 0xf1, 0x43, 0x50, 0xdd, 0xba, 0xaa, 0x7a, 0x7a, 0x36, 0x76, - 0xf4, 0x3d, 0x7c, 0x6f, 0x5d, 0xa7, 0x4e, 0x9d, 0x53, 0x75, 0xea, 0xd4, 0xb9, 0x36, 0x74, 0x8f, - 0xf3, 0x20, 0x99, 0xf9, 0x9b, 0xb3, 0x24, 0xce, 0x62, 0xb4, 0xcc, 0x47, 0xe3, 0x55, 0x8f, 0x90, - 0x38, 0xf3, 0xb2, 0x30, 0x26, 0x29, 0x9f, 0xb2, 0x37, 0x60, 0xed, 0x5e, 0x10, 0xec, 0xe4, 0x49, - 0x82, 0x89, 0x7f, 0xe2, 0xe0, 0x74, 0x16, 0x93, 0x14, 0xdb, 0xdf, 0x41, 0xff, 0x5e, 0x10, 0x3c, - 0xf5, 0xc2, 0xc4, 0xc1, 0xdf, 0xe7, 0x38, 0xcd, 0xd0, 0x65, 0xe8, 0x4d, 0xbc, 0x14, 0xbb, 0xbe, - 0x40, 0x1d, 0x59, 0x97, 0xac, 0xab, 0x2b, 0x8e, 0x09, 0x44, 0x57, 0xa0, 0xff, 0x7d, 0x1e, 0x67, - 0x1a, 0x5a, 0x8d, 0xa1, 0x95, 0xa0, 0xf6, 0x2a, 0x0c, 0x0a, 0xfa, 0x82, 0xe5, 0xcf, 0x35, 0x68, - 0x6d, 0x7b, 0x91, 0x47, 0x7c, 0x4c, 0x99, 0x65, 0x71, 0xe6, 0x45, 0xee, 0x84, 0x03, 0x18, 0xb3, - 0x86, 0x63, 0x02, 0xd1, 0x55, 0x18, 0xf8, 0x07, 0x1e, 0x21, 0x58, 0xe1, 0xd5, 0x18, 0x5e, 0x19, - 0x8c, 0x3e, 0x81, 0xb3, 0x33, 0x4c, 0x82, 0x90, 0xbc, 0x72, 0xcb, 0x2b, 0xea, 0x6c, 0xc5, 0xa2, - 0x69, 0x74, 0x17, 0x46, 0x21, 0xf1, 0xfc, 0x2c, 0x3c, 0xc4, 0x73, 0x4b, 0x1b, 0x6c, 0xe9, 0xc2, - 0x79, 0x2a, 0x8c, 0x23, 0x2f, 0x8a, 0x70, 0x56, 0xac, 0x68, 0xb2, 0x15, 0x25, 0x28, 0xfa, 0x1c, - 0xc6, 0x39, 0xf1, 0x63, 0xf2, 0x32, 0x4c, 0xa6, 0x38, 0x70, 0x4b, 0x6b, 0x96, 0xd9, 0x9a, 0x53, - 0x30, 0xec, 0x3f, 0x00, 0xd8, 0xf6, 0x88, 0xbc, 0xa8, 0xab, 0x30, 0x20, 0x71, 0x80, 0xdd, 0x30, - 0xc0, 0x24, 0x0b, 0x5f, 0x86, 0x38, 0x11, 0x57, 0x55, 0x06, 0xdb, 0x3d, 0xe8, 0xb0, 0x75, 0xe2, - 0x02, 0x6e, 0x43, 0x73, 0xe7, 0xc0, 0x0b, 0x09, 0x5a, 0x87, 0xa6, 0x4f, 0x3f, 0xc4, 0x3a, 0x3e, - 0x40, 0x23, 0x68, 0x11, 0x9c, 0x1d, 0xc5, 0xc9, 0x6b, 0x71, 0xa7, 0x72, 0x68, 0xcf, 0xa0, 0xbd, - 0xc3, 0x8f, 0x9e, 0xa2, 0x33, 0xb0, 0xcc, 0xa5, 0xc1, 0x16, 0xf7, 0x1c, 0x31, 0x42, 0x63, 0x68, - 0x4b, 0x39, 0xb1, 0xe5, 0x3d, 0xa7, 0x18, 0x53, 0xca, 0x42, 0xfc, 0xec, 0x36, 0x7a, 0x8e, 0x1c, - 0x52, 0x6a, 0x7e, 0x14, 0xa7, 0x38, 0x60, 0xb2, 0xee, 0x39, 0x62, 0x64, 0x5f, 0x87, 0xfe, 0x4e, - 0x4c, 0x08, 0xf6, 0x33, 0x79, 0xea, 0x31, 0xb4, 0xd9, 0xf1, 0xf2, 0x24, 0x14, 0xdb, 0x2e, 0xc6, - 0x54, 0xd9, 0x0a, 0x6c, 0x71, 0xd6, 0x9b, 0xb0, 0xba, 0x93, 0x60, 0x2f, 0xc3, 0x8f, 0xe3, 0x00, - 0x6b, 0x34, 0x66, 0x5e, 0x9a, 0x1e, 0xc5, 0x49, 0x20, 0x69, 0xc8, 0xb1, 0xfd, 0x93, 0x05, 0x48, - 0x5f, 0xc1, 0xe9, 0xa0, 0xdf, 0x81, 0x5e, 0x8a, 0x71, 0xe0, 0x4e, 0x09, 0x9e, 0xc6, 0x24, 0xf4, - 0x47, 0xd6, 0xa5, 0xfa, 0xd5, 0x15, 0xa7, 0x4b, 0x81, 0x8f, 0x04, 0x0c, 0x7d, 0x00, 0xc3, 0x90, - 0x84, 0x59, 0xe8, 0x45, 0xe1, 0x5f, 0xe0, 0xc0, 0x8d, 0x48, 0x90, 0x8e, 0x6a, 0x0c, 0x6f, 0xa0, - 0xc1, 0xf7, 0x48, 0x90, 0xa2, 0x1b, 0x80, 0x74, 0xd4, 0xc4, 0xa3, 0xd7, 0xc5, 0xa4, 0xd2, 0x76, - 0x56, 0xb5, 0x19, 0x87, 0x4d, 0xd8, 0xff, 0x69, 0x41, 0x5b, 0xbe, 0x5d, 0xba, 0xfd, 0xd2, 0xe3, - 0x2c, 0xc6, 0xe8, 0x33, 0xe8, 0xa4, 0x47, 0xde, 0xcc, 0xf5, 0xa3, 0x10, 0x93, 0x8c, 0xdd, 0x40, - 0x7f, 0xeb, 0xfc, 0xa6, 0xb0, 0x12, 0x92, 0xc4, 0xe6, 0xfe, 0x91, 0x37, 0xdb, 0x61, 0x28, 0x8e, - 0x8e, 0xcf, 0xdf, 0xe3, 0x6b, 0x4c, 0x5c, 0x2f, 0x08, 0x12, 0x9c, 0xa6, 0x6c, 0x47, 0x2b, 0x8e, - 0x09, 0xa4, 0xfa, 0x1e, 0x60, 0x3f, 0x9c, 0x7a, 0x91, 0x3b, 0x8b, 0x3c, 0x1f, 0xa7, 0xe2, 0xd6, - 0x4a, 0x50, 0xfb, 0x3d, 0x00, 0xc5, 0x08, 0xb5, 0xa0, 0xbe, 0xf7, 0xf8, 0xfe, 0x70, 0x09, 0x01, - 0x2c, 0x3b, 0xf7, 0x1e, 0xde, 0xdf, 0x7d, 0x3c, 0xb4, 0xe8, 0x05, 0xdf, 0xc7, 0xb3, 0x38, 0x0d, - 0xf5, 0x0b, 0x5e, 0x74, 0x3a, 0xfb, 0x43, 0x18, 0x14, 0xd8, 0xe2, 0x62, 0x46, 0xd0, 0x92, 0x7b, - 0xe5, 0xd8, 0x72, 0x68, 0x7f, 0x01, 0xeb, 0xf7, 0xc3, 0xd4, 0x8f, 0x0f, 0x71, 0x42, 0xaf, 0x32, - 0x7d, 0xfb, 0x77, 0xf3, 0x31, 0x6c, 0x94, 0x28, 0x08, 0xa6, 0x17, 0x60, 0x85, 0xe4, 0x53, 0x97, - 0xe2, 0xa7, 0x42, 0xff, 0x15, 0xc0, 0xfe, 0x1b, 0x0b, 0xd0, 0xee, 0x31, 0xf6, 0xf3, 0x0c, 0xd3, - 0xe3, 0x6b, 0x07, 0x8b, 0x93, 0x00, 0x27, 0x6e, 0x58, 0x68, 0x9d, 0x1c, 0xb3, 0x97, 0xe1, 0x85, - 0x6c, 0x4a, 0xbc, 0x39, 0x31, 0x44, 0x36, 0x74, 0x67, 0x18, 0x27, 0xee, 0x2c, 0x9f, 0xb8, 0xaf, - 0xf1, 0x89, 0xb8, 0x10, 0x03, 0x46, 0x29, 0x7f, 0x9f, 0x7b, 0x24, 0x0b, 0xb3, 0x13, 0x61, 0xab, - 0x8a, 0x31, 0x7d, 0x00, 0x5f, 0xe2, 0x4c, 0xd8, 0xdb, 0x37, 0x91, 0xf1, 0x3f, 0x5b, 0x80, 0xf4, - 0x15, 0xe2, 0xc8, 0xdb, 0xd0, 0x16, 0x66, 0x28, 0x65, 0xba, 0xdf, 0xd9, 0xba, 0x2a, 0xb5, 0x6a, - 0x1e, 0x7b, 0x53, 0x8c, 0xd3, 0x5d, 0x92, 0x25, 0x27, 0xce, 0x32, 0x3b, 0x67, 0x3a, 0xde, 0x83, - 0x9e, 0x31, 0x81, 0x86, 0x50, 0xa7, 0x67, 0xe2, 0x5b, 0xa0, 0x9f, 0xe8, 0x7d, 0x68, 0x1e, 0x7a, - 0x51, 0xce, 0x6d, 0x47, 0x67, 0x6b, 0x20, 0x79, 0x48, 0x06, 0x7c, 0xf6, 0x6e, 0xed, 0x13, 0xcb, - 0x1e, 0x42, 0xff, 0x4b, 0x9c, 0x3d, 0x24, 0x2f, 0x63, 0x71, 0x2c, 0xfb, 0xaf, 0x1b, 0x30, 0x28, - 0x40, 0x4a, 0x3f, 0x0e, 0x71, 0x92, 0x86, 0xb1, 0xb4, 0x72, 0x72, 0x48, 0x25, 0xcb, 0x2e, 0x5c, - 0x4a, 0x96, 0x0b, 0xde, 0x80, 0x21, 0x04, 0x8d, 0x3c, 0x09, 0xe9, 0x33, 0xa0, 0xaf, 0x98, 0x7d, - 0xcb, 0xcb, 0xa7, 0x37, 0x20, 0x15, 0x5f, 0x01, 0x8a, 0x59, 0x2f, 0x4c, 0x52, 0xe6, 0x06, 0xe4, - 0x2c, 0x05, 0xa0, 0x0f, 0x41, 0xc8, 0x82, 0x59, 0xfb, 0xce, 0xd6, 0x9a, 0x3c, 0xdf, 0x13, 0x06, - 0xdd, 0x89, 0x73, 0x92, 0x49, 0x71, 0xa1, 0x2d, 0xa8, 0x47, 0x24, 0x18, 0xb5, 0x98, 0xb4, 0x2f, - 0x69, 0xd2, 0xd6, 0x0f, 0xb8, 0xb9, 0x47, 0x02, 0x2e, 0x65, 0x8a, 0x8c, 0xae, 0xc1, 0xb2, 0xb0, - 0x25, 0x6d, 0xc6, 0x00, 0xc9, 0x65, 0xdc, 0x90, 0xb0, 0x95, 0x02, 0x83, 0x9a, 0x7f, 0x2f, 0x0a, - 0xbd, 0x74, 0xb4, 0xc2, 0xcd, 0x3f, 0x1b, 0xe8, 0xe6, 0x1f, 0x0c, 0xf3, 0x8f, 0x6e, 0xc1, 0x9a, - 0xf4, 0x9e, 0xcc, 0x66, 0x1c, 0x78, 0xe9, 0x01, 0x4e, 0x47, 0x1d, 0x26, 0x9b, 0xaa, 0x29, 0x74, - 0x03, 0x5a, 0x3e, 0x35, 0xc8, 0xc7, 0xd9, 0xa8, 0x6b, 0x9e, 0x77, 0x87, 0x83, 0xd9, 0x7e, 0x24, - 0xce, 0xf8, 0x4b, 0x68, 0xcb, 0xd3, 0xbc, 0x85, 0x6a, 0xec, 0x91, 0x80, 0x91, 0xd1, 0x54, 0xe3, - 0x73, 0xa6, 0xc2, 0xf4, 0xcd, 0x6a, 0xea, 0xf1, 0x16, 0x0f, 0xdf, 0x81, 0x35, 0x63, 0x7d, 0xe1, - 0x04, 0x06, 0x09, 0x9e, 0xe5, 0x3c, 0xb0, 0xda, 0xf7, 0xe3, 0x84, 0x3b, 0xbf, 0x55, 0x07, 0x14, - 0x98, 0xba, 0xb2, 0x09, 0xf5, 0x91, 0xfc, 0x25, 0xb7, 0x1d, 0x31, 0xb2, 0xcf, 0xc2, 0xc6, 0x5e, - 0x98, 0x66, 0xc2, 0x04, 0x87, 0x85, 0x3d, 0xb2, 0xbf, 0x82, 0x33, 0xe5, 0x09, 0xc1, 0xef, 0x16, - 0x80, 0x5f, 0x40, 0xc5, 0xab, 0x1b, 0x96, 0x6d, 0xb9, 0xa3, 0xe1, 0xd8, 0xff, 0x64, 0xc1, 0x2a, - 0x25, 0xc6, 0xd5, 0x49, 0x1e, 0x5c, 0xb3, 0x2e, 0x96, 0x69, 0x5d, 0x3e, 0x86, 0x66, 0x7c, 0x44, - 0x70, 0x22, 0x1c, 0xc5, 0xbb, 0x85, 0x4c, 0xcb, 0x34, 0x36, 0x9f, 0x50, 0x34, 0x87, 0x63, 0x53, - 0xcd, 0x89, 0xc2, 0x69, 0x98, 0x09, 0x37, 0xce, 0x07, 0xf6, 0x65, 0x68, 0x32, 0x2c, 0xd4, 0x86, - 0xc6, 0xf6, 0x93, 0x67, 0x0f, 0x86, 0x4b, 0xd4, 0xe6, 0x3f, 0xf9, 0xf6, 0xf1, 0xd0, 0xa2, 0xa0, - 0xa7, 0xbb, 0xbb, 0xce, 0xb0, 0x66, 0xff, 0xa3, 0x05, 0x48, 0x27, 0x2f, 0xce, 0xfa, 0x79, 0xf1, - 0x32, 0xf8, 0x39, 0xaf, 0x54, 0x6d, 0x45, 0xa8, 0x3c, 0x1f, 0x9a, 0xb6, 0xe5, 0x21, 0x74, 0x34, - 0x70, 0x85, 0xfa, 0x5c, 0x36, 0xd5, 0xa7, 0x6f, 0xbe, 0x3c, 0x5d, 0x7b, 0x10, 0x0c, 0x29, 0x53, - 0x1a, 0xb4, 0x16, 0x97, 0xf4, 0x01, 0x97, 0xab, 0x80, 0x89, 0x3d, 0xaf, 0x43, 0x93, 0xbf, 0x73, - 0x1e, 0x0c, 0xf0, 0x41, 0xb1, 0x1c, 0x2b, 0xe9, 0xd9, 0xb7, 0xc5, 0x72, 0xac, 0x1f, 0xd9, 0x86, - 0x26, 0x37, 0x22, 0xfc, 0xc4, 0x5d, 0xb9, 0x23, 0x8a, 0xe5, 0xf0, 0x29, 0xc9, 0xf7, 0x59, 0xe2, - 0x69, 0x1e, 0xac, 0x10, 0xbf, 0xa5, 0x8b, 0xff, 0x53, 0x2e, 0x57, 0x89, 0x2a, 0x98, 0xbc, 0x0f, - 0xcb, 0x19, 0x83, 0x08, 0x2e, 0x3d, 0xc9, 0x85, 0xe1, 0x39, 0x62, 0xd2, 0xfe, 0x6f, 0x0b, 0x5a, - 0xe2, 0x21, 0x51, 0x0d, 0x4e, 0x33, 0x2f, 0xcb, 0xa5, 0x47, 0x15, 0x23, 0x74, 0x1d, 0xda, 0x22, - 0xf2, 0x4d, 0x85, 0x10, 0x95, 0x32, 0x0a, 0xb8, 0x53, 0x60, 0x50, 0xc6, 0x2c, 0x9e, 0xe4, 0xc6, - 0x53, 0x63, 0xcc, 0x62, 0x4f, 0x47, 0x4c, 0xa2, 0x4b, 0xd0, 0x99, 0x44, 0xb1, 0xff, 0xfa, 0x00, - 0x87, 0xaf, 0x0e, 0x32, 0x61, 0x4f, 0x75, 0x50, 0x61, 0x83, 0x9b, 0x9a, 0x0d, 0xd6, 0xac, 0xfa, - 0xb2, 0x69, 0xd5, 0x0b, 0xa3, 0xd6, 0xd2, 0x8c, 0x9a, 0xfd, 0x77, 0x16, 0xa0, 0x27, 0x33, 0x4c, - 0xc4, 0x3e, 0xdf, 0xda, 0x22, 0x18, 0x1e, 0xb3, 0x56, 0x8a, 0xb9, 0x68, 0x28, 0x3c, 0xa5, 0x96, - 0x5b, 0xe4, 0x18, 0x62, 0x44, 0x8f, 0x36, 0xcb, 0xd3, 0x03, 0x57, 0x4c, 0x72, 0xcf, 0xac, 0x83, - 0x68, 0x52, 0x66, 0xec, 0x4a, 0x04, 0xad, 0xff, 0x56, 0x83, 0x26, 0x53, 0x4b, 0xa6, 0x61, 0x49, - 0x28, 0xf2, 0x22, 0xcb, 0xe1, 0x03, 0xc3, 0xdf, 0xd7, 0x4c, 0x7f, 0xaf, 0xbf, 0xf5, 0xba, 0xf9, - 0xd6, 0xfb, 0x50, 0x0b, 0x79, 0x7c, 0xbd, 0xe2, 0xd4, 0xc2, 0x00, 0x5d, 0x2e, 0x45, 0x16, 0xd4, - 0x59, 0xad, 0x3c, 0x58, 0x2a, 0xc5, 0x16, 0x17, 0xa0, 0x1d, 0xc5, 0xbe, 0x17, 0x51, 0x82, 0xcb, - 0x02, 0xa3, 0x80, 0xa0, 0x8b, 0x00, 0x3e, 0x0b, 0x96, 0x03, 0xd7, 0xcb, 0x98, 0xc8, 0x1b, 0x8e, - 0x06, 0x41, 0xef, 0x43, 0x23, 0x0d, 0x03, 0xcc, 0x9c, 0x51, 0x7f, 0x6b, 0xd5, 0x78, 0x73, 0xfb, - 0x61, 0x80, 0x1d, 0x36, 0x4d, 0x5d, 0x71, 0x98, 0xba, 0xf1, 0x11, 0x71, 0xd9, 0x6b, 0x66, 0x0e, - 0xa9, 0xed, 0x18, 0x30, 0xaa, 0x06, 0x07, 0x71, 0x14, 0x30, 0xa7, 0xd4, 0x70, 0xd8, 0xf7, 0x76, - 0x0f, 0x3a, 0x1c, 0x81, 0x39, 0x5f, 0x6a, 0xfd, 0xba, 0x8c, 0xb4, 0x83, 0xa7, 0xf1, 0xa1, 0x17, - 0x19, 0x82, 0xb2, 0x16, 0x0b, 0xaa, 0x14, 0x72, 0xe9, 0x81, 0x5a, 0xbd, 0x14, 0xa8, 0x8d, 0x35, - 0x71, 0x70, 0x51, 0x2a, 0x61, 0x94, 0x4f, 0xd1, 0x9c, 0x3f, 0x85, 0x7d, 0x00, 0xcb, 0xdc, 0xe0, - 0xa0, 0x1b, 0x00, 0x93, 0xfc, 0xc4, 0x35, 0x8c, 0x5e, 0xcf, 0x10, 0x90, 0xa3, 0x21, 0xa0, 0x9b, - 0xd0, 0x49, 0x71, 0x14, 0x49, 0xfc, 0x5a, 0x15, 0xbe, 0x8e, 0x61, 0x7f, 0x24, 0x0d, 0x22, 0x0b, - 0x2a, 0xa8, 0xf8, 0xa8, 0x8c, 0x84, 0xc9, 0x60, 0xdf, 0xd4, 0x48, 0xc6, 0x47, 0x44, 0xa4, 0x69, - 0xf4, 0xd3, 0xfe, 0xc1, 0x12, 0xab, 0x9e, 0xcf, 0x02, 0x2f, 0xa3, 0xd6, 0xa3, 0xc9, 0xcf, 0x62, - 0xb1, 0xf7, 0x6e, 0xf2, 0x7b, 0xb0, 0xe4, 0xf0, 0x59, 0xf4, 0x87, 0xd0, 0xe3, 0x12, 0x4a, 0xb8, - 0xe0, 0x85, 0x79, 0x58, 0x37, 0xb7, 0xc7, 0xe7, 0x1e, 0x2c, 0x39, 0x26, 0xf2, 0x76, 0x1f, 0xba, - 0x1c, 0x90, 0x33, 0xa6, 0xf6, 0x8f, 0x75, 0x68, 0x50, 0x1b, 0xb8, 0x38, 0xb6, 0x7f, 0xa3, 0xd8, - 0xed, 0x0b, 0xe8, 0x46, 0x24, 0x90, 0x43, 0x69, 0x86, 0x2e, 0xe8, 0x56, 0x96, 0xc6, 0x0e, 0x4f, - 0xf3, 0xc9, 0xd7, 0xf8, 0x44, 0x78, 0x13, 0x63, 0x05, 0xe5, 0x1f, 0x92, 0x49, 0x9c, 0x13, 0x7e, - 0xd7, 0x6d, 0x47, 0x0e, 0x95, 0xe5, 0x6f, 0x6a, 0x96, 0x9f, 0x3e, 0xf8, 0xe3, 0x3c, 0x70, 0x4d, - 0xcb, 0xa4, 0x83, 0xd0, 0x75, 0x58, 0x4d, 0xb1, 0x1f, 0x93, 0x20, 0x75, 0x7d, 0x9e, 0xa9, 0xe2, - 0x80, 0x3d, 0x9b, 0x9e, 0x33, 0x3f, 0x41, 0xf3, 0x2c, 0x1e, 0xaa, 0x15, 0xe9, 0x58, 0x9b, 0x17, - 0x59, 0x4c, 0x68, 0x75, 0x20, 0x37, 0xfe, 0x0c, 0x06, 0xa5, 0xe3, 0x55, 0x78, 0xc5, 0x75, 0xdd, - 0x2b, 0xae, 0xe8, 0x5e, 0xf0, 0x2f, 0x6b, 0xb0, 0xfa, 0x94, 0xe6, 0x71, 0xe2, 0xf2, 0x0a, 0xd7, - 0xf3, 0x1b, 0x33, 0x48, 0xfa, 0x3b, 0x6b, 0x94, 0xde, 0x99, 0x34, 0x1c, 0xcd, 0xd3, 0x0d, 0xc7, - 0x35, 0x18, 0x26, 0x98, 0x65, 0x9b, 0x6e, 0x41, 0x8a, 0x8b, 0x7d, 0x0e, 0x4e, 0xc3, 0xd7, 0x70, - 0x3a, 0xc5, 0x41, 0xe8, 0x65, 0x14, 0xea, 0xfa, 0x34, 0xa1, 0x88, 0x98, 0xf4, 0xdb, 0x4e, 0xd5, - 0x14, 0x15, 0x01, 0xd2, 0x45, 0x20, 0x5c, 0xea, 0x1d, 0x9a, 0xe6, 0x67, 0x38, 0x21, 0x5e, 0xe4, - 0x4e, 0xbd, 0xcc, 0x3f, 0xc0, 0x0b, 0xde, 0xef, 0x1c, 0x1a, 0xfa, 0x14, 0xfa, 0x2c, 0x3e, 0x4e, - 0x73, 0xdf, 0xc7, 0x69, 0x8a, 0xe5, 0x43, 0x2e, 0xe2, 0x62, 0x9a, 0x30, 0xee, 0xf3, 0x49, 0xa7, - 0x84, 0x8a, 0x6e, 0xd3, 0xf0, 0x73, 0xea, 0x85, 0x84, 0x86, 0xd9, 0xfc, 0x59, 0xd6, 0x2b, 0x9e, - 0xa5, 0x53, 0xc6, 0x42, 0x77, 0xa0, 0xc7, 0x48, 0xbd, 0xf4, 0xc2, 0x28, 0x4f, 0x58, 0xba, 0x3e, - 0xc7, 0xf4, 0x8f, 0xf8, 0x9c, 0x63, 0x62, 0xda, 0x7f, 0x55, 0x83, 0x81, 0x12, 0xc1, 0xee, 0x21, - 0x4d, 0xe4, 0x6f, 0x43, 0xdf, 0x3c, 0xd8, 0x22, 0xeb, 0x50, 0x42, 0x43, 0x77, 0xa0, 0xab, 0x1f, - 0x49, 0x58, 0x89, 0xaa, 0xb3, 0x53, 0x37, 0xa4, 0xa3, 0xa2, 0x3b, 0x6f, 0x76, 0xf6, 0x07, 0x4b, - 0x55, 0xa7, 0xef, 0xea, 0x67, 0x62, 0xaa, 0x56, 0x7d, 0xf8, 0x82, 0xab, 0x40, 0xdd, 0x6e, 0x41, - 0x13, 0xd3, 0x23, 0xdb, 0x7f, 0x6f, 0x01, 0xa8, 0x0c, 0x6a, 0x61, 0x84, 0xa4, 0x19, 0xac, 0x9a, - 0x69, 0xb0, 0xf4, 0xd8, 0xa9, 0xfe, 0x8b, 0xb1, 0x93, 0x16, 0xde, 0x34, 0xe6, 0xc2, 0x1b, 0x5e, - 0xb2, 0x6b, 0x6a, 0x25, 0x3b, 0xfb, 0x1f, 0x2c, 0xe8, 0x68, 0x19, 0xd5, 0x6f, 0xdd, 0xfe, 0x3e, - 0x82, 0x0d, 0x66, 0xfd, 0xb1, 0xaa, 0x3f, 0xff, 0x72, 0x21, 0x62, 0x04, 0x67, 0xca, 0x8b, 0x44, - 0x7c, 0xb4, 0x07, 0x88, 0xcf, 0x18, 0xa6, 0xe9, 0xb4, 0xfa, 0xca, 0x29, 0x06, 0xca, 0xfe, 0x18, - 0xd6, 0x0c, 0x6a, 0xe2, 0x95, 0x5f, 0x84, 0xa1, 0x44, 0x71, 0x63, 0xe2, 0xb2, 0xd8, 0xc3, 0x52, - 0xb1, 0x87, 0x7d, 0x03, 0x56, 0xf9, 0x32, 0xbd, 0x78, 0xbe, 0x30, 0xd3, 0xb2, 0xd7, 0xe5, 0x9e, - 0x8d, 0x5a, 0xf8, 0xff, 0xd4, 0x28, 0x38, 0xcd, 0xe2, 0xc4, 0x28, 0x50, 0xbe, 0x51, 0xb5, 0x51, - 0xaf, 0x62, 0xd6, 0xcc, 0x2a, 0x26, 0xfa, 0x1a, 0x3a, 0xd4, 0x93, 0x4d, 0x3c, 0xff, 0x75, 0x3e, - 0x93, 0xae, 0xef, 0x5a, 0x51, 0x0b, 0x98, 0xe3, 0x48, 0x1d, 0xe1, 0x36, 0x47, 0xe6, 0x8e, 0x10, - 0xa2, 0x02, 0x80, 0x7e, 0x17, 0x06, 0xc2, 0xe1, 0x04, 0x5e, 0xe6, 0x4d, 0xbc, 0x94, 0xbf, 0xa1, - 0xae, 0xf4, 0x43, 0xf7, 0x05, 0x14, 0xdd, 0x82, 0xf5, 0x12, 0xa2, 0x3b, 0xf3, 0xb2, 0x03, 0xa1, - 0x0b, 0xc8, 0xc4, 0x7e, 0xea, 0x65, 0x07, 0xe8, 0x3d, 0xd6, 0xc0, 0x50, 0x74, 0x97, 0x19, 0x5d, - 0xea, 0x32, 0x25, 0x9a, 0x70, 0x63, 0xfa, 0xe6, 0x7e, 0xc9, 0x8d, 0x75, 0x75, 0x37, 0xe6, 0xd3, - 0xdb, 0xd5, 0x8e, 0xab, 0xea, 0xb9, 0x09, 0x07, 0x8b, 0x3a, 0xad, 0x90, 0xb0, 0x04, 0xb2, 0x22, - 0x2d, 0x3d, 0xb8, 0x44, 0x12, 0x55, 0x15, 0x9e, 0xd3, 0xf7, 0x25, 0x58, 0x94, 0x67, 0x57, 0x61, - 0xb0, 0x7f, 0x90, 0x67, 0x41, 0x7c, 0x24, 0xab, 0xf3, 0x34, 0x0b, 0x54, 0x20, 0x71, 0xdb, 0xbf, - 0x0f, 0x67, 0xf6, 0xf3, 0x49, 0xea, 0x27, 0xe1, 0x04, 0x9b, 0x19, 0xfa, 0x18, 0xda, 0xf8, 0x38, - 0x4c, 0xb3, 0x90, 0xbc, 0x62, 0xc7, 0x6a, 0x3b, 0xc5, 0xd8, 0xfe, 0x0c, 0x36, 0x8a, 0x55, 0xd4, - 0x58, 0xa5, 0x5a, 0xa7, 0x26, 0x24, 0x7e, 0x94, 0x07, 0xd8, 0xcd, 0xbc, 0xd7, 0x22, 0x48, 0x6b, - 0x3b, 0x26, 0xd0, 0xfe, 0x17, 0x0b, 0x3a, 0x9a, 0x8d, 0xfb, 0x95, 0x65, 0x48, 0xfd, 0x01, 0xd5, - 0x4b, 0x1e, 0xbe, 0x5c, 0xa2, 0x6c, 0x54, 0x94, 0x28, 0xaf, 0x40, 0x5f, 0x18, 0x55, 0x37, 0xc1, - 0x5e, 0x1a, 0x4b, 0x03, 0x51, 0x82, 0xda, 0xff, 0x55, 0xe7, 0xbb, 0x15, 0x7e, 0x00, 0x9d, 0x9b, - 0xdb, 0x6d, 0x8b, 0x8d, 0x1f, 0x9a, 0xa1, 0x78, 0xad, 0x14, 0x8a, 0x9f, 0x1a, 0x74, 0x2c, 0xaa, - 0x95, 0x52, 0xb3, 0x99, 0xb0, 0xd2, 0x95, 0xd8, 0x9c, 0x18, 0xd1, 0x34, 0x91, 0x27, 0x6c, 0x6e, - 0x82, 0x7d, 0x1c, 0x1e, 0xe2, 0x80, 0x05, 0x62, 0x0d, 0xa7, 0x0c, 0xa6, 0x11, 0xa0, 0x00, 0xa5, - 0x98, 0x64, 0x2c, 0x1e, 0x6b, 0x38, 0x3a, 0x68, 0x4e, 0x58, 0x50, 0x21, 0xac, 0xeb, 0xd0, 0x48, - 0xe2, 0x08, 0x8f, 0x3a, 0x2c, 0xf8, 0x19, 0x55, 0xf8, 0xc7, 0x4d, 0x27, 0x8e, 0xb0, 0xc3, 0xb0, - 0x68, 0x4c, 0x29, 0x6d, 0xa6, 0xda, 0x5f, 0x97, 0x91, 0x9d, 0x9f, 0xa0, 0x4a, 0x53, 0x00, 0xd9, - 0x1e, 0x7b, 0xbc, 0xc2, 0x6f, 0x00, 0x69, 0x5e, 0x97, 0xb8, 0xb3, 0x04, 0x87, 0x53, 0xef, 0x15, - 0x1e, 0xf5, 0x19, 0x8a, 0x06, 0x51, 0x61, 0xe0, 0x40, 0x0b, 0x03, 0xed, 0x0b, 0xd0, 0xa0, 0xfb, - 0x42, 0x2b, 0xd0, 0x7c, 0x76, 0xef, 0xeb, 0x5d, 0x67, 0xb8, 0x44, 0x3f, 0x1f, 0xb1, 0x4f, 0xcb, - 0xde, 0x81, 0xde, 0xb3, 0xc4, 0x0b, 0x42, 0xf2, 0x6a, 0x2f, 0x9c, 0x86, 0x19, 0xbd, 0xdb, 0xd6, - 0x23, 0xef, 0x78, 0x1f, 0x47, 0x91, 0x4c, 0xce, 0xa6, 0xde, 0xb1, 0x4b, 0x73, 0x18, 0x74, 0x16, - 0x96, 0x1f, 0x79, 0xc7, 0xdb, 0xb9, 0xb4, 0xd6, 0x2d, 0x3a, 0x33, 0xc9, 0x4f, 0xec, 0x7f, 0xb7, - 0xa0, 0xc9, 0x2a, 0x17, 0x34, 0x21, 0x9a, 0x52, 0x05, 0x77, 0x17, 0x27, 0x28, 0x8e, 0x8e, 0x81, - 0xb6, 0xa0, 0x93, 0x69, 0x0b, 0x6a, 0x55, 0x0b, 0xfa, 0x1a, 0x06, 0xd5, 0x16, 0xa5, 0x11, 0x75, - 0x43, 0x23, 0x4e, 0xd3, 0x22, 0x4d, 0xf7, 0x9a, 0xa6, 0x0f, 0xd8, 0x82, 0x75, 0x43, 0x02, 0x6f, - 0xe2, 0x05, 0xff, 0xd5, 0x82, 0x8d, 0xd2, 0x22, 0x61, 0xc2, 0xee, 0xc1, 0x32, 0x2b, 0xfc, 0xc8, - 0xe0, 0xf3, 0x03, 0xbd, 0xb2, 0x33, 0x87, 0xbe, 0xc9, 0x87, 0xa2, 0x68, 0xc6, 0x17, 0x8e, 0x9f, - 0x42, 0x47, 0x03, 0x57, 0xd8, 0xd5, 0x0f, 0xcd, 0xa2, 0xd9, 0x46, 0x35, 0x0b, 0xcd, 0xdc, 0x7e, - 0x03, 0xdd, 0xe7, 0x64, 0xf2, 0x2b, 0x9a, 0x94, 0xe8, 0x02, 0xac, 0x24, 0x58, 0xe4, 0x3e, 0xc2, - 0xcc, 0x2a, 0x80, 0x3d, 0x80, 0x9e, 0xa0, 0xab, 0x1a, 0x7b, 0xcf, 0x49, 0x14, 0xfb, 0xaf, 0xdf, - 0xb4, 0xb1, 0xf7, 0xa3, 0x05, 0x48, 0x5f, 0xa1, 0x1c, 0x41, 0xce, 0xa0, 0x25, 0x47, 0x20, 0x81, - 0xd2, 0x11, 0x14, 0x48, 0xa6, 0x23, 0x90, 0x60, 0xee, 0x08, 0xd0, 0xbb, 0xd0, 0xd1, 0x69, 0xf1, - 0xb6, 0x01, 0x28, 0x4a, 0xf6, 0xdf, 0x5a, 0x30, 0xf8, 0x36, 0xcc, 0x0e, 0x82, 0xc4, 0x3b, 0x7a, - 0x83, 0xeb, 0xa7, 0x06, 0x25, 0xc0, 0xd4, 0x0f, 0xb0, 0xe2, 0xb2, 0xb0, 0x73, 0x3a, 0x68, 0x61, - 0xf5, 0x69, 0x08, 0x75, 0x2f, 0x8a, 0x44, 0xe2, 0x4a, 0x3f, 0x29, 0xe4, 0x25, 0xc6, 0xa2, 0x29, - 0x41, 0x3f, 0xed, 0xbb, 0x30, 0x54, 0x9b, 0x11, 0x02, 0xb9, 0x02, 0xfd, 0x2c, 0xf1, 0x48, 0xea, - 0xf9, 0x94, 0xbc, 0xb2, 0xbb, 0x25, 0xe8, 0xb5, 0x8b, 0xb0, 0x52, 0x64, 0x63, 0xa8, 0x05, 0xf5, - 0xed, 0xe7, 0x7f, 0x3c, 0x5c, 0x42, 0x6d, 0x68, 0xec, 0xef, 0xee, 0xed, 0x0d, 0xad, 0xad, 0xff, - 0xb5, 0xa0, 0xf5, 0x22, 0x0f, 0x1e, 0x92, 0x30, 0x43, 0xbb, 0x00, 0xaa, 0xa7, 0x8a, 0xce, 0x15, - 0x91, 0x65, 0xb9, 0x33, 0x3b, 0x1e, 0x57, 0x4d, 0x89, 0x1b, 0x5f, 0x42, 0x0f, 0xa0, 0xa3, 0xf9, - 0x72, 0x34, 0x5e, 0x1c, 0xcf, 0x8c, 0xcf, 0x57, 0xce, 0x15, 0x94, 0x76, 0x01, 0x94, 0x2e, 0xa8, - 0x0d, 0xcd, 0x69, 0x94, 0xda, 0xd0, 0xbc, 0xea, 0xd8, 0x4b, 0x5b, 0x3f, 0xaf, 0x43, 0xfd, 0x45, - 0x1e, 0xa0, 0x17, 0xd0, 0xd1, 0x7e, 0xae, 0x40, 0x73, 0x35, 0x7a, 0xb5, 0x9d, 0xaa, 0x7f, 0x30, - 0xc6, 0x3f, 0xfc, 0xc7, 0xff, 0xfd, 0x54, 0x5b, 0xb7, 0x07, 0x37, 0x0f, 0x7f, 0xef, 0xa6, 0x17, - 0x04, 0xf2, 0xf2, 0xef, 0x5a, 0xd7, 0x90, 0x03, 0x2d, 0xf1, 0xff, 0x04, 0x3a, 0xa3, 0xd1, 0xd0, - 0x62, 0xce, 0xf1, 0xd9, 0x39, 0xb8, 0xa0, 0x7b, 0x86, 0xd1, 0x1d, 0xda, 0x1d, 0x41, 0x97, 0x9a, - 0x21, 0x4a, 0x73, 0x1b, 0xea, 0xdb, 0x1e, 0x41, 0x48, 0xf5, 0xd6, 0xe4, 0x73, 0x1d, 0xaf, 0x19, - 0x30, 0x41, 0x07, 0x31, 0x3a, 0x5d, 0xbb, 0x45, 0xe9, 0x4c, 0x3c, 0x22, 0xf6, 0x25, 0x5a, 0xed, - 0x6a, 0x5f, 0x66, 0xa7, 0x5e, 0xed, 0xab, 0xdc, 0x93, 0x37, 0xf6, 0x25, 0x1e, 0xb8, 0xa0, 0x29, - 0xba, 0xbb, 0x8a, 0xa6, 0xd9, 0x1c, 0x56, 0x34, 0x4b, 0x6d, 0x60, 0x93, 0x66, 0xc0, 0x27, 0x29, - 0xcd, 0x3f, 0x87, 0x9e, 0xd1, 0xc2, 0x45, 0x45, 0xfd, 0xa7, 0xaa, 0x37, 0x3c, 0x7e, 0x67, 0xc1, - 0xac, 0xe0, 0x72, 0x81, 0x71, 0x39, 0x63, 0xaf, 0x32, 0x2e, 0x02, 0x85, 0x35, 0x7d, 0x29, 0xaf, - 0x17, 0x00, 0xaa, 0x15, 0xaa, 0x94, 0x6a, 0xae, 0xfd, 0xaa, 0x94, 0x6a, 0xbe, 0x73, 0x6a, 0xaf, - 0x31, 0x16, 0x3d, 0xd4, 0xe1, 0xc2, 0xe6, 0xb4, 0xf6, 0xa0, 0x25, 0xda, 0x7e, 0x4a, 0x32, 0x66, - 0xef, 0x53, 0x49, 0xa6, 0xd4, 0x1f, 0xb4, 0x87, 0x8c, 0x20, 0xa0, 0x36, 0x25, 0x18, 0x52, 0x12, - 0x7f, 0x0a, 0x1d, 0xad, 0xbb, 0x85, 0xf4, 0xdd, 0x94, 0x5a, 0x66, 0x4a, 0x6f, 0x2b, 0xda, 0x61, - 0xf6, 0x3a, 0xa3, 0xdc, 0x47, 0x5d, 0x4a, 0x99, 0x4a, 0x81, 0x51, 0xff, 0x16, 0x40, 0xb5, 0x6c, - 0x94, 0x14, 0xe6, 0x3a, 0x4a, 0x4a, 0x0a, 0xf3, 0x1d, 0x1e, 0xa9, 0x72, 0x08, 0x28, 0x69, 0x51, - 0x01, 0x7d, 0x05, 0x7d, 0xb3, 0x4f, 0x86, 0xde, 0xd1, 0x29, 0xcc, 0x35, 0xd6, 0xc6, 0x17, 0x17, - 0x4d, 0x9b, 0x3a, 0x83, 0xfa, 0x4c, 0x0f, 0x15, 0xd9, 0x7d, 0x58, 0x29, 0x7a, 0x3d, 0x68, 0xa4, - 0x13, 0xd1, 0x5b, 0x42, 0xe3, 0x73, 0x15, 0x33, 0x82, 0xf2, 0x2a, 0xa3, 0xdc, 0x41, 0x2b, 0x94, - 0x32, 0xaf, 0x0d, 0x4a, 0xa2, 0xac, 0x49, 0x6c, 0x12, 0xd5, 0x1a, 0x45, 0x25, 0xa2, 0x7a, 0xbb, - 0xa8, 0x44, 0x94, 0xd1, 0xf9, 0x8e, 0xcb, 0x9a, 0xb7, 0x7c, 0x4c, 0x59, 0x1b, 0x1d, 0x23, 0x53, - 0xd6, 0x66, 0x87, 0xc8, 0x3e, 0xc7, 0xe8, 0xae, 0xd9, 0x4c, 0x0c, 0x51, 0x98, 0x66, 0xbc, 0x25, - 0x44, 0x35, 0xda, 0x85, 0x8e, 0xd6, 0x9f, 0x50, 0x9a, 0x32, 0xdf, 0x4a, 0x51, 0x9a, 0x52, 0xd5, - 0xd0, 0x38, 0xcb, 0x58, 0xac, 0x72, 0x0b, 0x17, 0xcf, 0x30, 0x11, 0x95, 0x04, 0xf4, 0x67, 0x00, - 0xaa, 0xba, 0xa4, 0x0e, 0x30, 0x57, 0x77, 0x54, 0xea, 0x5d, 0x2a, 0x46, 0x99, 0xbb, 0x67, 0x15, - 0x3f, 0xa6, 0x2e, 0x77, 0xad, 0x6b, 0xb7, 0x2c, 0xf4, 0x12, 0xfa, 0x0a, 0x7f, 0xff, 0x84, 0xf8, - 0xa7, 0xb1, 0x18, 0x57, 0x4d, 0x89, 0x03, 0xbc, 0xc3, 0xb8, 0x9c, 0xb5, 0x91, 0xc9, 0x25, 0x3d, - 0x21, 0x3e, 0x95, 0xd3, 0x9f, 0x40, 0x47, 0xfb, 0xe1, 0x43, 0xc9, 0x69, 0xfe, 0x2f, 0x90, 0x71, - 0x55, 0xb5, 0xcb, 0xf4, 0x00, 0x98, 0x2f, 0x4a, 0x8f, 0xbc, 0x19, 0xa5, 0x4d, 0xa0, 0x6f, 0x96, - 0x41, 0x94, 0xda, 0x57, 0xd6, 0x54, 0x94, 0xda, 0x2f, 0xa8, 0x9e, 0x18, 0x67, 0x61, 0x35, 0x78, - 0xac, 0x7b, 0x9c, 0x09, 0x75, 0xb2, 0x45, 0x39, 0x44, 0x77, 0xb2, 0xe5, 0x8a, 0x8b, 0xee, 0x64, - 0xe7, 0xea, 0x27, 0xe6, 0x99, 0x38, 0x1b, 0x79, 0x33, 0x54, 0x6f, 0x55, 0x31, 0x44, 0xdd, 0xc9, - 0x5c, 0x3d, 0x65, 0x3c, 0xae, 0x9a, 0xaa, 0xd2, 0x5b, 0xce, 0x40, 0x7a, 0xb8, 0x6f, 0xa0, 0x2d, - 0x93, 0x6f, 0x54, 0x68, 0x4e, 0x29, 0x43, 0x1f, 0x8f, 0xe6, 0x27, 0x4a, 0xea, 0xca, 0x0c, 0x5b, - 0x2a, 0x66, 0x29, 0x5d, 0x0c, 0x83, 0x52, 0x02, 0x8f, 0x0a, 0x69, 0x57, 0x67, 0xf6, 0x63, 0xf3, - 0x0f, 0x0f, 0xde, 0x56, 0xb1, 0xcf, 0x33, 0x06, 0x1b, 0x68, 0x8d, 0x31, 0x90, 0x0b, 0xb9, 0x4a, - 0xdd, 0xb2, 0xd0, 0x04, 0xfa, 0x66, 0xc6, 0xaf, 0xae, 0xbc, 0xb2, 0x12, 0x70, 0xaa, 0x52, 0x21, - 0x64, 0x30, 0xa1, 0x6a, 0x45, 0x79, 0xcc, 0x4a, 0x55, 0x05, 0x51, 0x1e, 0x78, 0x3b, 0x56, 0x62, - 0x91, 0xfd, 0x1e, 0x63, 0x75, 0x1e, 0x9d, 0x9b, 0x63, 0x25, 0x0b, 0xc9, 0xb7, 0x2c, 0xf4, 0xaa, - 0x9c, 0xff, 0x5d, 0x58, 0x90, 0xb0, 0x94, 0x5c, 0x71, 0x65, 0x3a, 0x23, 0x6f, 0x1f, 0x31, 0x57, - 0x9c, 0x71, 0x14, 0x9e, 0xd5, 0xa0, 0xaf, 0xa0, 0xc9, 0x72, 0x05, 0xb4, 0xae, 0x82, 0x37, 0x95, - 0x92, 0x8c, 0x37, 0x4a, 0x50, 0xd3, 0x9b, 0xd9, 0xcc, 0xbc, 0xe6, 0x44, 0xc4, 0x39, 0xdf, 0x40, - 0x5b, 0x46, 0xc8, 0x4a, 0x93, 0x4a, 0x01, 0xbc, 0xd2, 0xa4, 0x72, 0x30, 0x6d, 0x6a, 0xd2, 0x91, - 0x98, 0xbd, 0x6b, 0x5d, 0x9b, 0x2c, 0xb3, 0xbf, 0x72, 0x3f, 0xfa, 0xff, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x32, 0xe9, 0x59, 0xbf, 0xc0, 0x2b, 0x00, 0x00, + // 3646 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0xdd, 0x8f, 0x1c, 0x47, + 0xf1, 0x37, 0xfb, 0x71, 0xbb, 0x57, 0xfb, 0x79, 0x7d, 0x1f, 0x5e, 0xaf, 0x2f, 0x8e, 0x33, 0x3f, + 0xc7, 0x3f, 0xc7, 0xb1, 0xcf, 0xe6, 0x42, 0x70, 0xec, 0x90, 0x28, 0xbe, 0xf3, 0x11, 0x3b, 0x39, + 0x7f, 0x68, 0xce, 0x4e, 0x0c, 0x82, 0x8c, 0x66, 0x67, 0xda, 0xbe, 0xc1, 0xb3, 0x33, 0xeb, 0xf9, + 0xb8, 0x0f, 0x9e, 0x50, 0x82, 0x78, 0x80, 0xc7, 0xf0, 0x18, 0x04, 0x4f, 0xbc, 0xc0, 0x2b, 0x42, + 0xe2, 0xdf, 0x40, 0x42, 0x3c, 0x20, 0x21, 0x24, 0xfe, 0x10, 0xd4, 0x5f, 0xd3, 0xdd, 0xb3, 0xb3, + 0x97, 0x73, 0x04, 0x12, 0x6f, 0xd3, 0xd5, 0xd5, 0x55, 0x5d, 0xd5, 0xd5, 0x55, 0xd5, 0x55, 0x03, + 0xed, 0xc3, 0xcc, 0x8b, 0x27, 0xee, 0xfa, 0x24, 0x8e, 0xd2, 0x08, 0xcd, 0xb3, 0xd1, 0x70, 0xd1, + 0x09, 0xc3, 0x28, 0x75, 0x52, 0x3f, 0x0a, 0x13, 0x36, 0x65, 0xae, 0xc0, 0xd2, 0x2d, 0xcf, 0xdb, + 0xca, 0xe2, 0x18, 0x87, 0xee, 0x91, 0x85, 0x93, 0x49, 0x14, 0x26, 0xd8, 0xfc, 0x0c, 0xba, 0xb7, + 0x3c, 0xef, 0xa1, 0xe3, 0xc7, 0x16, 0x7e, 0x91, 0xe1, 0x24, 0x45, 0xe7, 0xa1, 0x33, 0x72, 0x12, + 0x6c, 0xbb, 0x1c, 0x75, 0x60, 0x9c, 0x33, 0x2e, 0x2e, 0x58, 0x3a, 0x10, 0x5d, 0x80, 0xee, 0x8b, + 0x2c, 0x4a, 0x15, 0xb4, 0x0a, 0x45, 0x2b, 0x40, 0xcd, 0x45, 0xe8, 0xe5, 0xf4, 0x39, 0xcb, 0x3f, + 0x55, 0xa0, 0xb1, 0xe9, 0x04, 0x4e, 0xe8, 0x62, 0xc2, 0x2c, 0x8d, 0x52, 0x27, 0xb0, 0x47, 0x0c, + 0x40, 0x99, 0xd5, 0x2c, 0x1d, 0x88, 0x2e, 0x42, 0xcf, 0xdd, 0x73, 0xc2, 0x10, 0x4b, 0xbc, 0x0a, + 0xc5, 0x2b, 0x82, 0xd1, 0x3b, 0x70, 0x6a, 0x82, 0x43, 0xcf, 0x0f, 0x9f, 0xd9, 0xc5, 0x15, 0x55, + 0xba, 0x62, 0xd6, 0x34, 0xba, 0x09, 0x03, 0x3f, 0x74, 0xdc, 0xd4, 0xdf, 0xc7, 0x53, 0x4b, 0x6b, + 0x74, 0xe9, 0xcc, 0x79, 0xa2, 0x8c, 0x03, 0x27, 0x08, 0x70, 0x9a, 0xaf, 0xa8, 0xd3, 0x15, 0x05, + 0x28, 0x7a, 0x1f, 0x86, 0x59, 0xe8, 0x46, 0xe1, 0x53, 0x3f, 0x1e, 0x63, 0xcf, 0x2e, 0xac, 0x99, + 0xa7, 0x6b, 0x8e, 0xc1, 0x30, 0xbf, 0x03, 0xb0, 0xe9, 0x84, 0xe2, 0xa0, 0x2e, 0x42, 0x2f, 0x8c, + 0x3c, 0x6c, 0xfb, 0x1e, 0x0e, 0x53, 0xff, 0xa9, 0x8f, 0x63, 0x7e, 0x54, 0x45, 0xb0, 0xd9, 0x81, + 0x16, 0x5d, 0xc7, 0x0f, 0xe0, 0x3a, 0xd4, 0xb7, 0xf6, 0x1c, 0x3f, 0x44, 0xcb, 0x50, 0x77, 0xc9, + 0x07, 0x5f, 0xc7, 0x06, 0x68, 0x00, 0x8d, 0x10, 0xa7, 0x07, 0x51, 0xfc, 0x9c, 0x9f, 0xa9, 0x18, + 0x9a, 0x13, 0x68, 0x6e, 0x31, 0xd1, 0x13, 0xb4, 0x0a, 0xf3, 0x4c, 0x1b, 0x74, 0x71, 0xc7, 0xe2, + 0x23, 0x34, 0x84, 0xa6, 0xd0, 0x13, 0x5d, 0xde, 0xb1, 0xf2, 0x31, 0xa1, 0xcc, 0xd5, 0x4f, 0x4f, + 0xa3, 0x63, 0x89, 0x21, 0xa1, 0xe6, 0x06, 0x51, 0x82, 0x3d, 0xaa, 0xeb, 0x8e, 0xc5, 0x47, 0xe6, + 0x0b, 0x58, 0xda, 0x22, 0x5f, 0x9c, 0xed, 0x4b, 0x8b, 0x4e, 0xb6, 0x53, 0xb0, 0xd0, 0x7c, 0x4c, + 0xc4, 0x7f, 0x1a, 0xc5, 0xdc, 0x34, 0x9a, 0x16, 0x1b, 0x98, 0xab, 0xb0, 0xac, 0xb3, 0xe4, 0x5a, + 0xbb, 0x0c, 0xdd, 0xad, 0x28, 0x0c, 0xb1, 0x9b, 0x8a, 0x5d, 0x0c, 0xa1, 0x49, 0xd9, 0x65, 0xb1, + 0xcf, 0xd9, 0xe7, 0x63, 0x62, 0xf7, 0x39, 0x36, 0x27, 0x70, 0x15, 0x16, 0xb7, 0x62, 0xec, 0xa4, + 0xf8, 0x7e, 0xe4, 0x61, 0x85, 0xc6, 0xc4, 0x49, 0x92, 0x83, 0x28, 0xf6, 0x04, 0x0d, 0x31, 0x36, + 0xbf, 0x34, 0x00, 0xa9, 0x2b, 0x18, 0x1d, 0xf4, 0x7f, 0xd0, 0x49, 0x30, 0xf6, 0xec, 0x71, 0x88, + 0xc7, 0x51, 0xe8, 0xbb, 0x03, 0xe3, 0x5c, 0xf5, 0xe2, 0x82, 0xd5, 0x26, 0xc0, 0x7b, 0x1c, 0x86, + 0xde, 0x80, 0xbe, 0x1f, 0xfa, 0xa9, 0xef, 0x04, 0xfe, 0x4f, 0xb0, 0x67, 0x07, 0xa1, 0x97, 0x0c, + 0x2a, 0x14, 0xaf, 0xa7, 0xc0, 0x77, 0x42, 0x2f, 0x41, 0x57, 0x00, 0xa9, 0xa8, 0xb1, 0x43, 0xd4, + 0xc7, 0x75, 0xb2, 0xa8, 0xcc, 0x58, 0x74, 0xc2, 0xfc, 0xab, 0x01, 0x4d, 0xe1, 0x46, 0x34, 0xf5, + 0x1a, 0x05, 0xf5, 0xbe, 0x07, 0xad, 0xe4, 0xc0, 0x99, 0xd8, 0x6e, 0xe0, 0xe3, 0x30, 0xa5, 0xda, + 0xef, 0x6e, 0x9c, 0x59, 0xe7, 0x0e, 0x4b, 0x90, 0x58, 0xdf, 0x3d, 0x70, 0x26, 0x5b, 0x14, 0xc5, + 0x52, 0xf1, 0x99, 0x6b, 0x78, 0x8e, 0x43, 0xdb, 0xf1, 0xbc, 0x18, 0x27, 0x09, 0xdd, 0xd1, 0x82, + 0xa5, 0x03, 0xc9, 0xd5, 0xf3, 0xb0, 0xeb, 0x8f, 0x9d, 0xc0, 0x9e, 0x04, 0x8e, 0x8b, 0x13, 0x6e, + 0x40, 0x05, 0xa8, 0xf9, 0x1a, 0x80, 0x64, 0x84, 0x1a, 0x50, 0xdd, 0xb9, 0x7f, 0xbb, 0x3f, 0x87, + 0x00, 0xe6, 0xad, 0x5b, 0x77, 0x6f, 0x6f, 0xdf, 0xef, 0x1b, 0xe4, 0x80, 0x6f, 0xe3, 0x49, 0x94, + 0xf8, 0xea, 0x01, 0xcf, 0x92, 0xce, 0x7c, 0x13, 0x7a, 0x39, 0x36, 0x3f, 0x98, 0x01, 0x34, 0xc4, + 0x5e, 0x19, 0xb6, 0x18, 0x9a, 0x1f, 0xc0, 0xf2, 0x6d, 0x3f, 0x71, 0xa3, 0x7d, 0x1c, 0x93, 0xa3, + 0x4c, 0x5e, 0xfe, 0x0a, 0xbf, 0x0d, 0x2b, 0x05, 0x0a, 0x9c, 0xe9, 0x1a, 0x2c, 0x84, 0xd9, 0xd8, + 0x26, 0xf8, 0x09, 0xbf, 0x8a, 0x12, 0x60, 0xfe, 0xc2, 0x00, 0xb4, 0x7d, 0x88, 0xdd, 0x2c, 0xc5, + 0x44, 0x7c, 0x45, 0xb0, 0x28, 0xf6, 0x70, 0x6c, 0xfb, 0xb9, 0xd5, 0x89, 0x31, 0xbd, 0xa4, 0x8e, + 0x4f, 0xa7, 0xf8, 0xf5, 0xe7, 0x43, 0x64, 0x42, 0x7b, 0x82, 0x71, 0x6c, 0x4f, 0xb2, 0x91, 0xfd, + 0x1c, 0x1f, 0xf1, 0x03, 0xd1, 0x60, 0x84, 0xf2, 0x8b, 0xcc, 0x09, 0x53, 0x3f, 0x3d, 0xe2, 0x6e, + 0x33, 0x1f, 0x93, 0x0b, 0xf0, 0x21, 0x4e, 0xb9, 0xeb, 0x3f, 0x89, 0x8e, 0x7f, 0x67, 0x00, 0x52, + 0x57, 0x70, 0x91, 0x37, 0xa1, 0xc9, 0x3d, 0x62, 0x42, 0x6d, 0xbf, 0xb5, 0x71, 0x51, 0x58, 0xd5, + 0x34, 0xf6, 0x3a, 0x1f, 0x27, 0xdb, 0x61, 0x1a, 0x1f, 0x59, 0xf3, 0x54, 0xce, 0x64, 0xb8, 0x03, + 0x1d, 0x6d, 0x02, 0xf5, 0xa1, 0x4a, 0x64, 0x62, 0x5b, 0x20, 0x9f, 0xe8, 0x75, 0xa8, 0xef, 0x3b, + 0x41, 0xc6, 0xdc, 0x58, 0x6b, 0xa3, 0x27, 0x78, 0x08, 0x06, 0x6c, 0xf6, 0x66, 0xe5, 0x1d, 0xc3, + 0xec, 0x43, 0xf7, 0x43, 0x9c, 0xde, 0x0d, 0x9f, 0x46, 0x5c, 0x2c, 0xf3, 0xe7, 0x35, 0xe8, 0xe5, + 0x20, 0x69, 0x1f, 0xfb, 0x38, 0x4e, 0xfc, 0x48, 0x38, 0x5c, 0x31, 0x24, 0x9a, 0xa5, 0x07, 0x2e, + 0x34, 0xcb, 0x14, 0xaf, 0xc1, 0x10, 0x82, 0x5a, 0x16, 0xfb, 0xe4, 0x1a, 0x90, 0x5b, 0x4c, 0xbf, + 0xc5, 0xe1, 0x93, 0x13, 0x10, 0x86, 0x2f, 0x01, 0xf9, 0xac, 0xe3, 0xc7, 0x09, 0x8d, 0x48, 0x62, + 0x96, 0x00, 0xd0, 0x9b, 0xc0, 0x75, 0x41, 0x03, 0x4f, 0x6b, 0x63, 0x49, 0xc8, 0xf7, 0x80, 0x42, + 0xb7, 0xa2, 0x2c, 0x4c, 0x85, 0xba, 0xd0, 0x06, 0x54, 0x83, 0xd0, 0x1b, 0x34, 0xa8, 0xb6, 0xcf, + 0x29, 0xda, 0x56, 0x05, 0x5c, 0xdf, 0x09, 0x3d, 0xa6, 0x65, 0x82, 0x8c, 0x2e, 0xc1, 0x3c, 0xf7, + 0x25, 0x4d, 0xca, 0x00, 0x89, 0x65, 0xcc, 0x91, 0xd0, 0x95, 0x1c, 0x83, 0xb8, 0x62, 0x27, 0xf0, + 0x9d, 0x64, 0xb0, 0xc0, 0x22, 0x11, 0x1d, 0xa8, 0x91, 0x08, 0xb4, 0x48, 0x84, 0xae, 0xc1, 0x92, + 0x08, 0xe4, 0xd4, 0x67, 0xec, 0x39, 0xc9, 0x1e, 0x4e, 0x06, 0x2d, 0xaa, 0x9b, 0xb2, 0x29, 0x74, + 0x05, 0x1a, 0x2e, 0x71, 0xc8, 0x87, 0xe9, 0xa0, 0xad, 0xcb, 0xbb, 0xc5, 0xc0, 0x74, 0x3f, 0x02, + 0x67, 0xf8, 0x21, 0x34, 0x85, 0x34, 0x2f, 0x61, 0x1a, 0x3b, 0xa1, 0x47, 0xc9, 0x28, 0xa6, 0xf1, + 0x3e, 0x35, 0x61, 0x72, 0x67, 0x15, 0xf3, 0x78, 0x89, 0x8b, 0x6f, 0xc1, 0x92, 0xb6, 0x3e, 0x0f, + 0x02, 0xbd, 0x18, 0x4f, 0x32, 0x96, 0xe3, 0xed, 0xba, 0x51, 0xcc, 0xe2, 0xf0, 0xa2, 0x05, 0x12, + 0x4c, 0xa2, 0xea, 0x88, 0x04, 0x31, 0x76, 0x93, 0x9b, 0x16, 0x1f, 0x99, 0xa7, 0x60, 0x65, 0xc7, + 0x4f, 0x52, 0xee, 0x82, 0xfd, 0xdc, 0x1f, 0x99, 0x1f, 0xc1, 0x6a, 0x71, 0x82, 0xf3, 0xbb, 0x06, + 0xe0, 0xe6, 0x50, 0x7e, 0xeb, 0xfa, 0x45, 0x5f, 0x6e, 0x29, 0x38, 0xe6, 0x6f, 0x0d, 0x58, 0x24, + 0xc4, 0x98, 0x39, 0x09, 0xc1, 0x15, 0xef, 0x62, 0xe8, 0xde, 0xe5, 0x6d, 0xa8, 0x47, 0x07, 0x21, + 0x8e, 0x79, 0xa0, 0x78, 0x35, 0xd7, 0x69, 0x91, 0xc6, 0xfa, 0x03, 0x82, 0x66, 0x31, 0x6c, 0x62, + 0x39, 0x81, 0x3f, 0xf6, 0x53, 0x9e, 0x51, 0xb0, 0x81, 0x79, 0x1e, 0xea, 0x14, 0x0b, 0x35, 0xa1, + 0xb6, 0xf9, 0xe0, 0xd1, 0x9d, 0xfe, 0x1c, 0xf1, 0xf9, 0x0f, 0x3e, 0xbd, 0xdf, 0x37, 0x08, 0xe8, + 0xe1, 0xf6, 0xb6, 0xd5, 0xaf, 0x98, 0xbf, 0x31, 0x00, 0xa9, 0xe4, 0xb9, 0xac, 0xef, 0xe7, 0x37, + 0x83, 0xc9, 0x79, 0xa1, 0x6c, 0x2b, 0xdc, 0xe4, 0xd9, 0x50, 0xf7, 0x2d, 0x77, 0xa1, 0xa5, 0x80, + 0x4b, 0xcc, 0xe7, 0xbc, 0x6e, 0x3e, 0x5d, 0xfd, 0xe6, 0xa9, 0xd6, 0x83, 0xa0, 0x4f, 0x98, 0x92, + 0xfc, 0x39, 0x3f, 0xa4, 0x37, 0x98, 0x5e, 0x39, 0x8c, 0xef, 0x79, 0x19, 0xea, 0xec, 0x9e, 0xb3, + 0x64, 0x80, 0x0d, 0xf2, 0xe5, 0x58, 0x6a, 0xcf, 0xbc, 0xce, 0x97, 0x63, 0x55, 0x64, 0x13, 0xea, + 0xcc, 0x89, 0x30, 0x89, 0xdb, 0x62, 0x47, 0x04, 0xcb, 0x62, 0x53, 0x82, 0xef, 0xa3, 0xd8, 0x51, + 0x22, 0x58, 0xae, 0x7e, 0x43, 0x55, 0xff, 0xbb, 0x4c, 0xaf, 0x02, 0x95, 0x33, 0x79, 0x1d, 0xe6, + 0x53, 0x0a, 0xe1, 0x5c, 0x3a, 0x82, 0x0b, 0xc5, 0xb3, 0xf8, 0xa4, 0xf9, 0x77, 0x03, 0x1a, 0xfc, + 0x22, 0x11, 0x0b, 0x4e, 0x52, 0x27, 0xcd, 0x44, 0x44, 0xe5, 0x23, 0x74, 0x19, 0x9a, 0x3c, 0x09, + 0x4f, 0xb8, 0x12, 0xa5, 0x31, 0x72, 0xb8, 0x95, 0x63, 0x10, 0xc6, 0x34, 0xb5, 0x65, 0xce, 0x53, + 0x61, 0x4c, 0xd3, 0x60, 0x8b, 0x4f, 0xa2, 0x73, 0xd0, 0x1a, 0x05, 0x91, 0xfb, 0x7c, 0x0f, 0xfb, + 0xcf, 0xf6, 0x52, 0xee, 0x4f, 0x55, 0x50, 0xee, 0x83, 0xeb, 0x8a, 0x0f, 0x56, 0xbc, 0xfa, 0xbc, + 0xee, 0xd5, 0x73, 0xa7, 0xd6, 0x50, 0x9c, 0x9a, 0xf9, 0x2b, 0x03, 0xd0, 0x83, 0x09, 0x0e, 0xff, + 0x2b, 0x29, 0x2d, 0xc9, 0xca, 0xc7, 0xc4, 0x73, 0xf3, 0xe7, 0x0e, 0x1f, 0x11, 0xd1, 0x26, 0x59, + 0xb2, 0x67, 0xf3, 0x49, 0x16, 0x99, 0x55, 0x10, 0x79, 0x1f, 0x6a, 0xbb, 0xe2, 0x49, 0xeb, 0x1f, + 0x2b, 0x50, 0xa7, 0x66, 0x49, 0x2d, 0x2c, 0xf6, 0xf9, 0x13, 0xcd, 0xb0, 0xd8, 0x40, 0x8b, 0xf7, + 0x15, 0x3d, 0xde, 0xab, 0x77, 0xbd, 0xaa, 0xdf, 0xf5, 0x2e, 0x54, 0x7c, 0x96, 0xea, 0x2f, 0x58, + 0x15, 0xdf, 0x43, 0xe7, 0x0b, 0x99, 0x05, 0x09, 0x56, 0x0b, 0x77, 0xe6, 0x0a, 0xb9, 0xc5, 0x1a, + 0x34, 0x83, 0xc8, 0x75, 0x02, 0x42, 0x70, 0x9e, 0x63, 0xe4, 0x10, 0x74, 0x16, 0xc0, 0xa5, 0xc9, + 0xb2, 0x67, 0x3b, 0x29, 0x55, 0x79, 0xcd, 0x52, 0x20, 0xe8, 0x75, 0xa8, 0x25, 0xbe, 0x87, 0x69, + 0x30, 0xea, 0x6e, 0x2c, 0x6a, 0x77, 0x6e, 0xd7, 0xf7, 0xb0, 0x45, 0xa7, 0x49, 0x28, 0xf6, 0x13, + 0x3b, 0x3a, 0x08, 0x6d, 0x7a, 0x9b, 0x69, 0x40, 0x6a, 0x5a, 0x1a, 0x8c, 0x98, 0xc1, 0x5e, 0x14, + 0x78, 0x34, 0x28, 0xd5, 0x2c, 0xfa, 0xbd, 0xd9, 0x81, 0x16, 0x43, 0xa0, 0xc1, 0x97, 0x78, 0xbf, + 0x36, 0x25, 0x6d, 0xe1, 0x71, 0xb4, 0xef, 0x04, 0x9a, 0xa2, 0x8c, 0xd9, 0x8a, 0x2a, 0xa4, 0x5c, + 0x6a, 0xa2, 0x56, 0x2d, 0x24, 0x6a, 0x43, 0x45, 0x1d, 0x4c, 0x95, 0x52, 0x19, 0x45, 0x29, 0xea, + 0xd3, 0x52, 0x98, 0x7b, 0x30, 0xcf, 0x1c, 0x0e, 0xba, 0x02, 0x30, 0xca, 0x8e, 0x6c, 0xcd, 0xe9, + 0x75, 0x34, 0x05, 0x59, 0x0a, 0x02, 0xba, 0x0a, 0xad, 0x04, 0x07, 0x81, 0xc0, 0xaf, 0x94, 0xe1, + 0xab, 0x18, 0xe6, 0x5b, 0xc2, 0x21, 0xd2, 0xa4, 0x82, 0xa8, 0x8f, 0xe8, 0x88, 0xbb, 0x0c, 0xfa, + 0x4d, 0x9c, 0x64, 0x74, 0x10, 0xf2, 0x17, 0x23, 0xf9, 0x34, 0x3f, 0x37, 0xf8, 0xaa, 0xc7, 0x13, + 0xcf, 0x49, 0x89, 0xf7, 0xa8, 0x33, 0x59, 0x0c, 0x7a, 0xdf, 0x75, 0x7e, 0x77, 0xe6, 0x2c, 0x36, + 0x8b, 0xbe, 0x0b, 0x1d, 0xa6, 0xa1, 0x98, 0x29, 0x9e, 0xbb, 0x87, 0x65, 0x7d, 0x7b, 0x6c, 0xee, + 0xce, 0x9c, 0xa5, 0x23, 0x6f, 0x76, 0xa1, 0xcd, 0x00, 0x19, 0x65, 0x6a, 0x7e, 0x51, 0x85, 0x1a, + 0xf1, 0x81, 0xb3, 0x73, 0xfb, 0x13, 0xe5, 0x6e, 0x1f, 0x40, 0x3b, 0x08, 0x3d, 0x31, 0x14, 0x6e, + 0x68, 0x4d, 0xf5, 0xb2, 0x24, 0x77, 0x78, 0x98, 0x8d, 0x3e, 0xc6, 0x47, 0x3c, 0x9a, 0x68, 0x2b, + 0x08, 0x7f, 0x3f, 0x1c, 0x45, 0x59, 0xc8, 0xce, 0xba, 0x69, 0x89, 0xa1, 0xf4, 0xfc, 0x75, 0xc5, + 0xf3, 0x93, 0x0b, 0x7f, 0x98, 0x79, 0xb6, 0xee, 0x99, 0x54, 0x10, 0xba, 0x0c, 0x8b, 0x09, 0x76, + 0xa3, 0xd0, 0x4b, 0x6c, 0x97, 0xbd, 0x54, 0xb1, 0x47, 0xaf, 0x4d, 0xc7, 0x9a, 0x9e, 0x20, 0xef, + 0x2c, 0x96, 0xaa, 0xe5, 0xcf, 0xb1, 0x26, 0xab, 0xf7, 0xe8, 0xd0, 0xf2, 0x44, 0x6e, 0xf8, 0x1e, + 0xf4, 0x0a, 0xe2, 0x95, 0x44, 0xc5, 0x65, 0x35, 0x2a, 0x2e, 0xa8, 0x51, 0xf0, 0xa7, 0x15, 0x58, + 0x7c, 0x48, 0xde, 0x71, 0xfc, 0xf0, 0xf2, 0xd0, 0xf3, 0x1f, 0x73, 0x48, 0xea, 0x3d, 0xab, 0x15, + 0xee, 0x99, 0x70, 0x1c, 0xf5, 0xe3, 0x1d, 0xc7, 0x25, 0xe8, 0xc7, 0x98, 0xbe, 0x36, 0xed, 0x9c, + 0x14, 0x53, 0xfb, 0x14, 0x9c, 0xa4, 0xaf, 0xfe, 0x78, 0x8c, 0x3d, 0xdf, 0x49, 0x09, 0xd4, 0x76, + 0xc9, 0x83, 0x22, 0xa0, 0xda, 0x6f, 0x5a, 0x65, 0x53, 0x44, 0x05, 0x48, 0x55, 0x01, 0x0f, 0xa9, + 0x37, 0xc8, 0x33, 0x3f, 0xc5, 0x71, 0xe8, 0x04, 0xf6, 0xd8, 0x49, 0xdd, 0x3d, 0x3c, 0xe3, 0xfe, + 0x4e, 0xa1, 0xa1, 0x77, 0xa1, 0x4b, 0xf3, 0xe3, 0x24, 0x73, 0x5d, 0x9c, 0x24, 0x58, 0x5c, 0xe4, + 0x3c, 0x2f, 0x26, 0x0f, 0xc6, 0x5d, 0x36, 0x69, 0x15, 0x50, 0xd1, 0x75, 0x92, 0x7e, 0x8e, 0x1d, + 0x3f, 0x24, 0x69, 0x36, 0xbb, 0x96, 0xd5, 0x92, 0x6b, 0x69, 0x15, 0xb1, 0xd0, 0x0d, 0xe8, 0x50, + 0x52, 0x4f, 0x1d, 0x3f, 0xc8, 0x62, 0xfa, 0x5c, 0x9f, 0x62, 0xfa, 0x3d, 0x36, 0x67, 0xe9, 0x98, + 0xe6, 0xcf, 0x2a, 0xd0, 0x93, 0x2a, 0xd8, 0xde, 0x27, 0x0f, 0xf9, 0xeb, 0xd0, 0xd5, 0x05, 0x9b, + 0xe5, 0x1d, 0x0a, 0x68, 0xe8, 0x06, 0xb4, 0x55, 0x91, 0xb8, 0x97, 0x28, 0x93, 0x9d, 0x84, 0x21, + 0x15, 0x15, 0xdd, 0x38, 0x99, 0xec, 0x77, 0xe6, 0xca, 0xa4, 0x6f, 0xab, 0x32, 0x51, 0x53, 0x2b, + 0x17, 0x3e, 0xe7, 0xca, 0x51, 0x37, 0x1b, 0x50, 0xc7, 0x44, 0x64, 0xf3, 0x2b, 0x03, 0x40, 0xbe, + 0xa0, 0x66, 0x66, 0x48, 0x8a, 0xc3, 0xaa, 0xe8, 0x0e, 0x4b, 0xcd, 0x9d, 0xaa, 0x5f, 0x9b, 0x3b, + 0x29, 0xe9, 0x4d, 0x6d, 0x2a, 0xbd, 0x61, 0xd5, 0xc3, 0xba, 0x52, 0x3d, 0x34, 0x7f, 0x6d, 0x40, + 0x4b, 0x79, 0x51, 0xfd, 0xcf, 0xed, 0xef, 0x2d, 0x58, 0xa1, 0xde, 0x1f, 0xcb, 0x52, 0xf8, 0xd7, + 0x17, 0x22, 0x06, 0xb0, 0x5a, 0x5c, 0xc4, 0xf3, 0xa3, 0x1d, 0x40, 0x6c, 0x46, 0x73, 0x4d, 0xc7, + 0xd5, 0x57, 0x8e, 0x71, 0x50, 0xe6, 0xdb, 0xb0, 0xa4, 0x51, 0xe3, 0xb7, 0xfc, 0x2c, 0xf4, 0x05, + 0x8a, 0x1d, 0x85, 0x36, 0xcd, 0x3d, 0x0c, 0x99, 0x7b, 0x98, 0x57, 0x60, 0x91, 0x2d, 0x53, 0xeb, + 0xf8, 0x33, 0x5f, 0x5a, 0xe6, 0xb2, 0xd8, 0xb3, 0x56, 0x96, 0xff, 0x47, 0x85, 0x80, 0x93, 0x34, + 0x8a, 0xb5, 0x02, 0xe5, 0x89, 0xaa, 0x8d, 0x6a, 0x15, 0xb3, 0xa2, 0x57, 0x31, 0xd1, 0xc7, 0xd0, + 0x22, 0x91, 0x6c, 0xe4, 0xb8, 0xcf, 0xb3, 0x89, 0x08, 0x7d, 0x97, 0xf2, 0x5a, 0xc0, 0x14, 0x47, + 0x12, 0x08, 0x37, 0x19, 0x32, 0x0b, 0x84, 0x10, 0xe4, 0x00, 0xf4, 0xff, 0xd0, 0xe3, 0x01, 0xc7, + 0x73, 0x52, 0x67, 0xe4, 0x24, 0xec, 0x0e, 0xb5, 0x45, 0x1c, 0xba, 0xcd, 0xa1, 0xe8, 0x1a, 0x2c, + 0x17, 0x10, 0xed, 0x89, 0x93, 0xee, 0x71, 0x5b, 0x40, 0x3a, 0xf6, 0x43, 0x27, 0xdd, 0x43, 0xaf, + 0xd1, 0x5e, 0x8a, 0xa4, 0x3b, 0x4f, 0xe9, 0x92, 0x90, 0x29, 0xd0, 0x78, 0x18, 0x53, 0x37, 0xf7, + 0x75, 0x61, 0xac, 0xad, 0x86, 0x31, 0x97, 0x9c, 0xae, 0x22, 0xae, 0xac, 0xe7, 0xc6, 0x0c, 0xcc, + 0xeb, 0xb4, 0x5c, 0xc3, 0x02, 0x48, 0x8b, 0xb4, 0x44, 0x70, 0x81, 0xc4, 0xab, 0x2a, 0xec, 0x4d, + 0xdf, 0x15, 0x60, 0x5e, 0x9e, 0x5d, 0x84, 0xde, 0xee, 0x5e, 0x96, 0x7a, 0xd1, 0x81, 0x68, 0x14, + 0x90, 0x57, 0xa0, 0x04, 0xf1, 0xd3, 0xfe, 0x36, 0xac, 0xee, 0x66, 0xa3, 0xc4, 0x8d, 0xfd, 0x11, + 0xd6, 0x5f, 0xe8, 0x43, 0x68, 0xe2, 0x43, 0x3f, 0x49, 0xfd, 0xf0, 0x19, 0x15, 0xab, 0x69, 0xe5, + 0x63, 0xf3, 0x3d, 0x58, 0xc9, 0x57, 0x11, 0x67, 0x95, 0x28, 0x4d, 0x23, 0x3f, 0x74, 0x83, 0xcc, + 0xc3, 0x76, 0xea, 0x3c, 0xe7, 0x49, 0x5a, 0xd3, 0xd2, 0x81, 0xe6, 0xef, 0x0d, 0x68, 0x29, 0x3e, + 0xee, 0x1b, 0x96, 0x21, 0xd5, 0x0b, 0x54, 0x2d, 0x44, 0xf8, 0x62, 0x89, 0xb2, 0x56, 0x52, 0xa2, + 0xbc, 0x00, 0x5d, 0xee, 0x54, 0xed, 0x18, 0x3b, 0x49, 0x24, 0x1c, 0x44, 0x01, 0x6a, 0xfe, 0xad, + 0xca, 0x76, 0xcb, 0xe3, 0x00, 0x3a, 0x3d, 0xb5, 0xdb, 0x06, 0x1d, 0xdf, 0xd5, 0x53, 0xf1, 0x4a, + 0x21, 0x15, 0x3f, 0x36, 0xe9, 0x98, 0x55, 0x2b, 0x25, 0x6e, 0x33, 0xa6, 0xa5, 0x2b, 0xbe, 0x39, + 0x3e, 0x22, 0xcf, 0x44, 0xf6, 0x60, 0xb3, 0x63, 0xec, 0x62, 0x7f, 0x1f, 0x7b, 0x34, 0x11, 0xab, + 0x59, 0x45, 0x30, 0xc9, 0x00, 0x39, 0x28, 0xc1, 0x61, 0x4a, 0xf3, 0xb1, 0x9a, 0xa5, 0x82, 0xa6, + 0x94, 0x05, 0x25, 0xca, 0xba, 0x0c, 0xb5, 0x38, 0x0a, 0xf0, 0xa0, 0x45, 0x93, 0x9f, 0x41, 0x49, + 0x7c, 0x5c, 0xb7, 0xa2, 0x00, 0x5b, 0x14, 0x8b, 0xe4, 0x94, 0xc2, 0x67, 0xca, 0xfd, 0xb5, 0x29, + 0xd9, 0xe9, 0x09, 0x62, 0x34, 0x39, 0x90, 0xee, 0xb1, 0xc3, 0x2a, 0xfc, 0x1a, 0x90, 0xbc, 0xeb, + 0x62, 0x7b, 0x12, 0x63, 0x7f, 0xec, 0x3c, 0xc3, 0x83, 0x2e, 0x45, 0x51, 0x20, 0x32, 0x0d, 0xec, + 0x29, 0x69, 0xa0, 0xb9, 0x06, 0x35, 0xb2, 0x2f, 0xb4, 0x00, 0xf5, 0x47, 0xb7, 0x3e, 0xde, 0xb6, + 0xfa, 0x73, 0xe4, 0xf3, 0x1e, 0xfd, 0x34, 0xcc, 0x2d, 0xe8, 0x3c, 0x8a, 0x1d, 0xcf, 0x0f, 0x9f, + 0xed, 0xf8, 0x63, 0x3f, 0x25, 0x67, 0xdb, 0xb8, 0xe7, 0x1c, 0xee, 0xe2, 0x20, 0x10, 0x8f, 0xb3, + 0xb1, 0x73, 0x68, 0x93, 0x37, 0x0c, 0x3a, 0x05, 0xf3, 0xf7, 0x9c, 0xc3, 0xcd, 0x4c, 0x78, 0xeb, + 0x06, 0x99, 0x19, 0x65, 0x47, 0xe6, 0x9f, 0x0d, 0xa8, 0xd3, 0xca, 0x05, 0x79, 0x10, 0x8d, 0x89, + 0x81, 0xdb, 0xb3, 0x1f, 0x28, 0x96, 0x8a, 0x81, 0x36, 0xa0, 0x95, 0x2a, 0x0b, 0x2a, 0x65, 0x0b, + 0xba, 0x0a, 0x06, 0xb1, 0x16, 0x69, 0x11, 0x55, 0xcd, 0x22, 0x8e, 0xb3, 0x22, 0xc5, 0xf6, 0xea, + 0x7a, 0x0c, 0xd8, 0x80, 0x65, 0x4d, 0x03, 0x27, 0x89, 0x82, 0x7f, 0x30, 0x60, 0xa5, 0xb0, 0x88, + 0xbb, 0xb0, 0x5b, 0x30, 0x4f, 0x0b, 0x3f, 0x22, 0xf9, 0x7c, 0x43, 0xad, 0xec, 0x4c, 0xa1, 0xaf, + 0xb3, 0x21, 0x2f, 0x9a, 0xb1, 0x85, 0xc3, 0x87, 0xd0, 0x52, 0xc0, 0x25, 0x7e, 0xf5, 0x4d, 0xbd, + 0x68, 0xb6, 0x52, 0xce, 0x42, 0x71, 0xb7, 0x9f, 0x40, 0xfb, 0x71, 0x38, 0xfa, 0x06, 0xfd, 0x52, + 0xb4, 0x06, 0x0b, 0x31, 0xe6, 0x6f, 0x1f, 0xee, 0x66, 0x25, 0xc0, 0xec, 0x41, 0x87, 0xd3, 0x95, + 0x8d, 0xbd, 0xc7, 0x61, 0x10, 0xb9, 0xcf, 0x4f, 0xda, 0xd8, 0xfb, 0xc2, 0x00, 0xa4, 0xae, 0x90, + 0x81, 0x20, 0xa3, 0xd0, 0x42, 0x20, 0x10, 0x40, 0x11, 0x08, 0x72, 0x24, 0x3d, 0x10, 0x08, 0x30, + 0x0b, 0x04, 0xe8, 0x55, 0x68, 0xa9, 0xb4, 0x58, 0xdb, 0x00, 0x24, 0x25, 0xf3, 0x97, 0x06, 0xf4, + 0x3e, 0xf5, 0xd3, 0x3d, 0x2f, 0x76, 0x0e, 0x4e, 0x70, 0xfc, 0xc4, 0xa1, 0x78, 0x98, 0xc4, 0x01, + 0x5a, 0x5c, 0xe6, 0x7e, 0x4e, 0x05, 0xcd, 0xac, 0x3e, 0xf5, 0xa1, 0xea, 0x04, 0x01, 0x7f, 0xb8, + 0x92, 0x4f, 0x02, 0x79, 0x8a, 0x31, 0x6f, 0x4a, 0x90, 0x4f, 0xf3, 0x26, 0xf4, 0xe5, 0x66, 0xb8, + 0x42, 0x2e, 0x40, 0x37, 0x8d, 0x9d, 0x30, 0x71, 0x5c, 0x42, 0x5e, 0xfa, 0xdd, 0x02, 0xf4, 0xd2, + 0x59, 0x58, 0xc8, 0x5f, 0x63, 0xa8, 0x01, 0xd5, 0xcd, 0xc7, 0xdf, 0xef, 0xcf, 0xa1, 0x26, 0xd4, + 0x76, 0xb7, 0x77, 0x76, 0xfa, 0xc6, 0xc6, 0x3f, 0x0d, 0x68, 0x3c, 0xc9, 0xbc, 0xbb, 0xa1, 0x9f, + 0xa2, 0x6d, 0x00, 0xd9, 0x53, 0x45, 0xa7, 0xf3, 0xcc, 0xb2, 0xd8, 0x99, 0x1d, 0x0e, 0xcb, 0xa6, + 0xf8, 0x89, 0xcf, 0xa1, 0x3b, 0xd0, 0x52, 0x62, 0x39, 0x1a, 0xce, 0xce, 0x67, 0x86, 0x67, 0x4a, + 0xe7, 0x72, 0x4a, 0xdb, 0x00, 0xd2, 0x16, 0xe4, 0x86, 0xa6, 0x2c, 0x4a, 0x6e, 0x68, 0xda, 0x74, + 0xcc, 0xb9, 0x8d, 0xaf, 0x56, 0xa0, 0xfa, 0x24, 0xf3, 0xd0, 0x13, 0x68, 0x29, 0xff, 0x79, 0xa0, + 0xa9, 0x1a, 0xbd, 0xdc, 0x4e, 0xd9, 0xef, 0x20, 0xc3, 0xcf, 0xff, 0xf2, 0xaf, 0x2f, 0x2b, 0xcb, + 0x66, 0xef, 0xea, 0xfe, 0xb7, 0xae, 0x3a, 0x9e, 0x27, 0x0e, 0xff, 0xa6, 0x71, 0x09, 0x59, 0xd0, + 0xe0, 0xbf, 0x72, 0xa0, 0x55, 0x85, 0x86, 0x92, 0x73, 0x0e, 0x4f, 0x4d, 0xc1, 0x39, 0xdd, 0x55, + 0x4a, 0xb7, 0x6f, 0xb6, 0x38, 0x5d, 0xe2, 0x86, 0x08, 0xcd, 0x4d, 0xa8, 0x6e, 0x3a, 0x21, 0x42, + 0xb2, 0xb7, 0x26, 0xae, 0xeb, 0x70, 0x49, 0x83, 0x71, 0x3a, 0x88, 0xd2, 0x69, 0x9b, 0x0d, 0x42, + 0x67, 0xe4, 0x84, 0x84, 0x86, 0x0b, 0x6d, 0xb5, 0x61, 0x8f, 0x64, 0x8b, 0x79, 0xfa, 0xcf, 0x81, + 0xe1, 0x5a, 0xf9, 0x24, 0x27, 0x3f, 0xa0, 0xe4, 0x91, 0xd9, 0x27, 0xe4, 0xe9, 0x2f, 0x08, 0xfc, + 0x9d, 0x41, 0x84, 0xe7, 0xfd, 0x7c, 0x29, 0xbc, 0xfe, 0x3b, 0x80, 0x14, 0xbe, 0xd8, 0xf8, 0xd7, + 0x84, 0xe7, 0x5e, 0x84, 0x2b, 0x94, 0xb7, 0x90, 0x25, 0x4d, 0xbd, 0x03, 0x2d, 0x69, 0x16, 0x7a, + 0xcd, 0x3a, 0x4d, 0x8f, 0x4d, 0x12, 0x9a, 0x3f, 0x86, 0x8e, 0xd6, 0x27, 0x46, 0xb9, 0xc0, 0x65, + 0x0d, 0xe8, 0xe1, 0x2b, 0x33, 0x66, 0x39, 0x97, 0x35, 0xca, 0x65, 0xd5, 0x5c, 0xa4, 0x5c, 0x38, + 0x0a, 0xed, 0x2c, 0x13, 0x5e, 0x4f, 0x00, 0x64, 0xbf, 0x55, 0x5a, 0xee, 0x54, 0x8f, 0x57, 0x5a, + 0xee, 0x74, 0x7b, 0xd6, 0x5c, 0xa2, 0x2c, 0x3a, 0xa8, 0xc5, 0x4e, 0x94, 0xd1, 0xda, 0x81, 0x06, + 0xef, 0x2d, 0x4a, 0xcd, 0xe8, 0x0d, 0x56, 0xa9, 0x99, 0x42, 0x13, 0xd2, 0xec, 0x53, 0x82, 0x80, + 0x9a, 0x84, 0xa0, 0x4f, 0x48, 0xfc, 0x10, 0x5a, 0x4a, 0x0b, 0x0d, 0xa9, 0xbb, 0x29, 0xf4, 0xe5, + 0xe4, 0xe5, 0x28, 0xe9, 0xb9, 0x99, 0xcb, 0x94, 0x72, 0x17, 0xb5, 0x09, 0x65, 0xa2, 0x05, 0x4a, + 0xfd, 0x53, 0x00, 0xd9, 0x17, 0x92, 0x5a, 0x98, 0x6a, 0x5b, 0x49, 0x2d, 0x4c, 0xb7, 0x91, 0x84, + 0x5d, 0x23, 0x20, 0xa4, 0x79, 0x99, 0xf5, 0x19, 0x74, 0xf5, 0x66, 0x1c, 0x7a, 0x45, 0xa5, 0x30, + 0xd5, 0xbd, 0x1b, 0x9e, 0x9d, 0x35, 0xad, 0xdb, 0x0c, 0xea, 0x52, 0x3b, 0x94, 0x64, 0x77, 0x61, + 0x21, 0x6f, 0x28, 0xa1, 0x81, 0x4a, 0x44, 0xed, 0x3b, 0x0d, 0x4f, 0x97, 0xcc, 0x70, 0xca, 0x8b, + 0x94, 0x72, 0x0b, 0x2d, 0x10, 0xca, 0xac, 0x00, 0x29, 0x88, 0xd2, 0x4e, 0xb4, 0x4e, 0x54, 0xe9, + 0x46, 0x15, 0x88, 0xaa, 0x3d, 0xa9, 0x02, 0x51, 0x4a, 0xe7, 0x33, 0xa6, 0x6b, 0xd6, 0x57, 0xd2, + 0x75, 0xad, 0xb5, 0xa5, 0x74, 0x5d, 0xeb, 0x6d, 0x28, 0xf3, 0x34, 0xa5, 0xbb, 0x64, 0x52, 0x35, + 0x04, 0x7e, 0x92, 0xb2, 0xbe, 0x13, 0xb1, 0x68, 0x1b, 0x5a, 0x4a, 0x13, 0x44, 0x5a, 0xca, 0x74, + 0xbf, 0x46, 0x5a, 0x4a, 0x59, 0xd7, 0xe4, 0x14, 0x65, 0xb1, 0xc8, 0xdc, 0x68, 0x34, 0xc1, 0xa1, + 0x70, 0x23, 0x3f, 0x02, 0x90, 0x25, 0x2c, 0x29, 0xc0, 0x54, 0x71, 0x53, 0x9a, 0x77, 0xa1, 0xe2, + 0xa5, 0xef, 0x9e, 0x96, 0x15, 0xa9, 0xb9, 0xdc, 0x34, 0x2e, 0x5d, 0x33, 0xd0, 0x53, 0xe8, 0x4a, + 0xfc, 0xdd, 0xa3, 0xd0, 0x3d, 0x8e, 0xc5, 0xb0, 0x6c, 0x8a, 0x0b, 0xf0, 0x0a, 0xe5, 0x72, 0xca, + 0x44, 0x3a, 0x97, 0xe4, 0x28, 0x74, 0x89, 0x9e, 0x7e, 0x00, 0x2d, 0xe5, 0xaf, 0x12, 0xa9, 0xa7, + 0xe9, 0x5f, 0x4d, 0x86, 0x65, 0x25, 0x35, 0x3d, 0xcc, 0x60, 0xb6, 0x28, 0x39, 0x70, 0x26, 0x84, + 0x76, 0x08, 0x5d, 0xbd, 0xd6, 0x22, 0xcd, 0xbe, 0xb4, 0x70, 0x23, 0xcd, 0x7e, 0x46, 0x89, 0x46, + 0x93, 0x85, 0x16, 0xfa, 0xb1, 0x1a, 0xd6, 0x46, 0x24, 0x92, 0xe7, 0x35, 0x17, 0x35, 0x92, 0x17, + 0xcb, 0x3a, 0x6a, 0x24, 0x9f, 0x2a, 0xd2, 0xe8, 0x32, 0x31, 0x36, 0xe2, 0x64, 0x88, 0xdd, 0xca, + 0x8a, 0x8b, 0x3c, 0x93, 0xa9, 0xa2, 0xcd, 0x70, 0x58, 0x36, 0x55, 0x66, 0xb7, 0x8c, 0x81, 0x08, + 0xa3, 0x9f, 0x40, 0x53, 0xbc, 0xf0, 0x51, 0x6e, 0x39, 0x85, 0x32, 0xc0, 0x70, 0x30, 0x3d, 0x51, + 0x30, 0x57, 0xea, 0xd8, 0x12, 0x3e, 0x4b, 0xe8, 0x62, 0xe8, 0x15, 0xaa, 0x04, 0x28, 0xd7, 0x76, + 0x79, 0xf9, 0x60, 0xa8, 0xff, 0x46, 0xc2, 0x7a, 0x37, 0xe6, 0x19, 0xca, 0x60, 0x05, 0x2d, 0x51, + 0x06, 0x62, 0x21, 0x33, 0xa9, 0x6b, 0x06, 0x1a, 0x41, 0x57, 0x2f, 0x2b, 0xc8, 0x23, 0x2f, 0x2d, + 0x37, 0x1c, 0x6b, 0x54, 0x08, 0x69, 0x4c, 0x88, 0x59, 0x11, 0x1e, 0x93, 0x42, 0xe9, 0x82, 0xd7, + 0x20, 0x5e, 0x8e, 0x15, 0x5f, 0x64, 0xbe, 0x46, 0x59, 0x9d, 0x41, 0xa7, 0xa7, 0x58, 0x89, 0x6a, + 0xf5, 0x35, 0x03, 0x3d, 0x2b, 0x3e, 0x32, 0xd7, 0x66, 0xbc, 0x8a, 0x0a, 0xa1, 0xb8, 0xf4, 0xcd, + 0x24, 0x4e, 0x1f, 0xd1, 0x50, 0x9c, 0x32, 0x14, 0xf6, 0x74, 0x42, 0x1f, 0x41, 0x9d, 0x3e, 0x48, + 0xd0, 0xb2, 0xcc, 0x10, 0xe5, 0xbb, 0x67, 0xb8, 0x52, 0x80, 0xea, 0xd1, 0xcc, 0xa4, 0xee, 0x35, + 0x0b, 0x79, 0x32, 0xf5, 0x09, 0x34, 0x45, 0x1a, 0x2e, 0x2d, 0xa9, 0xf0, 0x4a, 0x90, 0x96, 0x54, + 0xcc, 0xd8, 0x75, 0x4b, 0x3a, 0xe0, 0xb3, 0x37, 0x8d, 0x4b, 0xa3, 0x79, 0xfa, 0x17, 0xf2, 0x5b, + 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x88, 0xe0, 0x98, 0xb0, 0x2c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4543,6 +4637,9 @@ type XudClient interface { // to a specific node. // shell: xucli ban Ban(ctx context.Context, in *BanRequest, opts ...grpc.CallOption) (*BanResponse, error) + // Closes any existing payment channels with a peer for the specified currency. + // shell: xucli closechannel [--force] + CloseChannel(ctx context.Context, in *CloseChannelRequest, opts ...grpc.CallOption) (*CloseChannelResponse, error) // Attempts to connect to a node. Once connected, the node is added to the list of peers and // becomes available for swaps and trading. A handshake exchanges information about the peer's // supported trading and swap clients. Orders will be shared with the peer upon connection and @@ -4675,6 +4772,15 @@ func (c *xudClient) Ban(ctx context.Context, in *BanRequest, opts ...grpc.CallOp return out, nil } +func (c *xudClient) CloseChannel(ctx context.Context, in *CloseChannelRequest, opts ...grpc.CallOption) (*CloseChannelResponse, error) { + out := new(CloseChannelResponse) + err := c.cc.Invoke(ctx, "/xudrpc.Xud/CloseChannel", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *xudClient) Connect(ctx context.Context, in *ConnectRequest, opts ...grpc.CallOption) (*ConnectResponse, error) { out := new(ConnectResponse) err := c.cc.Invoke(ctx, "/xudrpc.Xud/Connect", in, out, opts...) @@ -5006,6 +5112,9 @@ type XudServer interface { // to a specific node. // shell: xucli ban Ban(context.Context, *BanRequest) (*BanResponse, error) + // Closes any existing payment channels with a peer for the specified currency. + // shell: xucli closechannel [--force] + CloseChannel(context.Context, *CloseChannelRequest) (*CloseChannelResponse, error) // Attempts to connect to a node. Once connected, the node is added to the list of peers and // becomes available for swaps and trading. A handshake exchanges information about the peer's // supported trading and swap clients. Orders will be shared with the peer upon connection and @@ -5161,6 +5270,24 @@ func _Xud_Ban_Handler(srv interface{}, ctx context.Context, dec func(interface{} return interceptor(ctx, in, info, handler) } +func _Xud_CloseChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CloseChannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(XudServer).CloseChannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/xudrpc.Xud/CloseChannel", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(XudServer).CloseChannel(ctx, req.(*CloseChannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Xud_Connect_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ConnectRequest) if err := dec(in); err != nil { @@ -5639,6 +5766,10 @@ var _Xud_serviceDesc = grpc.ServiceDesc{ MethodName: "Ban", Handler: _Xud_Ban_Handler, }, + { + MethodName: "CloseChannel", + Handler: _Xud_CloseChannel_Handler, + }, { MethodName: "Connect", Handler: _Xud_Connect_Handler,