New eslint rules auto fix (#3058)
* no-implicit-coercion and no-unneeded-ternary * End every line with a semicolon * Spacing and formatting * Enabled semi-spacing * Applies npm run lint:fix to code after master merge * Fix merge issues * Switched operator-linebreak to 'before' Co-authored-by: Joshi <simplyrender@gmail.com>
This commit is contained in:
@@ -37,7 +37,7 @@ define([
|
||||
) {
|
||||
|
||||
return {
|
||||
name:"platform/telemetry",
|
||||
name: "platform/telemetry",
|
||||
definition: {
|
||||
"name": "Data bundle",
|
||||
"description": "Interfaces and infrastructure for real-time and historical data",
|
||||
|
||||
@@ -130,7 +130,6 @@ define(
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
return TelemetryAggregator;
|
||||
}
|
||||
);
|
||||
|
||||
@@ -118,6 +118,7 @@ define(
|
||||
$injector.get("telemetryService"));
|
||||
} catch (e) {
|
||||
$log.info("Telemetry service unavailable");
|
||||
|
||||
return (this.telemetryService = null);
|
||||
}
|
||||
};
|
||||
@@ -163,6 +164,7 @@ define(
|
||||
if (!fullRequest.id) {
|
||||
fullRequest.id = domainObject.getId();
|
||||
}
|
||||
|
||||
if (!fullRequest.key) {
|
||||
fullRequest.key = domainObject.getId();
|
||||
}
|
||||
@@ -224,8 +226,8 @@ define(
|
||||
var fullRequest = this.buildRequest(request || {});
|
||||
var source = fullRequest.source;
|
||||
var key = fullRequest.key;
|
||||
var telemetryService = this.telemetryService ||
|
||||
this.initializeTelemetryService(); // Lazy initialization
|
||||
var telemetryService = this.telemetryService
|
||||
|| this.initializeTelemetryService(); // Lazy initialization
|
||||
|
||||
var domainObject = objectUtils.toNewFormat(this.domainObject.getModel(), this.domainObject.getId());
|
||||
var telemetryAPI = this.openmct.telemetry;
|
||||
@@ -237,14 +239,14 @@ define(
|
||||
|
||||
var sourceMap = _.keyBy(metadata.values(), 'key');
|
||||
|
||||
var isLegacyProvider = telemetryAPI.findRequestProvider(domainObject) ===
|
||||
telemetryAPI.legacyProvider;
|
||||
var isLegacyProvider = telemetryAPI.findRequestProvider(domainObject)
|
||||
=== telemetryAPI.legacyProvider;
|
||||
|
||||
// Pull out the relevant field from the larger,
|
||||
// structured response.
|
||||
function getRelevantResponse(response) {
|
||||
return ((response || {})[source] || {})[key] ||
|
||||
EMPTY_SERIES;
|
||||
return ((response || {})[source] || {})[key]
|
||||
|| EMPTY_SERIES;
|
||||
}
|
||||
|
||||
// Issue a request to the service
|
||||
@@ -256,8 +258,8 @@ define(
|
||||
// If a telemetryService is not available,
|
||||
// getTelemetryService() should reject, and this should
|
||||
// bubble through subsequent then calls.
|
||||
return telemetryService &&
|
||||
requestTelemetryFromService().then(getRelevantResponse);
|
||||
return telemetryService
|
||||
&& requestTelemetryFromService().then(getRelevantResponse);
|
||||
} else {
|
||||
return telemetryAPI.request(domainObject, fullRequest).then(function (telemetry) {
|
||||
return asSeries(telemetry, defaultDomain, defaultRange, sourceMap);
|
||||
@@ -289,8 +291,8 @@ define(
|
||||
*/
|
||||
TelemetryCapability.prototype.subscribe = function subscribe(callback, request) {
|
||||
var fullRequest = this.buildRequest(request || {});
|
||||
var telemetryService = this.telemetryService ||
|
||||
this.initializeTelemetryService(); // Lazy initialization
|
||||
var telemetryService = this.telemetryService
|
||||
|| this.initializeTelemetryService(); // Lazy initialization
|
||||
|
||||
var domainObject = objectUtils.toNewFormat(this.domainObject.getModel(), this.domainObject.getId());
|
||||
var telemetryAPI = this.openmct.telemetry;
|
||||
@@ -302,8 +304,8 @@ define(
|
||||
|
||||
var sourceMap = _.keyBy(metadata.values(), 'key');
|
||||
|
||||
var isLegacyProvider = telemetryAPI.findSubscriptionProvider(domainObject) ===
|
||||
telemetryAPI.legacyProvider;
|
||||
var isLegacyProvider = telemetryAPI.findSubscriptionProvider(domainObject)
|
||||
=== telemetryAPI.legacyProvider;
|
||||
|
||||
function update(telemetry) {
|
||||
callback(asSeries([telemetry], defaultDomain, defaultRange, sourceMap));
|
||||
@@ -321,8 +323,8 @@ define(
|
||||
|
||||
// Avoid a loop here...
|
||||
if (isLegacyProvider) {
|
||||
return telemetryService &&
|
||||
telemetryService.subscribe(updateLegacy, [fullRequest]);
|
||||
return telemetryService
|
||||
&& telemetryService.subscribe(updateLegacy, [fullRequest]);
|
||||
} else {
|
||||
return telemetryAPI.subscribe(domainObject, update, fullRequest);
|
||||
}
|
||||
@@ -333,7 +335,7 @@ define(
|
||||
* domain object model has a "telemetry" field.
|
||||
*/
|
||||
TelemetryCapability.appliesTo = function (model) {
|
||||
return (model && model.telemetry) ? true : false;
|
||||
return Boolean(model && model.telemetry);
|
||||
};
|
||||
|
||||
return TelemetryCapability;
|
||||
|
||||
@@ -124,6 +124,7 @@ define(
|
||||
// Request won't happen, so don't
|
||||
// mark it as pending.
|
||||
self.pending -= trackPending ? 1 : 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -175,9 +176,10 @@ define(
|
||||
"delegation",
|
||||
"telemetry"
|
||||
)).then(function (result) {
|
||||
var head = domainObject.hasCapability("telemetry") ?
|
||||
[domainObject] : [],
|
||||
var head = domainObject.hasCapability("telemetry")
|
||||
? [domainObject] : [],
|
||||
tail = result || [];
|
||||
|
||||
return head.concat(tail);
|
||||
});
|
||||
}
|
||||
@@ -186,8 +188,8 @@ define(
|
||||
// by this controller to track latest responses, etc, for
|
||||
// a given domain object.
|
||||
function buildResponseContainer(domainObject) {
|
||||
var telemetry = domainObject &&
|
||||
domainObject.getCapability("telemetry"),
|
||||
var telemetry = domainObject
|
||||
&& domainObject.getCapability("telemetry"),
|
||||
id,
|
||||
metadata;
|
||||
|
||||
@@ -350,8 +352,8 @@ define(
|
||||
* @memberof platform/telemetry.TelemetryController#
|
||||
*/
|
||||
getResponse: function getResponse(arg) {
|
||||
var id = arg && (typeof arg === 'string' ?
|
||||
arg : arg.getId());
|
||||
var id = arg && (typeof arg === 'string'
|
||||
? arg : arg.getId());
|
||||
|
||||
if (id) {
|
||||
return (self.response[id] || {}).data;
|
||||
@@ -380,6 +382,7 @@ define(
|
||||
*/
|
||||
requestData: function (request) {
|
||||
self.request = request || {};
|
||||
|
||||
return requestTelemetry(true);
|
||||
},
|
||||
/**
|
||||
|
||||
@@ -58,9 +58,10 @@ define(
|
||||
"delegation",
|
||||
"telemetry"
|
||||
)).then(function (result) {
|
||||
var head = domainObject.hasCapability("telemetry") ?
|
||||
[domainObject] : [],
|
||||
var head = domainObject.hasCapability("telemetry")
|
||||
? [domainObject] : [],
|
||||
tail = result || [];
|
||||
|
||||
return head.concat(tail);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -50,9 +50,9 @@ define(
|
||||
* data and time, suitable for display.
|
||||
*/
|
||||
TelemetryFormatter.prototype.formatDomainValue = function (v, key) {
|
||||
var formatter = (key === undefined) ?
|
||||
this.defaultFormat :
|
||||
this.formatService.getFormat(key);
|
||||
var formatter = (key === undefined)
|
||||
? this.defaultFormat
|
||||
: this.formatService.getFormat(key);
|
||||
|
||||
return isNaN(v) ? "" : formatter.format(v);
|
||||
};
|
||||
|
||||
@@ -52,6 +52,7 @@ define(
|
||||
if (callback && active) {
|
||||
callback(telemetryObject, series);
|
||||
}
|
||||
|
||||
// Pass it along for promise-chaining
|
||||
return series;
|
||||
}
|
||||
@@ -62,6 +63,7 @@ define(
|
||||
|
||||
self.unsubscribe = function () {
|
||||
active = false;
|
||||
|
||||
return subscription.unsubscribe();
|
||||
};
|
||||
|
||||
@@ -76,10 +78,10 @@ define(
|
||||
*/
|
||||
self.getSeries = function (domainObject) {
|
||||
var id = domainObject.getId();
|
||||
|
||||
return seriesMap[id];
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Change the request duration.
|
||||
* @param {TelemetryRequest} request the request to issue
|
||||
@@ -100,8 +102,8 @@ define(
|
||||
}
|
||||
|
||||
// If the request is a simple number, treat it as a duration
|
||||
request = (typeof request === 'number') ?
|
||||
{ duration: request } : request;
|
||||
request = (typeof request === 'number')
|
||||
? { duration: request } : request;
|
||||
|
||||
// Look up telemetry-providing objects from the subscription,
|
||||
// then issue new requests.
|
||||
@@ -126,13 +128,14 @@ define(
|
||||
if (series.getDatum) {
|
||||
return series.getDatum(index);
|
||||
}
|
||||
|
||||
return subscription.makeDatum(telemetryObject, series, index);
|
||||
}
|
||||
}
|
||||
|
||||
return typeof index !== 'number' ?
|
||||
subscription.getDatum(telemetryObject) :
|
||||
makeNewDatum(this.getSeries(telemetryObject));
|
||||
return typeof index !== 'number'
|
||||
? subscription.getDatum(telemetryObject)
|
||||
: makeNewDatum(this.getSeries(telemetryObject));
|
||||
};
|
||||
|
||||
return self;
|
||||
|
||||
@@ -24,7 +24,6 @@ define(
|
||||
['./TelemetryHandle'],
|
||||
function (TelemetryHandle) {
|
||||
|
||||
|
||||
/**
|
||||
* A TelemetryRequester provides an easy interface to request
|
||||
* telemetry associated with a set of domain objects.
|
||||
|
||||
@@ -65,7 +65,6 @@ define(
|
||||
this.counts = {};
|
||||
}
|
||||
|
||||
|
||||
TelemetryQueue.prototype.isEmpty = function () {
|
||||
return this.queue.length < 1;
|
||||
};
|
||||
@@ -84,6 +83,7 @@ define(
|
||||
|
||||
// Decrement counts for the object that will be popped
|
||||
Object.keys(counts).forEach(decrementCount);
|
||||
|
||||
return this.queue.shift();
|
||||
};
|
||||
|
||||
@@ -109,6 +109,7 @@ define(
|
||||
// up a new container for key-value pairs.
|
||||
object = {};
|
||||
queue.push(object);
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ define(
|
||||
* @method platform/telemetry.TelemetryPool#put
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* A TelemetrySubscription tracks latest values for streaming
|
||||
* telemetry data and handles notifying interested observers.
|
||||
@@ -112,13 +111,13 @@ define(
|
||||
updatePending = false;
|
||||
}
|
||||
|
||||
|
||||
// Look up metadata associated with an object's telemetry
|
||||
function lookupMetadata(domainObj) {
|
||||
var telemetryCapability =
|
||||
domainObj.getCapability("telemetry");
|
||||
return telemetryCapability &&
|
||||
telemetryCapability.getMetadata();
|
||||
|
||||
return telemetryCapability
|
||||
&& telemetryCapability.getMetadata();
|
||||
}
|
||||
|
||||
// Update the latest telemetry data for a specific
|
||||
@@ -149,6 +148,7 @@ define(
|
||||
function subscribe(domainObj) {
|
||||
var telemetryCapability =
|
||||
domainObj.getCapability("telemetry");
|
||||
|
||||
return telemetryCapability.subscribe(function (telemetry) {
|
||||
update(domainObj, telemetry);
|
||||
});
|
||||
@@ -178,6 +178,7 @@ define(
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
|
||||
return objects;
|
||||
}
|
||||
|
||||
@@ -195,8 +196,8 @@ define(
|
||||
}
|
||||
|
||||
function idsMatch(ids) {
|
||||
return ids.length === self.telemetryObjects.length &&
|
||||
ids.every(function (id, index) {
|
||||
return ids.length === self.telemetryObjects.length
|
||||
&& ids.every(function (id, index) {
|
||||
return self.telemetryObjects[index].getId() === id;
|
||||
});
|
||||
}
|
||||
@@ -209,8 +210,8 @@ define(
|
||||
}
|
||||
|
||||
function addMutationListener() {
|
||||
var mutation = domainObject &&
|
||||
domainObject.getCapability('mutation');
|
||||
var mutation = domainObject
|
||||
&& domainObject.getCapability('mutation');
|
||||
if (mutation) {
|
||||
return mutation.listen(modelChange);
|
||||
}
|
||||
@@ -225,7 +226,6 @@ define(
|
||||
this.unlistenToMutation = addMutationListener();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* From a telemetry series, retrieve a single data point
|
||||
* containing all fields for domains/ranges
|
||||
@@ -255,6 +255,7 @@ define(
|
||||
*/
|
||||
TelemetrySubscription.prototype.unsubscribeAll = function () {
|
||||
var $q = this.$q;
|
||||
|
||||
return this.unsubscribePromise.then(function (unsubscribes) {
|
||||
return $q.all(unsubscribes.map(function (unsubscribe) {
|
||||
return unsubscribe();
|
||||
@@ -270,6 +271,7 @@ define(
|
||||
if (this.unlistenToMutation) {
|
||||
this.unlistenToMutation();
|
||||
}
|
||||
|
||||
return this.unsubscribeAll();
|
||||
};
|
||||
|
||||
@@ -291,9 +293,10 @@ define(
|
||||
TelemetrySubscription.prototype.getDomainValue = function (domainObject, key) {
|
||||
var id = domainObject.getId(),
|
||||
latestValue = this.latestValues[id];
|
||||
return latestValue && (key ?
|
||||
latestValue.datum[key] :
|
||||
latestValue.domain);
|
||||
|
||||
return latestValue && (key
|
||||
? latestValue.datum[key]
|
||||
: latestValue.domain);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -314,9 +317,10 @@ define(
|
||||
TelemetrySubscription.prototype.getRangeValue = function (domainObject, key) {
|
||||
var id = domainObject.getId(),
|
||||
latestValue = this.latestValues[id];
|
||||
return latestValue && (key ?
|
||||
latestValue.datum[key] :
|
||||
latestValue.range);
|
||||
|
||||
return latestValue && (key
|
||||
? latestValue.datum[key]
|
||||
: latestValue.range);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -327,6 +331,7 @@ define(
|
||||
*/
|
||||
TelemetrySubscription.prototype.getDatum = function (domainObject) {
|
||||
var id = domainObject.getId();
|
||||
|
||||
return (this.latestValues[id] || {}).datum;
|
||||
};
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ define(
|
||||
TelemetryTable.prototype.poll = function () {
|
||||
var t = this.table;
|
||||
this.table = undefined;
|
||||
|
||||
return t;
|
||||
};
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ define(
|
||||
|
||||
// Store to verify interactions later
|
||||
mockUnsubscribes[index] = unsubscribe;
|
||||
|
||||
return provider;
|
||||
}
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ define(
|
||||
key: 'default' + hint
|
||||
};
|
||||
metadatum[hint] = "foo";
|
||||
|
||||
return [metadatum];
|
||||
});
|
||||
|
||||
@@ -160,8 +161,14 @@ define(
|
||||
key: "testKey", // from model
|
||||
start: 42, // from argument
|
||||
domain: 'mockTimeSystem',
|
||||
domains: [{ domain: "foo", key: 'defaultdomain' }],
|
||||
ranges: [{ range: "foo", key: 'defaultrange' }]
|
||||
domains: [{
|
||||
domain: "foo",
|
||||
key: 'defaultdomain'
|
||||
}],
|
||||
ranges: [{
|
||||
range: "foo",
|
||||
key: 'defaultrange'
|
||||
}]
|
||||
}]);
|
||||
});
|
||||
|
||||
@@ -182,8 +189,14 @@ define(
|
||||
start: 0,
|
||||
end: 1,
|
||||
domain: 'mockTimeSystem',
|
||||
domains: [{ domain: "foo", key: 'defaultdomain' }],
|
||||
ranges: [{ range: "foo", key: 'defaultrange' }]
|
||||
domains: [{
|
||||
domain: "foo",
|
||||
key: 'defaultdomain'
|
||||
}],
|
||||
ranges: [{
|
||||
range: "foo",
|
||||
key: 'defaultrange'
|
||||
}]
|
||||
});
|
||||
});
|
||||
|
||||
@@ -201,12 +214,17 @@ define(
|
||||
start: 0,
|
||||
end: 1,
|
||||
domain: 'mockTimeSystem',
|
||||
domains: [{ domain: "foo", key: 'defaultdomain' }],
|
||||
ranges: [{ range: "foo", key: 'defaultrange' }]
|
||||
domains: [{
|
||||
domain: "foo",
|
||||
key: 'defaultdomain'
|
||||
}],
|
||||
ranges: [{
|
||||
range: "foo",
|
||||
key: 'defaultrange'
|
||||
}]
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it("warns if no telemetry service can be injected", function () {
|
||||
mockInjector.get.and.callFake(function () {
|
||||
throw "";
|
||||
@@ -304,8 +322,14 @@ define(
|
||||
start: 0,
|
||||
end: 1,
|
||||
domain: 'mockTimeSystem',
|
||||
domains: [{ domain: "foo", key: "defaultdomain" }],
|
||||
ranges: [{ range: "foo", key: "defaultrange" }]
|
||||
domains: [{
|
||||
domain: "foo",
|
||||
key: "defaultdomain"
|
||||
}],
|
||||
ranges: [{
|
||||
range: "foo",
|
||||
key: "defaultrange"
|
||||
}]
|
||||
}]
|
||||
);
|
||||
|
||||
@@ -331,7 +355,10 @@ define(
|
||||
expect(fullRequest.start).toBe(mockBounds.start);
|
||||
expect(fullRequest.end).toBe(mockBounds.end);
|
||||
|
||||
fullRequest = telemetry.buildRequest({start: 10, end: 20});
|
||||
fullRequest = telemetry.buildRequest({
|
||||
start: 10,
|
||||
end: 20
|
||||
});
|
||||
|
||||
expect(fullRequest.start).toBe(10);
|
||||
expect(fullRequest.end).toBe(20);
|
||||
|
||||
@@ -142,7 +142,10 @@ define(
|
||||
mockScope.$watch.calls.mostRecent().args[1](mockDomainObject);
|
||||
|
||||
expect(controller.getMetadata()).toEqual([
|
||||
{ source: "testSource", key: "testKey" }
|
||||
{
|
||||
source: "testSource",
|
||||
key: "testKey"
|
||||
}
|
||||
]);
|
||||
});
|
||||
|
||||
|
||||
@@ -74,6 +74,7 @@ define(
|
||||
asPromise(v).then(function (value) {
|
||||
r = value;
|
||||
});
|
||||
|
||||
return r;
|
||||
});
|
||||
});
|
||||
@@ -120,7 +121,10 @@ define(
|
||||
});
|
||||
|
||||
it("provides access to the datum objects by index", function () {
|
||||
var testDatum = { a: 1, b: 2 }, testIndex = 42;
|
||||
var testDatum = {
|
||||
a: 1,
|
||||
b: 2
|
||||
}, testIndex = 42;
|
||||
mockSubscription.makeDatum.and.returnValue(testDatum);
|
||||
handle.request({});
|
||||
expect(handle.getDatum(mockDomainObject, testIndex))
|
||||
|
||||
@@ -42,7 +42,10 @@ define(
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }, b: 42 });
|
||||
.toEqual({
|
||||
a: { someKey: "some value" },
|
||||
b: 42
|
||||
});
|
||||
});
|
||||
|
||||
it("adds new objects for repeated keys", function () {
|
||||
@@ -50,9 +53,12 @@ define(
|
||||
queue.put("a", { someKey: "some other value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }, b: 42 });
|
||||
.toEqual({
|
||||
a: { someKey: "some value" },
|
||||
b: 42
|
||||
});
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some other value" } });
|
||||
.toEqual({ a: { someKey: "some other value" } });
|
||||
});
|
||||
|
||||
it("reports emptiness", function () {
|
||||
@@ -67,7 +73,6 @@ define(
|
||||
expect(queue.isEmpty()).toBeTruthy();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@@ -134,6 +134,7 @@ define(
|
||||
for (i = 0; i < 100; i += 1) {
|
||||
mockTelemetry.subscribe.calls.mostRecent().args[0](mockSeries);
|
||||
}
|
||||
|
||||
// This gets fired via a timeout, so trigger any of those
|
||||
mockTimeout.calls.all().forEach(function (call) {
|
||||
call.args[0]();
|
||||
@@ -170,7 +171,6 @@ define(
|
||||
it("fires one event per update if requested", function () {
|
||||
var i, domains = [], ranges = [], lastCall, initialCalls;
|
||||
|
||||
|
||||
// Clear out the subscription from beforeEach
|
||||
subscription.unsubscribe();
|
||||
// Create a subscription which does not drop events
|
||||
@@ -243,7 +243,12 @@ define(
|
||||
});
|
||||
|
||||
it("provides telemetry as datum objects", function () {
|
||||
var testDatum = { a: 1, b: 13, c: 42, d: -1977 };
|
||||
var testDatum = {
|
||||
a: 1,
|
||||
b: 13,
|
||||
c: 42,
|
||||
d: -1977
|
||||
};
|
||||
|
||||
function lookup(index, key) {
|
||||
return testDatum[key];
|
||||
|
||||
@@ -42,7 +42,10 @@ define(
|
||||
queue.put("a", { someKey: "some value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some value" }, b: 42 });
|
||||
.toEqual({
|
||||
a: { someKey: "some value" },
|
||||
b: 42
|
||||
});
|
||||
});
|
||||
|
||||
it("overwrites repeated keys", function () {
|
||||
@@ -50,7 +53,10 @@ define(
|
||||
queue.put("a", { someKey: "some other value" });
|
||||
queue.put("b", 42);
|
||||
expect(queue.poll())
|
||||
.toEqual({ a: { someKey: "some other value" }, b: 42 });
|
||||
.toEqual({
|
||||
a: { someKey: "some other value" },
|
||||
b: 42
|
||||
});
|
||||
expect(queue.poll())
|
||||
.toBeUndefined();
|
||||
});
|
||||
@@ -65,7 +71,6 @@ define(
|
||||
expect(queue.isEmpty()).toBeTruthy();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user