nodestatus-server 1.1.0-alpha → 1.1.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,8 @@
1
+ # NodeStatus-Server
2
+
3
+ > NodeStatus main package.
4
+
5
+ See https://github.com/cokemine/nodestatus for more information.
6
+
7
+
8
+
package/build/app.js CHANGED
@@ -60264,7 +60264,7 @@ exports.InvalidOptionArgumentError = InvalidArgumentError; // Deprecated
60264
60264
  exports.Option = Option;
60265
60265
  }(commander, commander.exports));
60266
60266
 
60267
- main.config({ path: require$$1$2.resolve(process.cwd(), '.env.local') });
60267
+ main.config({ path: require$$1$2.resolve(require$$1$1.homedir(), '.nodestatus/.env.local') });
60268
60268
  commander.exports.program
60269
60269
  .option('-db, --database <db>', 'the path of database', require$$1$1.platform() === 'win32' ? require$$1$2.resolve(__dirname, '../db.sqlite') : '/usr/local/NodeStatus/server/db.sqlite')
60270
60270
  .option('-p, --port <port>', 'the port of NodeStatus', '35601')
@@ -60283,6 +60283,7 @@ const config = {
60283
60283
  webPassword: process.env.WEB_PASSWORD || '',
60284
60284
  webSecret: process.env.WEB_SECRET || process.env.WEB_PASSWORD || 'secret',
60285
60285
  ipcAddress: process.env.IPC_ADDRESS || (require$$1$1.platform() !== 'win32' ? '/tmp/status_unix.sock' : '\\\\.\\pipe\\status_ipc'),
60286
+ pushTimeOut: Number(process.env.PUSH_TIMEOUT) || 30,
60286
60287
  telegram: {
60287
60288
  proxy: process.env.TGBOT_PROXY,
60288
60289
  bot_token: process.env.TGBOT_TOKEN || '',
@@ -61837,6 +61838,21 @@ Server = __decorate([
61837
61838
  underscored: true
61838
61839
  })
61839
61840
  ], Server);
61841
+ let Order = class Order extends sequelizeTypescript.Model {
61842
+ /* varchar id split by ',' */
61843
+ order;
61844
+ };
61845
+ __decorate([
61846
+ sequelizeTypescript.NotEmpty,
61847
+ sequelizeTypescript.Unique,
61848
+ sequelizeTypescript.Column,
61849
+ __metadata("design:type", String)
61850
+ ], Order.prototype, "order", void 0);
61851
+ Order = __decorate([
61852
+ sequelizeTypescript.Table({
61853
+ underscored: true
61854
+ })
61855
+ ], Order);
61840
61856
  /* Deprecated */
61841
61857
  let User = class User extends sequelizeTypescript.Model {
61842
61858
  username;
@@ -61871,46 +61887,70 @@ async function handleRequest$1(callback) {
61871
61887
  return createRes(1, error.message);
61872
61888
  }
61873
61889
  }
