client manager complete, client and client channels next
This commit is contained in:
6
dist/server/channelManager.js
vendored
Normal file
6
dist/server/channelManager.js
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
"use strict";
|
||||
class ChannelManager {
|
||||
}
|
||||
;
|
||||
module.exports = ChannelManager;
|
||||
//# sourceMappingURL=channelManager.js.map
|
1
dist/server/channelManager.js.map
vendored
Normal file
1
dist/server/channelManager.js.map
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"channelManager.js","sourceRoot":"","sources":["../../src/channelManager.ts"],"names":[],"mappings":";AAAA,MAAM,cAAc;CAEnB;AAAA,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC"}
|
20
dist/server/clientManager.js
vendored
Normal file
20
dist/server/clientManager.js
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
class ClientManager {
|
||||
constructor(data, ws) {
|
||||
this.ws = ws;
|
||||
this.client(data);
|
||||
}
|
||||
client(data) {
|
||||
if (data.site) {
|
||||
console.log('legit: ' + data.site);
|
||||
}
|
||||
else {
|
||||
console.log('no client type designated, socket disconnect.');
|
||||
this.ws.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
;
|
||||
module.exports = ClientManager;
|
||||
// user_type: 'user', user_id: 125, site: 'mhs' }
|
||||
//# sourceMappingURL=clientManager.js.map
|
1
dist/server/clientManager.js.map
vendored
Normal file
1
dist/server/clientManager.js.map
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"clientManager.js","sourceRoot":"","sources":["../../src/clientManager.ts"],"names":[],"mappings":";AAAA,MAAM,aAAa;IAGjB,YAAY,IAAY,EAAE,EAAU;QAClC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,IAAS;QACd,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;SACnC;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;YAC5D,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;SACjB;IACH,CAAC;CACF;AAAA,CAAC;AAEF,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC;AAG9B,iDAAiD"}
|
17
dist/server/config/app.js
vendored
Normal file
17
dist/server/config/app.js
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
"use strict";
|
||||
module.exports = {
|
||||
version: '0.2.1',
|
||||
whitelist: (process.env.WHITELIST || "http://admin.localhost").split(','),
|
||||
secret: process.env.API_TOKEN || "test",
|
||||
devToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoidGVzdCBkYXRhIiwiYXVkIjoiaW50ZXJuYWwiLCJpc3MiOiJZYXJkc3RpY2sgU29mdHdhcmUiLCJzdWIiOiJCcmFpZCBKV1QifQ.t6LFXWPEVz3aLXwtrucarggqTkGY_2NnZB8ZTMaJ2oI',
|
||||
port: process.env.PORT || 8443,
|
||||
hostname: process.env.HOSTNAME || 'ysbraid.localhost',
|
||||
environment: process.env.ENVIRONMENT || 'development',
|
||||
signOptions: {
|
||||
issuer: 'Yardstick Software',
|
||||
subject: 'Braid JWT',
|
||||
audience: 'internal',
|
||||
algorithm: ["HS256"]
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=app.js.map
|
1
dist/server/config/app.js.map
vendored
Normal file
1
dist/server/config/app.js.map
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/config/app.ts"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,GAAG;IACf,OAAO,EAAG,OAAO;IACjB,SAAS,EAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAC1E,MAAM,EAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACxC,QAAQ,EAAE,iMAAiM;IAC3M,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,mBAAmB;IACrD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,aAAa;IACrD,WAAW,EAAG;QACZ,MAAM,EAAG,oBAAoB;QAC7B,OAAO,EAAG,WAAW;QACrB,QAAQ,EAAG,UAAU;QACrB,SAAS,EAAG,CAAC,OAAO,CAAC;KACtB;CACF,CAAA"}
|
8
dist/server/controllers/appController.js
vendored
Normal file
8
dist/server/controllers/appController.js
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
"use strict";
|
||||
var app = require('../config/app');
|
||||
module.exports = {
|
||||
home: (req, res) => {
|
||||
res.send(`Welcome to Braid v${app.version}`);
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=appController.js.map
|
1
dist/server/controllers/appController.js.map
vendored
Normal file
1
dist/server/controllers/appController.js.map
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"appController.js","sourceRoot":"","sources":["../../../src/controllers/appController.ts"],"names":[],"mappings":";AAAA,IAAI,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;AAElC,MAAM,CAAC,OAAO,GAAG;IACf,IAAI,EAAG,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE;QAC5B,GAAG,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9C,CAAC;CACF,CAAA"}
|
13
dist/server/controllers/authController.js
vendored
Normal file
13
dist/server/controllers/authController.js
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const jwt = require("jsonwebtoken");
|
||||
var app = require('../config/app');
|
||||
module.exports = {
|
||||
confirmToken: (req, res) => {
|
||||
var token = req.body.token;
|
||||
res.json({
|
||||
response: JSON.stringify(jwt.verify(token, app.secret, app.signOptions))
|
||||
});
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=authController.js.map
|
1
dist/server/controllers/authController.js.map
vendored
Normal file
1
dist/server/controllers/authController.js.map
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"authController.js","sourceRoot":"","sources":["../../../src/controllers/authController.ts"],"names":[],"mappings":";;AAAA,oCAAoC;AAEpC,IAAI,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;AAElC,MAAM,CAAC,OAAO,GAAG;IACf,YAAY,EAAG,CAAC,GAAQ,EAAE,GAAQ,EAAE,EAAE;QACpC,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAA;QAC1B,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;SACzE,CAAC,CAAC;IACL,CAAC;CACF,CAAA"}
|
24
dist/server/routes.js
vendored
Normal file
24
dist/server/routes.js
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const cors = require("cors");
|
||||
const express = require("express");
|
||||
var app = require('./config/app');
|
||||
var corsOptions = {
|
||||
origin: (origin, callback) => {
|
||||
if (app.whitelist.indexOf(origin) !== -1) {
|
||||
callback(null, true);
|
||||
}
|
||||
else {
|
||||
callback(new Error(`Not allowed by CORS. Origin: ${origin}`));
|
||||
}
|
||||
}
|
||||
};
|
||||
var router = express.Router();
|
||||
//application
|
||||
var appController = require('./controllers/appController');
|
||||
router.route(['/', '/home']).get(appController.home);
|
||||
//auth
|
||||
var authController = require('./controllers/authController');
|
||||
router.route('/auth/user').post(cors(corsOptions), authController.confirmToken);
|
||||
module.exports = router;
|
||||
//# sourceMappingURL=routes.js.map
|
1
dist/server/routes.js.map
vendored
Normal file
1
dist/server/routes.js.map
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":";;AAAA,6BAA6B;AAC7B,mCAAmC;AAEnC,IAAI,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AACjC,IAAI,WAAW,GAAG;IAChB,MAAM,EAAE,CAAC,MAAc,EAAE,QAAkB,EAAE,EAAE;QAC7C,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;YACxC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACrB;aAAM;YACL,QAAQ,CAAC,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC,CAAA;SAC9D;IACH,CAAC;CACF,CAAA;AAED,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAE9B,aAAa;AACb,IAAI,aAAa,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;AAEpD,MAAM;AACN,IAAI,cAAc,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;AAC7D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;AAEhF,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC"}
|
100
dist/server/server.js
vendored
100
dist/server/server.js
vendored
@ -1,41 +1,87 @@
|
||||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//external imports
|
||||
const express = require("express");
|
||||
const https = require("https");
|
||||
const WebSocket = require("ws");
|
||||
const fs = require("fs");
|
||||
const jwt = require("jsonwebtoken");
|
||||
const url = require("url");
|
||||
//internal imports
|
||||
var routes = require('./routes');
|
||||
var app = require('./config/app');
|
||||
var privateKey = fs.readFileSync('certs/key.pem', 'utf8');
|
||||
var certificate = fs.readFileSync('certs/cert.pem', 'utf8');
|
||||
var credentials = { key: privateKey, cert: certificate };
|
||||
const app = express();
|
||||
const server = https.createServer(credentials, app);
|
||||
const wss = new WebSocket.Server({ server, maxPayload: 250000 });
|
||||
wss.on('connection', (ws) => {
|
||||
var options = { key: privateKey, cert: certificate, hostname: app.hostname };
|
||||
const application = express();
|
||||
const server = https.createServer(options, application);
|
||||
const wss = new WebSocket.Server({ noServer: true, maxPayload: 250000, host: app.hostname });
|
||||
application.use(express.json());
|
||||
application.use('', routes);
|
||||
wss.on('connection', (ws, request, args) => {
|
||||
console.log('client connected');
|
||||
ws.on('message', (message) => {
|
||||
console.log('received: %s', message);
|
||||
const broadcastRegex = /^broadcast\:/;
|
||||
if (broadcastRegex.test(message)) {
|
||||
message = message.replace(broadcastRegex, '');
|
||||
//send back the message to the other clients
|
||||
wss.clients
|
||||
.forEach(client => {
|
||||
if (client != ws) {
|
||||
client.send(`Hello, broadcast message -> ${message}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
ws.send(`Hello, you sent -> ${message}`);
|
||||
}
|
||||
});
|
||||
var data = JSON.parse(args).data;
|
||||
var ClientManager = require('./clientManager');
|
||||
let clientManager = new ClientManager(data, ws);
|
||||
// ws.on('message', (message: string) => {
|
||||
// console.log('received: %s', message);
|
||||
// const broadcastRegex = /^broadcast\:/;
|
||||
// if (broadcastRegex.test(message)) {
|
||||
// message = message.replace(broadcastRegex, '');
|
||||
// //send back the message to the other clients
|
||||
// wss.clients
|
||||
// .forEach(client => {
|
||||
// if (client != ws) {
|
||||
// client.send(`Hello, broadcast message -> ${message}`);
|
||||
// }
|
||||
// });
|
||||
// } else {
|
||||
// ws.send(`Hello, you sent -> ${message}`);
|
||||
// }
|
||||
// });
|
||||
ws.send('Hi there, welcome to braid, Measures Web Socket server.\nConnecting all our services!');
|
||||
});
|
||||
// start our server
|
||||
server.listen(process.env.PORT || 8443, () => {
|
||||
console.log(`Server started :)`);
|
||||
server.on('upgrade', function upgrade(request, socket, head) {
|
||||
return __awaiter(this, void 0, void 0, function* () {
|
||||
let args;
|
||||
try {
|
||||
args = yield verifyConnection();
|
||||
}
|
||||
catch (e) {
|
||||
socket.destroy();
|
||||
console.log('connection terminated.');
|
||||
return;
|
||||
}
|
||||
function verifyConnection() {
|
||||
return new Promise((resolve, reject) => {
|
||||
var data = url.parse(request.url, true).query;
|
||||
var token = data["token"] || (app.environment == 'development' ? app.devToken : '');
|
||||
var accepted = true;
|
||||
var result;
|
||||
jwt.verify(token, app.secret, app.signOptions, function (err, decoded) {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
accepted = false;
|
||||
}
|
||||
result = JSON.stringify(decoded);
|
||||
accepted ? resolve(result) : reject('rejected');
|
||||
});
|
||||
});
|
||||
}
|
||||
wss.handleUpgrade(request, socket, head, function done(ws) {
|
||||
wss.emit('connection', ws, request, args);
|
||||
});
|
||||
});
|
||||
});
|
||||
app.get('/', (req, res) => {
|
||||
res.send('Braid v0.1.2 is running!\n');
|
||||
server.listen(app.port, () => {
|
||||
console.log(`Braid v${app.version} is running!\n`);
|
||||
});
|
||||
//# sourceMappingURL=server.js.map
|
2
dist/server/server.js.map
vendored
2
dist/server/server.js.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AACnC,+BAA+B;AAC/B,gCAAgC;AAChC,yBAAyB;AAEzB,IAAI,UAAU,GAAI,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAC3D,IAAI,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;AAC5D,IAAI,WAAW,GAAG,EAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAC,CAAC;AAEvD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACpD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAC,MAAM,EAAE,CAAC,CAAC;AAEhE,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAa,EAAE,EAAE;IACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAE/B,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAe,EAAE,EAAE;QAEjC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAErC,MAAM,cAAc,GAAG,cAAc,CAAC;QAEtC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAE9C,4CAA4C;YAC5C,GAAG,CAAC,OAAO;iBACN,OAAO,CAAC,MAAM,CAAC,EAAE;gBACd,IAAI,MAAM,IAAI,EAAE,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;iBACzD;YACL,CAAC,CAAC,CAAC;SAEV;aAAM;YACH,EAAE,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;SAC5C;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;AACrG,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE;IACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}
|
||||
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,kBAAkB;AAClB,mCAAmC;AACnC,+BAA+B;AAC/B,gCAAgC;AAChC,yBAAyB;AACzB,oCAAoC;AACpC,2BAA2B;AAE3B,kBAAkB;AAClB,IAAI,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACjC,IAAI,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAElC,IAAI,UAAU,GAAI,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AAC3D,IAAI,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;AAC5D,IAAI,OAAO,GAAG,EAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAC,CAAC;AAE3E,MAAM,WAAW,GAAG,OAAO,EAAE,CAAC;AAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;AAE5F,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAChC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5B,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAa,EAAE,OAAe,EAAE,IAAY,EAAE,EAAE;IACpE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAA;IAChC,IAAI,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEhD,0CAA0C;IAE1C,0CAA0C;IAE1C,2CAA2C;IAE3C,wCAAwC;IACxC,qDAAqD;IAErD,mDAAmD;IACnD,kBAAkB;IAClB,6BAA6B;IAC7B,8BAA8B;IAC9B,mEAAmE;IACnE,YAAY;IACZ,YAAY;IAEZ,aAAa;IACb,gDAAgD;IAChD,MAAM;IACN,MAAM;IAEN,EAAE,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;AACnG,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAe,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI;;QAC/D,IAAI,IAAQ,CAAC;QAEb,IAAI;YACF,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAA;SAChC;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;SACR;QAED,SAAS,gBAAgB;YACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC;gBAC9C,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpF,IAAI,QAAQ,GAAG,IAAI,CAAC;gBACpB,IAAI,MAAc,CAAC;gBAEnB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,UAAS,GAAG,EAAE,OAAO;oBAClE,IAAI,GAAG,EAAE;wBACP,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACjB,QAAQ,GAAG,KAAK,CAAC;qBAClB;oBAED,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;oBAChC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAClD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,IAAI,CAAC,EAAE;YACvD,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;CAAA,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}
|
Reference in New Issue
Block a user