ftpd-lite 0.0.0-stage → 1.0.3

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.
Files changed (66) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +121 -2
  3. package/examples/basic.js +28 -0
  4. package/package.json +47 -4
  5. package/src/commands/CwdCommand.d.ts +3 -0
  6. package/src/commands/CwdCommand.js +91 -0
  7. package/src/commands/DeleCommand.d.ts +3 -0
  8. package/src/commands/DeleCommand.js +85 -0
  9. package/src/commands/FeatCommand.d.ts +2 -0
  10. package/src/commands/FeatCommand.js +30 -0
  11. package/src/commands/ListCommand.d.ts +4 -0
  12. package/src/commands/ListCommand.js +92 -0
  13. package/src/commands/MkdCommand.d.ts +3 -0
  14. package/src/commands/MkdCommand.js +97 -0
  15. package/src/commands/NoopCommand.d.ts +2 -0
  16. package/src/commands/NoopCommand.js +12 -0
  17. package/src/commands/PassCommand.d.ts +3 -0
  18. package/src/commands/PassCommand.js +43 -0
  19. package/src/commands/PasvCommand.d.ts +2 -0
  20. package/src/commands/PasvCommand.js +27 -0
  21. package/src/commands/PortCommand.d.ts +2 -0
  22. package/src/commands/PortCommand.js +34 -0
  23. package/src/commands/PwdCommand.d.ts +2 -0
  24. package/src/commands/PwdCommand.js +30 -0
  25. package/src/commands/QuitCommand.d.ts +2 -0
  26. package/src/commands/QuitCommand.js +21 -0
  27. package/src/commands/RetrCommand.d.ts +3 -0
  28. package/src/commands/RetrCommand.js +83 -0
  29. package/src/commands/RmdCommand.d.ts +3 -0
  30. package/src/commands/RmdCommand.js +97 -0
  31. package/src/commands/RnfrCommand.d.ts +3 -0
  32. package/src/commands/RnfrCommand.js +85 -0
  33. package/src/commands/RntoCommand.d.ts +3 -0
  34. package/src/commands/RntoCommand.js +104 -0
  35. package/src/commands/StorCommand.d.ts +3 -0
  36. package/src/commands/StorCommand.js +87 -0
  37. package/src/commands/SystCommand.d.ts +2 -0
  38. package/src/commands/SystCommand.js +22 -0
  39. package/src/commands/TypeCommand.d.ts +2 -0
  40. package/src/commands/TypeCommand.js +29 -0
  41. package/src/commands/UserCommand.d.ts +3 -0
  42. package/src/commands/UserCommand.js +79 -0
  43. package/src/commands/index.d.ts +19 -0
  44. package/src/commands/index.js +36 -0
  45. package/src/connection.d.ts +28 -0
  46. package/src/connection.js +133 -0
  47. package/src/core/DataServer.d.ts +7 -0
  48. package/src/core/DataServer.js +76 -0
  49. package/src/core/FtpServer.d.ts +44 -0
  50. package/src/core/FtpServer.js +502 -0
  51. package/src/core/index.d.ts +2 -0
  52. package/src/core/index.js +19 -0
  53. package/src/fileTransfer.d.ts +15 -0
  54. package/src/fileTransfer.js +120 -0
  55. package/src/index.d.ts +6 -0
  56. package/src/index.js +16 -0
  57. package/src/types/index.d.ts +119 -0
  58. package/src/types/index.js +53 -0
  59. package/src/types.d.ts +130 -0
  60. package/src/types.js +53 -0
  61. package/src/userManager.d.ts +24 -0
  62. package/src/userManager.js +287 -0
  63. package/src/utils/logger.d.ts +14 -0
  64. package/src/utils/logger.js +36 -0
  65. package/src/utils/pathUtils.d.ts +7 -0
  66. package/src/utils/pathUtils.js +145 -0
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.UserManager = void 0;
37
+ exports.getUserManager = getUserManager;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const DEFAULT_USERS = [
41
+ {
42
+ username: 'admin',
43
+ password: 'admin123',
44
+ homeDir: path.join(__dirname, '../files/admin'),
45
+ permissions: {
46
+ read: true,
47
+ write: true,
48
+ list: true,
49
+ create: true,
50
+ append: true,
51
+ delete: true,
52
+ chmod: true,
53
+ mkd: true,
54
+ rmdir: true,
55
+ rename: true,
56
+ deletemyfiles: true,
57
+ },
58
+ isActive: true,
59
+ },
60
+ {
61
+ username: 'guest',
62
+ password: 'guest123',
63
+ homeDir: path.join(__dirname, '../files/guest'),
64
+ permissions: {
65
+ read: true,
66
+ write: false,
67
+ list: true,
68
+ create: false,
69
+ append: false,
70
+ delete: false,
71
+ chmod: false,
72
+ mkd: false,
73
+ rmdir: false,
74
+ rename: false,
75
+ deletemyfiles: false,
76
+ },
77
+ isActive: true,
78
+ },
79
+ ];
80
+ class UserManager {
81
+ constructor(userFile) {
82
+ this.users = [];
83
+ this.userFile = userFile;
84
+ this.load();
85
+ }
86
+ load() {
87
+ try {
88
+ if (fs.existsSync(this.userFile)) {
89
+ const content = fs.readFileSync(this.userFile, 'utf-8');
90
+ this.data = JSON.parse(content);
91
+ this.users = this.data.users || [];
92
+ console.log(`[UserManager] ${this.users.length} kullanıcı yüklendi`);
93
+ }
94
+ else {
95
+ this.data = {
96
+ users: DEFAULT_USERS,
97
+ lastUpdated: new Date().toISOString(),
98
+ };
99
+ this.save();
100
+ console.log(`[UserManager] Varsayılan ${this.users.length} kullanıcı oluşturuldu`);
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error('[UserManager] Yükleme hatası:', error);
105
+ this.users = DEFAULT_USERS;
106
+ this.data = {
107
+ users: DEFAULT_USERS,
108
+ lastUpdated: new Date().toISOString(),
109
+ };
110
+ }
111
+ }
112
+ save() {
113
+ try {
114
+ this.data.lastUpdated = new Date().toISOString();
115
+ fs.writeFileSync(this.userFile, JSON.stringify(this.data, null, 2));
116
+ console.log(`[UserManager] Veriler kaydedildi: ${this.userFile}`);
117
+ }
118
+ catch (error) {
119
+ console.error('[UserManager] Kaydetme hatası:', error);
120
+ }
121
+ }
122
+ findUser(username) {
123
+ if (!username || username.trim() === '') {
124
+ console.error('[UserManager] Boş kullanıcı adı');
125
+ return null;
126
+ }
127
+ const user = this.users.find((u) => u.username.toLowerCase() === username.toLowerCase() && u.isActive);
128
+ if (!user) {
129
+ console.error('[UserManager] Kullanıcı bulunamadı: ' + username);
130
+ }
131
+ if (!user) {
132
+ console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
133
+ }
134
+ return user;
135
+ }
136
+ addUser(username, password, homeDir, permissions) {
137
+ if (!username || !password) {
138
+ console.error('[UserManager] Boş kullanıcı adı veya şifre');
139
+ return false;
140
+ }
141
+ const existing = this.findUser(username);
142
+ if (existing) {
143
+ console.log(`[UserManager] Kullanıcı zaten var: ${username}`);
144
+ return false;
145
+ }
146
+ const newUser = {
147
+ username,
148
+ password,
149
+ homeDir: path.resolve(homeDir),
150
+ permissions: { ...permissions },
151
+ isActive: true,
152
+ };
153
+ this.users.push(newUser);
154
+ this.save();
155
+ console.log(`[UserManager] Kullanıcı eklendi: ${username}`);
156
+ return true;
157
+ }
158
+ deleteUser(username) {
159
+ const user = this.findUser(username);
160
+ if (!user) {
161
+ console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
162
+ return false;
163
+ }
164
+ this.users = this.users.filter((u) => u.username !== username);
165
+ this.save();
166
+ console.log(`[UserManager] Kullanıcı silindi: ${username}`);
167
+ return true;
168
+ }
169
+ toggleUserStatus(username, isActive) {
170
+ const user = this.findUser(username);
171
+ if (!user) {
172
+ console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
173
+ return false;
174
+ }
175
+ user.isActive = isActive;
176
+ this.save();
177
+ console.log(`[UserManager] Kullanıcı durumu değiştirildi: ${username} (${isActive ? 'aktif' : 'pasif'})`);
178
+ return true;
179
+ }
180
+ updatePermissions(username, permissions) {
181
+ const user = this.findUser(username);
182
+ if (!user) {
183
+ console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
184
+ return false;
185
+ }
186
+ const currentPermissions = user.permissions || {};
187
+ const newPermissions = {
188
+ ...currentPermissions,
189
+ ...permissions,
190
+ };
191
+ user.permissions = newPermissions;
192
+ this.save();
193
+ console.log(`[UserManager] İzinler güncellendi: ${username}`);
194
+ return true;
195
+ }
196
+ checkPermission(username, permission) {
197
+ const user = this.findUser(username);
198
+ if (!user) {
199
+ console.log(`[UserManager] İzin kontrolü başarısız - kullanıcı bulunamadı: ${username}`);
200
+ return false;
201
+ }
202
+ const hasPermission = user.permissions?.[permission] === true;
203
+ if (!hasPermission) {
204
+ console.log(`[UserManager] İzin reddedildi: ${username} - ${permission}`);
205
+ }
206
+ else {
207
+ console.log(`[UserManager] İzin onaylandı: ${username} - ${permission}`);
208
+ }
209
+ return hasPermission;
210
+ }
211
+ listUsers() {
212
+ return this.users.filter((u) => u.isActive);
213
+ }
214
+ getUserStats() {
215
+ const stats = new Map();
216
+ this.users.forEach((user) => {
217
+ stats.set(user.username, Object.keys(user.permissions || {}).length);
218
+ });
219
+ return stats;
220
+ }
221
+ getUserCount() {
222
+ return this.users.filter((u) => u.isActive).length;
223
+ }
224
+ changeUsername(oldUsername, newUsername) {
225
+ const user = this.findUser(oldUsername);
226
+ if (!user) {
227
+ console.log(`[UserManager] Kullanıcı bulunamadı: ${oldUsername}`);
228
+ return false;
229
+ }
230
+ const existing = this.findUser(newUsername);
231
+ if (existing) {
232
+ console.log(`[UserManager] Kullanıcı adı zaten var: ${newUsername}`);
233
+ return false;
234
+ }
235
+ user.username = newUsername;
236
+ this.save();
237
+ console.log(`[UserManager] Kullanıcı adı değiştirildi: ${oldUsername} -> ${newUsername}`);
238
+ return true;
239
+ }
240
+ changePassword(username, newPassword) {
241
+ const user = this.findUser(username);
242
+ if (!user) {
243
+ console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
244
+ return false;
245
+ }
246
+ user.password = newPassword;
247
+ this.save();
248
+ console.log(`[UserManager] Şifre değiştirildi: ${username}`);
249
+ return true;
250
+ }
251
+ changeHomeDir(username, newHomeDir) {
252
+ const user = this.findUser(username);
253
+ if (!user) {
254
+ console.log(`[UserManager] Kullanıcı bulunamadı: ${username}`);
255
+ return false;
256
+ }
257
+ user.homeDir = path.resolve(newHomeDir);
258
+ this.save();
259
+ console.log(`[UserManager] Dizin değiştirildi: ${username} -> ${user.homeDir}`);
260
+ return true;
261
+ }
262
+ static getInstance(userFile) {
263
+ if (!UserManager._instance) {
264
+ UserManager._instance = new UserManager(userFile);
265
+ }
266
+ return UserManager._instance;
267
+ }
268
+ }
269
+ exports.UserManager = UserManager;
270
+ UserManager._instance = null;
271
+ let userManagerInstance = null;
272
+ let userManagerInitPromise = null;
273
+ async function getUserManager(userFile) {
274
+ if (!userManagerInitPromise) {
275
+ userManagerInitPromise = (async () => {
276
+ if (!userManagerInstance) {
277
+ if (!userFile) {
278
+ userFile = path.join(__dirname, '../users.json');
279
+ }
280
+ userManagerInstance = new UserManager(userFile);
281
+ }
282
+ return userManagerInstance;
283
+ })();
284
+ }
285
+ return userManagerInitPromise;
286
+ }
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlck1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlck1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksRUFBRSwrQkFBVztBQUN6QixNQUFZLElBQUksaUNBQWE7QUFNN0IsTUFBTSxhQUFhLEdBQVc7SUFDNUI7UUFDRSxRQUFRLEVBQUUsT0FBTztRQUNqQixRQUFRLEVBQUUsVUFBVTtRQUNwQixPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7UUFDL0MsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxJQUFJO1lBQ1osS0FBSyxFQUFFLElBQUk7WUFDWCxHQUFHLEVBQUUsSUFBSTtZQUNULEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsSUFBSTtTQUNwQjtRQUNELFFBQVEsRUFBRSxJQUFJO0tBQ2Y7SUFDRDtRQUNFLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztRQUMvQyxXQUFXLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLElBQUk7WUFDVixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTSxFQUFFLEtBQUs7WUFDYixLQUFLLEVBQUUsS0FBSztZQUNaLEdBQUcsRUFBRSxLQUFLO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixNQUFNLEVBQUUs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Q0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQy9CLENBQUM7Q0FHRjs7QUFEZ0IscUJBQVMsR0FBdUIsSUFBSSxBQUEzQixDQUE0QjtBQUl0RCxJQUFJLG1CQUFtQixHQUF1QixJQUFJLENBQUM7QUFDbkQsSUFBSSxzQkFBc0IsR0FBZ0MsSUFBSSxDQUFDO0FBRXhELEtBQUsseUJBQXlCLFFBQWlCO0lBQ3BELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzVCLHNCQUFzQixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ25ELENBQUM7Z0JBQ0QsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUNELE9BQU8sbUJBQW1CLENBQUM7UUFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFDRCxPQUFPLHNCQUFzQixDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IFVzZXIsIFVzZXJQZXJtaXNzaW9ucywgVXNlck1hbmFnZXJEYXRhLCBQZXJtaXNzaW9uIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBrdWxsYW7EsWPEsWxhclxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9VU0VSUzogVXNlcltdID0gW1xyXG4gIHtcclxuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxyXG4gICAgcGFzc3dvcmQ6ICdhZG1pbjEyMycsXHJcbiAgICBob21lRGlyOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZmlsZXMvYWRtaW4nKSxcclxuICAgIHBlcm1pc3Npb25zOiB7XHJcbiAgICAgIHJlYWQ6IHRydWUsXHJcbiAgICAgIHdyaXRlOiB0cnVlLFxyXG4gICAgICBsaXN0OiB0cnVlLFxyXG4gICAgICBjcmVhdGU6IHRydWUsXHJcbiAgICAgIGFwcGVuZDogdHJ1ZSxcclxuICAgICAgZGVsZXRlOiB0cnVlLFxyXG4gICAgICBjaG1vZDogdHJ1ZSxcclxuICAgICAgbWtkOiB0cnVlLFxyXG4gICAgICBybWRpcjogdHJ1ZSxcclxuICAgICAgcmVuYW1lOiB0cnVlLFxyXG4gICAgICBkZWxldGVteWZpbGVzOiB0cnVlLFxyXG4gICAgfSxcclxuICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgdXNlcm5hbWU6ICdndWVzdCcsXHJcbiAgICBwYXNzd29yZDogJ2d1ZXN0MTIzJyxcclxuICAgIGhvbWVEaXI6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9maWxlcy9ndWVzdCcpLFxyXG4gICAgcGVybWlzc2lvbnM6IHtcclxuICAgICAgcmVhZDogdHJ1ZSxcclxuICAgICAgd3JpdGU6IGZhbHNlLFxyXG4gICAgICBsaXN0OiB0cnVlLFxyXG4gICAgICBjcmVhdGU6IGZhbHNlLFxyXG4gICAgICBhcHBlbmQ6IGZhbHNlLFxyXG4gICAgICBkZWxldGU6IGZhbHNlLFxyXG4gICAgICBjaG1vZDogZmFsc2UsXHJcbiAgICAgIG1rZDogZmFsc2UsXHJcbiAgICAgIHJtZGlyOiBmYWxzZSxcclxuICAgICAgcmVuYW1lOiBmYWxzZSxcclxuICAgICAgZGVsZXRlbXlmaWxlczogZmFsc2UsXHJcbiAgICB9LFxyXG4gICAgaXNBY3RpdmU6IHRydWUsXHJcbiAgfSxcclxuXTtcclxuXHJcbi8qKlxyXG4gKiBVc2VyTWFuYWdlciBjbGFzcyAtIEt1bGxhbsSxY8SxIHnDtm5ldGltaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VyIHtcclxuICBwcml2YXRlIHVzZXJGaWxlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB1c2VyczogVXNlcltdID0gW107XHJcbiAgcHJpdmF0ZSBkYXRhOiBVc2VyTWFuYWdlckRhdGE7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHVzZXJGaWxlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudXNlckZpbGUgPSB1c2VyRmlsZTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgdmVyaWxlcmluaSB5w7xrbGVcclxuICAgKi9cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLnVzZXJGaWxlKSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGhpcy51c2VyRmlsZSwgJ3V0Zi04Jyk7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5wYXJzZShjb250ZW50KTtcclxuICAgICAgICB0aGlzLnVzZXJzID0gdGhpcy5kYXRhLnVzZXJzIHx8IFtdO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdICR7dGhpcy51c2Vycy5sZW5ndGh9IGt1bGxhbsSxY8SxIHnDvGtsZW5kaWApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFZhcnNhecSxbGFuIGt1bGxhbsSxY8SxbGFyxLEgb2x1xZ90dXJcclxuICAgICAgICB0aGlzLmRhdGEgPSB7XHJcbiAgICAgICAgICB1c2VyczogREVGQVVMVF9VU0VSUyxcclxuICAgICAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBWYXJzYXnEsWxhbiAke3RoaXMudXNlcnMubGVuZ3RofSBrdWxsYW7EsWPEsSBvbHXFn3R1cnVsZHVgKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1VzZXJNYW5hZ2VyXSBZw7xrbGVtZSBoYXRhc8SxOicsIGVycm9yKTtcclxuICAgICAgdGhpcy51c2VycyA9IERFRkFVTFRfVVNFUlM7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHtcclxuICAgICAgICB1c2VyczogREVGQVVMVF9VU0VSUyxcclxuICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgdmVyaWxlcmluaSBrYXlkZXRcclxuICAgKi9cclxuICBwcml2YXRlIHNhdmUoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmRhdGEubGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy51c2VyRmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAyKSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIFZlcmlsZXIga2F5ZGVkaWxkaTogJHt0aGlzLnVzZXJGaWxlfWApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1VzZXJNYW5hZ2VyXSBLYXlkZXRtZSBoYXRhc8SxOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGJ1bFxyXG4gICAqL1xyXG4gIHB1YmxpYyBmaW5kVXNlcih1c2VybmFtZTogc3RyaW5nKTogVXNlciB8IG51bGwge1xyXG4gICAgaWYgKCF1c2VybmFtZSB8fCB1c2VybmFtZS50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tVc2VyTWFuYWdlcl0gQm/FnyBrdWxsYW7EsWPEsSBhZMSxJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXJzLmZpbmQoXHJcbiAgICAgICh1KSA9PiB1LnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgJiYgdS5pc0FjdGl2ZVxyXG4gICAgKSBhcyBVc2VyIHwgbnVsbDtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxOiAnICsgdXNlcm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdXNlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGVrbGVcclxuICAgKi9cclxuICBwdWJsaWMgYWRkVXNlcih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBob21lRGlyOiBzdHJpbmcsIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnMpOiBib29sZWFuIHtcclxuICAgIGlmICghdXNlcm5hbWUgfHwgIXBhc3N3b3JkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tVc2VyTWFuYWdlcl0gQm/FnyBrdWxsYW7EsWPEsSBhZMSxIHZleWEgxZ9pZnJlJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBLdWxsYW7EsWPEsSBhZMSxIHphdGVuIHZhcnNhIGtvbnRyb2wgZXRcclxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XHJcbiAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gS3VsbGFuxLFjxLEgemF0ZW4gdmFyOiAke3VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3VXNlcjogVXNlciA9IHtcclxuICAgICAgdXNlcm5hbWUsXHJcbiAgICAgIHBhc3N3b3JkLFxyXG4gICAgICBob21lRGlyOiBwYXRoLnJlc29sdmUoaG9tZURpciksXHJcbiAgICAgIHBlcm1pc3Npb25zOiB7IC4uLnBlcm1pc3Npb25zIH0sXHJcbiAgICAgIGlzQWN0aXZlOiB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnVzZXJzLnB1c2gobmV3VXNlcik7XHJcbiAgICB0aGlzLnNhdmUoKTtcclxuICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGVrbGVuZGk6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIHNpbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZWxldGVVc2VyKHVzZXJuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlcnMgPSB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS51c2VybmFtZSAhPT0gdXNlcm5hbWUpO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBzaWxpbmRpOiAke3VzZXJuYW1lfWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSBha3RpZi9wYXNpZiB5YXBcclxuICAgKi9cclxuICBwdWJsaWMgdG9nZ2xlVXNlclN0YXR1cyh1c2VybmFtZTogc3RyaW5nLCBpc0FjdGl2ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxOiAke3VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXNlci5pc0FjdGl2ZSA9IGlzQWN0aXZlO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBkdXJ1bXUgZGXEn2nFn3RpcmlsZGk6ICR7dXNlcm5hbWV9ICgke2lzQWN0aXZlID8gJ2FrdGlmJyA6ICdwYXNpZid9KWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSBpemlubGVyaW5pIGfDvG5jZWxsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGVQZXJtaXNzaW9ucyh1c2VybmFtZTogc3RyaW5nLCBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB1c2VyID0gdGhpcy5maW5kVXNlcih1c2VybmFtZSk7XHJcbiAgICBpZiAoIXVzZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gS3VsbGFuxLFjxLEgYnVsdW5hbWFkxLE6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNZXZjdXQgaXppbmxlcmkga29weWFsYVxyXG4gICAgY29uc3QgY3VycmVudFBlcm1pc3Npb25zID0gdXNlci5wZXJtaXNzaW9ucyB8fCB7fTtcclxuICAgIFxyXG4gICAgLy8gWWVuaSBpemlubGVyaSBiaXJsZcWfdGlyICh5ZW5pIGl6aW4gdmFyc2EgZ8O8bmNlbGxlLCB5b2tzYSBtZXZjdXQga29ydSlcclxuICAgIGNvbnN0IG5ld1Blcm1pc3Npb25zID0ge1xyXG4gICAgICAuLi5jdXJyZW50UGVybWlzc2lvbnMsXHJcbiAgICAgIC4uLnBlcm1pc3Npb25zLFxyXG4gICAgfSBhcyBVc2VyUGVybWlzc2lvbnM7XHJcblxyXG4gICAgdXNlci5wZXJtaXNzaW9ucyA9IG5ld1Blcm1pc3Npb25zO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSDEsHppbmxlciBnw7xuY2VsbGVuZGk6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGl6aW5sZXJpbmkga29udHJvbCBldFxyXG4gICAqL1xyXG4gIHB1YmxpYyBjaGVja1Blcm1pc3Npb24odXNlcm5hbWU6IHN0cmluZywgcGVybWlzc2lvbjogUGVybWlzc2lvbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIMSwemluIGtvbnRyb2zDvCBiYcWfYXLEsXPEsXogLSBrdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSB1c2VyLnBlcm1pc3Npb25zPy5bcGVybWlzc2lvbl0gPT09IHRydWU7XHJcbiAgICBcclxuICAgIGlmICghaGFzUGVybWlzc2lvbikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSDEsHppbiByZWRkZWRpbGRpOiAke3VzZXJuYW1lfSAtICR7cGVybWlzc2lvbn1gKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIMSwemluIG9uYXlsYW5kxLE6ICR7dXNlcm5hbWV9IC0gJHtwZXJtaXNzaW9ufWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoYXNQZXJtaXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVMO8bSBrdWxsYW7EsWPEsWxhcsSxIGxpc3RlbGVcclxuICAgKi9cclxuICBwdWJsaWMgbGlzdFVzZXJzKCk6IFVzZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2Vycy5maWx0ZXIoKHUpID0+IHUuaXNBY3RpdmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgaXN0YXRpc3Rpa2xlcmlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VXNlclN0YXRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xyXG4gICAgY29uc3Qgc3RhdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgdGhpcy51c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XHJcbiAgICAgIHN0YXRzLnNldCh1c2VyLnVzZXJuYW1lLCBPYmplY3Qua2V5cyh1c2VyLnBlcm1pc3Npb25zIHx8IHt9KS5sZW5ndGgpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc3RhdHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSBzYXnEsXPEsW7EsSBhbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRVc2VyQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJzLmZpbHRlcigodSkgPT4gdS5pc0FjdGl2ZSkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogS3VsbGFuxLFjxLEgYWTEsW7EsSBkZcSfacWfdGlyXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZVVzZXJuYW1lKG9sZFVzZXJuYW1lOiBzdHJpbmcsIG5ld1VzZXJuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKG9sZFVzZXJuYW1lKTtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHtvbGRVc2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFllbmkga3VsbGFuxLFjxLEgYWTEsSB6YXRlbiB2YXJzYSBrb250cm9sIGV0XHJcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZmluZFVzZXIobmV3VXNlcm5hbWUpO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGFkxLEgemF0ZW4gdmFyOiAke25ld1VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXNlci51c2VybmFtZSA9IG5ld1VzZXJuYW1lO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBhZMSxIGRlxJ9pxZ90aXJpbGRpOiAke29sZFVzZXJuYW1lfSAtPiAke25ld1VzZXJuYW1lfWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBLdWxsYW7EsWPEsSDFn2lmcmVzaW5pIGRlxJ9pxZ90aXJcclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFzc3dvcmQodXNlcm5hbWU6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuZmluZFVzZXIodXNlcm5hbWUpO1xyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbVXNlck1hbmFnZXJdIEt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxOiAke3VzZXJuYW1lfWApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXNlci5wYXNzd29yZCA9IG5ld1Bhc3N3b3JkO1xyXG4gICAgdGhpcy5zYXZlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSDFnmlmcmUgZGXEn2nFn3RpcmlsZGk6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEt1bGxhbsSxY8SxIGRpemluaW5pIGRlxJ9pxZ90aXJcclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlSG9tZURpcih1c2VybmFtZTogc3RyaW5nLCBuZXdIb21lRGlyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmZpbmRVc2VyKHVzZXJuYW1lKTtcclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhgW1VzZXJNYW5hZ2VyXSBLdWxsYW7EsWPEsSBidWx1bmFtYWTEsTogJHt1c2VybmFtZX1gKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHVzZXIuaG9tZURpciA9IHBhdGgucmVzb2x2ZShuZXdIb21lRGlyKTtcclxuICAgIHRoaXMuc2F2ZSgpO1xyXG4gICAgY29uc29sZS5sb2coYFtVc2VyTWFuYWdlcl0gRGl6aW4gZGXEn2nFn3RpcmlsZGk6ICR7dXNlcm5hbWV9IC0+ICR7dXNlci5ob21lRGlyfWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VyTWFuYWdlciDDtnJuZcSfaSBvbHXFn3R1ciAoc2luZ2xldG9uKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UodXNlckZpbGU6IHN0cmluZyk6IFVzZXJNYW5hZ2VyIHtcclxuICAgIGlmICghVXNlck1hbmFnZXIuX2luc3RhbmNlKSB7XHJcbiAgICAgIFVzZXJNYW5hZ2VyLl9pbnN0YW5jZSA9IG5ldyBVc2VyTWFuYWdlcih1c2VyRmlsZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gVXNlck1hbmFnZXIuX2luc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBVc2VyTWFuYWdlciB8IG51bGwgPSBudWxsO1xyXG59XHJcblxyXG4vLyBTaW5nbGV0b24gaW5zdGFuY2Ugb2x1xZ90dXJtYSAtIGTDtm5nw7wgYmHEn8SxbWzEsWzEscSfxLFuZGFuIGthw6fEsW5tYWsgacOnaW5cclxubGV0IHVzZXJNYW5hZ2VySW5zdGFuY2U6IFVzZXJNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcbmxldCB1c2VyTWFuYWdlckluaXRQcm9taXNlOiBQcm9taXNlPFVzZXJNYW5hZ2VyPiB8IG51bGwgPSBudWxsO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFVzZXJNYW5hZ2VyKHVzZXJGaWxlPzogc3RyaW5nKTogUHJvbWlzZTxVc2VyTWFuYWdlcj4ge1xyXG4gIGlmICghdXNlck1hbmFnZXJJbml0UHJvbWlzZSkge1xyXG4gICAgdXNlck1hbmFnZXJJbml0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICghdXNlck1hbmFnZXJJbnN0YW5jZSkge1xyXG4gICAgICAgIGlmICghdXNlckZpbGUpIHtcclxuICAgICAgICAgIHVzZXJGaWxlID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3VzZXJzLmpzb24nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdXNlck1hbmFnZXJJbnN0YW5jZSA9IG5ldyBVc2VyTWFuYWdlcih1c2VyRmlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHVzZXJNYW5hZ2VySW5zdGFuY2U7XHJcbiAgICB9KSgpO1xyXG4gIH1cclxuICByZXR1cm4gdXNlck1hbmFnZXJJbml0UHJvbWlzZTtcclxufVxyXG4iXX0=
@@ -0,0 +1,14 @@
1
+ export declare enum LogLevel {
2
+ DEBUG = "debug",
3
+ INFO = "info",
4
+ WARN = "warn",
5
+ ERROR = "error"
6
+ }
7
+ export declare class Logger {
8
+ private static level;
9
+ static setLevel(level: LogLevel): void;
10
+ static debug(message: string, ...args: unknown[]): void;
11
+ static info(message: string, ...args: unknown[]): void;
12
+ static warn(message: string, ...args: unknown[]): void;
13
+ static error(message: string, ...args: unknown[]): void;
14
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Logger = exports.LogLevel = void 0;
4
+ var LogLevel;
5
+ (function (LogLevel) {
6
+ LogLevel["DEBUG"] = "debug";
7
+ LogLevel["INFO"] = "info";
8
+ LogLevel["WARN"] = "warn";
9
+ LogLevel["ERROR"] = "error";
10
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
11
+ class Logger {
12
+ static setLevel(level) {
13
+ this.level = level;
14
+ }
15
+ static debug(message, ...args) {
16
+ if (this.level === LogLevel.DEBUG) {
17
+ console.log(`[DEBUG] ${message}`, ...args);
18
+ }
19
+ }
20
+ static info(message, ...args) {
21
+ if (this.level === LogLevel.DEBUG || this.level === LogLevel.INFO) {
22
+ console.log(`[INFO] ${message}`, ...args);
23
+ }
24
+ }
25
+ static warn(message, ...args) {
26
+ if (this.level === LogLevel.DEBUG || this.level === LogLevel.INFO || this.level === LogLevel.WARN) {
27
+ console.warn(`[WARN] ${message}`, ...args);
28
+ }
29
+ }
30
+ static error(message, ...args) {
31
+ console.error(`[ERROR] ${message}`, ...args);
32
+ }
33
+ }
34
+ exports.Logger = Logger;
35
+ Logger.level = LogLevel.INFO;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxJQUFZLFFBS1g7QUFMRCxXQUFZLFFBQVE7SUFDbEIsMkJBQWUsQ0FBQTtJQUNmLHlCQUFhLENBQUE7SUFDYix5QkFBYSxDQUFBO0lBQ2IsMkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTFcsUUFBUSxhQUFSLFFBQVEsR0FBUixRQUFRLFFBS25CO0FBS0Q7SUFHUyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWU7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBZSxFQUFFLEdBQUcsSUFBZTtRQUNyRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFlLEVBQUUsR0FBRyxJQUFlO1FBQ3BELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFlLEVBQUUsR0FBRyxJQUFlO1FBQ3BELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBZSxFQUFFLEdBQUcsSUFBZTtRQUNyRCxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0Y7O0FBM0JnQixZQUFLLEdBQWEsUUFBUSxDQUFDLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTG9nIHNldml5ZWxlcmlcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICBERUJVRyA9ICdkZWJ1ZycsXG4gIElORk8gPSAnaW5mbycsXG4gIFdBUk4gPSAnd2FybicsXG4gIEVSUk9SID0gJ2Vycm9yJyxcbn1cblxuLyoqXG4gKiBMb2dnZXIgdXRpbGl0eVxuICovXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuSU5GTztcblxuICBwdWJsaWMgc3RhdGljIHNldExldmVsKGxldmVsOiBMb2dMZXZlbCk6IHZvaWQge1xuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbREVCVUddICR7bWVzc2FnZX1gLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGluZm8obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuREVCVUcgfHwgdGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuSU5GTykge1xuICAgICAgY29uc29sZS5sb2coYFtJTkZPXSAke21lc3NhZ2V9YCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGV2ZWwgPT09IExvZ0xldmVsLkRFQlVHIHx8IHRoaXMubGV2ZWwgPT09IExvZ0xldmVsLklORk8gfHwgdGhpcy5sZXZlbCA9PT0gTG9nTGV2ZWwuV0FSTikge1xuICAgICAgY29uc29sZS53YXJuKGBbV0FSTl0gJHttZXNzYWdlfWAsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGBbRVJST1JdICR7bWVzc2FnZX1gLCAuLi5hcmdzKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ export declare function normalizeDirPath(dirPath: string): string;
2
+ export declare function robustPathNormalize(dirPath: string): string;
3
+ export declare function isPathWithinHome(targetPath: string, homeDir: string): boolean;
4
+ export declare function ensureDirectoryExists(dirPath: string): Promise<void>;
5
+ export declare function getFullPath(baseDir: string, filePath: string): string;
6
+ export declare function resolveFtpPath(targetPath: string, currentDir: string, homeDir: string): string;
7
+ export declare function toVirtualPath(fsPath: string, homeDir: string): string;
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.normalizeDirPath = normalizeDirPath;
37
+ exports.robustPathNormalize = robustPathNormalize;
38
+ exports.isPathWithinHome = isPathWithinHome;
39
+ exports.ensureDirectoryExists = ensureDirectoryExists;
40
+ exports.getFullPath = getFullPath;
41
+ exports.resolveFtpPath = resolveFtpPath;
42
+ exports.toVirtualPath = toVirtualPath;
43
+ const path = __importStar(require("path"));
44
+ const fs = __importStar(require("fs"));
45
+ function normalizeDirPath(dirPath) {
46
+ if (!dirPath || typeof dirPath !== 'string') {
47
+ return '';
48
+ }
49
+ let normalized = dirPath.replace(/\\/g, '/');
50
+ if (/^[a-zA-Z]:\//.test(normalized) || /^([a-zA-Z]:\.)|([a-zA-Z]:\/)/.test(normalized)) {
51
+ return normalized;
52
+ }
53
+ if (normalized.startsWith('./')) {
54
+ normalized = normalized.slice(2);
55
+ }
56
+ if (!normalized.startsWith('/') && !/^[a-zA-Z]:\//.test(normalized)) {
57
+ normalized = '/' + normalized;
58
+ }
59
+ return normalized;
60
+ }
61
+ function robustPathNormalize(dirPath) {
62
+ if (!dirPath || typeof dirPath !== 'string') {
63
+ return '';
64
+ }
65
+ let normalized = dirPath.replace(/\\/g, '/');
66
+ normalized = normalized.replace(/\/+/g, '/');
67
+ normalized = normalized.replace(/\/\.\//g, '/').replace(/\.\//g, '');
68
+ if (normalized === 'files/admin' || normalized === 'files/guest') {
69
+ normalized = '/files/admin';
70
+ }
71
+ else if (normalized === 'files' || normalized === 'admin' || normalized === 'guest') {
72
+ normalized = '/files';
73
+ }
74
+ else if (normalized === '') {
75
+ normalized = '/';
76
+ }
77
+ if (normalized.startsWith('/')) {
78
+ return normalized;
79
+ }
80
+ if (/^[a-zA-Z]:\/\//.test(normalized) || /^[a-zA-Z]:\/\./.test(normalized)) {
81
+ return normalized;
82
+ }
83
+ if (!normalized.startsWith('.') && !normalized.startsWith('/')) {
84
+ normalized = './' + normalized;
85
+ }
86
+ return normalized;
87
+ }
88
+ function isPathWithinHome(targetPath, homeDir) {
89
+ const targetNormalized = targetPath.replace(/\\/g, '/');
90
+ const homeNormalized = (homeDir || '.').replace(/\\/g, '/');
91
+ const targetClean = targetNormalized.replace(/\/+$/, '');
92
+ const homeClean = homeNormalized.replace(/\/+$/, '');
93
+ if (targetClean === homeClean) {
94
+ return true;
95
+ }
96
+ if (homeClean !== '' && targetClean.startsWith(homeClean + '/')) {
97
+ return true;
98
+ }
99
+ return false;
100
+ }
101
+ async function ensureDirectoryExists(dirPath) {
102
+ try {
103
+ await fs.promises.mkdir(dirPath, { recursive: true });
104
+ }
105
+ catch (error) {
106
+ if (error.code !== 'EEXIST') {
107
+ throw error;
108
+ }
109
+ }
110
+ }
111
+ function getFullPath(baseDir, filePath) {
112
+ if (!baseDir || !filePath) {
113
+ return '';
114
+ }
115
+ return path.resolve(baseDir, filePath);
116
+ }
117
+ function resolveFtpPath(targetPath, currentDir, homeDir) {
118
+ const home = path.resolve(homeDir || '.');
119
+ const current = path.resolve(currentDir || home);
120
+ const raw = (targetPath || '').trim().replace(/\\/g, '/').replace(/\/{2,}/g, '/');
121
+ if (!raw || raw === '.') {
122
+ return current;
123
+ }
124
+ if (/^[a-zA-Z]:\//.test(raw)) {
125
+ return path.resolve(raw);
126
+ }
127
+ if (raw.startsWith('/')) {
128
+ const asFileSystemPath = path.resolve(raw);
129
+ if (isPathWithinHome(asFileSystemPath, home)) {
130
+ return asFileSystemPath;
131
+ }
132
+ return path.resolve(home, raw.replace(/^\/+/, ''));
133
+ }
134
+ return path.resolve(current, raw);
135
+ }
136
+ function toVirtualPath(fsPath, homeDir) {
137
+ const home = path.resolve(homeDir || '.');
138
+ const target = path.resolve(fsPath || home);
139
+ const relative = path.relative(home, target);
140
+ if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {
141
+ return '/';
142
+ }
143
+ return '/' + relative.replace(/\\/g, '/');
144
+ }
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGhVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxNQUFZLElBQUksaUNBQWE7QUFDN0IsTUFBWSxFQUFFLCtCQUFXO0FBTXpCLDBCQUFpQyxPQUFlO0lBQzlDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBR0QsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFHN0MsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLDhCQUE4QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBRXZGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFHRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBR0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDcEUsVUFBVSxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUM7SUFDaEMsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFNRCw2QkFBb0MsT0FBZTtJQUNqRCxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUdELElBQUksVUFBVSxHQUFH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LE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcclxuXHJcbi8qKlxyXG4gKiBEaXppbiB5b2x1bnUgbm9ybWFsaXplIGV0XHJcbiAqIFdpbmRvd3MgYWJzb2x1dGUgcGF0aCdsZXJpIG11dGxhayBvbGFyYWsga2Fsc8SxbiwgLi8gcHJlZml4J2kga2FsZMSxciwgcm9vdCd0YW4gYmHFn2xhdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURpclBhdGgoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBpZiAoIWRpclBhdGggfHwgdHlwZW9mIGRpclBhdGggIT09ICdzdHJpbmcnKSB7XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvLyAxLiBXaW5kb3dzIGFic29sdXRlIHBhdGgnbGVyaSBub3JtYWxpemUgZXQgKEM6XFwuLi4gLT4gQzovLi4uKVxyXG4gIGxldCBub3JtYWxpemVkID0gZGlyUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcblxyXG4gIC8vIDIuIFdpbmRvd3MgZHJpdmUgbGV0dGVyIHBhdGgga29udHJvbMO8IChDOi8uLi4gdmV5YSBDOi4uLilcclxuICBpZiAoL15bYS16QS1aXTpcXC8vLnRlc3Qobm9ybWFsaXplZCkgfHwgL14oW2EtekEtWl06XFwuKXwoW2EtekEtWl06XFwvKS8udGVzdChub3JtYWxpemVkKSkge1xyXG4gICAgLy8gV2luZG93cyBhYnNvbHV0ZSBwYXRoLCBtdXRsYWsgb2xhcmFrIGthbHPEsW46IEM6L1VzZXJzLy4uLi9maWxlcy9hZG1pblxyXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XHJcbiAgfVxyXG5cclxuICAvLyAzLiAuLyBwcmVmaXgnaSBrYWxkxLFyXHJcbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLi8nKSkge1xyXG4gICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc2xpY2UoMik7XHJcbiAgfVxyXG5cclxuICAvLyA0LiBFxJ9lciBhYnNvbHV0ZSBkZcSfaWxzZSwgcm9vdCdkYW4gYmHFn2xhdFxyXG4gIGlmICghbm9ybWFsaXplZC5zdGFydHNXaXRoKCcvJykgJiYgIS9eW2EtekEtWl06XFwvLy50ZXN0KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICBub3JtYWxpemVkID0gJy8nICsgbm9ybWFsaXplZDtcclxuICB9XHJcbiAgXHJcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMaW51eCB2ZSBXaW5kb3dzIHBhdGgnbGVyaW5pIGfDvMOnbMO8IMWfZWtpbGRlIG5vcm1hbGl6ZSBldFxyXG4gKiBCYWNrc2xhc2ggLT4gZm9yd2FyZCBzbGFzaCwgLi8gdmUgLi4vIMOnw7Z6LCByZWxhdGl2ZSBwYXRoIHlhcCAoUE9TSVggLyB5ZXJpbmUgV2luZG93cyB1eXVtbHUpXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcm9idXN0UGF0aE5vcm1hbGl6ZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICghZGlyUGF0aCB8fCB0eXBlb2YgZGlyUGF0aCAhPT0gJ3N0cmluZycpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8vIDEuIEJhY2tzbGFzaCdsZXJpIGZvcndhcmQgc2xhc2gnZSDDp2V2aXJcclxuICBsZXQgbm9ybWFsaXplZCA9IGRpclBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG5cclxuICAvLyAyLiAuLyB2ZSAuLi8gc2VnbWVudCdsZXJpbmkgw6fDtnpcclxuICAvLyByZXBlYXRlZCAvIC0+IHNpbmdsZSAvXHJcbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvXFwvKy9nLCAnLycpO1xyXG4gIC8vIC4vIHNlZ21lbnQnbGVyaW5pIGthbGTEsXJcclxuICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9cXC9cXC5cXC8vZywgJy8nKS5yZXBsYWNlKC9cXC5cXC8vZywgJycpO1xyXG4gIC8vIC4uLyBzZWdtZW50J2xlcmluaSBpxZ9sZSAoYmFzaXTDp2UsIHBhdGgucmVzb2x2ZSBoYWxsZWRlY2VrKVxyXG4gIC8vIE5vdGU6IC4vZmlsZXMvYWRtaW4gLT4gZmlsZXMvYWRtaW4sIHRoZW4gd2UnbGwgY29udmVydCB0byBhYnNvbHV0ZSBiZWxvd1xyXG5cclxuICAvLyAzLiAuL2ZpbGVzL2FkbWluIGdpYmkgcmVsYXRpdmUgeW9sIHZhcnNhLCBtdXRsYWsgaGFsZSDDp2V2aXJcclxuICBpZiAobm9ybWFsaXplZCA9PT0gJ2ZpbGVzL2FkbWluJyB8fCBub3JtYWxpemVkID09PSAnZmlsZXMvZ3Vlc3QnKSB7XHJcbiAgICAvLyAuL2ZpbGVzL2FkbWluIG5vcm1hbGl6ZSBlZGlsaW5jZSBmaWxlcy9hZG1pbiBvbGR1LCBidW51IG11dGxhayBoYWxlIMOnZXZpclxyXG4gICAgbm9ybWFsaXplZCA9ICcvZmlsZXMvYWRtaW4nO1xyXG4gIH0gZWxzZSBpZiAobm9ybWFsaXplZCA9PT0gJ2ZpbGVzJyB8fCBub3JtYWxpemVkID09PSAnYWRtaW4nIHx8IG5vcm1hbGl6ZWQgPT09ICdndWVzdCcpIHtcclxuICAgIC8vIGZpbGVzIG5vcm1hbGl6ZSBlZGlsaW5jZSwgL2ZpbGVzIG9sYXJhayDDp2V2aXJcclxuICAgIG5vcm1hbGl6ZWQgPSAnL2ZpbGVzJztcclxuICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWQgPT09ICcnKSB7XHJcbiAgICAvLyBlbXB0eSAtPiAvXHJcbiAgICBub3JtYWxpemVkID0gJy8nO1xyXG4gIH1cclxuXHJcbiAgLy8gNC4gUE9TSVggYWJzb2x1dGUgcGF0aCBrb250cm9sw7wgKC9maWxlcy9hZG1pbiBnaWJpKVxyXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgLy8gUE9TSVggbXV0bGFrIHlvbCBvbGFyYWsga2Fsc8SxbjogL2ZpbGVzL2FkbWluXHJcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcclxuICB9XHJcblxyXG4gIC8vIDUuIFdpbmRvd3MgYWJzb2x1dGUgcGF0aCBrb250cm9sw7wgKEM6L2ZpbGVzL2FkbWluIGdpYmkpXHJcbiAgaWYgKC9eW2EtekEtWl06XFwvXFwvLy50ZXN0KG5vcm1hbGl6ZWQpIHx8IC9eW2EtekEtWl06XFwvXFwuLy50ZXN0KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICAvLyBXaW5kb3dzIG11dGxhayB5b2wgb2xhcmFrIGthbHPEsW46IEM6L2ZpbGVzL2FkbWluXHJcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcclxuICB9XHJcblxyXG4gIC8vIDYuIFJlbGF0aXZlIHBhdGggaXNlIC4vIGlsZSBiYcWfbGF0IChXaW5kb3dzIHV5dW1sdSlcclxuICBpZiAoIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLicpICYmICFub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgbm9ybWFsaXplZCA9ICcuLycgKyBub3JtYWxpemVkO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHw5xWRU5MxLBLOiBQYXRoJ2luIGhvbWVEaXIgacOnaW5kZSBvbHVwIG9sbWFkxLHEn8SxbsSxIGtvbnRyb2wgZXRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BhdGhXaXRoaW5Ib21lKHRhcmdldFBhdGg6IHN0cmluZywgaG9tZURpcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgLy8gTm9ybWFsaXplIGJvdGggcGF0aHMgdG8gZm9yd2FyZCBzbGFzaGVzIGZvciBjcm9zcy1wbGF0Zm9ybSBjb21wYXJpc29uXHJcbiAgY29uc3QgdGFyZ2V0Tm9ybWFsaXplZCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG4gIGNvbnN0IGhvbWVOb3JtYWxpemVkID0gKGhvbWVEaXIgfHwgJy4nKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcblxyXG4gIC8vIFN0cmlwIHRyYWlsaW5nIHNsYXNoZXNcclxuICBjb25zdCB0YXJnZXRDbGVhbiA9IHRhcmdldE5vcm1hbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCAnJyk7XHJcbiAgY29uc3QgaG9tZUNsZWFuID0gaG9tZU5vcm1hbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCAnJyk7XHJcblxyXG4gIC8vIElmIHBhdGhzIGFyZSBlcXVhbCwgdGFyZ2V0IGlzIHdpdGhpbiBob21lXHJcbiAgaWYgKHRhcmdldENsZWFuID09PSBob21lQ2xlYW4pIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgdGFyZ2V0IHN0YXJ0cyB3aXRoIGhvbWUgKyAnLycgKGkuZS4sIHRhcmdldCBpcyBpbnNpZGUgaG9tZSlcclxuICBpZiAoaG9tZUNsZWFuICE9PSAnJyAmJiB0YXJnZXRDbGVhbi5zdGFydHNXaXRoKGhvbWVDbGVhbiArICcvJykpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vKipcclxuICogRGl6aW4gdmFybMSxxJ/EsW5kYW4gZW1pbiBvbFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICB0cnkge1xyXG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIC8vIFphdGVuIHZhcnNhIGhhdGEgdmVybWV6XHJcbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VFWElTVCcpIHtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGFtIHlvbCBvbHXFn3R1clxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bGxQYXRoKGJhc2VEaXI6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgaWYgKCFiYXNlRGlyIHx8ICFmaWxlUGF0aCkge1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICByZXR1cm4gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGZpbGVQYXRoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZUUCBpc3RlbWNpc2luaW4gZ8O2bmRlcmRpxJ9pIHlvbHUgZG9zeWEgc2lzdGVtaSBtdXRsYWsgeW9sdW5hIMOnZXZpci5cclxuICpcclxuICogLSBNdXRsYWsgV2luZG93cyB5b2x1IChDOi8uLi4gdmV5YSBDOlxcXFwuLi4pIGhlciB6YW1hbiBkb3N5YSBzaXN0ZW1pIHlvbHVkdXIuXHJcbiAqIC0gTXV0bGFrIFBPU0lYIHlvbHUgKC9hbHQvZGl6aW4pIMO2bmNlIGRvc3lhIHNpc3RlbWkgeW9sdSBvbGFyYWsgZGVuZW5pcjtcclxuICogICBrdWxsYW7EsWPEsW7EsW4gaG9tZURpcidpIGnDp2luZGUgZGXEn2lsc2Ugc2FuYWwga8O2ayAoaG9tZURpcikgw7x6ZXJpbmRlbiDDp8O2esO8bMO8ci5cclxuICogLSBHw7ZyZWxpIHlvbCBoZXIgemFtYW4gY3VycmVudERpciDDvHplcmluZGVuIMOnw7Z6w7xsw7xyLlxyXG4gKlxyXG4gKiBEw7ZuZW4gZGXEn2VyIG11dGxhayBkb3N5YSBzaXN0ZW1pIHlvbHVkdXI7IGhvbWVEaXIgacOnaW5kZSBvbHVwIG9sbWFkxLHEn8SxbsSxXHJcbiAqIMOnYcSfxLFyYW4ga29udHJvbCBlZGVyIChpc1BhdGhXaXRoaW5Ib21lKS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnRwUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcsIGN1cnJlbnREaXI6IHN0cmluZywgaG9tZURpcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBob21lID0gcGF0aC5yZXNvbHZlKGhvbWVEaXIgfHwgJy4nKTtcclxuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXIgfHwgaG9tZSk7XHJcblxyXG4gIC8vIEJhY2tzbGFzaCAtPiBzbGFzaCwgdGVrcmFyIGVkZW4gc2xhc2ggLT4gdGVrIHNsYXNoXHJcbiAgY29uc3QgcmF3ID0gKHRhcmdldFBhdGggfHwgJycpLnRyaW0oKS5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZSgvXFwvezIsfS9nLCAnLycpO1xyXG4gIGlmICghcmF3IHx8IHJhdyA9PT0gJy4nKSB7XHJcbiAgICByZXR1cm4gY3VycmVudDtcclxuICB9XHJcblxyXG4gIC8vIFPDvHLDvGPDvCBoYXJmaSAoQzovLi4uKSBkb3N5YSBzaXN0ZW1pIHlvbHVkdXJcclxuICBpZiAoL15bYS16QS1aXTpcXC8vLnRlc3QocmF3KSkge1xyXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShyYXcpO1xyXG4gIH1cclxuXHJcbiAgLy8gUE9TSVggbXV0bGFrIHlvbFxyXG4gIGlmIChyYXcuc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICBjb25zdCBhc0ZpbGVTeXN0ZW1QYXRoID0gcGF0aC5yZXNvbHZlKHJhdyk7XHJcbiAgICAvLyBob21lRGlyIGnDp2luZGV5c2UgZ2Vyw6dlayBkb3N5YSBzaXN0ZW1pIHlvbHUgb2xhcmFrIGt1bGxhblxyXG4gICAgaWYgKGlzUGF0aFdpdGhpbkhvbWUoYXNGaWxlU3lzdGVtUGF0aCwgaG9tZSkpIHtcclxuICAgICAgcmV0dXJuIGFzRmlsZVN5c3RlbVBhdGg7XHJcbiAgICB9XHJcbiAgICAvLyBEZcSfaWxzZSBzYW5hbCBrw7ZrID0ga3VsbGFuxLFjxLFuxLFuIGhvbWVEaXInaVxyXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShob21lLCByYXcucmVwbGFjZSgvXlxcLysvLCAnJykpO1xyXG4gIH1cclxuXHJcbiAgLy8gR8O2cmVsaSB5b2w6IGJ1bHVuZHXEn3UgZGl6aW5kZW4gw6fDtnrDvG1sZVxyXG4gIHJldHVybiBwYXRoLnJlc29sdmUoY3VycmVudCwgcmF3KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIERvc3lhIHNpc3RlbWkgeW9sdW51IGlzdGVtY2luaW4gZ8O2cmVjZcSfaSBzYW5hbCAoLyBrw7ZrbMO8KSB5b2xhIMOnZXZpci5cclxuICogaG9tZURpciBrw7ZrIGRpemluIG9sZHXEn3UgacOnaW4gZMSxxZ9hcsSxZGEga2FsYW4geW9sbGFyIFwiL1wiIGTDtm5lci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1ZpcnR1YWxQYXRoKGZzUGF0aDogc3RyaW5nLCBob21lRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGhvbWUgPSBwYXRoLnJlc29sdmUoaG9tZURpciB8fCAnLicpO1xyXG4gIGNvbnN0IHRhcmdldCA9IHBhdGgucmVzb2x2ZShmc1BhdGggfHwgaG9tZSk7XHJcbiAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKGhvbWUsIHRhcmdldCk7XHJcbiAgaWYgKCFyZWxhdGl2ZSB8fCByZWxhdGl2ZS5zdGFydHNXaXRoKCcuLicpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpIHtcclxuICAgIHJldHVybiAnLyc7XHJcbiAgfVxyXG4gIHJldHVybiAnLycgKyByZWxhdGl2ZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbn1cclxuIl19