61874
- function getServer(username) {
61890
+ function getServer$1(username, getPassword = false) {
61875
61891
  return handleRequest$1(async () => {
61876
- const result = await Server.findOne({
61877
- where: {
61878
- username
61892
+ const exclude = ['createdAt', 'updatedAt'];
61893
+ !getPassword && exclude.push('password');
61894
+ const [result, orderResult] = await Promise.all([
61895
+ Server.findOne({
61896
+ where: {
61897
+ username
61898
+ },
61899
+ attributes: {
61900
+ exclude
61901
+ },
61902
+ raw: true
61903
+ }),
61904
+ getOrder()
61905
+ ]);
61906
+ if (orderResult.code)
61907
+ return orderResult;
61908
+ const order = orderResult.data?.split(',') || [];
61909
+ const newResult = result;
61910
+ for (let i = 0; i < order.length; ++i) {
61911
+ if (result?.id === Number(order[i])) {
61912
+ newResult.order = i + 1;
61879
61913
  }
61880
- });
61881
- return createRes(result ? 0 : 1, result ? 'ok' : 'User Not Found', result);
61882
- });
61883
- }
61884
- function getServerPassword(username) {
61885
- return handleRequest$1(async () => {
61886
- const result = await getServer(username);
61887
- if (result.code)
61888
- return result;
61889
- return createRes(0, result.data.password);
61914
+ }
61915
+ return createRes(newResult ? 0 : 1, newResult ? 'ok' : 'User Not Found', newResult);
61890
61916
  });
61891
61917
  }
61892
61918
  function createServer(server) {
61893
61919
  return handleRequest$1(async () => {
61894
- await Server.create(server);
61895
- emitter.emit('update', server.username);
61920
+ const [item, result] = await Promise.all([Server.create(server), getOrder()]);
61921
+ let order = result.data;
61922
+ order = order ? `${order},${item.id}` : item.id;
61923
+ await updateOrder(order);
61896
61924
  return createRes();
61897
61925
  });
61898
61926
  }
61899
61927
  function bulkCreateServer(servers) {
61900
61928
  return handleRequest$1(async () => {
61901
- await Server.bulkCreate(servers, { validate: true });
61902
- emitter.emit('update');
61929
+ const [items, result] = await Promise.all([Server.bulkCreate(servers, { validate: true }), getOrder()]);
61930
+ if (result.code)
61931
+ return result;
61932
+ let order = result.data;
61933
+ for (const item of items) {
61934
+ order = order ? `${order},${item.id}` : item.id;
61935
+ }
61936
+ await updateOrder(order);
61903
61937
  return createRes();
61904
61938
  });
61905
61939
  }
61906
61940
  function delServer$2(username) {
61907
61941
  return handleRequest$1(async () => {
61908
- await Server.destroy({
61909
- where: {
61910
- username
61911
- }
61912
- });
61913
- emitter.emit('update', username);
61942
+ const [result, orderResult] = await Promise.all([getServer$1(username), getOrder()]);
61943
+ if (result.code)
61944
+ return result;
61945
+ if (orderResult.code)
61946
+ return orderResult;
61947
+ const server = result.data;
61948
+ let order = orderResult.data?.split(',');
61949
+ if (order) {
61950
+ order = order.filter((id) => Number(id) !== server.id);
61951
+ }
61952
+ await Promise.all([server.destroy(), updateOrder(order.join(','))]);
61953
+ emitter.emit('update', username, true);
61914
61954
  return createRes();
61915
61955
  });
61916
61956
  }
@@ -61921,20 +61961,60 @@ function setServer$2(username, obj) {
61921
61961
  username
61922
61962
  }
61923
61963
  });
61924
- emitter.emit('update', username);
61925
- emitter.emit('update', obj.username);
61964
+ const shouldDisconnect = !!(obj.username || obj.password || obj.disabled === true);
61965
+ emitter.emit('update', username, shouldDisconnect);
61966
+ obj.username && emitter.emit('update', obj.username, true);
61926
61967
  return createRes();
61927
61968
  });
61928
61969
  }
