turbogui-angular 16.0.0 → 17.0.0
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/fesm2022/turbogui-angular.mjs +102 -97
- package/fesm2022/turbogui-angular.mjs.map +1 -1
- package/main/controller/globalerror.service.d.ts +1 -1
- package/main/view/components/busy-state-base/busy-state-base.component.d.ts.map +1 -1
- package/main/view/components/button-base/button-base.component.d.ts +1 -1
- package/main/view/components/button-container/button-container.component.d.ts.map +1 -1
- package/main/view/components/button-image/button-image.component.d.ts.map +1 -1
- package/main/view/components/dialog-base/dialog-base.component.d.ts.map +1 -1
- package/main/view/components/dialog-date-selection/dialog-date-selection.component.d.ts.map +1 -1
- package/main/view/components/dialog-error/dialog-error.component.d.ts.map +1 -1
- package/main/view/components/dialog-multiple-option/dialog-multiple-option.component.d.ts.map +1 -1
- package/main/view/components/dialog-single-input/dialog-single-input.component.d.ts.map +1 -1
- package/main/view/components/dialog-single-option/dialog-single-option.component.d.ts.map +1 -1
- package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.d.ts.map +1 -1
- package/main/view/components/dialog-two-option/dialog-two-option.component.d.ts.map +1 -1
- package/main/view/directives/AutoFocusOnDisplayDirective.d.ts.map +1 -1
- package/main/view/directives/AutoSelectTextOnFocusDirective.d.ts.map +1 -1
- package/main/view/directives/ElementCreatedDirective.d.ts.map +1 -1
- package/main/view/directives/ElementDestroyedDirective.d.ts.map +1 -1
- package/package.json +1 -3
- package/esm2022/main/controller/browser.service.mjs +0 -51
- package/esm2022/main/controller/dialog.service.mjs +0 -408
- package/esm2022/main/controller/globalerror.service.mjs +0 -73
- package/esm2022/main/controller/http.service.mjs +0 -71
- package/esm2022/main/controller/httpservice/HTTPServiceGetRequest.mjs +0 -15
- package/esm2022/main/controller/httpservice/HTTPServicePostRequest.mjs +0 -15
- package/esm2022/main/controller/locales.service.mjs +0 -494
- package/esm2022/main/controller/notification.service.mjs +0 -61
- package/esm2022/main/controller/turbo-api-caller.service.mjs +0 -440
- package/esm2022/main/managers/DelayedMethodCallManager.mjs +0 -70
- package/esm2022/main/model/classes/GUINotification.mjs +0 -32
- package/esm2022/main/model/classes/SingletoneStrictClass.mjs +0 -24
- package/esm2022/main/model/classes/View.mjs +0 -31
- package/esm2022/main/model/classes/ViewService.mjs +0 -15
- package/esm2022/main/model/modules/turbogui-angular.module.mjs +0 -48
- package/esm2022/main/view/animations/fade.animation.mjs +0 -35
- package/esm2022/main/view/components/busy-state-base/busy-state-base.component.mjs +0 -38
- package/esm2022/main/view/components/button-base/button-base.component.mjs +0 -180
- package/esm2022/main/view/components/button-container/button-container.component.mjs +0 -34
- package/esm2022/main/view/components/button-image/button-image.component.mjs +0 -47
- package/esm2022/main/view/components/dialog-base/dialog-base.component.mjs +0 -56
- package/esm2022/main/view/components/dialog-date-selection/dialog-date-selection.component.mjs +0 -39
- package/esm2022/main/view/components/dialog-error/dialog-error.component.mjs +0 -48
- package/esm2022/main/view/components/dialog-multiple-option/dialog-multiple-option.component.mjs +0 -42
- package/esm2022/main/view/components/dialog-single-input/dialog-single-input.component.mjs +0 -84
- package/esm2022/main/view/components/dialog-single-option/dialog-single-option.component.mjs +0 -45
- package/esm2022/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.mjs +0 -138
- package/esm2022/main/view/components/dialog-two-option/dialog-two-option.component.mjs +0 -46
- package/esm2022/main/view/directives/AutoFocusOnDisplayDirective.mjs +0 -39
- package/esm2022/main/view/directives/AutoSelectTextOnFocusDirective.mjs +0 -39
- package/esm2022/main/view/directives/ElementCreatedDirective.mjs +0 -42
- package/esm2022/main/view/directives/ElementDestroyedDirective.mjs +0 -42
- package/esm2022/main/view/forms/ValidatorsPlus.mjs +0 -39
- package/esm2022/public_api.mjs +0 -45
- package/esm2022/turbogui-angular.mjs +0 -5
|
@@ -1,440 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TurboGUI is A library that helps with the most common and generic UI elements and functionalities
|
|
3
|
-
*
|
|
4
|
-
* Website : -> http://www.turbogui.org
|
|
5
|
-
* License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
|
|
6
|
-
* License Url : -> http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
* CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
|
|
8
|
-
*/
|
|
9
|
-
import { Injectable } from '@angular/core';
|
|
10
|
-
import { ConversionUtils, HTTPManager, HTTPManagerPostRequest, StringUtils } from 'turbocommons-ts';
|
|
11
|
-
import { SingletoneStrictClass } from '../model/classes/SingletoneStrictClass';
|
|
12
|
-
import { DialogErrorComponent } from '../view/components/dialog-error/dialog-error.component';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "./dialog.service";
|
|
15
|
-
import * as i2 from "./browser.service";
|
|
16
|
-
/**
|
|
17
|
-
* Allows us to easily perform requests to a remote API that is developed with Turbo framework.
|
|
18
|
-
*/
|
|
19
|
-
export class TurboApiCallerService extends SingletoneStrictClass {
|
|
20
|
-
constructor(dialogService, browserService) {
|
|
21
|
-
super(TurboApiCallerService);
|
|
22
|
-
this.dialogService = dialogService;
|
|
23
|
-
this.browserService = browserService;
|
|
24
|
-
/**
|
|
25
|
-
* URI Path to the web service that performs the user login
|
|
26
|
-
*/
|
|
27
|
-
this.loginServiceURI = 'users/login';
|
|
28
|
-
/**
|
|
29
|
-
* URI Path to the web service that allows us to create extra user tokens
|
|
30
|
-
*/
|
|
31
|
-
this.tokenCreationServiceURI = 'users/user-token-create';
|
|
32
|
-
/**
|
|
33
|
-
* URI Path to the web service that performs the user log out
|
|
34
|
-
*/
|
|
35
|
-
this.logOutServiceURI = 'users/logout';
|
|
36
|
-
/**
|
|
37
|
-
* URI Path to the web service that performs the verification for a user email
|
|
38
|
-
*/
|
|
39
|
-
this.mailVerifyServiceURI = 'users/user-mail-verify';
|
|
40
|
-
/**
|
|
41
|
-
* The username that is currently defined and will be used by the login methods
|
|
42
|
-
*/
|
|
43
|
-
this._userName = '';
|
|
44
|
-
/**
|
|
45
|
-
* The password for the user that is currently defined and will be used by the login methods
|
|
46
|
-
*/
|
|
47
|
-
this._password = '';
|
|
48
|
-
/**
|
|
49
|
-
* Contains the last email account that has been verified (or tried to verify) by this service, if any
|
|
50
|
-
*/
|
|
51
|
-
this._lastVerifiedMail = '';
|
|
52
|
-
/**
|
|
53
|
-
* Check public getter for docs
|
|
54
|
-
*/
|
|
55
|
-
this._isLogged = false;
|
|
56
|
-
/**
|
|
57
|
-
* @see token() getter for more info
|
|
58
|
-
*/
|
|
59
|
-
this._token = '';
|
|
60
|
-
/**
|
|
61
|
-
* List of operations that are allowed to the currently loged user. It gets filled just after login is performed
|
|
62
|
-
*/
|
|
63
|
-
this._operations = [];
|
|
64
|
-
// Create a fresh instance of the http service so we can use it independently
|
|
65
|
-
this.httpManager = new HTTPManager();
|
|
66
|
-
this._clearUserAndToken();
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* The username that is currently defined and will be used by the login methods
|
|
70
|
-
*/
|
|
71
|
-
set userName(v) {
|
|
72
|
-
this._isLogged = false;
|
|
73
|
-
this._token = '';
|
|
74
|
-
this._userName = v;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* The username that is currently defined and will be used by the login methods
|
|
78
|
-
*/
|
|
79
|
-
get userName() {
|
|
80
|
-
return this._userName;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* The password for the user that is currently defined and will be used by the login methods
|
|
84
|
-
*/
|
|
85
|
-
set password(v) {
|
|
86
|
-
this._isLogged = false;
|
|
87
|
-
this._token = '';
|
|
88
|
-
this._password = v;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* The password for the user that is currently defined and will be used by the login methods
|
|
92
|
-
*/
|
|
93
|
-
get password() {
|
|
94
|
-
return this._password;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Define the root url that will be used for all the API calls
|
|
98
|
-
*/
|
|
99
|
-
set baseUrl(url) {
|
|
100
|
-
this.httpManager.baseUrl = url;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Define the root url that will be used for all the API calls
|
|
104
|
-
*/
|
|
105
|
-
get baseUrl() {
|
|
106
|
-
return this.httpManager.baseUrl;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* If the current browser URL contains a hash fragment (The part after the # character) that contains encoded user or password
|
|
110
|
-
* values, this method will parse and automatically set them as the credentials to use.
|
|
111
|
-
*
|
|
112
|
-
* The URL hash is not altered in any way by this method.
|
|
113
|
-
*
|
|
114
|
-
* @returns True if any credentials were found and loaded, false if nothing happened
|
|
115
|
-
*/
|
|
116
|
-
loadCredentialsFromURLHashFragment() {
|
|
117
|
-
// If the hash fragment is empty, nothing to do
|
|
118
|
-
if (!this.browserService.isCurrentUrlWithHashFragment()) {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
let valuesFound = false;
|
|
122
|
-
// Split the hash fragment to obtain the different values that contains
|
|
123
|
-
let hashData = this.browserService.getCurrentUrlHashFragment().split('/');
|
|
124
|
-
// User name is the first element of the hash fragment. If we found a value,
|
|
125
|
-
// we will fill it automatically
|
|
126
|
-
if (hashData.length > 0) {
|
|
127
|
-
valuesFound = true;
|
|
128
|
-
this.userName = ConversionUtils.base64ToString(hashData[0]);
|
|
129
|
-
}
|
|
130
|
-
// Auto fill the password if it is received
|
|
131
|
-
if (hashData.length > 3) {
|
|
132
|
-
valuesFound = true;
|
|
133
|
-
this.password = ConversionUtils.base64ToString(hashData[3]);
|
|
134
|
-
}
|
|
135
|
-
return valuesFound;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* If the current browser URL contains a hash fragment (The part after the # character) that contains encoded user, mail and
|
|
139
|
-
* has verification code values, this method will perform the request to server to verify that email account for the user.
|
|
140
|
-
*
|
|
141
|
-
* The URI path to the mail verification service must be correctly defined at this.mailVerifyServiceURI property.
|
|
142
|
-
*
|
|
143
|
-
* @returns A promise that resolves with the server response if the verification is successful,
|
|
144
|
-
* or rejects with an error if the verification fails. Response will have 4 possible values:
|
|
145
|
-
* undefined - meaning that the URL hash fragment didn't contain valid verification values
|
|
146
|
-
* -1 - meaning verification failed
|
|
147
|
-
* 0 - meaning verification succeeded
|
|
148
|
-
* 1 - meaning the email was already previouly verified
|
|
149
|
-
*/
|
|
150
|
-
verifyUserMailFromURLHashFragment() {
|
|
151
|
-
// If the hash fragment is empty, nothing to do
|
|
152
|
-
if (this.browserService.isCurrentUrlWithHashFragment()) {
|
|
153
|
-
let hashData = this.browserService.getCurrentUrlHashFragment().split('/');
|
|
154
|
-
if (hashData.length >= 3) {
|
|
155
|
-
// Call for the user mail verification if user, mail and hash are received
|
|
156
|
-
let user = ConversionUtils.base64ToString(hashData[0]);
|
|
157
|
-
let mail = ConversionUtils.base64ToString(hashData[1]);
|
|
158
|
-
let hash = ConversionUtils.base64ToString(hashData[2]);
|
|
159
|
-
if (!StringUtils.isEmpty(user) && !StringUtils.isEmpty(mail) && !StringUtils.isEmpty(hash)) {
|
|
160
|
-
this._lastVerifiedMail = mail;
|
|
161
|
-
return this.call(this.mailVerifyServiceURI, { userName: user, mail: mail, hash: hash });
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return Promise.resolve(undefined);
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Obtain the lat user mail account that has been verified (or attempted to verify) by this service.
|
|
169
|
-
*/
|
|
170
|
-
getLastVerifiedMail() {
|
|
171
|
-
return this._lastVerifiedMail;
|
|
172
|
-
;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Authenticates the userName and password that are currently defined at the respective properties of this service.
|
|
176
|
-
* Returns a promise that resolves with the server's response or rejects with an error if the login fails.
|
|
177
|
-
* Path to the login service must be correctly defined at this.loginWebService
|
|
178
|
-
*
|
|
179
|
-
* The authentication process is performed by sending an encoded credentials request to the login web service using the
|
|
180
|
-
* currently defined user name and psw.
|
|
181
|
-
*
|
|
182
|
-
* Here's an example of a call:
|
|
183
|
-
*
|
|
184
|
-
* login().then(response => {
|
|
185
|
-
* console.log('Login successful:', response);
|
|
186
|
-
* }).catch(() => {
|
|
187
|
-
* console.error('Login failed:');
|
|
188
|
-
* });
|
|
189
|
-
*
|
|
190
|
-
* @returns A promise that resolves with the server response if the login is successful,
|
|
191
|
-
* or rejects with an error if the login fails.
|
|
192
|
-
*/
|
|
193
|
-
login() {
|
|
194
|
-
this.dialogService.addModalBusyState();
|
|
195
|
-
return new Promise((resolve, reject) => {
|
|
196
|
-
const request = new HTTPManagerPostRequest(this.loginServiceURI);
|
|
197
|
-
request.ignoreGlobalPostParams = true;
|
|
198
|
-
const encodedCredentials = ConversionUtils.stringToBase64(ConversionUtils.stringToBase64(this._userName) + ',' + ConversionUtils.stringToBase64(this._password));
|
|
199
|
-
request.parameters = { data: encodedCredentials };
|
|
200
|
-
request.successCallback = (response) => {
|
|
201
|
-
if (response !== '') {
|
|
202
|
-
response = JSON.parse(response);
|
|
203
|
-
this._isLogged = true;
|
|
204
|
-
this._token = response.token;
|
|
205
|
-
this._operations = response.operations;
|
|
206
|
-
this.httpManager.setGlobalPostParam('token', response.token);
|
|
207
|
-
resolve(response);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
this._clearUserAndToken();
|
|
211
|
-
reject(new Error());
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
request.errorCallback = () => {
|
|
215
|
-
this._clearUserAndToken();
|
|
216
|
-
reject(new Error());
|
|
217
|
-
};
|
|
218
|
-
request.finallyCallback = () => {
|
|
219
|
-
this.dialogService.removeModalBusyState();
|
|
220
|
-
};
|
|
221
|
-
this.httpManager.execute(request);
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Perform a request to the API service to create a new token for the user that is currently logged in.
|
|
226
|
-
*
|
|
227
|
-
* @param options The parameters that will affect the token behaviour. To learn more about each option, please
|
|
228
|
-
* refer to the turbodepot UsersManager class createToken method documentation
|
|
229
|
-
*
|
|
230
|
-
* @returns A promise that resolves with the created token string if the request is successful, or rejects
|
|
231
|
-
* with an error (containing all the error response details) if the request fails.
|
|
232
|
-
*/
|
|
233
|
-
createUserToken(options) {
|
|
234
|
-
return this.call(this.tokenCreationServiceURI, { options: options }, { resultFormat: 'STRING' });
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Checks if the user and password credentials are filled and not empty.
|
|
238
|
-
* If any of the two values is empty, false will be returned
|
|
239
|
-
*/
|
|
240
|
-
get isUserAndPswDefined() {
|
|
241
|
-
return !StringUtils.isEmpty(this._userName) && !StringUtils.isEmpty(this._password);
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Tells if the user name and psw that are specified on this service are currently logged or not. This means
|
|
245
|
-
* also a token is active.
|
|
246
|
-
*/
|
|
247
|
-
get isLogged() {
|
|
248
|
-
return this._isLogged;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Gives the value for the currently active user authentication token or an empty string if no user logged
|
|
252
|
-
*/
|
|
253
|
-
get token() {
|
|
254
|
-
return this._token;
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Checks if the currently logged user is allowed to perform the specified operation.
|
|
258
|
-
* This will check the user permisions as defined on server side and return true if the operation is allowed
|
|
259
|
-
* or false if not. We can then decide what to do (hide an app section, block a button, etc)
|
|
260
|
-
*
|
|
261
|
-
* @param operation The name of the operation to check
|
|
262
|
-
*
|
|
263
|
-
* @returns True if the operation is allowed, false otherwise
|
|
264
|
-
*/
|
|
265
|
-
isUserAllowedTo(operation) {
|
|
266
|
-
return this._operations.includes(operation);
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Performs a standard request to an API service and returns a promise that resolves with the response data.
|
|
270
|
-
*
|
|
271
|
-
* Following is an example of a call:
|
|
272
|
-
*
|
|
273
|
-
* this.apiService.call('users/user-create', this.userData, {handleErrors: false}).then(response => {
|
|
274
|
-
*
|
|
275
|
-
* console.log('Success:', response);
|
|
276
|
-
*
|
|
277
|
-
* }).catch(error => {
|
|
278
|
-
*
|
|
279
|
-
* console.error('Error:', error.message);
|
|
280
|
-
* });
|
|
281
|
-
*
|
|
282
|
-
* @param apiPath - A relative URL (based on the defined base root url) that defines the path to the service to call.
|
|
283
|
-
* For example: 'users/login'
|
|
284
|
-
* @param parameters - An object containing key-value pairs that are sent as the request body.
|
|
285
|
-
* token parameter is not necessary, it is automatically appended
|
|
286
|
-
* @param options An object defining several options for the request:
|
|
287
|
-
* resultFormat: 'JSON' by default. The expected format of the response.
|
|
288
|
-
* busyState: Enabled by default. Enables or disables the busy state to lock user interaction while performing the http calls.
|
|
289
|
-
* handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.
|
|
290
|
-
* If set to false, the promise will generate a reject error that must be handled by our code.
|
|
291
|
-
*
|
|
292
|
-
* @returns A promise that resolves with the response data correctly parsed if the request is successful, or rejects
|
|
293
|
-
* with an error (containing all the error response details) if the request fails.
|
|
294
|
-
*/
|
|
295
|
-
call(apiPath, parameters = {}, options = {}) {
|
|
296
|
-
// Set the default values for non specified properties
|
|
297
|
-
options.resultFormat = options.resultFormat ?? 'JSON';
|
|
298
|
-
options.busyState = options.busyState ?? true;
|
|
299
|
-
options.handleErrors = options.handleErrors ?? true;
|
|
300
|
-
if (options.busyState) {
|
|
301
|
-
this.dialogService.addModalBusyState();
|
|
302
|
-
}
|
|
303
|
-
return new Promise((resolve, reject) => {
|
|
304
|
-
// Create the request object
|
|
305
|
-
const request = new HTTPManagerPostRequest(apiPath, options.resultFormat === 'STRING' ? HTTPManagerPostRequest.STRING : HTTPManagerPostRequest.JSON);
|
|
306
|
-
request.parameters = parameters;
|
|
307
|
-
request.successCallback = (response) => {
|
|
308
|
-
resolve(response);
|
|
309
|
-
};
|
|
310
|
-
request.errorCallback = (errorMsg, errorCode, response) => {
|
|
311
|
-
if (options.handleErrors) {
|
|
312
|
-
this.showErrorDialog(errorMsg, errorCode, response);
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));
|
|
316
|
-
}
|
|
317
|
-
};
|
|
318
|
-
request.finallyCallback = () => {
|
|
319
|
-
if (options.busyState) {
|
|
320
|
-
this.dialogService.removeModalBusyState();
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
this.httpManager.execute(request);
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Performs a request to chain several api calls into a single http request, via the chain services mechanism of the turboframework API.
|
|
328
|
-
* Returns a promise that resolves with an array of response objects. One for each of the request calls.
|
|
329
|
-
*
|
|
330
|
-
* @param apiPath - A relative URL (based on the defined base root url) that defines the path to the root of the chain services call.
|
|
331
|
-
* For example: 'turbosite/chain/chain-services'
|
|
332
|
-
* @param services - An array of objects, were each object contains a valid structure for the chain services call.
|
|
333
|
-
* Token parameter is not necessary, it is automatically appended
|
|
334
|
-
* @param options An object defining several options for the request:
|
|
335
|
-
* busyState: Enables or disables the busy state to lock user interaction while performing the http calls. Enabled by default
|
|
336
|
-
* handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.
|
|
337
|
-
* If set to false, the promise will generate a reject error that must be handled by our code.
|
|
338
|
-
*
|
|
339
|
-
* @returns A promise that resolves with the response data correctly parsed if the request is successful, or rejects
|
|
340
|
-
* with an error (containing all the error response details) if the request fails.
|
|
341
|
-
*/
|
|
342
|
-
callChain(apiPath, services, options = {}) {
|
|
343
|
-
// Set the default values for non specified properties
|
|
344
|
-
options.busyState = options.busyState ?? true;
|
|
345
|
-
options.handleErrors = options.handleErrors ?? true;
|
|
346
|
-
if (options.busyState) {
|
|
347
|
-
this.dialogService.addModalBusyState();
|
|
348
|
-
}
|
|
349
|
-
return new Promise((resolve, reject) => {
|
|
350
|
-
const request = new HTTPManagerPostRequest(apiPath, HTTPManagerPostRequest.JSON);
|
|
351
|
-
request.ignoreGlobalPostParams = true;
|
|
352
|
-
request.parameters = { services: services };
|
|
353
|
-
request.successCallback = (response) => {
|
|
354
|
-
resolve(response);
|
|
355
|
-
};
|
|
356
|
-
request.errorCallback = (errorMsg, errorCode, response) => {
|
|
357
|
-
if (options.handleErrors) {
|
|
358
|
-
this.showErrorDialog(errorMsg, errorCode, response);
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));
|
|
362
|
-
}
|
|
363
|
-
};
|
|
364
|
-
request.finallyCallback = () => {
|
|
365
|
-
if (options.busyState) {
|
|
366
|
-
this.dialogService.removeModalBusyState();
|
|
367
|
-
}
|
|
368
|
-
};
|
|
369
|
-
this.httpManager.execute(request);
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Aux method to show an error dialog when a request fails and error handling is enabled
|
|
374
|
-
*/
|
|
375
|
-
showErrorDialog(errorMsg, errorCode, response) {
|
|
376
|
-
errorMsg = errorMsg + '\n\n' + response;
|
|
377
|
-
if (StringUtils.isEmpty(errorMsg)) {
|
|
378
|
-
errorMsg = 'Unknown error. Make sure Internet connection is available';
|
|
379
|
-
}
|
|
380
|
-
this.dialogService.addDialog(DialogErrorComponent, {
|
|
381
|
-
width: '50vw',
|
|
382
|
-
texts: ['Error: ' + errorCode, errorMsg],
|
|
383
|
-
options: ['Ok']
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Perform the logout for the currently logged user
|
|
388
|
-
*
|
|
389
|
-
* @param options An object defining several options for the request:
|
|
390
|
-
* handleErrors: Enabled by default. If set to true, an error dialog will be automatically shown when the call fails.
|
|
391
|
-
* If set to false, the promise will generate a reject error that must be handled by our code.
|
|
392
|
-
*
|
|
393
|
-
* @returns A promise that resolves correctly if the logout is correct, or rejects with an error (containing all the error
|
|
394
|
-
* response details) if the request fails.
|
|
395
|
-
*/
|
|
396
|
-
logout(options = {}) {
|
|
397
|
-
// Set the default values for non specified properties
|
|
398
|
-
options.handleErrors = options.handleErrors ?? true;
|
|
399
|
-
this.dialogService.addModalBusyState();
|
|
400
|
-
return new Promise((resolve, reject) => {
|
|
401
|
-
const request = new HTTPManagerPostRequest(this.logOutServiceURI);
|
|
402
|
-
request.parameters = { token: this._token };
|
|
403
|
-
request.successCallback = () => {
|
|
404
|
-
this._clearUserAndToken();
|
|
405
|
-
resolve(undefined);
|
|
406
|
-
};
|
|
407
|
-
request.errorCallback = (errorMsg, errorCode, response) => {
|
|
408
|
-
if (options.handleErrors) {
|
|
409
|
-
this.showErrorDialog(errorMsg, errorCode, response);
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
reject(new Error(errorMsg + ' ' + errorCode + ' ' + response));
|
|
413
|
-
}
|
|
414
|
-
};
|
|
415
|
-
request.finallyCallback = () => {
|
|
416
|
-
this.dialogService.removeModalBusyState();
|
|
417
|
-
};
|
|
418
|
-
this.httpManager.execute(request);
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* Aux methot to clear all the currently logged user data
|
|
423
|
-
*/
|
|
424
|
-
_clearUserAndToken() {
|
|
425
|
-
this._userName = '';
|
|
426
|
-
this._password = '';
|
|
427
|
-
this._isLogged = false;
|
|
428
|
-
this._token = '';
|
|
429
|
-
this.httpManager.setGlobalPostParam('token', '-');
|
|
430
|
-
}
|
|
431
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TurboApiCallerService, deps: [{ token: i1.DialogService }, { token: i2.BrowserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
432
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TurboApiCallerService, providedIn: 'root' }); }
|
|
433
|
-
}
|
|
434
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: TurboApiCallerService, decorators: [{
|
|
435
|
-
type: Injectable,
|
|
436
|
-
args: [{
|
|
437
|
-
providedIn: 'root',
|
|
438
|
-
}]
|
|
439
|
-
}], ctorParameters: () => [{ type: i1.DialogService }, { type: i2.BrowserService }] });
|
|
440
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVyYm8tYXBpLWNhbGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9jb250cm9sbGVyL3R1cmJvLWFwaS1jYWxsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3REFBd0QsQ0FBQzs7OztBQUk5Rjs7R0FFRztBQUlILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxxQkFBcUI7SUFxRTVELFlBQTZCLGFBQTRCLEVBQzVCLGNBQThCO1FBRXZELEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBSEosa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBbkUzRDs7V0FFRztRQUNILG9CQUFlLEdBQUcsYUFBYSxDQUFDO1FBR2hDOztXQUVHO1FBQ0gsNEJBQXVCLEdBQUcseUJBQXlCLENBQUM7UUFHcEQ7O1dBRUc7UUFDSCxxQkFBZ0IsR0FBRyxjQUFjLENBQUM7UUFHbEM7O1dBRUc7UUFDSCx5QkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztRQUdoRDs7V0FFRztRQUNLLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFHdkI7O1dBRUc7UUFDSyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBR3ZCOztXQUVHO1FBQ0ssc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBRy9COztXQUVHO1FBQ0ssY0FBUyxHQUFHLEtBQUssQ0FBQztRQUcxQjs7V0FF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LEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUV0RCxJQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUM7b0JBRXBCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFFdkQ7cUJBQUk7b0JBRUQsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNsRTtZQUNMLENBQUMsQ0FBQztZQUVGLE9BQU8sQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFO2dCQUU1QixJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDN0MsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR0Q7O09BRUc7SUFDSyxrQkFBa0I7UUFFdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEQsQ0FBQzs4R0F6a0JRLHFCQUFxQjtrSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzJGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udmVyc2lvblV0aWxzLCBIVFRQTWFuYWdlciwgSFRUUE1hbmFnZXJQb3N0UmVxdWVzdCwgU3RyaW5nVXRpbHMgfSBmcm9tICd0dXJib2NvbW1vbnMtdHMnO1xyXG5pbXBvcnQgeyBTaW5nbGV0b25lU3RyaWN0Q2xhc3MgfSBmcm9tICcuLi9tb2RlbC9jbGFzc2VzL1NpbmdsZXRvbmVTdHJpY3RDbGFzcyc7XHJcbmltcG9ydCB7IERpYWxvZ0Vycm9yQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2RpYWxvZy1lcnJvci9kaWFsb2ctZXJyb3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQnJvd3NlclNlcnZpY2UgfSBmcm9tICcuL2Jyb3dzZXIuc2VydmljZSc7XHJcblxyXG5cclxuLyoqXHJcbiAqIEFsbG93cyB1cyB0byBlYXNpbHkgcGVyZm9ybSByZXF1ZXN0cyB0byBhIHJlbW90ZSBBUEkgdGhhdCBpcyBkZXZlbG9wZWQgd2l0aCBUdXJibyBmcmFtZXdvcmsuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHVyYm9BcGlDYWxsZXJTZXJ2aWNlIGV4dGVuZHMgU2luZ2xldG9uZVN0cmljdENsYXNzIHtcclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVVJJIFBhdGggdG8gdGhlIHdlYiBzZXJ2aWNlIHRoYXQgcGVyZm9ybXMgdGhlIHVzZXIgbG9naW5cclxuICAgICAqL1xyXG4gICAgbG9naW5TZXJ2aWNlVVJJID0gJ3VzZXJzL2xvZ2luJztcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFVSSSBQYXRoIHRvIHRoZSB3ZWIgc2VydmljZSB0aGF0IGFsbG93cyB1cyB0byBjcmVhdGUgZXh0cmEgdXNlciB0b2tlbnNcclxuICAgICAqL1xyXG4gICAgdG9rZW5DcmVhdGlvblNlcnZpY2VVUkkgPSAndXNlcnMvdXNlci10b2tlbi1jcmVhdGUnO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVVJJIFBhdGggdG8gdGhlIHdlYiBzZXJ2aWNlIHRoYXQgcGVyZm9ybXMgdGhlIHVzZXIgbG9nIG91dFxyXG4gICAgICovXHJcbiAgICBsb2dPdXRTZXJ2aWNlVVJJID0gJ3VzZXJzL2xvZ291dCc7XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBVUkkgUGF0aCB0byB0aGUgd2ViIHNlcnZpY2UgdGhhdCBwZXJmb3JtcyB0aGUgdmVyaWZpY2F0aW9uIGZvciBhIHVzZXIgZW1haWxcclxuICAgICAqL1xyXG4gICAgbWFpbFZlcmlmeVNlcnZpY2VVUkkgPSAndXNlcnMvdXNlci1tYWlsLXZlcmlmeSc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHVzZXJuYW1lIHRoYXQgaXMgY3VycmVudGx5IGRlZmluZWQgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgbG9naW4gbWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF91c2VyTmFtZSA9ICcnO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXIgdGhhdCBpcyBjdXJyZW50bHkgZGVmaW5lZCBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsb2dpbiBtZXRob2RzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3Bhc3N3b3JkID0gJyc7XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyB0aGUgbGFzdCBlbWFpbCBhY2NvdW50IHRoYXQgaGFzIGJlZW4gdmVyaWZpZWQgKG9yIHRyaWVkIHRvIHZlcmlmeSkgYnkgdGhpcyBzZXJ2aWNlLCBpZiBhbnlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbGFzdFZlcmlmaWVkTWFpbCA9ICcnO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIHB1YmxpYyBnZXR0ZXIgZm9yIGRvY3NcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaXNMb2dnZWQgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc2VlIHRva2VuKCkgZ2V0dGVyIGZvciBtb3JlIGluZm9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfdG9rZW4gPSAnJztcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2Ygb3BlcmF0aW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIHRoZSBjdXJyZW50bHkgbG9nZWQgdXNlci4gSXQgZ2V0cyBmaWxsZWQganVzdCBhZnRlciBsb2dpbiBpcyBwZXJmb3JtZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb3BlcmF0aW9uczpzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBodHRwIG1hbmFnZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIGV4Y2x1c2l2ZSB0byB0aGlzIHR1cmJvIGFwaSBjYWxsZXIgc2VydmljZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwTWFuYWdlcjogSFRUUE1hbmFnZXI7XHJcbiAgICBcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLCBcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlclNlcnZpY2U6IEJyb3dzZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc3VwZXIoVHVyYm9BcGlDYWxsZXJTZXJ2aWNlKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDcmVhdGUgYSBmcmVzaCBpbnN0YW5jZSBvZiB0aGUgaHR0cCBzZXJ2aWNlIHNvIHdlIGNhbiB1c2UgaXQgaW5kZXBlbmRlbnRseVxyXG4gICAgICAgIHRoaXMuaHR0cE1hbmFnZXIgPSBuZXcgSFRUUE1hbmFnZXIoKTtcclxuICAgICAgICB0aGlzLl9jbGVhclVzZXJBbmRUb2tlbigpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKiBcclxuICAgICAqIFRoZSB1c2VybmFtZSB0aGF0IGlzIGN1cnJlbnRseSBkZWZpbmVkIGFuZCB3aWxsIGJlIHVzZWQgYnkgdGhlIGxvZ2luIG1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc2V0IHVzZXJOYW1lKHY6c3RyaW5nKXtcclxuXHJcbiAgICAgICAgdGhpcy5faXNMb2dnZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl90b2tlbiA9ICcnO1xyXG4gICAgICAgIHRoaXMuX3VzZXJOYW1lID0gdjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgdXNlcm5hbWUgdGhhdCBpcyBjdXJyZW50bHkgZGVmaW5lZCBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsb2dpbiBtZXRob2RzXHJcbiAgICAgKi9cclxuICAgIGdldCB1c2VyTmFtZSgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyTmFtZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyIHRoYXQgaXMgY3VycmVudGx5IGRlZmluZWQgYW5kIHdpbGwgYmUgdXNlZCBieSB0aGUgbG9naW4gbWV0aG9kc1xyXG4gICAgICovXHJcbiAgICBzZXQgcGFzc3dvcmQodjpzdHJpbmcpe1xyXG5cclxuICAgICAgICB0aGlzLl9pc0xvZ2dlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Rva2VuID0gJyc7XHJcbiAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSB2O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKiBcclxuICAgICAqIFRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXIgdGhhdCBpcyBjdXJyZW50bHkgZGVmaW5lZCBhbmQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBsb2dpbiBtZXRob2RzXHJcbiAgICAgKi9cclxuICAgIGdldCBwYXNzd29yZCgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXNzd29yZDtcclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIERlZmluZSB0aGUgcm9vdCB1cmwgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCB0aGUgQVBJIGNhbGxzXHJcbiAgICAgKi9cclxuICAgIHNldCBiYXNlVXJsKHVybDpzdHJpbmcpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaHR0cE1hbmFnZXIuYmFzZVVybCA9IHVybDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKiogXHJcbiAgICAgKiBEZWZpbmUgdGhlIHJvb3QgdXJsIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgdGhlIEFQSSBjYWxsc1xyXG4gICAgICovXHJcbiAgICBnZXQgYmFzZVVybCgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBNYW5hZ2VyLmJhc2VVcmw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBicm93c2VyIFVSTCBjb250YWlucyBhIGhhc2ggZnJhZ21lbnQgKFRoZSBwYXJ0IGFmdGVyIHRoZSAjIGNoYXJhY3RlcikgdGhhdCBjb250YWlucyBlbmNvZGVkIHVzZXIgb3IgcGFzc3dvcmRcclxuICAgICAqIHZhbHVlcywgdGhpcyBtZXRob2Qgd2lsbCBwYXJzZSBhbmQgYXV0b21hdGljYWxseSBzZXQgdGhlbSBhcyB0aGUgY3JlZGVudGlhbHMgdG8gdXNlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgVVJMIGhhc2ggaXMgbm90IGFsdGVyZWQgaW4gYW55IHdheSBieSB0aGlzIG1ldGhvZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIGFueSBjcmVkZW50aWFscyB3ZXJlIGZvdW5kIGFuZCBsb2FkZWQsIGZhbHNlIGlmIG5vdGhpbmcgaGFwcGVuZWRcclxuICAgICAqL1xyXG4gICAgbG9hZENyZWRlbnRpYWxzRnJvbVVSTEhhc2hGcmFnbWVudCgpIHtcclxuICAgIFxyXG4gICAgICAgIC8vIElmIHRoZSBoYXNoIGZyYWdtZW50IGlzIGVtcHR5LCBub3RoaW5nIHRvIGRvXHJcbiAgICAgICAgaWYoIXRoaXMuYnJvd3NlclNlcnZpY2UuaXNDdXJyZW50VXJsV2l0aEhhc2hGcmFnbWVudCgpKXtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgbGV0IHZhbHVlc0ZvdW5kID0gZmFsc2U7XHJcbiAgICAgICBcclxuICAgICAgICAvLyBTcGxpdCB0aGUgaGFzaCBmcmFnbWVudCB0byBvYnRhaW4gdGhlIGRpZmZlcmVudCB2YWx1ZXMgdGhhdCBjb250YWluc1xyXG4gICAgICAgIGxldCBoYXNoRGF0YSA9IHRoaXMuYnJvd3NlclNlcnZpY2UuZ2V0Q3VycmVudFVybEhhc2hGcmFnbWVudCgpLnNwbGl0KCcvJyk7XHJcbiAgICAgICBcclxuICAgICAgICAvLyBVc2VyIG5hbWUgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGhhc2ggZnJhZ21lbnQuIElmIHdlIGZvdW5kIGEgdmFsdWUsIFxyXG4gICAgICAgIC8vIHdlIHdpbGwgZmlsbCBpdCBhdXRvbWF0aWNhbGx5XHJcbiAgICAgICAgaWYoaGFzaERhdGEubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZhbHVlc0ZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy51c2VyTmFtZSA9IENvbnZlcnNpb25VdGlscy5iYXNlNjRUb1N0cmluZyhoYXNoRGF0YVswXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgLy8gQXV0byBmaWxsIHRoZSBwYXNzd29yZCBpZiBpdCBpcyByZWNlaXZlZFxyXG4gICAgICAgIGlmKGhhc2hEYXRhLmxlbmd0aCA+IDMpe1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB2YWx1ZXNGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbM10pO1xyXG4gICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICAgIHJldHVybiB2YWx1ZXNGb3VuZDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSBjdXJyZW50IGJyb3dzZXIgVVJMIGNvbnRhaW5zIGEgaGFzaCBmcmFnbWVudCAoVGhlIHBhcnQgYWZ0ZXIgdGhlICMgY2hhcmFjdGVyKSB0aGF0IGNvbnRhaW5zIGVuY29kZWQgdXNlciwgbWFpbCBhbmRcclxuICAgICAqIGhhcyB2ZXJpZmljYXRpb24gY29kZSB2YWx1ZXMsIHRoaXMgbWV0aG9kIHdpbGwgcGVyZm9ybSB0aGUgcmVxdWVzdCB0byBzZXJ2ZXIgdG8gdmVyaWZ5IHRoYXQgZW1haWwgYWNjb3VudCBmb3IgdGhlIHVzZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBVUkkgcGF0aCB0byB0aGUgbWFpbCB2ZXJpZmljYXRpb24gc2VydmljZSBtdXN0IGJlIGNvcnJlY3RseSBkZWZpbmVkIGF0IHRoaXMubWFpbFZlcmlmeVNlcnZpY2VVUkkgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2VydmVyIHJlc3BvbnNlIGlmIHRoZSB2ZXJpZmljYXRpb24gaXMgc3VjY2Vzc2Z1bCxcclxuICAgICAqICAgICAgICAgIG9yIHJlamVjdHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzLiBSZXNwb25zZSB3aWxsIGhhdmUgNCBwb3NzaWJsZSB2YWx1ZXM6XHJcbiAgICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZCAtIG1lYW5pbmcgdGhhdCB0aGUgVVJMIGhhc2ggZnJhZ21lbnQgZGlkbid0IGNvbnRhaW4gdmFsaWQgdmVyaWZpY2F0aW9uIHZhbHVlc1xyXG4gICAgICogICAgICAgICAgICAgIC0xIC0gbWVhbmluZyB2ZXJpZmljYXRpb24gZmFpbGVkXHJcbiAgICAgKiAgICAgICAgICAgICAgIDAgLSBtZWFuaW5nIHZlcmlmaWNhdGlvbiBzdWNjZWVkZWRcclxuICAgICAqICAgICAgICAgICAgICAgMSAtIG1lYW5pbmcgdGhlIGVtYWlsIHdhcyBhbHJlYWR5IHByZXZpb3VseSB2ZXJpZmllZFxyXG4gICAgICovXHJcbiAgICB2ZXJpZnlVc2VyTWFpbEZyb21VUkxIYXNoRnJhZ21lbnQoKSB7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBoYXNoIGZyYWdtZW50IGlzIGVtcHR5LCBub3RoaW5nIHRvIGRvXHJcbiAgICAgICAgaWYodGhpcy5icm93c2VyU2VydmljZS5pc0N1cnJlbnRVcmxXaXRoSGFzaEZyYWdtZW50KCkpe1xyXG4gICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBoYXNoRGF0YSA9IHRoaXMuYnJvd3NlclNlcnZpY2UuZ2V0Q3VycmVudFVybEhhc2hGcmFnbWVudCgpLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKGhhc2hEYXRhLmxlbmd0aCA+PSAzKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDYWxsIGZvciB0aGUgdXNlciBtYWlsIHZlcmlmaWNhdGlvbiBpZiB1c2VyLCBtYWlsIGFuZCBoYXNoIGFyZSByZWNlaXZlZFxyXG4gICAgICAgICAgICAgICAgbGV0IHVzZXIgPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbMF0pO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1haWwgPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbMV0pO1xyXG4gICAgICAgICAgICAgICAgbGV0IGhhc2ggPSBDb252ZXJzaW9uVXRpbHMuYmFzZTY0VG9TdHJpbmcoaGFzaERhdGFbMl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmKCFTdHJpbmdVdGlscy5pc0VtcHR5KHVzZXIpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KG1haWwpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KGhhc2gpKXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmVyaWZpZWRNYWlsID0gbWFpbDtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsKHRoaXMubWFpbFZlcmlmeVNlcnZpY2VVUkksIHt1c2VyTmFtZTogdXNlciwgbWFpbDogbWFpbCwgaGFzaDogaGFzaH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIE9idGFpbiB0aGUgbGF0IHVzZXIgbWFpbCBhY2NvdW50IHRoYXQgaGFzIGJlZW4gdmVyaWZpZWQgKG9yIGF0dGVtcHRlZCB0byB2ZXJpZnkpIGJ5IHRoaXMgc2VydmljZS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGFzdFZlcmlmaWVkTWFpbCgpe1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFZlcmlmaWVkTWFpbDs7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXRoZW50aWNhdGVzIHRoZSB1c2VyTmFtZSBhbmQgcGFzc3dvcmQgdGhhdCBhcmUgY3VycmVudGx5IGRlZmluZWQgYXQgdGhlIHJlc3BlY3RpdmUgcHJvcGVydGllcyBvZiB0aGlzIHNlcnZpY2UuXHJcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNlcnZlcidzIHJlc3BvbnNlIG9yIHJlamVjdHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgbG9naW4gZmFpbHMuXHJcbiAgICAgKiBQYXRoIHRvIHRoZSBsb2dpbiBzZXJ2aWNlIG11c3QgYmUgY29ycmVjdGx5IGRlZmluZWQgYXQgdGhpcy5sb2dpbldlYlNlcnZpY2VcclxuICAgICAqIFxyXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaXMgcGVyZm9ybWVkIGJ5IHNlbmRpbmcgYW4gZW5jb2RlZCBjcmVkZW50aWFscyByZXF1ZXN0IHRvIHRoZSBsb2dpbiB3ZWIgc2VydmljZSB1c2luZyB0aGUgXHJcbiAgICAgKiBjdXJyZW50bHkgZGVmaW5lZCB1c2VyIG5hbWUgYW5kIHBzdy5cclxuICAgICAqXHJcbiAgICAgKiBIZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIGNhbGw6XHJcbiAgICAgKiBcclxuICAgICAqICBsb2dpbigpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICogICAgIGNvbnNvbGUubG9nKCdMb2dpbiBzdWNjZXNzZnVsOicsIHJlc3BvbnNlKTtcclxuICAgICAqICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgKiAgICAgY29uc29sZS5lcnJvcignTG9naW4gZmFpbGVkOicpO1xyXG4gICAgICogIH0pO1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaWYgdGhlIGxvZ2luIGlzIHN1Y2Nlc3NmdWwsXHJcbiAgICAgKiAgICAgICAgICBvciByZWplY3RzIHdpdGggYW4gZXJyb3IgaWYgdGhlIGxvZ2luIGZhaWxzLlxyXG4gICAgICovXHJcbiAgICBsb2dpbigpIHtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkTW9kYWxCdXN5U3RhdGUoKTsgXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOihyOmFueSkgPT4gYW55LCByZWplY3QpID0+IHtcclxuICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBIVFRQTWFuYWdlclBvc3RSZXF1ZXN0KHRoaXMubG9naW5TZXJ2aWNlVVJJKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5pZ25vcmVHbG9iYWxQb3N0UGFyYW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRDcmVkZW50aWFscyA9IENvbnZlcnNpb25VdGlscy5zdHJpbmdUb0Jhc2U2NChcclxuICAgICAgICAgICAgICAgIENvbnZlcnNpb25VdGlscy5zdHJpbmdUb0Jhc2U2NCh0aGlzLl91c2VyTmFtZSkgKyAnLCcgKyBDb252ZXJzaW9uVXRpbHMuc3RyaW5nVG9CYXNlNjQodGhpcy5fcGFzc3dvcmQpKTtcclxuICAgIFxyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtZXRlcnMgPSB7IGRhdGE6IGVuY29kZWRDcmVkZW50aWFscyB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5zdWNjZXNzQ2FsbGJhY2sgPSAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT09ICcnKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTsgICAgICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0xvZ2dlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSByZXNwb25zZS50b2tlbjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGVyYXRpb25zID0gcmVzcG9uc2Uub3BlcmF0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLnNldEdsb2JhbFBvc3RQYXJhbSgndG9rZW4nLCByZXNwb25zZS50b2tlbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyVXNlckFuZFRva2VuKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JDYWxsYmFjayA9ICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclVzZXJBbmRUb2tlbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCkpOyAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5maW5hbGx5Q2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UucmVtb3ZlTW9kYWxCdXN5U3RhdGUoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlci5leGVjdXRlKHJlcXVlc3QpO1xyXG4gICAgICAgIH0pOyBcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm0gYSByZXF1ZXN0IHRvIHRoZSBBUEkgc2VydmljZSB0byBjcmVhdGUgYSBuZXcgdG9rZW4gZm9yIHRoZSB1c2VyIHRoYXQgaXMgY3VycmVudGx5IGxvZ2dlZCBpbi5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGFmZmVjdCB0aGUgdG9rZW4gYmVoYXZpb3VyLiBUbyBsZWFybiBtb3JlIGFib3V0IGVhY2ggb3B0aW9uLCBwbGVhc2VcclxuICAgICAqICAgICAgICByZWZlciB0byB0aGUgdHVyYm9kZXBvdCBVc2Vyc01hbmFnZXIgY2xhc3MgY3JlYXRlVG9rZW4gbWV0aG9kIGRvY3VtZW50YXRpb25cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3JlYXRlZCB0b2tlbiBzdHJpbmcgaWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwgb3IgcmVqZWN0cyBcclxuICAgICAqICAgICAgICAgIHdpdGggYW4gZXJyb3IgKGNvbnRhaW5pbmcgYWxsIHRoZSBlcnJvciByZXNwb25zZSBkZXRhaWxzKSBpZiB0aGUgcmVxdWVzdCBmYWlscy5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlVXNlclRva2VuKG9wdGlvbnM6IHtsaWZlVGltZT86bnVtYmVyLCB1c2VDb3VudD86bnVtYmVyLCBpc0xpZmVUaW1lUmVjeWNsZWQ/OmJvb2xlYW59KSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbCh0aGlzLnRva2VuQ3JlYXRpb25TZXJ2aWNlVVJJLCB7b3B0aW9uczogb3B0aW9uc30sIHtyZXN1bHRGb3JtYXQ6ICdTVFJJTkcnfSk7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgdXNlciBhbmQgcGFzc3dvcmQgY3JlZGVudGlhbHMgYXJlIGZpbGxlZCBhbmQgbm90IGVtcHR5LlxyXG4gICAgICogSWYgYW55IG9mIHRoZSB0d28gdmFsdWVzIGlzIGVtcHR5LCBmYWxzZSB3aWxsIGJlIHJldHVybmVkXHJcbiAgICAgKi9cclxuICAgIGdldCBpc1VzZXJBbmRQc3dEZWZpbmVkKCk6IGJvb2xlYW4gIHtcclxuXHJcbiAgICAgICAgcmV0dXJuICFTdHJpbmdVdGlscy5pc0VtcHR5KHRoaXMuX3VzZXJOYW1lKSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eSh0aGlzLl9wYXNzd29yZCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgaWYgdGhlIHVzZXIgbmFtZSBhbmQgcHN3IHRoYXQgYXJlIHNwZWNpZmllZCBvbiB0aGlzIHNlcnZpY2UgYXJlIGN1cnJlbnRseSBsb2dnZWQgb3Igbm90LiBUaGlzIG1lYW5zXHJcbiAgICAgKiBhbHNvIGEgdG9rZW4gaXMgYWN0aXZlLlxyXG4gICAgICovXHJcbiAgICBnZXQgaXNMb2dnZWQoKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xvZ2dlZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlcyB0aGUgdmFsdWUgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIHVzZXIgYXV0aGVudGljYXRpb24gdG9rZW4gb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHVzZXIgbG9nZ2VkXHJcbiAgICAgKi9cclxuICAgIGdldCB0b2tlbigpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50bHkgbG9nZ2VkIHVzZXIgaXMgYWxsb3dlZCB0byBwZXJmb3JtIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLlxyXG4gICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSB1c2VyIHBlcm1pc2lvbnMgYXMgZGVmaW5lZCBvbiBzZXJ2ZXIgc2lkZSBhbmQgcmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBhbGxvd2VkXHJcbiAgICAgKiBvciBmYWxzZSBpZiBub3QuIFdlIGNhbiB0aGVuIGRlY2lkZSB3aGF0IHRvIGRvIChoaWRlIGFuIGFwcCBzZWN0aW9uLCBibG9jayBhIGJ1dHRvbiwgZXRjKVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdG8gY2hlY2sgXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBhbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UgXHJcbiAgICAgKi9cclxuICAgIGlzVXNlckFsbG93ZWRUbyhvcGVyYXRpb246c3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb24pO1xyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGEgc3RhbmRhcmQgcmVxdWVzdCB0byBhbiBBUEkgc2VydmljZSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkYXRhLlxyXG4gICAgICogXHJcbiAgICAgKiBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIGNhbGw6XHJcbiAgICAgKiBcclxuICAgICAqICAgICB0aGlzLmFwaVNlcnZpY2UuY2FsbCgndXNlcnMvdXNlci1jcmVhdGUnLCB0aGlzLnVzZXJEYXRhLCB7aGFuZGxlRXJyb3JzOiBmYWxzZX0pLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICogICAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXNwb25zZSk7XHJcbiAgICAgKiAgICAgICAgICBcclxuICAgICAqICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICogICAgICAgICAgXHJcbiAgICAgKiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcclxuICAgICAqICAgICAgfSk7XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGFwaVBhdGggLSBBIHJlbGF0aXZlIFVSTCAoYmFzZWQgb24gdGhlIGRlZmluZWQgYmFzZSByb290IHVybCkgdGhhdCBkZWZpbmVzIHRoZSBwYXRoIHRvIHRoZSBzZXJ2aWNlIHRvIGNhbGwuXHJcbiAgICAgKiAgICAgICAgRm9yIGV4YW1wbGU6ICd1c2Vycy9sb2dpbidcclxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIHNlbnQgYXMgdGhlIHJlcXVlc3QgYm9keS5cclxuICAgICAqICAgICAgICB0b2tlbiBwYXJhbWV0ZXIgaXMgbm90IG5lY2Vzc2FyeSwgaXQgaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IGRlZmluaW5nIHNldmVyYWwgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3Q6XHJcbiAgICAgKiAgICAgICAgcmVzdWx0Rm9ybWF0OiAnSlNPTicgYnkgZGVmYXVsdC4gVGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgcmVzcG9uc2UuIFxyXG4gICAgICogICAgICAgIGJ1c3lTdGF0ZTogRW5hYmxlZCBieSBkZWZhdWx0LiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBidXN5IHN0YXRlIHRvIGxvY2sgdXNlciBpbnRlcmFjdGlvbiB3aGlsZSBwZXJmb3JtaW5nIHRoZSBodHRwIGNhbGxzLlxyXG4gICAgICogICAgICAgIGhhbmRsZUVycm9yczogRW5hYmxlZCBieSBkZWZhdWx0LiBJZiBzZXQgdG8gdHJ1ZSwgYW4gZXJyb3IgZGlhbG9nIHdpbGwgYmUgYXV0b21hdGljYWxseSBzaG93biB3aGVuIHRoZSBjYWxsIGZhaWxzLlxyXG4gICAgICogICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlIHByb21pc2Ugd2lsbCBnZW5lcmF0ZSBhIHJlamVjdCBlcnJvciB0aGF0IG11c3QgYmUgaGFuZGxlZCBieSBvdXIgY29kZS5cclxuICAgICAqICAgICAgIFxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2UgZGF0YSBjb3JyZWN0bHkgcGFyc2VkIGlmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsIG9yIHJlamVjdHMgXHJcbiAgICAgKiAgICAgICAgICB3aXRoIGFuIGVycm9yIChjb250YWluaW5nIGFsbCB0aGUgZXJyb3IgcmVzcG9uc2UgZGV0YWlscykgaWYgdGhlIHJlcXVlc3QgZmFpbHMuXHJcbiAgICAgKi9cclxuICAgIGNhbGwoYXBpUGF0aDpzdHJpbmcsIHBhcmFtZXRlcnMgPSB7fSwgb3B0aW9uczoge3Jlc3VsdEZvcm1hdD86J1NUUklORyd8J0pTT04nLCBidXN5U3RhdGU/OmJvb2xlYW4sIGhhbmRsZUVycm9ycz86Ym9vbGVhbn0gPSB7fSl7XHJcbiAgICBcclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBub24gc3BlY2lmaWVkIHByb3BlcnRpZXNcclxuICAgICAgICBvcHRpb25zLnJlc3VsdEZvcm1hdCA9IG9wdGlvbnMucmVzdWx0Rm9ybWF0ID8/ICdKU09OJztcclxuICAgICAgICBvcHRpb25zLmJ1c3lTdGF0ZSA9IG9wdGlvbnMuYnVzeVN0YXRlID8/IHRydWU7XHJcbiAgICAgICAgb3B0aW9ucy5oYW5kbGVFcnJvcnMgPSBvcHRpb25zLmhhbmRsZUVycm9ycyA/PyB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKG9wdGlvbnMuYnVzeVN0YXRlKXtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkTW9kYWxCdXN5U3RhdGUoKTsgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZToocjphbnkpID0+IGFueSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgSFRUUE1hbmFnZXJQb3N0UmVxdWVzdChcclxuICAgICAgICAgICAgICAgIGFwaVBhdGgsIFxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZXN1bHRGb3JtYXQgPT09ICdTVFJJTkcnID8gSFRUUE1hbmFnZXJQb3N0UmVxdWVzdC5TVFJJTkcgOiBIVFRQTWFuYWdlclBvc3RSZXF1ZXN0LkpTT05cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHJlcXVlc3QucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XHJcblxyXG4gICAgICAgICAgICByZXF1ZXN0LnN1Y2Nlc3NDYWxsYmFjayA9IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVxdWVzdC5lcnJvckNhbGxiYWNrID0gKGVycm9yTXNnLCBlcnJvckNvZGUsIHJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYob3B0aW9ucy5oYW5kbGVFcnJvcnMpe1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JEaWFsb2coZXJyb3JNc2csIGVycm9yQ29kZSwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGVycm9yTXNnICsgJyAnICsgZXJyb3JDb2RlICsgJyAnICsgcmVzcG9uc2UpKTtcclxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbmFsbHlDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYob3B0aW9ucy5idXN5U3RhdGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5yZW1vdmVNb2RhbEJ1c3lTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlci5leGVjdXRlKHJlcXVlc3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHRvIGNoYWluIHNldmVyYWwgYXBpIGNhbGxzIGludG8gYSBzaW5nbGUgaHR0cCByZXF1ZXN0LCB2aWEgdGhlIGNoYWluIHNlcnZpY2VzIG1lY2hhbmlzbSBvZiB0aGUgdHVyYm9mcmFtZXdvcmsgQVBJLlxyXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMuIE9uZSBmb3IgZWFjaCBvZiB0aGUgcmVxdWVzdCBjYWxscy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gYXBpUGF0aCAtIEEgcmVsYXRpdmUgVVJMIChiYXNlZCBvbiB0aGUgZGVmaW5lZCBiYXNlIHJvb3QgdXJsKSB0aGF0IGRlZmluZXMgdGhlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGNoYWluIHNlcnZpY2VzIGNhbGwuXHJcbiAgICAgKiAgICAgICAgRm9yIGV4YW1wbGU6ICd0dXJib3NpdGUvY2hhaW4vY2hhaW4tc2VydmljZXMnXHJcbiAgICAgKiBAcGFyYW0gc2VydmljZXMgLSBBbiBhcnJheSBvZiBvYmplY3RzLCB3ZXJlIGVhY2ggb2JqZWN0IGNvbnRhaW5zIGEgdmFsaWQgc3RydWN0dXJlIGZvciB0aGUgY2hhaW4gc2VydmljZXMgY2FsbC4gXHJcbiAgICAgKiAgICAgICAgVG9rZW4gcGFyYW1ldGVyIGlzIG5vdCBuZWNlc3NhcnksIGl0IGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWRcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBkZWZpbmluZyBzZXZlcmFsIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0OlxyXG4gICAgICogICAgICAgIGJ1c3lTdGF0ZTogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYnVzeSBzdGF0ZSB0byBsb2NrIHVzZXIgaW50ZXJhY3Rpb24gd2hpbGUgcGVyZm9ybWluZyB0aGUgaHR0cCBjYWxscy4gRW5hYmxlZCBieSBkZWZhdWx0XHJcbiAgICAgKiAgICAgICAgaGFuZGxlRXJyb3JzOiBFbmFibGVkIGJ5IGRlZmF1bHQuIElmIHNldCB0byB0cnVlLCBhbiBlcnJvciBkaWFsb2cgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNob3duIHdoZW4gdGhlIGNhbGwgZmFpbHMuXHJcbiAgICAgKiAgICAgICAgSWYgc2V0IHRvIGZhbHNlLCB0aGUgcHJvbWlzZSB3aWxsIGdlbmVyYXRlIGEgcmVqZWN0IGVycm9yIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGJ5IG91ciBjb2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkYXRhIGNvcnJlY3RseSBwYXJzZWQgaWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwgb3IgcmVqZWN0cyBcclxuICAgICAqICAgICAgICAgIHdpdGggYW4gZXJyb3IgKGNvbnRhaW5pbmcgYWxsIHRoZSBlcnJvciByZXNwb25zZSBkZXRhaWxzKSBpZiB0aGUgcmVxdWVzdCBmYWlscy5cclxuICAgICAqL1xyXG4gICAgY2FsbENoYWluKGFwaVBhdGg6c3RyaW5nLCBzZXJ2aWNlczp7fVtdLCBvcHRpb25zOiB7YnVzeVN0YXRlPzpib29sZWFuLCBoYW5kbGVFcnJvcnM/OmJvb2xlYW59ID0ge30pe1xyXG4gICAgXHJcbiAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3Igbm9uIHNwZWNpZmllZCBwcm9wZXJ0aWVzXHJcbiAgICAgICAgb3B0aW9ucy5idXN5U3RhdGUgPSBvcHRpb25zLmJ1c3lTdGF0ZSA/PyB0cnVlO1xyXG4gICAgICAgIG9wdGlvbnMuaGFuZGxlRXJyb3JzID0gb3B0aW9ucy5oYW5kbGVFcnJvcnMgPz8gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICBpZihvcHRpb25zLmJ1c3lTdGF0ZSl7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFkZE1vZGFsQnVzeVN0YXRlKCk7IFxyXG4gICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZToocjphbnkpID0+IGFueSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEhUVFBNYW5hZ2VyUG9zdFJlcXVlc3QoYXBpUGF0aCwgSFRUUE1hbmFnZXJQb3N0UmVxdWVzdC5KU09OKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuaWdub3JlR2xvYmFsUG9zdFBhcmFtcyA9IHRydWU7ICAgICAgXHJcblxyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtZXRlcnMgPSB7IHNlcnZpY2VzOiBzZXJ2aWNlcyB9O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5zdWNjZXNzQ2FsbGJhY2sgPSAocmVzcG9uc2U6YW55W10pID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfTsgICAgICBcclxuXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JDYWxsYmFjayA9IChlcnJvck1zZywgZXJyb3JDb2RlLCByZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuaGFuZGxlRXJyb3JzKXtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yRGlhbG9nKGVycm9yTXNnLCBlcnJvckNvZGUsIHJlc3BvbnNlKTsgICAgXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3JNc2cgKyAnICcgKyBlcnJvckNvZGUgKyAnICcgKyByZXNwb25zZSkpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZmluYWxseUNhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmJ1c3lTdGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnJlbW92ZU1vZGFsQnVzeVN0YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXggbWV0aG9kIHRvIHNob3cgYW4gZXJyb3IgZGlhbG9nIHdoZW4gYSByZXF1ZXN0IGZhaWxzIGFuZCBlcnJvciBoYW5kbGluZyBpcyBlbmFibGVkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2hvd0Vycm9yRGlhbG9nKGVycm9yTXNnOnN0cmluZywgZXJyb3JDb2RlOm51bWJlciwgcmVzcG9uc2U6YW55KXtcclxuICAgICAgICBcclxuICAgICAgICBlcnJvck1zZyA9IGVycm9yTXNnICsgJ1xcblxcbicgKyByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIGlmKFN0cmluZ1V0aWxzLmlzRW1wdHkoZXJyb3JNc2cpKXtcclxuICAgICAgICBcclxuICAgICAgICAgICAgZXJyb3JNc2cgPSAnVW5rbm93biBlcnJvci4gTWFrZSBzdXJlIEludGVybmV0IGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlJzsgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkRGlhbG9nKERpYWxvZ0Vycm9yQ29tcG9uZW50LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDonNTB2dycsXHJcbiAgICAgICAgICAgICAgICB0ZXh0czogWydFcnJvcjogJyArIGVycm9yQ29kZSwgZXJyb3JNc2ddLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogWydPayddXHJcbiAgICAgICAgICAgIH0pOyBcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFBlcmZvcm0gdGhlIGxvZ291dCBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgdXNlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBkZWZpbmluZyBzZXZlcmFsIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0OlxyXG4gICAgICogICAgICAgIGhhbmRsZUVycm9yczogRW5hYmxlZCBieSBkZWZhdWx0LiBJZiBzZXQgdG8gdHJ1ZSwgYW4gZXJyb3IgZGlhbG9nIHdpbGwgYmUgYXV0b21hdGljYWxseSBzaG93biB3aGVuIHRoZSBjYWxsIGZhaWxzLlxyXG4gICAgICogICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlIHByb21pc2Ugd2lsbCBnZW5lcmF0ZSBhIHJlamVjdCBlcnJvciB0aGF0IG11c3QgYmUgaGFuZGxlZCBieSBvdXIgY29kZS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgY29ycmVjdGx5IGlmIHRoZSBsb2dvdXQgaXMgY29ycmVjdCwgb3IgcmVqZWN0cyB3aXRoIGFuIGVycm9yIChjb250YWluaW5nIGFsbCB0aGUgZXJyb3IgXHJcbiAgICAgKiAgICAgICAgICByZXNwb25zZSBkZXRhaWxzKSBpZiB0aGUgcmVxdWVzdCBmYWlscy5cclxuICAgICAqL1xyXG4gICAgbG9nb3V0KG9wdGlvbnM6IHtoYW5kbGVFcnJvcnM/OmJvb2xlYW59ID0ge30pIHtcclxuICAgICAgICBcclxuICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBub24gc3BlY2lmaWVkIHByb3BlcnRpZXNcclxuICAgICAgICBvcHRpb25zLmhhbmRsZUVycm9ycyA9IG9wdGlvbnMuaGFuZGxlRXJyb3JzID8/IHRydWU7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkTW9kYWxCdXN5U3RhdGUoKTsgXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IEhUVFBNYW5hZ2VyUG9zdFJlcXVlc3QodGhpcy5sb2dPdXRTZXJ2aWNlVVJJKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVxdWVzdC5wYXJhbWV0ZXJzID0geyB0b2tlbjogdGhpcy5fdG9rZW4gfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3Quc3VjY2Vzc0NhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyVXNlckFuZFRva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcXVlc3QuZXJyb3JDYWxsYmFjayA9IChlcnJvck1zZywgZXJyb3JDb2RlLCByZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmhhbmRsZUVycm9ycyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3JEaWFsb2coZXJyb3JNc2csIGVycm9yQ29kZSwgcmVzcG9uc2UpOyAgICBcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvck1zZyArICcgJyArIGVycm9yQ29kZSArICcgJyArIHJlc3BvbnNlKSk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXF1ZXN0LmZpbmFsbHlDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5yZW1vdmVNb2RhbEJ1c3lTdGF0ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLmV4ZWN1dGUocmVxdWVzdCk7XHJcbiAgICAgICAgfSk7IFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQXV4IG1ldGhvdCB0byBjbGVhciBhbGwgdGhlIGN1cnJlbnRseSBsb2dnZWQgdXNlciBkYXRhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2NsZWFyVXNlckFuZFRva2VuKCl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fdXNlck5hbWUgPSAnJztcclxuICAgICAgICB0aGlzLl9wYXNzd29yZCA9ICcnO1xyXG4gICAgICAgIHRoaXMuX2lzTG9nZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdG9rZW4gPSAnJztcclxuICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyLnNldEdsb2JhbFBvc3RQYXJhbSgndG9rZW4nLCAnLScpOyBcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TurboGUI is A library that helps with the most common and generic UI elements and functionalities
|
|
3
|
-
*
|
|
4
|
-
* Website : -> http://www.turbogui.org
|
|
5
|
-
* License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
|
|
6
|
-
* License Url : -> http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
* CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Sometimes it is necessary to apply some kind of buffer to the user input for certain operations that may be executed
|
|
11
|
-
* several times but we need to capture only the latest of them into a certain period of time. This class does exactly this:
|
|
12
|
-
* we can queue as many times as we want a specific method call and only the last one will be executed under a defined window of time.
|
|
13
|
-
* So for example if a user types keys on an input, we can buffer it for x seconds and perform a request only with the last of its changes.
|
|
14
|
-
* Lots of other UI interaction usages may be interesting with this class.
|
|
15
|
-
*/
|
|
16
|
-
export class DelayedMethodCallManager {
|
|
17
|
-
/**
|
|
18
|
-
* Sometimes it is necessary to apply some kind of buffer to the user input for certain operations that may be executed
|
|
19
|
-
* several times but we need to capture only the latest of them into a certain period of time. This class does exactly this:
|
|
20
|
-
* we can queue as many times as we want a specific method call and only the last one will be executed under a defined window of time.
|
|
21
|
-
* So for example if a user types keys on an input, we can buffer it for x seconds and perform a request only with the last of its changes.
|
|
22
|
-
* Lots of other UI interaction usages may be interesting with this class.
|
|
23
|
-
*
|
|
24
|
-
* @param delay Amount of time to wait before executing the operations . Defaults to 1000 miliseconds.
|
|
25
|
-
*/
|
|
26
|
-
constructor(delay = 1000) {
|
|
27
|
-
this.delay = delay;
|
|
28
|
-
this._functionsToExecute = [];
|
|
29
|
-
this._timerIsRunning = false;
|
|
30
|
-
this._setTimeoutHandler = null;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Add a method to be called once the delay time is finished.
|
|
34
|
-
* Every time a new call to queue is performed, the delay timer is restarted. When the delay time finishes, only the
|
|
35
|
-
* last of the methods that have been pushed by call() will be executed.
|
|
36
|
-
*
|
|
37
|
-
* Use it to queue several user input operations that should be called only once in a period of time, while waiting
|
|
38
|
-
* for the user to finish his input.
|
|
39
|
-
*
|
|
40
|
-
* @param method The function that will be queued for execution after the delay time has passed
|
|
41
|
-
*/
|
|
42
|
-
queue(method) {
|
|
43
|
-
this._functionsToExecute.push(method);
|
|
44
|
-
if (this._timerIsRunning) {
|
|
45
|
-
clearTimeout(this._setTimeoutHandler);
|
|
46
|
-
}
|
|
47
|
-
this._timerIsRunning = true;
|
|
48
|
-
this._setTimeoutHandler = setTimeout(() => { this.run(); }, this.delay);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Abort all methods that may have been pushed to this class and are waiting to be executed, so none of them
|
|
52
|
-
* is executed when the delay time finishes. Basically everything is cleared and stoped when this method is called.
|
|
53
|
-
*/
|
|
54
|
-
cancel() {
|
|
55
|
-
if (this._setTimeoutHandler !== null) {
|
|
56
|
-
clearTimeout(this._setTimeoutHandler);
|
|
57
|
-
}
|
|
58
|
-
this._functionsToExecute = [];
|
|
59
|
-
this._timerIsRunning = false;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Auxiliary function that performs the call to the latest queued method
|
|
63
|
-
*/
|
|
64
|
-
run() {
|
|
65
|
-
this._functionsToExecute.pop()();
|
|
66
|
-
this._functionsToExecute = [];
|
|
67
|
-
this._timerIsRunning = false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVsYXllZE1ldGhvZENhbGxNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9tYW5hZ2Vycy9EZWxheWVkTWV0aG9kQ2FsbE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyx3QkFBd0I7SUFZakM7Ozs7Ozs7O09BUUc7SUFDSCxZQUFvQixRQUFRLElBQUk7UUFBWixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBbEJ4Qix3QkFBbUIsR0FBZSxFQUFFLENBQUM7UUFHckMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsdUJBQWtCLEdBQVEsSUFBSSxDQUFDO0lBY3ZDLENBQUM7SUFHRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsTUFBa0I7UUFFcEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QyxJQUFHLElBQUksQ0FBQyxlQUFlLEVBQUM7WUFFcEIsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFHRDs7O09BR0c7SUFDSCxNQUFNO1FBRUYsSUFBRyxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxFQUFDO1lBRWhDLFlBQVksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUN6QztRQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUdEOztPQUVHO0lBQ0ssR0FBRztRQUVOLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQWlCLEVBQUUsQ0FBQztRQUVqRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHNvbWUga2luZCBvZiBidWZmZXIgdG8gdGhlIHVzZXIgaW5wdXQgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBleGVjdXRlZFxyXG4gKiBzZXZlcmFsIHRpbWVzIGJ1dCB3ZSBuZWVkIHRvIGNhcHR1cmUgb25seSB0aGUgbGF0ZXN0IG9mIHRoZW0gaW50byBhIGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUuIFRoaXMgY2xhc3MgZG9lcyBleGFjdGx5IHRoaXM6XHJcbiAqIHdlIGNhbiBxdWV1ZSBhcyBtYW55IHRpbWVzIGFzIHdlIHdhbnQgYSBzcGVjaWZpYyBtZXRob2QgY2FsbCBhbmQgb25seSB0aGUgbGFzdCBvbmUgd2lsbCBiZSBleGVjdXRlZCB1bmRlciBhIGRlZmluZWQgd2luZG93IG9mIHRpbWUuXHJcbiAqIFNvIGZvciBleGFtcGxlIGlmIGEgdXNlciB0eXBlcyBrZXlzIG9uIGFuIGlucHV0LCB3ZSBjYW4gYnVmZmVyIGl0IGZvciB4IHNlY29uZHMgYW5kIHBlcmZvcm0gYSByZXF1ZXN0IG9ubHkgd2l0aCB0aGUgbGFzdCBvZiBpdHMgY2hhbmdlcy5cclxuICogTG90cyBvZiBvdGhlciBVSSBpbnRlcmFjdGlvbiB1c2FnZXMgbWF5IGJlIGludGVyZXN0aW5nIHdpdGggdGhpcyBjbGFzcy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBEZWxheWVkTWV0aG9kQ2FsbE1hbmFnZXJ7XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2Z1bmN0aW9uc1RvRXhlY3V0ZTogRnVuY3Rpb25bXSA9IFtdO1xyXG5cclxuXHJcbiAgICBwcml2YXRlIF90aW1lcklzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICBcclxuICAgIHByaXZhdGUgX3NldFRpbWVvdXRIYW5kbGVyOiBhbnkgPSBudWxsO1xyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHNvbWUga2luZCBvZiBidWZmZXIgdG8gdGhlIHVzZXIgaW5wdXQgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBleGVjdXRlZFxyXG4gICAgICogc2V2ZXJhbCB0aW1lcyBidXQgd2UgbmVlZCB0byBjYXB0dXJlIG9ubHkgdGhlIGxhdGVzdCBvZiB0aGVtIGludG8gYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lLiBUaGlzIGNsYXNzIGRvZXMgZXhhY3RseSB0aGlzOlxyXG4gICAgICogd2UgY2FuIHF1ZXVlIGFzIG1hbnkgdGltZXMgYXMgd2Ugd2FudCBhIHNwZWNpZmljIG1ldGhvZCBjYWxsIGFuZCBvbmx5IHRoZSBsYXN0IG9uZSB3aWxsIGJlIGV4ZWN1dGVkIHVuZGVyIGEgZGVmaW5lZCB3aW5kb3cgb2YgdGltZS5cclxuICAgICAqIFNvIGZvciBleGFtcGxlIGlmIGEgdXNlciB0eXBlcyBrZXlzIG9uIGFuIGlucHV0LCB3ZSBjYW4gYnVmZmVyIGl0IGZvciB4IHNlY29uZHMgYW5kIHBlcmZvcm0gYSByZXF1ZXN0IG9ubHkgd2l0aCB0aGUgbGFzdCBvZiBpdHMgY2hhbmdlcy5cclxuICAgICAqIExvdHMgb2Ygb3RoZXIgVUkgaW50ZXJhY3Rpb24gdXNhZ2VzIG1heSBiZSBpbnRlcmVzdGluZyB3aXRoIHRoaXMgY2xhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRlbGF5IEFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9ucyAuIERlZmF1bHRzIHRvIDEwMDAgbWlsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVsYXkgPSAxMDAwKSB7XHJcbiAgICAgICBcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIG1ldGhvZCB0byBiZSBjYWxsZWQgb25jZSB0aGUgZGVsYXkgdGltZSBpcyBmaW5pc2hlZC5cclxuICAgICAqIEV2ZXJ5IHRpbWUgYSBuZXcgY2FsbCB0byBxdWV1ZSBpcyBwZXJmb3JtZWQsIHRoZSBkZWxheSB0aW1lciBpcyByZXN0YXJ0ZWQuIFdoZW4gdGhlIGRlbGF5IHRpbWUgZmluaXNoZXMsIG9ubHkgdGhlXHJcbiAgICAgKiBsYXN0IG9mIHRoZSBtZXRob2RzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBieSBjYWxsKCkgd2lsbCBiZSBleGVjdXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBVc2UgaXQgdG8gcXVldWUgc2V2ZXJhbCB1c2VyIGlucHV0IG9wZXJhdGlvbnMgdGhhdCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBpbiBhIHBlcmlvZCBvZiB0aW1lLCB3aGlsZSB3YWl0aW5nXHJcbiAgICAgKiBmb3IgdGhlIHVzZXIgdG8gZmluaXNoIGhpcyBpbnB1dC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcXVldWVkIGZvciBleGVjdXRpb24gYWZ0ZXIgdGhlIGRlbGF5IHRpbWUgaGFzIHBhc3NlZFxyXG4gICAgICovXHJcbiAgICBxdWV1ZShtZXRob2Q6ICgpID0+IHZvaWQpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uc1RvRXhlY3V0ZS5wdXNoKG1ldGhvZCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYodGhpcy5fdGltZXJJc1J1bm5pbmcpe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NldFRpbWVvdXRIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3RpbWVySXNSdW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fc2V0VGltZW91dEhhbmRsZXIgPSBzZXRUaW1lb3V0KCgpID0+IHt0aGlzLnJ1bigpIH0sIHRoaXMuZGVsYXkpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQWJvcnQgYWxsIG1ldGhvZHMgdGhhdCBtYXkgaGF2ZSBiZWVuIHB1c2hlZCB0byB0aGlzIGNsYXNzIGFuZCBhcmUgd2FpdGluZyB0byBiZSBleGVjdXRlZCwgc28gbm9uZSBvZiB0aGVtXHJcbiAgICAgKiBpcyBleGVjdXRlZCB3aGVuIHRoZSBkZWxheSB0aW1lIGZpbmlzaGVzLiBCYXNpY2FsbHkgZXZlcnl0aGluZyBpcyBjbGVhcmVkIGFuZCBzdG9wZWQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXHJcbiAgICAgKi9cclxuICAgIGNhbmNlbCgpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKHRoaXMuX3NldFRpbWVvdXRIYW5kbGVyICE9PSBudWxsKXtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZXRUaW1lb3V0SGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uc1RvRXhlY3V0ZSA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX3RpbWVySXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBBdXhpbGlhcnkgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0aGUgY2FsbCB0byB0aGUgbGF0ZXN0IHF1ZXVlZCBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBydW4oKXtcclxuICAgICAgICBcclxuICAgICAgICAodGhpcy5fZnVuY3Rpb25zVG9FeGVjdXRlLnBvcCgpIGFzICgpID0+IHZvaWQpKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fZnVuY3Rpb25zVG9FeGVjdXRlID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fdGltZXJJc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TurboGUI is A library that helps with the most common and generic UI elements and functionalities
|
|
3
|
-
*
|
|
4
|
-
* Website : -> http://www.turbogui.org
|
|
5
|
-
* License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
|
|
6
|
-
* License Url : -> http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
* CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Defines the data that is contained inside a GUI notification
|
|
11
|
-
*/
|
|
12
|
-
export class GUINotification {
|
|
13
|
-
constructor(name, type = '', data = null) {
|
|
14
|
-
/**
|
|
15
|
-
* The name for this notification
|
|
16
|
-
*/
|
|
17
|
-
this.name = '';
|
|
18
|
-
/**
|
|
19
|
-
* An optional type to categorize this notification in case the name is not enough
|
|
20
|
-
* to uniquely identify it
|
|
21
|
-
*/
|
|
22
|
-
this.type = '';
|
|
23
|
-
/**
|
|
24
|
-
* Additional data to send with the notification
|
|
25
|
-
*/
|
|
26
|
-
this.data = null;
|
|
27
|
-
this.name = name;
|
|
28
|
-
this.type = type;
|
|
29
|
-
this.data = data;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR1VJTm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9tb2RlbC9jbGFzc2VzL0dVSU5vdGlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUg7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUd4QixZQUFZLElBQVksRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLE9BQVksSUFBSTtRQVFyRDs7V0FFRztRQUNILFNBQUksR0FBRyxFQUFFLENBQUM7UUFHVjs7O1dBR0c7UUFDSCxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBR1Y7O1dBRUc7UUFDSCxTQUFJLEdBQVEsSUFBSSxDQUFDO1FBdEJiLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7Q0FvQkoiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG4vKipcclxuICogRGVmaW5lcyB0aGUgZGF0YSB0aGF0IGlzIGNvbnRhaW5lZCBpbnNpZGUgYSBHVUkgbm90aWZpY2F0aW9uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR1VJTm90aWZpY2F0aW9uIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlID0gJycsIGRhdGE6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgZm9yIHRoaXMgbm90aWZpY2F0aW9uXHJcbiAgICAgKi9cclxuICAgIG5hbWUgPSAnJztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBvcHRpb25hbCB0eXBlIHRvIGNhdGVnb3JpemUgdGhpcyBub3RpZmljYXRpb24gaW4gY2FzZSB0aGUgbmFtZSBpcyBub3QgZW5vdWdoXHJcbiAgICAgKiB0byB1bmlxdWVseSBpZGVudGlmeSBpdFxyXG4gICAgICovXHJcbiAgICB0eXBlID0gJyc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkaXRpb25hbCBkYXRhIHRvIHNlbmQgd2l0aCB0aGUgbm90aWZpY2F0aW9uXHJcbiAgICAgKi9cclxuICAgIGRhdGE6IGFueSA9IG51bGw7XHJcbn1cclxuIl19
|