61929
61970
  function getListServers$1() {
61930
61971
  return handleRequest$1(async () => {
61931
- const result = await Server.findAll({
61972
+ /* https://github.com/RobinBuschmann/sequelize-typescript/issues/763
61973
+ * Maybe we should move to TypeORM or Prisma because low typescript support of sequelize
61974
+ * */
61975
+ const [result, orderResult] = await Promise.all([
61976
+ Server.findAll({
61977
+ attributes: {
61978
+ exclude: ['password', 'createdAt', 'updatedAt']
61979
+ },
61980
+ raw: true
61981
+ }),
61982
+ getOrder()
61983
+ ]);
61984
+ if (orderResult.code)
61985
+ return orderResult;
61986
+ const order = orderResult.data?.split(',') || [];
61987
+ const newResult = [];
61988
+ const map = new Map();
61989
+ for (let i = 0; i < order.length; ++i) {
61990
+ map.set(Number(order?.[i]), i + 1);
61991
+ }
61992
+ for (const item of result) {
61993
+ newResult.push({ ...item, order: map.get(item.id) });
61994
+ }
61995
+ return createRes({ data: newResult });
61996
+ });
61997
+ }
61998
+ function getOrder() {
61999
+ return handleRequest$1(async () => {
62000
+ const result = await Order.findAll({
61932
62001
  attributes: {
61933
- exclude: ['password', 'createdAt', 'updatedAt']
62002
+ exclude: ['id', 'createdAt', 'updatedAt']
61934
62003
  },
61935
62004
  raw: true
61936
62005
  });
61937
- return createRes({ data: result });
62006
+ const order = result?.[0]?.order || '';
62007
+ return createRes({ data: order });
62008
+ });
62009
+ }
62010
+ function updateOrder(order) {
62011
+ return handleRequest$1(async () => {
62012
+ await Order.destroy({
62013
+ truncate: true
62014
+ });
62015
+ await Order.create({ order });
62016
+ emitter.emit('update');
62017
+ return createRes();
61938
62018
  });
61939
62019
  }
61940
62020
 
@@ -61946,7 +62026,9 @@ const handleRequest = async (ctx, handler) => {
61946
62026
  ctx.body = result;
61947
62027
  };
61948
62028
  const listServers = async (ctx) => {
61949
- await handleRequest(ctx, getListServers$1());
62029
+ const result = await getListServers$1();
62030
+ result.data.sort((x, y) => y.order - x.order);
62031
+ await handleRequest(ctx, Promise.resolve(result));
61950
62032
  };
61951
62033
  const setServer$1 = async (ctx) => {
61952
62034
  const { username } = ctx.request.body;
@@ -61958,6 +62040,8 @@ const setServer$1 = async (ctx) => {
61958
62040
  }
61959
62041
  if (!data.password)
61960
62042
  delete data.password;
62043
+ if (username === data.username)
62044
+ delete data.username;
61961
62045
  await handleRequest(ctx, setServer$2(username, data));
61962
62046
  };
61963
62047
  const addServer$1 = async (ctx) => {
@@ -61990,6 +62074,15 @@ const delServer$1 = async (ctx) => {
61990
62074
  return;
61991
62075
  }
61992
62076
  await handleRequest(ctx, delServer$2(username));
62077
+ };
62078
+ const modifyOrder = async (ctx) => {
62079
+ const { order = '' } = ctx.request.body;
62080
+ if (!order) {
62081
+ ctx.status = 400;
62082
+ ctx.body = createRes(1, 'Wrong request');
62083
+ return;
62084
+ }
62085
+ await handleRequest(ctx, updateOrder(order));
61993
62086
  };
61994
62087
 
61995
62088
  const router = new router$1({ prefix: '/api' });
@@ -61999,29 +62092,33 @@ router.post('/session', createSession);
61999
62092
  router.get('/server', listServers);
62000
62093
  router.post('/server', addServer$1);
62001
62094
  router.put('/server', setServer$1);
62095
+ router.put('/server/order', modifyOrder);
62002
62096
  router.delete('/server/:username', delServer$1);
62003
62097
 
62004
62098
  async function authServer(username, password) {
62005
- const result = await getServerPassword(username);
62099
+ const result = await getServer$1(username, true);
62006
62100
  if (result.code)
62007
62101
  return false;
62008
- return bcryptjs.compareSync(password, result.msg);
62102
+ const data = result.data;
62103
+ if (data.disabled || !data.password)
62104
+ return false;
62105
+ return bcryptjs.compareSync(password, data.password);
62009
62106
  }
62010
62107
  async function addServer(obj) {
62011
- const result = await getServer(obj.username);
62108
+ const result = await getServer$1(obj.username);
62012
62109
  if (!result.code) {
62013
62110
  return createRes(1, 'Username duplicate');
62014
62111
  }
62015
62112
  return createServer(obj);
62016
62113
  }
62017
62114
  async function setServer(username, obj) {
62018
- const result = await getServer(username);
62115
+ const result = await getServer$1(username);
62019
62116
  if (result.code)
62020
62117
  return result;
62021
62118
  return setServer$2(username, obj);
62022
62119
  }
62023
62120
  async function delServer(username) {
62024
- const result = await getServer(username);
62121
+ const result = await getServer$1(username);
62025
62122
  if (result.code) {
62026
62123
  return result;
62027
62124
  }
@@ -62033,12 +62130,23 @@ async function getListServers() {
62033
62130
  return result;
62034
62131
  const obj = {};
62035
62132
  result.data.forEach(item => {
62036
- if (item.disabled)
62133
+ const { username, disabled, ..._item } = item;
62134
+ if (disabled)
62037
62135
  return;
62038
- const { username, ..._item } = item;
62039
62136
  obj[username] = _item;
62040
62137
  });
62041
62138
  return createRes({ data: obj });
62139
+ }
62140
+ async function getServer(username) {
62141
+ const result = await getServer$1(username);
62142
+ if (result.code)
62143
+ return result;
62144
+ const data = result.data;
62145
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
62146
+ const { username: _, disabled, ...item } = data;
62147
+ if (disabled)
62148
+ return createRes(1, 'Server disabled');
62149
+ return createRes({ data: item });
62042
62150
  }
62043
62151
 
62044
62152
  function createIpc() {
@@ -68919,7 +69027,7 @@ class NodeStatus {
68919
69027
  constructor(server, options) {
68920
69028
  this.server = server;
68921
69029
  this.options = options;
68922
- emitter.on('update', this.update.bind(this));
69030
+ emitter.on('update', this.updateStatus.bind(this));
68923
69031
  }
68924
69032
  setBan(socket, address, t, reason) {
68925
69033
  socket.close();
@@ -68928,10 +69036,7 @@ class NodeStatus {
68928
69036
  this.isBanned.set(address, true);
68929
69037
  logger.warn(`${address} was banned ${t} seconds, reason: ${reason}`);
68930
69038
  callHook(this, 'onServerBanned', address, reason);
68931
- const id = setTimeout(() => {
68932
- this.isBanned.delete(address);
68933
- clearTimeout(id);
68934
- }, t * 1000);
69039
+ setTimeout(() => this.isBanned.delete(address), t * 1000);
68935
69040
  }
68936
69041
  launch() {
68937
69042
  this.server.on('upgrade', (request, socket, head) => {
@@ -69016,39 +69121,45 @@ class NodeStatus {
69016
69121
  socket.on('close', () => clearInterval(id));
69017
69122
  });
69018
69123
  this.options.usePush && this.createPush();
69019
- return this.update();
69124
+ return this.updateStatus();
69020
69125
  }
69021
- async update(username) {
69022
- const box = (await getListServers()).data;
69023
- if (!box)
69024
- return;
69126
+ async updateStatus(username, shouldDisconnect = false) {
69025
69127
  if (username) {
69026
- if (!box[username])
69128
+ const server = (await getServer(username)).data;
69129
+ if (!server)
69027
69130
  delete this.servers[username];
69028
69131
  else
69029
- this.servers[username] = Object.assign(box[username], { status: this.servers?.[username]?.status || {} });
69030
- const socket = this.userMap.get(username);
69031
- socket && socket.terminate();
69132
+ this.servers[username] = Object.assign(server, { status: this.servers?.[username]?.status || {} });
69133
+ shouldDisconnect && this.userMap.get(username)?.terminate() && this.userMap.delete(username);
69032
69134
  }
69033
69135
  else {
69136
+ const box = (await getListServers()).data;
69137
+ if (!box)
69138
+ return;
69034
69139
  for (const k of Object.keys(box)) {
69035
69140
  if (!this.servers[k])
69036
69141
  this.servers[k] = Object.assign(box[k], { status: {} });
69142
+ if (this.servers[k].order !== box[k].order)
69143
+ this.servers[k].order = box[k].order;
69037
69144
  }
69038
69145
  for (const k of Object.keys(this.servers)) {
69039
69146
  if (!box[k])
69040
69147
  delete this.servers[k];
69041
69148
  }
69042
- for (const socket of this.userMap.values()) {
69043
- socket.terminate();
69149
+ if (shouldDisconnect) {
69150
+ for (const socket of this.userMap.values()) {
69151
+ socket.terminate();
69152
+ }
69153
+ this.userMap.clear();
69044
69154
  }
69045
- this.userMap.clear();
69046
69155
  }
69047
- this.serversPub = Object.values(this.servers).sort((x, y) => y.id - x.id);
69156
+ this.serversPub = Object.values(this.servers).sort((x, y) => y.order - x.order);
69048
69157
  }
69049
69158
  /* This should move to another file later */
69050
69159
  createPush() {
69051
69160
  const pushList = [];
69161
+ /* ip -> timer */
69162
+ const timerMap = new Map();
69052
69163
  const entities = new Set(['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!', '\\']);
69053
69164
  const parseEntities = (str) => {
69054
69165
  if (typeof str !== 'string')
@@ -69134,8 +69245,27 @@ class NodeStatus {
69134
69245
  }
69135
69246
  pushList.push(message => [...chatId].map(id => bot.telegram.sendMessage(id, `${message}`, { parse_mode: 'MarkdownV2' })));
69136
69247
  }
69137
- this.onServerConnected = (socket, username) => Promise.all(pushList.map(fn => fn(`🍊*NodeStatus* \n😀 One new server has connected\\! \n\n *用户名*: ${parseEntities(username)} \n *节点名*: ${parseEntities(this.servers[username]['name'])} \n *时间*: ${parseEntities(new Date())}`)));
69138
- this.onServerDisconnected = (socket, username) => Promise.all(pushList.map(fn => fn(`🍊*NodeStatus* \n😰 One server has disconnected\\! \n\n *用户名*: ${parseEntities(username)} \n *节点名*: ${parseEntities(this.servers[username]?.['name'])} \n *时间*: ${parseEntities(new Date())}`)));
69248
+ this.onServerConnected = (socket, username) => {
69249
+ const ip = this.map.get(socket);
69250
+ if (ip) {
69251
+ const timer = timerMap.get(ip);
69252
+ if (timer) {
69253
+ clearTimeout(timer);
69254
+ timerMap.delete(ip);
69255
+ }
69256
+ else {
69257
+ return Promise.all(pushList.map(fn => fn(`🍊*NodeStatus* \n😀 One new server has connected\\! \n\n *用户名*: ${parseEntities(username)} \n *节点名*: ${parseEntities(this.servers[username]['name'])} \n *时间*: ${parseEntities(new Date())}`)));
69258
+ }
69259
+ }
69260
+ };
69261
+ this.onServerDisconnected = (socket, username) => {
69262
+ const ip = this.map.get(socket);
69263
+ const timer = setTimeout(() => {
69264
+ Promise.all(pushList.map(fn => fn(`🍊*NodeStatus* \n😰 One server has disconnected\\! \n\n *用户名*: ${parseEntities(username)} \n *节点名*: ${parseEntities(this.servers[username]?.['name'])} \n *时间*: ${parseEntities(new Date())}`))).then();
69265
+ ip && timerMap.delete(ip);
69266
+ }, this.options.pushTimeOut * 1000);
69267
+ ip && timerMap.set(ip, timer);
69268
+ };
69139
69269
  }
69140
69270
  }
69141
69271
 
@@ -69145,6 +69275,7 @@ async function createStatus(app) {
69145
69275
  const instance = new NodeStatus(server, {
69146
69276
  interval: Number(config.interval),
69147
69277
  usePush: config.usePush,
69278
+ pushTimeOut: config.pushTimeOut,
69148
69279
  telegram: {
69149
69280
  ...config.telegram,
69150
69281
  chat_id: config.telegram.chat_id.split(',')
@@ -69174,7 +69305,7 @@ const sequelize = new sequelizeTypescript.Sequelize({
69174
69305
  dialectModule: require('sqlite3'),
69175
69306
  storage: config.database,
69176
69307
  logging: false,
69177
- models: [Server]
69308
+ models: [Server, Order]
69178
69309
  });
69179
69310
 
69180
69311
  (async () => {
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "files": {
3
- "static/js/0.6679ea6c.chunk.js": "/admin/static/js/0.6679ea6c.chunk.js",
4
- "main.css": "/admin/static/css/main.f124e7ff.chunk.css",
5
- "main.js": "/admin/static/js/main.7c5e08e8.chunk.js",
6
- "runtime-main.js": "/admin/static/js/runtime-main.3af64b89.js",
7
- "static/js/3.3cb72322.chunk.js": "/admin/static/js/3.3cb72322.chunk.js",
8
- "static/js/4.20f08e63.chunk.js": "/admin/static/js/4.20f08e63.chunk.js",
9
- "static/js/5.211cebd3.chunk.js": "/admin/static/js/5.211cebd3.chunk.js",
10
- "static/js/6.2860407e.chunk.js": "/admin/static/js/6.2860407e.chunk.js",
3
+ "static/js/0.9f6e41e4.chunk.js": "/admin/static/js/0.9f6e41e4.chunk.js",
4
+ "main.css": "/admin/static/css/main.3be6ff03.chunk.css",
5
+ "main.js": "/admin/static/js/main.113da03e.chunk.js",
6
+ "runtime-main.js": "/admin/static/js/runtime-main.36fcdcba.js",
7
+ "static/js/3.f1d474c4.chunk.js": "/admin/static/js/3.f1d474c4.chunk.js",
8
+ "static/js/4.bb99ac03.chunk.js": "/admin/static/js/4.bb99ac03.chunk.js",
9
+ "static/js/5.1aa416ea.chunk.js": "/admin/static/js/5.1aa416ea.chunk.js",
10
+ "static/js/6.6ac61266.chunk.js": "/admin/static/js/6.6ac61266.chunk.js",
11
11
  "index.html": "/admin/index.html",
12
- "static/js/3.3cb72322.chunk.js.LICENSE.txt": "/admin/static/js/3.3cb72322.chunk.js.LICENSE.txt",
12
+ "static/js/3.f1d474c4.chunk.js.LICENSE.txt": "/admin/static/js/3.f1d474c4.chunk.js.LICENSE.txt",
13
13
  "static/media/login-office.0f3e03bf.jpeg": "/admin/static/media/login-office.0f3e03bf.jpeg",
14
14
  "static/media/logo.2e0dd078.png": "/admin/static/media/logo.2e0dd078.png",
15
15
  "static/media/logo.c62a2a6d.svg": "/admin/static/media/logo.c62a2a6d.svg"
16
16
  },
17
17
  "entrypoints": [
18
- "static/js/runtime-main.3af64b89.js",
19
- "static/js/3.3cb72322.chunk.js",
20
- "static/css/main.f124e7ff.chunk.css",
21
- "static/js/main.7c5e08e8.chunk.js"
18
+ "static/js/runtime-main.36fcdcba.js",
19
+ "static/js/3.f1d474c4.chunk.js",
20
+ "static/css/main.3be6ff03.chunk.css",
21
+ "static/js/main.113da03e.chunk.js"
22
22
  ]
23
23
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/admin/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="NodeStatus Admin"/><link rel="stylesheet" href="//cdn.jsdelivr.net/npm/antd@4.16.13/dist/antd.min.css"><link rel="apple-touch-icon" href="/admin/logo.png"/><title>NodeStatus Admin</title><link href="/admin/static/css/main.f124e7ff.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,a,i=r[0],c=r[1],l=r[2],s=0,p=[];s<i.length;s++)a=i[s],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&p.push(o[a][0]),o[a]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);p.length;)p.shift()();return u.push.apply(u,l||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var c=t[i];0!==o[c]&&(n=!1)}n&&(u.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={2:0},u=[];function a(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var u,i=document.createElement("script");i.charset="utf-8",i.timeout=120,a.nc&&i.setAttribute("nonce",a.nc),i.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"6679ea6c",4:"20f08e63",5:"211cebd3",6:"2860407e"}[e]+".chunk.js"}(e);var c=new Error;u=function(r){i.onerror=i.onload=null,clearTimeout(l);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),u=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",c.name="ChunkLoadError",c.type=n,c.request=u,t[1](c)}o[e]=void 0}};var l=setTimeout((function(){u({type:"timeout",target:i})}),12e4);i.onerror=i.onload=u,document.head.appendChild(i)}return Promise.all(r)},a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,function(r){return e[r]}.bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="/admin/",a.oe=function(e){throw console.error(e),e};var i=this["webpackJsonphotaru-admin"]=this["webpackJsonphotaru-admin"]||[],c=i.push.bind(i);i.push=r,i=i.slice();for(var l=0;l<i.length;l++)r(i[l]);var f=c;t()}([])</script><script src="/admin/static/js/3.3cb72322.chunk.js"></script><script src="/admin/static/js/main.7c5e08e8.chunk.js"></script></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/admin/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="NodeStatus Admin"/><link rel="stylesheet" href="//cdn.jsdelivr.net/npm/antd@4.16.13/dist/antd.min.css"><link rel="apple-touch-icon" href="/admin/logo.png"/><title>NodeStatus Admin</title><link href="/admin/static/css/main.3be6ff03.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,u,i=r[0],c=r[1],l=r[2],s=0,p=[];s<i.length;s++)u=i[s],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&p.push(o[u][0]),o[u]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(f&&f(r);p.length;)p.shift()();return a.push.apply(a,l||[]),t()}function t(){for(var e,r=0;r<a.length;r++){for(var t=a[r],n=!0,i=1;i<t.length;i++){var c=t[i];0!==o[c]&&(n=!1)}n&&(a.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={2:0},a=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.e=function(e){var r=[],t=o[e];if(0!==t)if(t)r.push(t[2]);else{var n=new Promise((function(r,n){t=o[e]=[r,n]}));r.push(t[2]=n);var a,i=document.createElement("script");i.charset="utf-8",i.timeout=120,u.nc&&i.setAttribute("nonce",u.nc),i.src=function(e){return u.p+"static/js/"+({}[e]||e)+"."+{0:"9f6e41e4",4:"bb99ac03",5:"1aa416ea",6:"6ac61266"}[e]+".chunk.js"}(e);var c=new Error;a=function(r){i.onerror=i.onload=null,clearTimeout(l);var t=o[e];if(0!==t){if(t){var n=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;c.message="Loading chunk "+e+" failed.\n("+n+": "+a+")",c.name="ChunkLoadError",c.type=n,c.request=a,t[1](c)}o[e]=void 0}};var l=setTimeout((function(){a({type:"timeout",target:i})}),12e4);i.onerror=i.onload=a,document.head.appendChild(i)}return Promise.all(r)},u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="/admin/",u.oe=function(e){throw console.error(e),e};var i=this["webpackJsonphotaru-admin"]=this["webpackJsonphotaru-admin"]||[],c=i.push.bind(i);i.push=r,i=i.slice();for(var l=0;l<i.length;l++)r(i[l]);var f=c;t()}([])</script><script src="/admin/static/js/3.f1d474c4.chunk.js"></script><script src="/admin/static/js/main.113da03e.chunk.js"></script></body></html>
@@ -1,3 +1,3 @@
1
1
  /* ! tailwindcss v2.2.14 | MIT License | https://tailwindcss.com */
2
2
 
3
- /*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=submit],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible!important}.m-auto{margin:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.mr-3{margin-right:.75rem!important}.mr-6{margin-right:1.5rem!important}.mb-2{margin-bottom:.5rem!important}.mb-6{margin-bottom:1.5rem!important}.mb-8{margin-bottom:2rem!important}.ml-4{margin-left:1rem!important}.block{display:block!important}.inline{display:inline!important}.flex{display:flex!important}.table{display:table!important}.hidden{display:none!important}.h-5{height:1.25rem!important}.h-12{height:3rem!important}.h-32{height:8rem!important}.h-full{height:100%!important}.h-screen{height:100vh!important}.min-h-screen{min-height:100vh!important}.w-5{width:1.25rem!important}.w-12{width:3rem!important}.w-full{width:100%!important}.max-w-4xl{max-width:56rem!important}.max-w-full{max-width:100%!important}.max-w-screen-xl{max-width:1280px!important}.flex-1{flex:1 1 0%!important}@-webkit-keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.flex-col{flex-direction:column!important}.items-center{align-items:center!important}.justify-center{justify-content:center!important}.justify-between{justify-content:space-between!important}.justify-evenly{justify-content:space-evenly!important}.overflow-hidden{overflow:hidden!important}.overflow-y-auto{overflow-y:auto!important}.whitespace-nowrap{white-space:nowrap!important}.rounded-lg{border-radius:.5rem!important}.rounded-full{border-radius:9999px!important}.bg-white{background-color:rgba(255,255,255,var(--tw-bg-opacity))!important}.bg-gray-50,.bg-white{--tw-bg-opacity:1!important}.bg-gray-50{background-color:rgba(249,250,251,var(--tw-bg-opacity))!important}.bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgba(254,243,199,var(--tw-bg-opacity))!important}.bg-green-100{background-color:rgba(209,250,229,var(--tw-bg-opacity))!important}.bg-blue-100,.bg-green-100{--tw-bg-opacity:1!important}.bg-blue-100{background-color:rgba(219,234,254,var(--tw-bg-opacity))!important}.object-cover{object-fit:cover!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.p-6{padding:1.5rem!important}.px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.pl-6{padding-left:1.5rem!important}.text-left{text-align:left!important}.text-center{text-align:center!important}.text-xs{font-size:.75rem!important;line-height:1rem!important}.text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-base{font-size:1rem!important;line-height:1.5rem!important}.text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.text-2xl{font-size:1.5rem!important;line-height:2rem!important}.text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.font-medium{font-weight:500!important}.font-semibold{font-weight:600!important}.text-gray-600{--tw-text-opacity:1!important;color:rgba(75,85,99,var(--tw-text-opacity))!important}.text-gray-700{--tw-text-opacity:1!important;color:rgba(55,65,81,var(--tw-text-opacity))!important}.text-yellow-500{--tw-text-opacity:1!important;color:rgba(245,158,11,var(--tw-text-opacity))!important}.text-green-500{--tw-text-opacity:1!important;color:rgba(16,185,129,var(--tw-text-opacity))!important}.text-blue-500{--tw-text-opacity:1!important;color:rgba(59,130,246,var(--tw-text-opacity))!important}*,:after,:before{--tw-shadow:0 0 transparent}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)!important}.shadow,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)!important}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)!important}*,:after,:before{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)!important}.ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))!important}.ring-opacity-5{--tw-ring-opacity:0.05!important}.ant-table{overflow:auto;background-color:#fafafa!important}.ant-table .ant-table-thead .ant-table-cell{font-weight:600}.ant-table .ant-table-tbody{background-color:#fff}.ant-drawer-content{background-color:#001529!important}@media (min-width:640px){.sm\:p-16{padding:4rem!important}}@media (min-width:768px){.md\:h-auto{height:auto!important}.md\:w-1\/2{width:50%!important}.md\:flex-row{flex-direction:row!important}}@media (min-width:1024px){.lg\:block{display:block!important}.lg\:inline-block{display:inline-block!important}.lg\:hidden{display:none!important}}
3
+ /*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=submit],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible!important}.m-auto{margin:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-6{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.mr-3{margin-right:.75rem!important}.mr-6{margin-right:1.5rem!important}.mb-2{margin-bottom:.5rem!important}.mb-6{margin-bottom:1.5rem!important}.mb-8{margin-bottom:2rem!important}.ml-4{margin-left:1rem!important}.block{display:block!important}.inline{display:inline!important}.flex{display:flex!important}.table{display:table!important}.hidden{display:none!important}.h-5{height:1.25rem!important}.h-12{height:3rem!important}.h-32{height:8rem!important}.h-full{height:100%!important}.h-screen{height:100vh!important}.min-h-screen{min-height:100vh!important}.w-5{width:1.25rem!important}.w-12{width:3rem!important}.w-full{width:100%!important}.max-w-4xl{max-width:56rem!important}.max-w-full{max-width:100%!important}.max-w-screen-xl{max-width:1280px!important}.flex-1{flex:1 1 0%!important}@-webkit-keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.flex-col{flex-direction:column!important}.items-center{align-items:center!important}.justify-center{justify-content:center!important}.justify-between{justify-content:space-between!important}.justify-evenly{justify-content:space-evenly!important}.overflow-hidden{overflow:hidden!important}.overflow-y-auto{overflow-y:auto!important}.whitespace-nowrap{white-space:nowrap!important}.rounded-lg{border-radius:.5rem!important}.rounded-full{border-radius:9999px!important}.bg-white{background-color:rgba(255,255,255,var(--tw-bg-opacity))!important}.bg-gray-50,.bg-white{--tw-bg-opacity:1!important}.bg-gray-50{background-color:rgba(249,250,251,var(--tw-bg-opacity))!important}.bg-yellow-100{--tw-bg-opacity:1!important;background-color:rgba(254,243,199,var(--tw-bg-opacity))!important}.bg-green-100{background-color:rgba(209,250,229,var(--tw-bg-opacity))!important}.bg-blue-100,.bg-green-100{--tw-bg-opacity:1!important}.bg-blue-100{background-color:rgba(219,234,254,var(--tw-bg-opacity))!important}.object-cover{object-fit:cover!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.p-6{padding:1.5rem!important}.px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.pl-6{padding-left:1.5rem!important}.text-left{text-align:left!important}.text-center{text-align:center!important}.text-xs{font-size:.75rem!important;line-height:1rem!important}.text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-base{font-size:1rem!important;line-height:1.5rem!important}.text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.text-2xl{font-size:1.5rem!important;line-height:2rem!important}.text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.font-medium{font-weight:500!important}.font-semibold{font-weight:600!important}.text-gray-600{--tw-text-opacity:1!important;color:rgba(75,85,99,var(--tw-text-opacity))!important}.text-gray-700{--tw-text-opacity:1!important;color:rgba(55,65,81,var(--tw-text-opacity))!important}.text-yellow-500{--tw-text-opacity:1!important;color:rgba(245,158,11,var(--tw-text-opacity))!important}.text-green-500{--tw-text-opacity:1!important;color:rgba(16,185,129,var(--tw-text-opacity))!important}.text-blue-500{--tw-text-opacity:1!important;color:rgba(59,130,246,var(--tw-text-opacity))!important}*,:after,:before{--tw-shadow:0 0 transparent}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)!important}.shadow,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)!important}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)!important}*,:after,:before{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)!important}.ring-black{--tw-ring-opacity:1!important;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))!important}.ring-opacity-5{--tw-ring-opacity:0.05!important}.filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/)!important;--tw-brightness:var(--tw-empty,/*!*/ /*!*/)!important;--tw-contrast:var(--tw-empty,/*!*/ /*!*/)!important;--tw-grayscale:var(--tw-empty,/*!*/ /*!*/)!important;--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/)!important;--tw-invert:var(--tw-empty,/*!*/ /*!*/)!important;--tw-saturate:var(--tw-empty,/*!*/ /*!*/)!important;--tw-sepia:var(--tw-empty,/*!*/ /*!*/)!important;--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/)!important;-webkit-filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.ant-table{overflow:auto;background-color:#fafafa!important}.ant-table .ant-table-thead .ant-table-cell{font-weight:600}.ant-table .ant-table-tbody{background-color:#fff}.ant-drawer-content{background-color:#001529!important}@media (min-width:640px){.sm\:p-16{padding:4rem!important}}@media (min-width:768px){.md\:h-auto{height:auto!important}.md\:w-1\/2{width:50%!important}.md\:flex-row{flex-direction:row!important}}@media (min-width:1024px){.lg\:block{display:block!important}.lg\:inline-block{display:inline-block!important}.lg\:hidden{display:none!important}}