@wavemaker/app-ng-runtime 11.6.0-next.26279 → 11.6.0-next.26282

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.
@@ -597,12 +597,12 @@
597
597
  * @param variable: the variable that is called from user action
598
598
  * @param requestParams object consisting the info to construct the XHR request for the service
599
599
  */
600
- const downloadThroughIframe = (requestParams, success) => {
600
+ const downloadThroughIframe = (requestParams, success, dataBinding) => {
601
601
  // Todo: SHubham: URL contains '//' in between which should be handled at the URL formation only
602
602
  if (requestParams.url[1] === '/' && requestParams.url[2] === '/') {
603
603
  requestParams.url = requestParams.url.slice(0, 1) + requestParams.url.slice(2);
604
604
  }
605
- let iFrameElement, formEl, paramElement, queryParams = '';
605
+ let iFrameElement, formEl, paramElement, queryParams = '', data;
606
606
  const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = _.get(requestParams.headers, CONTENT_TYPE), params = _.pickBy(requestParams.headers, function (val, key) { return key !== CONTENT_TYPE; });
607
607
  /* Todo: shubham : define getService method
608
608
  WS_CONSTANTS = getService('WS_CONSTANTS');*/
@@ -617,7 +617,7 @@
617
617
  'target': iFrameElement.attr('name'),
618
618
  'action': url,
619
619
  'method': requestParams.method,
620
- 'enctype': encType
620
+ 'enctype': !(_.isEmpty(requestParams.data) && _.isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
621
621
  });
622
622
  /* process query params, append a hidden input element in the form against each param */
623
623
  queryParams += url.indexOf('?') !== -1 ? url.substring(url.indexOf('?') + 1) : '';
@@ -626,8 +626,14 @@
626
626
  if (_.includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, _.toUpper(requestParams.method))) {
627
627
  setParamsFromURL(queryParams, params); // Set params for URL query params
628
628
  }
629
- setParamsFromURL(requestParams.data, params); // Set params for request data
630
- _.forEach(params, function (val, key) {
629
+ if (!_.isEmpty(requestParams.data)) {
630
+ setParamsFromURL(requestParams.data, params); // Set params for request data
631
+ data = params;
632
+ }
633
+ else {
634
+ data = dataBinding;
635
+ }
636
+ _.forEach(data, function (val, key) {
631
637
  paramElement = $('<input type="hidden">');
632
638
  paramElement.attr({
633
639
  'name': key,
@@ -900,7 +906,7 @@
900
906
  * @param success success callback
901
907
  * @param error error callback
902
908
  */
903
- const simulateFileDownload = (requestParams, fileName, exportFormat, success, error) => {
909
+ const simulateFileDownload = (requestParams, fileName, exportFormat, success, error, dataBinding) => {
904
910
  /*success and error callbacks are executed incase of downloadThroughAnchor
905
911
  Due to technical limitation cannot be executed incase of iframe*/
906
912
  if (CONSTANTS.hasCordova) {
@@ -914,7 +920,7 @@
914
920
  downloadThroughAnchor(requestParams, success, error);
915
921
  }
916
922
  else {
917
- downloadThroughIframe(requestParams, success);
923
+ downloadThroughIframe(requestParams, success, dataBinding);
918
924
  }
919
925
  };
920
926
  /**
@@ -263,12 +263,12 @@ const setParamsFromURL = (queryParams, params) => {
263
263
  * @param variable: the variable that is called from user action
264
264
  * @param requestParams object consisting the info to construct the XHR request for the service
265
265
  */
266
- const downloadThroughIframe = (requestParams, success) => {
266
+ const downloadThroughIframe = (requestParams, success, dataBinding) => {
267
267
  // Todo: SHubham: URL contains '//' in between which should be handled at the URL formation only
268
268
  if (requestParams.url[1] === '/' && requestParams.url[2] === '/') {
269
269
  requestParams.url = requestParams.url.slice(0, 1) + requestParams.url.slice(2);
270
270
  }
271
- let iFrameElement, formEl, paramElement, queryParams = '';
271
+ let iFrameElement, formEl, paramElement, queryParams = '', data;
272
272
  const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = _.get(requestParams.headers, CONTENT_TYPE), params = _.pickBy(requestParams.headers, function (val, key) { return key !== CONTENT_TYPE; });
273
273
  /* Todo: shubham : define getService method
274
274
  WS_CONSTANTS = getService('WS_CONSTANTS');*/
@@ -283,7 +283,7 @@ const downloadThroughIframe = (requestParams, success) => {
283
283
  'target': iFrameElement.attr('name'),
284
284
  'action': url,
285
285
  'method': requestParams.method,
286
- 'enctype': encType
286
+ 'enctype': !(_.isEmpty(requestParams.data) && _.isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
287
287
  });
288
288
  /* process query params, append a hidden input element in the form against each param */
289
289
  queryParams += url.indexOf('?') !== -1 ? url.substring(url.indexOf('?') + 1) : '';
@@ -292,8 +292,14 @@ const downloadThroughIframe = (requestParams, success) => {
292
292
  if (_.includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, _.toUpper(requestParams.method))) {
293
293
  setParamsFromURL(queryParams, params); // Set params for URL query params
294
294
  }
295
- setParamsFromURL(requestParams.data, params); // Set params for request data
296
- _.forEach(params, function (val, key) {
295
+ if (!_.isEmpty(requestParams.data)) {
296
+ setParamsFromURL(requestParams.data, params); // Set params for request data
297
+ data = params;
298
+ }
299
+ else {
300
+ data = dataBinding;
301
+ }
302
+ _.forEach(data, function (val, key) {
297
303
  paramElement = $('<input type="hidden">');
298
304
  paramElement.attr({
299
305
  'name': key,
@@ -589,7 +595,7 @@ export const processBinding = (variable, context, bindSource, bindTarget) => {
589
595
  * @param success success callback
590
596
  * @param error error callback
591
597
  */
592
- export const simulateFileDownload = (requestParams, fileName, exportFormat, success, error) => {
598
+ export const simulateFileDownload = (requestParams, fileName, exportFormat, success, error, dataBinding) => {
593
599
  /*success and error callbacks are executed incase of downloadThroughAnchor
594
600
  Due to technical limitation cannot be executed incase of iframe*/
595
601
  if (CONSTANTS.hasCordova) {
@@ -603,7 +609,7 @@ export const simulateFileDownload = (requestParams, fileName, exportFormat, succ
603
609
  downloadThroughAnchor(requestParams, success, error);
604
610
  }
605
611
  else {
606
- downloadThroughIframe(requestParams, success);
612
+ downloadThroughIframe(requestParams, success, dataBinding);
607
613
  }
608
614
  };
609
615
  /**
@@ -787,4 +793,4 @@ export const decodeData = (responseContent) => {
787
793
  function htmlDecode(input) {
788
794
  return he.unescape(input);
789
795
  }
790
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFM0osT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUlsRyxNQUFNLGNBQWMsR0FBSyxFQUFFLE9BQU8sRUFBRyxPQUFPLEVBQUUsS0FBSyxFQUFHLE1BQU0sRUFBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUN0QixNQUFNLENBQUMsSUFBSSxXQUFXLENBQUM7QUFDdkIsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDO0FBQzNCLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDO0FBQzdCLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUN6QixNQUFNLENBQUMsSUFBSSxjQUFjLENBQUM7QUFDMUIsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQztBQUMzQixNQUFNLENBQUMsSUFBSSxhQUFhLENBQUM7QUFFekIsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLEVBQ3pDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLEVBQ2hDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBRXZCLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzdCLElBQUksV0FBVyxFQUNYLFFBQVEsR0FBRyxDQUFDLENB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QWUsQ0FBQztLQUMxQjtBQUNMLENBQUMsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDckIsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0VHlwZSwgRGF0YVR5cGUsIERFRkFVTFRfRk9STUFUUywgJHBhcnNlRXZlbnQsICR3YXRjaCwgZmluZFZhbHVlT2YsIGdldEJsb2IsIGdldENsb25lZE9iamVjdCwgc3RyaW5nU3RhcnRzV2l0aCwgdHJpZ2dlckZuIH0gZnJvbSAnQHdtL2NvcmUnO1xuXG5pbXBvcnQgeyBDT05TVEFOVFMsIFZBUklBQkxFX0NPTlNUQU5UUywgV1NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3ZhcmlhYmxlcy5jb25zdGFudHMnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdywgXywgJCwgbW9tZW50LCBoZTtcblxuY29uc3QgZXhwb3J0VHlwZXNNYXAgICA9IHsgJ0VYQ0VMJyA6ICcueGxzeCcsICdDU1YnIDogJy5jc3YnfTtcblxuZXhwb3J0IGxldCBhcHBNYW5hZ2VyO1xuZXhwb3J0IGxldCBodHRwU2VydmljZTtcbmV4cG9ydCBsZXQgbWV0YWRhdGFTZXJ2aWNlO1xuZXhwb3J0IGxldCBuYXZpZ2F0aW9uU2VydmljZTtcbmV4cG9ydCBsZXQgcm91dGVyU2VydmljZTtcbmV4cG9ydCBsZXQgdG9hc3RlclNlcnZpY2U7XG5leHBvcnQgbGV0IG9hdXRoU2VydmljZTtcbmV4cG9ydCBsZXQgc2VjdXJpdHlTZXJ2aWNlO1xuZXhwb3J0IGxldCBkaWFsb2dTZXJ2aWNlO1xuXG5jb25zdCBET1RfRVhQUl9SRVggPSAvXlxcWyhcInwnKVtcXHdcXFddKihcXDEpXFxdJC8sXG4gICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAgPSBuZXcgTWFwKCksXG4gICAgdGltZXJzID0gbmV3IE1hcCgpO1xuXG5jb25zdCBfaW52b2tlID0gKHZhcmlhYmxlLCBvcCkgPT4ge1xuICAgIGxldCBkZWJvdW5jZWRGbixcbiAgICAgICAgY2FuY2VsRm4gPSBfLm5vb3AsXG4gICAgICAgIHJldFZhbDtcbiAgICBpZiAodGltZXJzLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgY2FuY2VsRm4gPSB0aW1lcnMuZ2V0KHZhcmlhYmxlKS5jYW5jZWw7XG4gICAgfVxuICAgIGNhbmNlbEZuKCk7XG4gICAgZGVib3VuY2VkRm4gPSBfLmRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0VmFsID0gdmFyaWFibGVbb3BdKCk7XG4gICAgICAgIC8vIGhhbmRsZSBwcm9taXNlcyB0byBhdm9pZCB1bmNhdWdodCBwcm9taXNlIGVycm9ycyBpbiBjb25zb2xlXG4gICAgICAgIGlmIChyZXRWYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXRWYWwuY2F0Y2goXy5ub29wKTtcbiAgICAgICAgfVxuICAgIH0sIDEwMCk7XG4gICAgdGltZXJzLnNldCh2YXJpYWJsZSwgZGVib3VuY2VkRm4pO1xuICAgIGRlYm91bmNlZEZuKCk7XG59O1xuXG5jb25zdCBwcm9jZXNzVmFyaWFibGVQb3N0QmluZFVwZGF0ZSA9IChub2RlTmFtZSwgbm9kZVZhbCwgbm9kZVR5cGUsIHZhcmlhYmxlLCBub1VwZGF0ZSkgPT4ge1xuICAgIHN3aXRjaCAodmFyaWFibGUuY2F0ZWdvcnkpIHtcbiAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuQ0FURUdPUlkuTElWRTpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5vcGVyYXRpb24gPT09ICdyZWFkJykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZVZhbCwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5maWx0ZXJGaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1tub2RlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBub2RlVmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogbm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGUubGlzdFJlY29yZHMpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBfaW52b2tlKHZhcmlhYmxlLCAnbGlzdFJlY29yZHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbnB1dEZpZWxkcyA9IG5vZGVWYWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuaW5wdXRGaWVsZHNbbm9kZU5hbWVdID0gbm9kZVZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGVbdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCddKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5DUlVEOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvblR5cGUgPT09ICdsaXN0JyAmJiB2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5TRVJWSUNFOlxuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MT0dJTjpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5ERVZJQ0U6XG4gICAgICAgICAgICB2YXJpYWJsZVtub2RlTmFtZV0gPSBub2RlVmFsO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIV8uaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgXy5pc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldERlcGVuZGVuY3kgPSAodHlwZTogc3RyaW5nLCByZWY6IGFueSkgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdhcHBNYW5hZ2VyJzpcbiAgICAgICAgICAgIGFwcE1hbmFnZXIgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaHR0cCc6XG4gICAgICAgICAgICBodHRwU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICBtZXRhZGF0YVNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmF2aWdhdGlvblNlcnZpY2UnOlxuICAgICAgICAgICAgbmF2aWdhdGlvblNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncm91dGVyJzpcbiAgICAgICAgICAgIHJvdXRlclNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9hc3Rlcic6XG4gICAgICAgICAgICB0b2FzdGVyU2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb0F1dGgnOlxuICAgICAgICAgICAgb2F1dGhTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWN1cml0eSc6XG4gICAgICAgICAgICBzZWN1cml0eVNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICAgICAgICBkaWFsb2dTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYXRlQ2FsbGJhY2sgPSAodHlwZTogc3RyaW5nLCB2YXJpYWJsZTogYW55LCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnksIHNraXBEZWZhdWx0Tm90aWZpY2F0aW9uPzogYm9vbGVhbikgPT4ge1xuXG4gICAgLypjaGVja2luZyBpZiBldmVudCBpcyBhdmFpbGFibGUgYW5kIHZhcmlhYmxlIGhhcyBldmVudCBwcm9wZXJ0eSBhbmQgdmFyaWFibGUgZXZlbnQgcHJvcGVydHkgYm91bmQgdG8gZnVuY3Rpb24qL1xuICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gdmFyaWFibGVbdHlwZV0sXG4gICAgICAgIGNhbGxCYWNrU2NvcGUgPSB2YXJpYWJsZS5fY29udGV4dDtcbiAgICBsZXQgZXJyb3JWYXJpYWJsZTtcbiAgICAvKipcbiAgICAgKiBGb3IgZXJyb3IgZXZlbnQ6XG4gICAgICogdHJpZ2dlciBhcHAgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAgICAgKiBpZiBubyBldmVudCBpcyBhc3NpZ25lZCwgdHJpZ2dlciBkZWZhdWx0IGFwcE5vdGlmaWNhdGlvbiB2YXJpYWJsZS5cbiAgICAgKi9cbiAgIGlmICh0eXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlQuRVJST1IgJiYgIXNraXBEZWZhdWx0Tm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGlmICghZXZlbnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIGlmIG5vIGV2ZW50IGFzc2lnbmVkLCBoYW5kbGUgdGhyb3VnaCBkZWZhdWx0IG5vdGlmaWNhdGlvbiB2YXJpYWJsZSAqL1xuICAgICAgICAgICAgZXJyb3JWYXJpYWJsZSA9IGNhbGxCYWNrU2NvcGUuQWN0aW9uc1tWQVJJQUJMRV9DT05TVEFOVFMuREVGQVVMVF9WQVIuTk9USUZJQ0FUSU9OXTtcbiAgICAgICAgICAgIGlmIChlcnJvclZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVycm9yVmFyaWFibGUuZ2V0TWVzc2FnZSgpIHx8IGRhdGE7XG4gICAgICAgICAgICAgICAgZGF0YSA9IF8uaXNTdHJpbmcoZGF0YSkgPyBkYXRhIDogJ0FuIGVycm9yIGhhcyBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGFwcCBsb2dzLic7XG4gICAgICAgICAgICAgICAgZXJyb3JWYXJpYWJsZS5pbnZva2UoeyAnbWVzc2FnZScgOiBkYXRhfSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRlbWl0KFwiaW52b2tlLXNlcnZpY2VcIiwgVkFSSUFCTEVfQ09OU1RBTlRTLkRFRkFVTFRfVkFSLk5PVElGSUNBVElPTiwge3Njb3BlOiBjYWxsQmFja1Njb3BlLCBtZXNzYWdlOiByZXNwb25zZX0pO1xuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE86IFtWaWJodV0sIGNoZWNrIHdoZXRoZXIgdG8gc3VwcG9ydCBsZWdhY3kgZXZlbnQgY2FsbGluZyBtZWNoYW5pc20gKGlkZWFsbHksIGl0IHNob3VsZCBoYXZlIGJlZW4gbWlncmF0ZWQpXG4gICAgY29uc3QgZm4gPSAkcGFyc2VFdmVudCh2YXJpYWJsZVt0eXBlXSk7XG4gICAgaWYgKHR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVC5CRUZPUkVfVVBEQVRFKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLkxpdmVWYXJpYWJsZScgJiYgdmFyaWFibGUub3BlcmF0aW9uID09PSAncmVhZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YUZpbHRlcjogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBpbnB1dERhdGE6IGRhdGEsIG9wdGlvbnM6IG9wdGlvbnN9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YTogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgIH1cbn07XG5cbmNvbnN0IHRyaWdnZXJPblRpbWVvdXQgPSAoc3VjY2VzcykgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0cmlnZ2VyRm4oc3VjY2Vzcyk7IH0sIDUwMCk7XG59O1xuXG5jb25zdCBkb3dubG9hZEZpbGVmcm9tUmVzcG9uc2UgPSAocmVzcG9uc2UsIGhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgLy8gY2hlY2sgZm9yIGEgZmlsZW5hbWVcbiAgICBsZXQgZmlsZW5hbWUgPSAnJyxcbiAgICAgICAgZmlsZW5hbWVSZWdleCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYmxvYixcbiAgICAgICAgVVJMLFxuICAgICAgICBkb3dubG9hZFVybCxcbiAgICAgICAgcG9wdXA7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xuICAgIGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XG4gICAgICAgIGZpbGVuYW1lUmVnZXggPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLztcbiAgICAgICAgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XG4gICAgICAgIGlmIChtYXRjaGVzICE9PSBudWxsICYmIG1hdGNoZXNbMV0pIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgIGJsb2IgPSBuZXcgQmxvYihbcmVzcG9uc2VdLCB7IHR5cGU6IHR5cGUgfSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gSUUgd29ya2Fyb3VuZCBmb3IgXCJIVE1MNzAwNzogT25lIG9yIG1vcmUgYmxvYiBVUkxzIHdlcmUgcmV2b2tlZCBieSBjbG9zaW5nIHRoZSBibG9iIGZvciB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4gVGhlc2UgVVJMcyB3aWxsIG5vIGxvbmdlciByZXNvbHZlIGFzIHRoZSBkYXRhIGJhY2tpbmcgdGhlIFVSTCBoYXMgYmVlbiBmcmVlZC5cIlxuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgdHJpZ2dlck9uVGltZW91dChzdWNjZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJGbihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBVUkwgICAgICAgICA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcbiAgICAgICAgZG93bmxvYWRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgICAgICAgLy8gdXNlIEhUTUw1IGFbZG93bmxvYWRdIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGZpbGVuYW1lXG4gICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGV0IHJlYWRlcjtcbiAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlYWRlci5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpO1xuICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IHRyaWdnZXJPblRpbWVvdXQuYmluZCh1bmRlZmluZWQsIHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IGRvd25sb2FkVXJsO1xuICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wdXAgPSB3aW5kb3cub3Blbihkb3dubG9hZFVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFVSTC5yZXZva2VPYmplY3RVUkwoZG93bmxvYWRVcmwpOyB9LCAxMDApOyAvLyBjbGVhbnVwXG4gICAgfVxufTtcblxuY29uc3QgZ2V0U2VydmljZSA9IChzZXJ2aWNlTmFtZSkgPT4ge1xuICAgIGlmICghc2VydmljZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmljZU5hbWU7XG4gICAgLy8gVG9kbzogU2h1YmhhbSwgdW5jb21tZW50IGJlbG93IGNvZGVcbiAgICAvKiAvISogZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHdoZXJlIG5nLWFwcCBpcyBkZWZpbmVkICohL1xuICAgICBsZXQgYXBwRWwgPSBXTS5lbGVtZW50KCdbaWQ9bmctYXBwXScpLCBpbmplY3RvcjtcbiAgICAgaWYgKGFwcEVsKSB7XG4gICAgIHRyeSB7XG4gICAgIGluamVjdG9yID0gYXBwRWwuaW5qZWN0b3IoKTsgLy8gZ2V0IHRoZSBhbmd1bGFyIGluamVjdG9yXG4gICAgIGlmIChpbmplY3Rvcikge1xuICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lKTsgLy8gcmV0dXJuIHRoZSBzZXJ2aWNlXG4gICAgIH1cbiAgICAgfSBjYXRjaCAoZSkge1xuICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICB9XG4gICAgIH0qL1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgdGhlIGZvcm0gZGF0YSBwYXJhbXMgZnJvbSB0aGUgVVJMXG4gKiBAcGFyYW0gcXVlcnlQYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqL1xuY29uc3Qgc2V0UGFyYW1zRnJvbVVSTCA9IChxdWVyeVBhcmFtcywgcGFyYW1zKSA9PiB7XG4gICAgcXVlcnlQYXJhbXMgPSBfLnNwbGl0KHF1ZXJ5UGFyYW1zLCAnJicpO1xuICAgIF8uZm9yRWFjaChxdWVyeVBhcmFtcywgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgIHBhcmFtID0gXy5zcGxpdChwYXJhbSwgJz0nKTtcbiAgICAgICAgcGFyYW1zW3BhcmFtWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChfLmpvaW4oXy5zbGljZShwYXJhbSwgMSksICc9JykpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBbVG9kbzogU2h1YmhhbV0sIEltcGxlbWVudCBEb3dubG9hZCB0aHJvdWdoIEkgZnJhbWVcbiAqIFNpbXVsYXRlcyBmaWxlIGRvd25sb2FkIGluIGFuIGFwcCB0aHJvdWdoIGNyZWF0aW5nIGFuZCBzdWJtaXR0aW5nIGEgaGlkZGVuIGZvcm0gaW4gRE9NLlxuICogVGhlIGFjdGlvbiB3aWxsIGJlIGluaXRpYXRlZCB0aHJvdWdoIGEgU2VydmljZSBWYXJpYWJsZVxuICpcbiAqIFF1ZXJ5IFBhcmFtc1xuICogVGhlIHJlcXVlc3QgcGFyYW1zIGxpa2UgcXVlcnkgcGFyYW1zIGFyZSBhZGRlZCBhcyBoaWRkZW4gaW5wdXQgZWxlbWVudHNcbiAqXG4gKiBIZWFkZXIgUGFyYW1zXG4gKiBUaGUgaGVhZGVyIHBhcmFtcyBmb3IgYSByZXF1ZXN0IGFyZSBhbHNvIGFkZGVkIGFsb25nIHdpdGggaGlkZGVuIGlucHV0IGVsZW1lbnRzLlxuICogVGhpcyBpcyBkb25lIGFzIGhlYWRlcnMgY2FuIG5vdCBiZSBzZXQgZm9yIGEgZm9ybSBQT1NUIGNhbGwgZnJvbSBKYXZhU2NyaXB0XG4gKlxuICogRmluYWxseSwgcmVxdWVzdCBwYXJhbWV0ZXJzIGFyZSBzZW50IGFzIGZvbGxvd3M6XG4gKiBGb3IgYSBHRVQgcmVxdWVzdCwgdGhlIHJlcXVlc3QgZGF0YSBpcyBzZW50IGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtcy5cbiAqIEZvciBQT1NULCBpdCBpcyBzZW50IGFzIHJlcXVlc3QgYm9keS5cbiAqXG4gKiBAcGFyYW0gdmFyaWFibGU6IHRoZSB2YXJpYWJsZSB0aGF0IGlzIGNhbGxlZCBmcm9tIHVzZXIgYWN0aW9uXG4gKiBAcGFyYW0gcmVxdWVzdFBhcmFtcyBvYmplY3QgY29uc2lzdGluZyB0aGUgaW5mbyB0byBjb25zdHJ1Y3QgdGhlIFhIUiByZXF1ZXN0IGZvciB0aGUgc2VydmljZVxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hJZnJhbWUgPSAocmVxdWVzdFBhcmFtcywgc3VjY2VzcykgPT4ge1xuICAgIC8vIFRvZG86IFNIdWJoYW06IFVSTCBjb250YWlucyAnLy8nIGluIGJldHdlZW4gd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYXQgdGhlIFVSTCBmb3JtYXRpb24gb25seVxuICAgIGlmIChyZXF1ZXN0UGFyYW1zLnVybFsxXSA9PT0gJy8nICYmIHJlcXVlc3RQYXJhbXMudXJsWzJdID09PSAnLycpIHtcbiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSByZXF1ZXN0UGFyYW1zLnVybC5zbGljZSgwLCAxKSArIHJlcXVlc3RQYXJhbXMudXJsLnNsaWNlKDIpO1xuICAgIH1cbiAgICBsZXQgaUZyYW1lRWxlbWVudCxcbiAgICAgICAgZm9ybUVsLFxuICAgICAgICBwYXJhbUVsZW1lbnQsXG4gICAgICAgIHF1ZXJ5UGFyYW1zICAgICA9ICcnO1xuICAgIGNvbnN0IElGUkFNRV9OQU1FICAgICA9ICdmaWxlRG93bmxvYWRJRnJhbWUnLFxuICAgICAgICBGT1JNX05BTUUgICAgICAgPSAnZmlsZURvd25sb2FkRm9ybScsXG4gICAgICAgIENPTlRFTlRfVFlQRSAgICA9ICdDb250ZW50LVR5cGUnLFxuICAgICAgICB1cmwgICAgICAgICAgICAgPSByZXF1ZXN0UGFyYW1zLnVybCxcbiAgICAgICAgZW5jVHlwZSAgICAgICAgID0gXy5nZXQocmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBDT05URU5UX1RZUEUpLFxuICAgICAgICBwYXJhbXMgICAgICAgICAgPSBfLnBpY2tCeShyZXF1ZXN0UGFyYW1zLmhlYWRlcnMsIGZ1bmN0aW9uICh2YWwsIGtleSkge3JldHVybiBrZXkgIT09IENPTlRFTlRfVFlQRTsgfSk7XG4gICAgLyogVG9kbzogc2h1YmhhbSA6IGRlZmluZSBnZXRTZXJ2aWNlIG1ldGhvZFxuICAgICBXU19DT05TVEFOVFMgICAgPSBnZXRTZXJ2aWNlKCdXU19DT05TVEFOVFMnKTsqL1xuXG4gICAgLyogbG9vayBmb3IgZXhpc3RpbmcgaWZyYW1lLiBJZiBleGlzdHMsIHJlbW92ZSBpdCBmaXJzdCAqL1xuICAgIGlGcmFtZUVsZW1lbnQgPSAkKCcjJyArIElGUkFNRV9OQU1FKTtcbiAgICBpZiAoaUZyYW1lRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgaUZyYW1lRWxlbWVudC5maXJzdCgpLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpRnJhbWVFbGVtZW50ID0gJCgnPGlmcmFtZSBpZD1cIicgKyBJRlJBTUVfTkFNRSArICdcIiBuYW1lPVwiJyArIElGUkFNRV9OQU1FICsgJ1wiIGNsYXNzPVwibmctaGlkZVwiPjwvaWZyYW1lPicpO1xuICAgIGZvcm1FbCAgICAgICAgPSAkKCc8Zm9ybSBpZD1cIicgKyBGT1JNX05BTUUgKyAnXCIgbmFtZT1cIicgKyBGT1JNX05BTUUgKyAnXCI+PC9mb3JtPicpO1xuICAgIGZvcm1FbC5hdHRyKHtcbiAgICAgICAgJ3RhcmdldCcgIDogaUZyYW1lRWxlbWVudC5hdHRyKCduYW1lJyksXG4gICAgICAgICdhY3Rpb24nICA6IHVybCxcbiAgICAgICAgJ21ldGhvZCcgIDogcmVxdWVzdFBhcmFtcy5tZXRob2QsXG4gICAgICAgICdlbmN0eXBlJyA6IGVuY1R5cGVcbiAgICB9KTtcblxuICAgIC8qIHByb2Nlc3MgcXVlcnkgcGFyYW1zLCBhcHBlbmQgYSBoaWRkZW4gaW5wdXQgZWxlbWVudCBpbiB0aGUgZm9ybSBhZ2FpbnN0IGVhY2ggcGFyYW0gKi9cbiAgICBxdWVyeVBhcmFtcyArPSB1cmwuaW5kZXhPZignPycpICE9PSAtMSA/IHVybC5zdWJzdHJpbmcodXJsLmluZGV4T2YoJz8nKSArIDEpIDogJyc7XG4gICAgcXVlcnlQYXJhbXMgKz0gZW5jVHlwZSA9PT0gV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuRk9STV9VUkxfRU5DT0RFRCA/ICgocXVlcnlQYXJhbXMgPyAnJicgOiAnJykgKyByZXF1ZXN0UGFyYW1zLmRhdGFQYXJhbXMpIDogJyc7XG5cbiAgICAvLyBGb3IgTm9uIGJvZHkgbWV0aG9kcyBvbmx5LCBzZXQgdGhlIGlucHV0IGZpZWxkcyBmcm9tIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBpZiAoXy5pbmNsdWRlcyhXU19DT05TVEFOVFMuTk9OX0JPRFlfSFRUUF9NRVRIT0RTLCBfLnRvVXBwZXIocmVxdWVzdFBhcmFtcy5tZXRob2QpKSkge1xuICAgICAgICBzZXRQYXJhbXNGcm9tVVJMKHF1ZXJ5UGFyYW1zLCBwYXJhbXMpOyAvLyBTZXQgcGFyYW1zIGZvciBVUkwgcXVlcnkgcGFyYW1zXG4gICAgfVxuICAgIHNldFBhcmFtc0Zyb21VUkwocmVxdWVzdFBhcmFtcy5kYXRhLCBwYXJhbXMpOyAvLyBTZXQgcGFyYW1zIGZvciByZXF1ZXN0IGRhdGFcbiAgICBfLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgcGFyYW1FbGVtZW50ID0gJCgnPGlucHV0IHR5cGU9XCJoaWRkZW5cIj4nKTtcbiAgICAgICAgcGFyYW1FbGVtZW50LmF0dHIoe1xuICAgICAgICAgICAgJ25hbWUnICA6IGtleSxcbiAgICAgICAgICAgICd2YWx1ZScgOiB2YWxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvcm1FbC5hcHBlbmQocGFyYW1FbGVtZW50KTtcbiAgICB9KTtcblxuICAgIC8qIGFwcGVuZCBmb3JtIHRvIGlGcmFtZSBhbmQgaUZyYW1lIHRvIHRoZSBkb2N1bWVudCBhbmQgc3VibWl0IHRoZSBmb3JtICovXG4gICAgJCgnYm9keScpLmFwcGVuZChpRnJhbWVFbGVtZW50KTtcblxuICAgIC8vIHRpbWVvdXQgZm9yIElFIDEwLCBpZnJhbWVFbGVtZW50LmNvbnRlbnRzKCkgaXMgZW1wdHkgaW4gSUUgMTAgd2l0aG91dCB0aW1lb3V0XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlGcmFtZUVsZW1lbnQuY29udGVudHMoKS5maW5kKCdib2R5JykuYXBwZW5kKGZvcm1FbCk7XG4gICAgICAgIGZvcm1FbC5zdWJtaXQoKTtcbiAgICAgICAgdHJpZ2dlckZuKHN1Y2Nlc3MpO1xuICAgIH0sIDEwMCk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGFuIFhIUiBjYWxsIGFnYWluc3QgdGhlIGNvbmZpZ1xuICogdGhlIHJlc3BvbnNlIGlzIGNvbnZlcnRlZCBpbnRvIGEgYmxvYiB1cmwsIHdoaWNoIGlzIGFzc2lnbmVkIHRvIHRoZSBzcmMgYXR0cmlidXRlIG9mIGFuIGFuY2hvciBlbGVtZW50IHdpdGggZG93bmxvYWQ9dHJ1ZVxuICogYSBjbGljayBpcyBzaW11bGF0ZWQgb24gdGhlIGFuY2hvciB0byBkb3dubG9hZCB0aGUgZmlsZVxuICogQHBhcmFtIGNvbmZpZ1xuICogQHBhcmFtIHN1Y2Nlc3NcbiAqIEBwYXJhbSBlcnJvclxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hBbmNob3IgPSAoY29uZmlnLCBzdWNjZXNzLCBlcnJvcikgPT4ge1xuICAgIGNvbnN0IHVybCAgICAgPSBjb25maWcudXJsLFxuICAgICAgICBtZXRob2QgID0gY29uZmlnLm1ldGhvZCxcbiAgICAgICAgZGF0YSAgICA9IGNvbmZpZy5kYXRhUGFyYW1zIHx8IGNvbmZpZy5kYXRhLFxuICAgICAgICBoZWFkZXJzID0gY29uZmlnLmhlYWRlcnM7XG5cbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xuXG4gICAgLy8gVG9kbzogUmVwbGFjZSBodHRwIHdpdGggZ2V0U2VydmljZVxuICAgIGh0dHBTZXJ2aWNlLnNlbmQoe1xuICAgICAgICAndGFyZ2V0JyA6ICdXZWJTZXJ2aWNlJyxcbiAgICAgICAgJ2FjdGlvbicgOiAnaW52b2tlUnVudGltZVJlc3RDYWxsJyxcbiAgICAgICAgJ21ldGhvZCcgOiBtZXRob2QsXG4gICAgICAgICd1cmwnICAgIDogdXJsLFxuICAgICAgICAnaGVhZGVycyc6IGhlYWRlcnMsXG4gICAgICAgICdkYXRhJyAgIDogZGF0YSxcbiAgICAgICAgJ3Jlc3BvbnNlVHlwZSc6ICdhcnJheWJ1ZmZlcidcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZWZyb21SZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZS5oZWFkZXJzLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgICAgIH0sIDkwMCk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0cmlnZ2VyRm4oZXJyb3IsIGVycik7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIGFwcGVuZHMgYSB0aW1lc3RhbXAgb24gdGhlIHBhc3NlZCBmaWxlbmFtZSB0byBwcmV2ZW50IGNhY2hpbmdcbiAqIHJldHVybnMgdGhlIG1vZGlmaWVkIGZpbGUgbmFtZVxuICogQHBhcmFtIGZpbGVOYW1lXG4gKiBAcGFyYW0gZXhwb3J0Rm9ybWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRNb2RpZmllZEZpbGVOYW1lID0gKGZpbGVOYW1lLCBleHBvcnRGb3JtYXQpID0+IHtcbiAgICBsZXQgZmlsZUV4dGVuc2lvbjtcbiAgICBjb25zdCBjdXJyZW50VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvbiA9IGV4cG9ydFR5cGVzTWFwW2V4cG9ydEZvcm1hdF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvbiA9ICcuJyArIF8ubGFzdChfLnNwbGl0KGZpbGVOYW1lLCAnLicpKTtcbiAgICAgICAgZmlsZU5hbWUgPSBfLnJlcGxhY2UoZmlsZU5hbWUsIGZpbGVFeHRlbnNpb24sICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVOYW1lICsgJ18nICsgY3VycmVudFRpbWVzdGFtcCArIGZpbGVFeHRlbnNpb247XG59O1xuXG5jb25zdCBnZXRDb29raWVCeU5hbWUgPSAobmFtZSkgPT4ge1xuICAgIC8vIFRvZG86IFNodWJoYW0gSW1wbGVtZW50IGNvb2tpZSBuYXRpdmUganNcbiAgICByZXR1cm4gJ2Nvb2tpZSc7XG59O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29va2llVmFsdWUgaWYgeHNyZiBpcyBlbmFibGVkLlxuICogSW4gZGV2aWNlLCB4c3JmIGNvb2tpZSBpcyBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlLlxuICogQHJldHVybnMgeHNyZiBjb29raWUgdmFsdWVcbiAqL1xuY29uc3QgaXNYc3JmRW5hYmxlZCA9ICgpID0+IHtcbiAgICBpZiAoQ09OU1RBTlRTLmhhc0NvcmRvdmEpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKENPTlNUQU5UUy5YU1JGX0NPT0tJRV9OQU1FKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgbm9kZSBmb3IgYSBiaW5kIG9iamVjdCwgd2hlcmUgdGhlIHZhbHVlIGhhcyB0byBiZSB1cGRhdGVkXG4gKiBvYmoudGFyZ2V0ID0gXCJhXCJcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXRPYmogPSAob2JqLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0ID0gb2JqLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0T2JqO1xuICAgIGNvbnN0IHJvb3ROb2RlID0gdmFyaWFibGVbcm9vdF07XG4gICAgaWYgKERPVF9FWFBSX1JFWC50ZXN0KHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnN1YnN0cigwLCB0YXJnZXQubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgIGlmIChvYmoudGFyZ2V0ID09PSByb290KSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSB2YXJpYWJsZTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IGZpbmRWYWx1ZU9mKHJvb3ROb2RlLCB0YXJnZXQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gcm9vdE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE9iajtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IGZvciB0aGUgdGFyZ2V0IG9iamVjdFxuICogdGhlIGNvbXB1dGVkIHZhbHVlIHdpbGwgYmUgdXBkYXRlZCBhZ2FpbnN0IHRoaXMga2V5IGluIHRoZSB0YXJnZXRPYmplY3QoY29tcHV0ZWQgYnkgZ2V0VGFyZ2V0T2JqKCkpXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gcmVnZXhcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRUYXJnZXROb2RlS2V5ID0gKHRhcmdldCkgPT4ge1xuICAgIC8qXG4gICAgICogaWYgdGhlIHRhcmdldCBrZXkgaXMgaW4gdGhlIGZvcm0gYXMgXCJbJ215LnBhcmFtJ11cIlxuICAgICAqIGtlZXAgdGhlIHRhcmdldCBrZXkgYXMgXCJteS5wYXJhbVwiIGFuZCBkbyBub3Qgc3BsaXQgZnVydGhlclxuICAgICAqIHRoaXMgaXMgZG9uZSwgc28gdGhhdCwgdGhlIGNvbXB1dGVkIHZhbHVlIGFnYWluc3QgdGhpcyBiaW5kaW5nIGlzIGFzc2lnbmVkIGFzXG4gICAgICogICAgICB7XCJteS5wYXJhbVwiOiBcInZhbHVlXCJ9XG4gICAgICogYW5kIG5vdCBhc1xuICAgICAqICAgICAge1xuICAgICAqICAgICAgICAgIFwibXlcIjoge1xuICAgICAqICAgICAgICAgICAgICBcInBhcmFtXCI6IFwidmFsdWVcIlxuICAgICAqICAgICAgICAgIH1cbiAgICAgKiAgICAgIH1cbiAgICAgKi9cbiAgICBsZXQgdGFyZ2V0Tm9kZUtleTtcbiAgICBpZiAoRE9UX0VYUFJfUkVYLnRlc3QodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnJlcGxhY2UoL14oXFxbW1wiJ10pfChbXCInXVxcXSkkL2csICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXROb2RlS2V5ID0gdGFyZ2V0LnNwbGl0KCcuJykucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXROb2RlS2V5O1xufTtcblxuY29uc3Qgc2V0VmFsdWVUb05vZGUgPSAodGFyZ2V0LCBvYmosIHJvb3QsIHZhcmlhYmxlLCB2YWx1ZSwgbm9VcGRhdGU/KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgdGFyZ2V0T2JqID0gZ2V0VGFyZ2V0T2JqKG9iaiwgcm9vdCwgdmFyaWFibGUpO1xuICAgIHZhbHVlID0gIV8uaXNVbmRlZmluZWQodmFsdWUpID8gdmFsdWUgOiBvYmoudmFsdWU7XG4gICAgLyogc2FuaXR5IGNoZWNrLCB1c2VyIGNhbiBiaW5kIHBhcmVudCBub2RlcyB0byBub24tb2JqZWN0IHZhbHVlcywgc28gY2hpbGQgbm9kZSBiaW5kaW5ncyBtYXkgZmFpbCAqL1xuICAgIGlmICh0YXJnZXRPYmopIHtcbiAgICAgICAgdGFyZ2V0T2JqW3RhcmdldE5vZGVLZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHByb2Nlc3NWYXJpYWJsZVBvc3RCaW5kVXBkYXRlKHRhcmdldE5vZGVLZXksIHZhbHVlLCBvYmoudHlwZSwgdmFyaWFibGUsIG5vVXBkYXRlKTtcbn07XG5cbi8qKlxuICogVGhlIG1vZGVsIGludGVybmFsQm91bmROb2RlTWFwIHN0b3JlcyB0aGUgcmVmZXJlbmNlIHRvIGxhdGVzdCBjb21wdXRlZCB2YWx1ZXMgYWdhaW5zdCBpbnRlcm5hbChuZXN0ZWQpIGJvdW5kIG5vZGVzXG4gKiBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgaW50ZXJuYWwgbm9kZSdzIGNvbXB1dGVkIHZhbHVlIGlzIG5vdCBsb3N0LCBvbmNlIGl0cyBwYXJlbnQgbm9kZSdzIHZhbHVlIGlzIGNvbXB1dGVkIGF0IGEgbGF0ZXIgcG9pbnRcbiAqIEUuZy5cbiAqIFZhcmlhYmxlLmVtcGxveWVlVmFyIGhhcyBmb2xsb3dpbmcgYmluZGluZ3NcbiAqIFwiZGF0YUJpbmRpbmdcIjogW1xuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnQuYnVkZ2V0XCIsXG4gICAgICAgICBcInZhbHVlXCI6IFwiYmluZDpWYXJpYWJsZXMuYnVkZ2V0VmFyLmRhdGFTZXRcIlxuICAgICB9LFxuICAgICB7XG4gICAgICAgICBcInRhcmdldFwiOiBcImRlcGFydG1lbnRcIixcbiAgICAgICAgIFwidmFsdWVcIjogXCJiaW5kOlZhcmlhYmxlcy5kZXBhcnRtZW50VmFyLmRhdGFTZXRcIlxuICAgICB9XG4gXVxuICogV2hlbiBkZXBhcnRtZW50LmJ1ZGdldCBpcyBjb21wdXRlZCwgZW1wbG95ZWVWYXIuZGF0YVNldCA9IHtcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcImJ1ZGdldFwiOiB7XCJxMVwiOiAxMTExfVxuICogIH1cbiAqIH1cbiAqXG4gKiBXaGVuIGRlcGFydG1lbnQgaXMgY29tcHV0ZWRcbiAqICBcImRlcGFydG1lbnRcIjoge1xuICogICAgICBcIm5hbWVcIjogXCJIUlwiLFxuICogICAgICBcImxvY2F0aW9uXCI6IFwiSHlkZXJhYmFkXCJcbiAqICB9XG4gKiBUaGUgYnVkZ2V0IGZpZWxkIChjb21wdXRlZCBlYXJsaWVyKSBpcyBMT1NULlxuICpcbiAqIFRvIGF2b2lkIHRoaXMsIHRoZSBsYXRlc3QgdmFsdWVzIGFnYWluc3QgaW50ZXJuYWwgbm9kZXMgKGluIHRoaXMgY2FzZSBkZXBhcnRtZW50LmJ1ZGdldCkgYXJlIHN0b3JlZCBpbiBhIG1hcFxuICogVGhlc2UgdmFsdWVzIGFyZSBhc3NpZ25lZCBiYWNrIHRvIGludGVybmFsIGZpZWxkcyBpZiB0aGUgcGFyZW50IGlzIGNvbXB1dGVkIChpbiB0aGlzIGNhc2UgZGVwYXJ0bWVudClcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSByb290XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqL1xuY29uc3QgdXBkYXRlSW50ZXJuYWxOb2RlcyA9ICh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKSA9PiB7XG4gICAgY29uc3QgYm91bmRJbnRlcm5hbE5vZGVzID0gXy5rZXlzKF8uZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290XSkpLFxuICAgICAgICB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpO1xuICAgIGxldCBpbnRlcm5hbE5vZGVzO1xuICAgIGZ1bmN0aW9uIGZpbmRJbnRlcm5hbE5vZGVCb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIF8uZmlsdGVyKGJvdW5kSW50ZXJuYWxOb2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBsYXRlciBjb25kaXRpb24gaW4gY2hlY2sgKHRhcmdldE5vZGVLZXkgPT09IHJvb3QgfHwgdGFyZ2V0Tm9kZUtleSA9PT0gJ2RhdGFCaW5kaW5nJykgaXMgc3BlY2lmaWNhbGx5IGZvciBsaXZlIHZhcmlhYmxlIG9mIGluc2VydC91cGRhdGUgdHlwZXNcbiAgICAgICAgICAgIHJldHVybiAobm9kZSAhPT0gdGFyZ2V0Tm9kZUtleSAmJiBfLmluY2x1ZGVzKG5vZGUsIHRhcmdldE5vZGVLZXkpKSB8fCAoKHRhcmdldE5vZGVLZXkgPT09IHJvb3QgfHwgdGFyZ2V0Tm9kZUtleSA9PT0gJ2RhdGFCaW5kaW5nJykgJiYgbm9kZSAhPT0gdGFyZ2V0Tm9kZUtleSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcm5hbE5vZGVzID0gZmluZEludGVybmFsTm9kZUJvdW5kKCk7XG4gICAgaWYgKChpbnRlcm5hbE5vZGVzLmxlbmd0aCkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGludGVybmFsTm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBzZXRWYWx1ZVRvTm9kZShub2RlLCB7dGFyZ2V0OiBub2RlfSwgcm9vdCwgdmFyaWFibGUsIF8uZ2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCBub2RlXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIE5ldyBJbXBsZW1lbnRhdGlvbiAoRGF0YUJpbmRpbmcgRmxhdCBTdHJ1Y3R1cmUgd2l0aCB4LXBhdGggdGFyZ2V0cylcbiAqIHByb2Nlc3NlcyBhIGRhdGFCaW5kaW5nIG9iamVjdCwgaWYgYm91bmQgdG8gZXhwcmVzc2lvbiwgd2F0Y2hlcyBvdmVyIGl0LCBlbHNlIGFzc2lnbnMgdmFsdWUgdG8gdGhlIGV4cHJlc3Npb25cbiAqIEBwYXJhbSBvYmogZGF0YUJpbmRpbmcgb2JqZWN0XG4gKiBAcGFyYW0gc2NvcGUgc2NvcGUgb2YgdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gcm9vdCByb290IG5vZGUgc3RyaW5nIChkYXRhQmluZGluZyBmb3IgYWxsIHZhcmlhYmxlcywgZGF0YVNldCBmb3Igc3RhdGljIHZhcmlhYmxlKVxuICogQHBhcmFtIHZhcmlhYmxlIHZhcmlhYmxlIG9iamVjdFxuICovXG5jb25zdCBwcm9jZXNzQmluZE9iamVjdCA9IChvYmosIHNjb3BlLCByb290LCB2YXJpYWJsZSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9iai50YXJnZXQsXG4gICAgICAgIHRhcmdldE9iaiA9IGdldFRhcmdldE9iaihvYmosIHJvb3QsIHZhcmlhYmxlKSxcbiAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkodGFyZ2V0KSxcbiAgICAgICAgcnVuTW9kZSA9IHRydWU7XG4gICAgY29uc3QgZGVzdHJveUZuID0gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIgPyBzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lci5iaW5kKHNjb3BlKSA6IF8ubm9vcDtcblxuICAgIGlmIChzdHJpbmdTdGFydHNXaXRoKG9iai52YWx1ZSwgJ2JpbmQ6JykpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICAgICAgICAgIGlmICgobmV3VmFsID09PSBvbGRWYWwgJiYgXy5pc1VuZGVmaW5lZChuZXdWYWwpKSB8fCAoXy5pc1VuZGVmaW5lZChuZXdWYWwpICYmICghXy5pc1VuZGVmaW5lZChvbGRWYWwpIHx8ICFfLmlzVW5kZWZpbmVkKHRhcmdldE9ialt0YXJnZXROb2RlS2V5XSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNraXAgY2xvbmluZyBmb3IgYmxvYiBjb2x1bW5cbiAgICAgICAgICAgIGlmICghXy5pbmNsdWRlcyhbJ2Jsb2InLCAnZmlsZSddLCBvYmoudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBnZXRDbG9uZWRPYmplY3QobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgbmV3VmFsKTsgLy8gY2xvbmluZyBuZXdWYWwgdG8ga2VlcCB0aGUgc291cmNlIGNsZWFuXG5cbiAgICAgICAgICAgIGlmIChydW5Nb2RlKSB7XG4gICAgICAgICAgICAgICAgLypzZXQgdGhlIGludGVybmFsIGJvdW5kIG5vZGUgbWFwIHdpdGggdGhlIGxhdGVzdCB1cGRhdGVkIHZhbHVlKi9cbiAgICAgICAgICAgICAgICBpZiAoIWludGVybmFsQm91bmROb2RlTWFwLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF8uc2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCB0YXJnZXRdLCBuZXdWYWwpO1xuICAgICAgICAgICAgICAgIC8qdXBkYXRlIHRoZSBpbnRlcm5hbCBub2RlcyBhZnRlciBpbnRlcm5hbCBub2RlIG1hcCBpcyBzZXQqL1xuICAgICAgICAgICAgICAgIGlmIChfLmlzT2JqZWN0KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJuYWxOb2Rlcyh0YXJnZXQsIHJvb3QsIHZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGRlc3Ryb3lGbigkd2F0Y2gob2JqLnZhbHVlLnJlcGxhY2UoJ2JpbmQ6JywgJycpLCBzY29wZSwge30sIGxpc3RlbmVyLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoKSA9PiB2YXJpYWJsZS5pc011dGVkKSk7XG4gICAgfSBlbHNlIGlmICghXy5pc1VuZGVmaW5lZChvYmoudmFsdWUpKSB7XG4gICAgICAgIHNldFZhbHVlVG9Ob2RlKHRhcmdldCwgb2JqLCByb290LCB2YXJpYWJsZSwgb2JqLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHJ1bk1vZGUgJiYgcm9vdCAhPT0gdGFyZ2V0Tm9kZUtleSkge1xuICAgICAgICAgICAgaWYgKCFpbnRlcm5hbEJvdW5kTm9kZU1hcC5oYXModmFyaWFibGUpKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfLnNldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgdGFyZ2V0XSwgb2JqLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBVQkxJQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvL1xuXG4vKipcbiAqIEluaXRpYWxpemVzIHdhdGNoZXJzIGZvciBiaW5kaW5nIGV4cHJlc3Npb25zIGNvbmZpZ3VyZWQgaW4gdGhlIHZhcmlhYmxlXG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEBwYXJhbSBjb250ZXh0LCBzY29wZSBjb250ZXh0IGluIHdoaWNoIHRoZSB2YXJpYWJsZSBleGlzdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBiaW5kU291cmNlLCAgdGhlIGZpZWxkIGluIHZhcmlhYmxlIHdoZXJlIHRoZSBkYXRhYmluZGluZ3MgYXJlIGNvbmZpZ3VyZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vc3QgdmFyaWFibGVzLCBpdCB3aWxsIGJlICdkYXRhQmluZGluZycsIGhlbmNlIGRlZmF1bHQgZmFsbGJhY2sgaXMgdG8gJ2RhdGFCaW5kaW5nJ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc29tZSBpdCBjYW4gYmUgJ2RhdGFTZXQnIGFuZCBoZW5jZSB3aWxsIGJlIHBhc3NlZCBhcyBwYXJhbVxuICogQHBhcmFtIHtzdHJpbmd9IGJpbmRUYXJnZXQsIHRoZSBvYmplY3QgZmllbGQgaW4gdmFyaWFibGUgd2hlcmUgdGhlIGNvbXB1dGVkIGJpbmRpbmdzIHdpbGwgYmUgc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzQmluZGluZyA9ICh2YXJpYWJsZTogYW55LCBjb250ZXh0OiBhbnksIGJpbmRTb3VyY2U/OiBzdHJpbmcsIGJpbmRUYXJnZXQ/OiBzdHJpbmcpID0+IHtcbiAgICBiaW5kU291cmNlID0gYmluZFNvdXJjZSB8fCAnZGF0YUJpbmRpbmcnO1xuICAgIGJpbmRUYXJnZXQgPSBiaW5kVGFyZ2V0IHx8ICdkYXRhQmluZGluZyc7XG5cbiAgICBjb25zdCBiaW5kTWFwID0gdmFyaWFibGVbYmluZFNvdXJjZV07XG4gICAgdmFyaWFibGVbYmluZFNvdXJjZV0gPSB7fTtcbiAgICB2YXJpYWJsZVsnX2JpbmQnICsgYmluZFNvdXJjZV0gPSBiaW5kTWFwO1xuICAgIGlmICghYmluZE1hcCB8fCAhXy5pc0FycmF5KGJpbmRNYXApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmluZE1hcC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIC8qIGZvciBzdGF0aWMgdmFyaWFibGUgY2hhbmdlIHRoZSBiaW5kaW5nIHdpdGggdGFyZ2V0ICdkYXRhQmluZGluZycgdG8gJ2RhdGFTZXQnLCBhcyB0aGUgcmVzdWx0cyBoYXZlIHRvIHJlZmxlY3QgZGlyZWN0bHkgaW4gdGhlIGRhdGFTZXQgKi9cbiAgICAgICAgaWYgKHZhcmlhYmxlLmNhdGVnb3J5ID09PSAnd20uVmFyaWFibGUnICYmIG5vZGUudGFyZ2V0ID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICBub2RlLnRhcmdldCA9ICdkYXRhU2V0JztcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQmluZE9iamVjdChub2RlLCBjb250ZXh0LCBiaW5kVGFyZ2V0LCB2YXJpYWJsZSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIERvd25sb2FkcyBhIGZpbGUgaW4gdGhlIGJyb3dzZXIuXG4gKiBUd28gbWV0aG9kcyB0byBkbyBzbywgbmFtZWx5OlxuICogMS4gZG93bmxvYWRUaHJvdWdoQW5jaG9yLCBjYWxsZWQgaWZcbiAqICAgICAgLSBpZiBhIGhlYWRlciBpcyB0byBiZSBwYXNzZWRcbiAqICAgICAgT1JcbiAqICAgICAgLSBpZiBzZWN1cml0eSBpcyBPTiBhbmQgWFNSRiB0b2tlbiBpcyB0byBiZSBzZW50IGFzIHdlbGxcbiAqIE5PVEU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgdmVyc2lvbiAxMC4wIGFuZCBiZWxvd1xuICpcbiAqIDIuIGRvd25sb2FkVGhyb3VnaElmcmFtZVxuICogICAgICAtIHRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBicm93c2VycyBhbmQgdXNlcyBhbiBpZnJhbWUgdG8gZG93bmxhZCB0aGUgZmlsZS5cbiAqIEBwYXJhbSByZXF1ZXN0UGFyYW1zIHJlcXVlc3QgcGFyYW1zIG9iamVjdFxuICogQHBhcmFtIGZpbGVOYW1lIHJlcHJlc2VudHMgdGhlIGZpbGUgbmFtZVxuICogQHBhcmFtIGV4cG9ydEZvcm1hdCBkb3dubG9hZGVkIGZpbGUgZm9ybWF0XG4gKiBAcGFyYW0gc3VjY2VzcyBzdWNjZXNzIGNhbGxiYWNrXG4gKiBAcGFyYW0gZXJyb3IgZXJyb3IgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IHNpbXVsYXRlRmlsZURvd25sb2FkID0gKHJlcXVlc3RQYXJhbXMsIGZpbGVOYW1lLCBleHBvcnRGb3JtYXQsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgLypzdWNjZXNzIGFuZCBlcnJvciBjYWxsYmFja3MgYXJlIGV4ZWN1dGVkIGluY2FzZSBvZiBkb3dubG9hZFRocm91Z2hBbmNob3JcbiAgICAgRHVlIHRvIHRlY2huaWNhbCBsaW1pdGF0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBpbmNhc2Ugb2YgaWZyYW1lKi9cbiAgICBpZiAoQ09OU1RBTlRTLmhhc0NvcmRvdmEpIHtcbiAgICAgICAgbGV0IGZpbGVFeHRlbnNpb247XG4gICAgICAgIGlmIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpbGVFeHRlbnNpb24gPSBleHBvcnRUeXBlc01hcFtleHBvcnRGb3JtYXRdO1xuICAgICAgICB9XG4gICAgICAgIGFwcE1hbmFnZXIubm90aWZ5KCdkZXZpY2UtZmlsZS1kb3dubG9hZCcsIHsgdXJsOiByZXF1ZXN0UGFyYW1zLnVybCwgbmFtZTogZmlsZU5hbWUsIGV4dGVuc2lvbjogZmlsZUV4dGVuc2lvbiwgaGVhZGVyczogcmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBzdWNjZXNzQ2I6IHN1Y2Nlc3MsIGVycm9yQ2I6IGVycm9yfSk7XG4gICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KHJlcXVlc3RQYXJhbXMuaGVhZGVycykgfHwgaXNYc3JmRW5hYmxlZCgpKSB7XG4gICAgICAgIGRvd25sb2FkVGhyb3VnaEFuY2hvcihyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG93bmxvYWRUaHJvdWdoSWZyYW1lKHJlcXVlc3RQYXJhbXMsIHN1Y2Nlc3MpO1xuICAgIH1cbn07XG5cbi8qKlxuICogc2V0cyB0aGUgdmFsdWUgYWdhaW5zdCBwYXNzZWQga2V5IG9uIHRoZSBcImlucHV0RmllbGRzXCIgb2JqZWN0IGluIHRoZSB2YXJpYWJsZVxuICogQHBhcmFtIHRhcmdldE9iajogdGhlIG9iamVjdCBpbiB3aGljaCB0aGUga2V5LCB2YWx1ZSBpcyB0byBiZSBzZXRcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHBhcmFtIGtleTogY2FuIGJlOlxuICogIC0gYSBzdHJpbmcgZS5nLiBcInVzZXJuYW1lXCJcbiAqICAtIGFuIG9iamVjdCwgZS5nLiB7XCJ1c2VybmFtZVwiOiBcImpvaG5cIiwgXCJzc25cIjogXCIxMTExMVwifVxuICogQHBhcmFtIHZhbFxuICogLSBpZiBrZXkgaXMgc3RyaW5nLCB0aGUgdmFsdWUgYWdhaW5zdCBpdCAoZm9yIHRoYXQgZGF0YSB0eXBlKVxuICogLSBpZiBrZXkgaXMgb2JqZWN0LCBub3QgcmVxdWlyZWRcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5leHBvcnQgY29uc3Qgc2V0SW5wdXQgPSAodGFyZ2V0T2JqOiBhbnksIGtleTogYW55LCB2YWw6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgdGFyZ2V0T2JqID0gdGFyZ2V0T2JqIHx8IHt9O1xuICAgIGxldCBrZXlzLFxuICAgICAgICBsYXN0S2V5LFxuICAgICAgICBwYXJhbU9iaiA9IHt9O1xuXG4gICAgLy8gY29udGVudCB0eXBlIGNoZWNrXG4gICAgaWYgKF8uaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgICAgIHZhbCA9IGdldEJsb2IodmFsLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgdmFsID0gXy5pc051bWJlcih2YWwpID8gdmFsIDogcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXy5pc09iamVjdChrZXkpKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBpdHNlbGZcbiAgICAgICAgcGFyYW1PYmogPSBrZXk7XG4gICAgfSBlbHNlIGlmIChrZXkuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yICcuJyBpbiBrZXkgZS5nLiAnZW1wbG95ZWUuZGVwYXJ0bWVudCdcbiAgICAgICAga2V5cyA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICBsYXN0S2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgLy8gRmluZGluZyB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBrZXlcbiAgICAgICAgdGFyZ2V0T2JqID0gZmluZFZhbHVlT2YodGFyZ2V0T2JqLCBrZXlzLmpvaW4oJy4nKSwgdHJ1ZSk7XG4gICAgICAgIGtleSA9IGxhc3RLZXk7XG4gICAgICAgIHBhcmFtT2JqW2tleV0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1PYmpba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICBfLmZvckVhY2gocGFyYW1PYmosIGZ1bmN0aW9uIChwYXJhbVZhbCwgcGFyYW1LZXkpIHtcbiAgICAgICAgdGFyZ2V0T2JqW3BhcmFtS2V5XSA9IHBhcmFtVmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXRPYmo7XG59O1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZiBIVE1MNSBGaWxlIEFQSSBpcyBhdmFpbGFibGUgZWxzZSBmYWxzZVxuICogQHJldHVybnMge3twcm90b3R5cGU6IEJsb2I7IG5ldyhibG9iUGFydHM/OiBhbnlbXSwgb3B0aW9ucz86IEJsb2JQcm9wZXJ0eUJhZyk6IEJsb2J9fVxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlVXBsb2FkU3VwcG9ydGVkID0gKCkgPT4ge1xuICAgIHJldHVybiAod2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YXJPcmRlclxuICogQHBhcmFtIG9wdGlvbnNPcmRlclxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEV2YWx1YXRlZE9yZGVyQnkgPSAodmFyT3JkZXIsIG9wdGlvbnNPcmRlcikgPT4ge1xuICAgIGxldCBvcHRpb25GaWVsZHMsXG4gICAgICAgIHZhck9yZGVyQnk7XG4gICAgLy8gSWYgb3B0aW9ucyBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHZhcmlhYmxlIG9yZGVyXG4gICAgaWYgKCFvcHRpb25zT3JkZXIgfHwgXy5pc0VtcHR5KG9wdGlvbnNPcmRlcikpIHtcbiAgICAgICAgcmV0dXJuIHZhck9yZGVyO1xuICAgIH1cbiAgICAvLyBJZiB2YXJpYWJsZSBvcmRlciBieSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIG9wdGlvbnMgb3JkZXJcbiAgICBpZiAoIXZhck9yZGVyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zT3JkZXI7XG4gICAgfVxuICAgIC8vIElmIGJvdGggYXJlIHByZXNlbnQsIGNvbWJpbmUgdGhlIG9wdGlvbnMgb3JkZXIgYW5kIHZhcmlhYmxlIG9yZGVyLCB3aXRoIG9wdGlvbnMgb3JkZXIgYXMgcHJlY2VkZW5jZVxuICAgIHZhck9yZGVyICAgICA9IF8uc3BsaXQodmFyT3JkZXIsICcsJyk7XG4gICAgb3B0aW9uc09yZGVyID0gXy5zcGxpdChvcHRpb25zT3JkZXIsICcsJyk7XG4gICAgb3B0aW9uRmllbGRzID0gXy5tYXAob3B0aW9uc09yZGVyLCBmdW5jdGlvbiAob3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIF8uc3BsaXQoXy50cmltKG9yZGVyKSwgJyAnKVswXTtcbiAgICB9KTtcbiAgICAvLyBJZiBhIGZpZWxkIGlzIHByZXNlbnQgaW4gYm90aCBvcHRpb25zIGFuZCB2YXJpYWJsZSwgcmVtb3ZlIHRoZSB2YXJpYWJsZSBvcmRlcmJ5XG4gICAgXy5yZW1vdmUodmFyT3JkZXIsIGZ1bmN0aW9uIChvcmRlckJ5KSB7XG4gICAgICAgIHJldHVybiBfLmluY2x1ZGVzKG9wdGlvbkZpZWxkcywgXy5zcGxpdChfLnRyaW0ob3JkZXJCeSksICcgJylbMF0pO1xuICAgIH0pO1xuICAgIHZhck9yZGVyQnkgPSB2YXJPcmRlci5sZW5ndGggPyAnLCcgKyBfLmpvaW4odmFyT3JkZXIsICcsJykgOiAnJztcbiAgICByZXR1cm4gXy5qb2luKG9wdGlvbnNPcmRlciwgJywnKSArIHZhck9yZGVyQnk7XG59O1xuXG4vKipcbiAqIGZvcm1hdHRpbmcgdGhlIGV4cHJlc3Npb24gYXMgcmVxdWlyZWQgYnkgYmFja2VuZCB3aGljaCB3YXMgZW5jbG9zZWQgYnkgJHs8ZXhwcmVzc2lvbj59LlxuICogQHBhcmFtIGZpZWxkRGVmc1xuICogcmV0dXJucyBmaWVsZERlZnNcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdEV4cG9ydEV4cHJlc3Npb24gPSBmaWVsZERlZnMgPT4ge1xuICAgIF8uZm9yRWFjaChmaWVsZERlZnMsIGZ1bmN0aW9uIChmaWVsZERlZikge1xuICAgICAgICBpZiAoZmllbGREZWYuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgZmllbGREZWYuZXhwcmVzc2lvbiA9ICckeycgKyBmaWVsZERlZi5leHByZXNzaW9uICsgJ30nO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpZWxkRGVmcztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZVZhcmlhYmxlQ2FsbCA9IF9pbnZva2U7XG5cbmNvbnN0IGdldERhdGVUaW1lRm9ybWF0Rm9yVHlwZSA9ICh0eXBlKSA9PiB7XG4gICAgcmV0dXJuIERFRkFVTFRfRk9STUFUU1tfLnRvVXBwZXIodHlwZSldO1xufTtcblxuLy8gRm9ybWF0IHZhbHVlIGZvciBkYXRldGltZSB0eXBlc1xuY29uc3QgX2Zvcm1hdERhdGUgPSAoZGF0ZVZhbHVlLCB0eXBlKSA9PiB7XG4gICAgbGV0IGVwb2NoO1xuICAgIGlmIChfLmlzRGF0ZShkYXRlVmFsdWUpKSB7XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWlzTmFOKGRhdGVWYWx1ZSkpIHtcbiAgICAgICAgICAgIGRhdGVWYWx1ZSA9IHBhcnNlSW50KGRhdGVWYWx1ZSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGVwb2NoID0gZGF0ZVZhbHVlICYmIG1vbWVudChkYXRlVmFsdWUpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGVwb2NoKSAmJiB0eXBlICE9PSBEYXRhVHlwZS5USU1FKSB7XG4gICAgICAgIHJldHVybiBlcG9jaDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IERhdGFUeXBlLlRJTUVTVEFNUCkge1xuICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBEYXRhVHlwZS5USU1FICYmICFlcG9jaCkge1xuICAgICAgICBlcG9jaCA9IG1vbWVudChuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpICsgJyAnICsgZGF0ZVZhbHVlKS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlVmFsdWUgJiYgYXBwTWFuYWdlci5nZXRQaXBlKCdkYXRlJykudHJhbnNmb3JtKGVwb2NoLCBnZXREYXRlVGltZUZvcm1hdEZvclR5cGUodHlwZSkpO1xufTtcblxuLy8gRnVuY3Rpb24gdG8gY29udmVydCB2YWx1ZXMgb2YgZGF0ZSB0aW1lIHR5cGVzIGludG8gZGVmYXVsdCBmb3JtYXRzXG5leHBvcnQgY29uc3QgZm9ybWF0RGF0ZSA9ICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgIGlmIChfLmluY2x1ZGVzKHR5cGUsICcuJykpIHtcbiAgICAgICAgdHlwZSA9IF8udG9Mb3dlcihleHRyYWN0VHlwZSh0eXBlKSk7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBfLm1hcCh2YWx1ZSwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIF9mb3JtYXREYXRlKHZhbCwgdHlwZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX2Zvcm1hdERhdGUodmFsdWUsIHR5cGUpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSB2YXJpYWJsZSBkYXRhIHdoaWNoIGlzIGVuY29kZWQgZnJvbSBiYWNrZW5kIGJlZm9yZSBzaG93aW5nIGluIHRoZSB3aWRnZXRzLlxuICogSXQgdGFrZXMgdmFyaWFibGUgcmVzcG9uc2UgY29udGVudCBhcyBpbnB1dCBhbmQgaXRlcmF0ZXMgcmVjdXJzaXZlbHksXG4gKiBpZiB0aGUgdmFsdWUgaXMgc3RyaW5nIHR5cGUgdGhlbiBpdCB3aWxsIGRlY29kZSB0aGUgZGF0YS5cbiAqIEBwYXJhbSByZXNwb25zZUNvbnRlbnQgKEFycmF5IG9mIG9iamVjdHMpXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNvZGVEYXRhID0gKHJlc3BvbnNlQ29udGVudCkgPT4ge1xuICAgIGlmICghcmVzcG9uc2VDb250ZW50KSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUNvbnRlbnQ7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICBfLmZvckVhY2gocmVzcG9uc2VDb250ZW50LCBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGh0bWxEZWNvZGUoZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goZGF0YSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIF8uaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBodG1sRGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlc3BvbnNlQ29udGVudCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBfLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGVudFtrZXldID0gaHRtbERlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlRGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIHJlc3BvbnNlQ29udGVudCA9IGh0bWxEZWNvZGUocmVzcG9uc2VDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGVudDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBodG1sRGVjb2RlKGlucHV0KSB7XG4gICAgcmV0dXJuIGhlLnVuZXNjYXBlKGlucHV0KTtcbn1cbiJdfQ==
796
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFyaWFibGVzL3NyYy91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFM0osT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUlsRyxNQUFNLGNBQWMsR0FBSyxFQUFFLE9BQU8sRUFBRyxPQUFPLEVBQUUsS0FBSyxFQUFHLE1BQU0sRUFBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUN0QixNQUFNLENBQUMsSUFBSSxXQUFXLENBQUM7QUFDdkIsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDO0FBQzNCLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDO0FBQzdCLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQztBQUN6QixNQUFNLENBQUMsSUFBSSxjQUFjLENBQUM7QUFDMUIsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQztBQUMzQixNQUFNLENBQUMsSUFBSSxhQUFhLENBQUM7QUFFekIsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLEVBQ3pDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLEVBQ2hDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBRXZCLE1BQU0sT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFO0lBQzdCLElBQUksV0FBVyxFQUNYLFFBQVEsR0FBRyxDQUFDLENB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QUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDNUIsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QztpQkFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzFCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtRQUNMLENBQUMsQ0FBQyxDQUFDO0tBQ047U0FBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDcEMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxPQUFPLGVBQWUsQ0FBQztLQUMxQjtBQUNMLENBQUMsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLEtBQUs7SUFDckIsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0VHlwZSwgRGF0YVR5cGUsIERFRkFVTFRfRk9STUFUUywgJHBhcnNlRXZlbnQsICR3YXRjaCwgZmluZFZhbHVlT2YsIGdldEJsb2IsIGdldENsb25lZE9iamVjdCwgc3RyaW5nU3RhcnRzV2l0aCwgdHJpZ2dlckZuIH0gZnJvbSAnQHdtL2NvcmUnO1xuXG5pbXBvcnQgeyBDT05TVEFOVFMsIFZBUklBQkxFX0NPTlNUQU5UUywgV1NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3ZhcmlhYmxlcy5jb25zdGFudHMnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdywgXywgJCwgbW9tZW50LCBoZTtcblxuY29uc3QgZXhwb3J0VHlwZXNNYXAgICA9IHsgJ0VYQ0VMJyA6ICcueGxzeCcsICdDU1YnIDogJy5jc3YnfTtcblxuZXhwb3J0IGxldCBhcHBNYW5hZ2VyO1xuZXhwb3J0IGxldCBodHRwU2VydmljZTtcbmV4cG9ydCBsZXQgbWV0YWRhdGFTZXJ2aWNlO1xuZXhwb3J0IGxldCBuYXZpZ2F0aW9uU2VydmljZTtcbmV4cG9ydCBsZXQgcm91dGVyU2VydmljZTtcbmV4cG9ydCBsZXQgdG9hc3RlclNlcnZpY2U7XG5leHBvcnQgbGV0IG9hdXRoU2VydmljZTtcbmV4cG9ydCBsZXQgc2VjdXJpdHlTZXJ2aWNlO1xuZXhwb3J0IGxldCBkaWFsb2dTZXJ2aWNlO1xuXG5jb25zdCBET1RfRVhQUl9SRVggPSAvXlxcWyhcInwnKVtcXHdcXFddKihcXDEpXFxdJC8sXG4gICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAgPSBuZXcgTWFwKCksXG4gICAgdGltZXJzID0gbmV3IE1hcCgpO1xuXG5jb25zdCBfaW52b2tlID0gKHZhcmlhYmxlLCBvcCkgPT4ge1xuICAgIGxldCBkZWJvdW5jZWRGbixcbiAgICAgICAgY2FuY2VsRm4gPSBfLm5vb3AsXG4gICAgICAgIHJldFZhbDtcbiAgICBpZiAodGltZXJzLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgY2FuY2VsRm4gPSB0aW1lcnMuZ2V0KHZhcmlhYmxlKS5jYW5jZWw7XG4gICAgfVxuICAgIGNhbmNlbEZuKCk7XG4gICAgZGVib3VuY2VkRm4gPSBfLmRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0VmFsID0gdmFyaWFibGVbb3BdKCk7XG4gICAgICAgIC8vIGhhbmRsZSBwcm9taXNlcyB0byBhdm9pZCB1bmNhdWdodCBwcm9taXNlIGVycm9ycyBpbiBjb25zb2xlXG4gICAgICAgIGlmIChyZXRWYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXRWYWwuY2F0Y2goXy5ub29wKTtcbiAgICAgICAgfVxuICAgIH0sIDEwMCk7XG4gICAgdGltZXJzLnNldCh2YXJpYWJsZSwgZGVib3VuY2VkRm4pO1xuICAgIGRlYm91bmNlZEZuKCk7XG59O1xuXG5jb25zdCBwcm9jZXNzVmFyaWFibGVQb3N0QmluZFVwZGF0ZSA9IChub2RlTmFtZSwgbm9kZVZhbCwgbm9kZVR5cGUsIHZhcmlhYmxlLCBub1VwZGF0ZSkgPT4ge1xuICAgIHN3aXRjaCAodmFyaWFibGUuY2F0ZWdvcnkpIHtcbiAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuQ0FURUdPUlkuTElWRTpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5vcGVyYXRpb24gPT09ICdyZWFkJykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZVZhbCwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5maWx0ZXJGaWVsZHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZpbHRlckZpZWxkc1tub2RlTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBub2RlVmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogbm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGUubGlzdFJlY29yZHMpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBfaW52b2tlKHZhcmlhYmxlLCAnbGlzdFJlY29yZHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5pbnB1dEZpZWxkcyA9IG5vZGVWYWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuaW5wdXRGaWVsZHNbbm9kZU5hbWVdID0gbm9kZVZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogaWYgYXV0by11cGRhdGUgc2V0IGZvciB0aGUgdmFyaWFibGUgd2l0aCByZWFkIG9wZXJhdGlvbiBvbmx5LCBnZXQgaXRzIGRhdGEgKi9cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuYXV0b1VwZGF0ZSAmJiAhXy5pc1VuZGVmaW5lZChub2RlVmFsKSAmJiBfLmlzRnVuY3Rpb24odmFyaWFibGVbdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCddKSAmJiAhbm9VcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgdmFyaWFibGUub3BlcmF0aW9uICsgJ1JlY29yZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5DUlVEOlxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLm9wZXJhdGlvblR5cGUgPT09ICdsaXN0JyAmJiB2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5TRVJWSUNFOlxuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5MT0dJTjpcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5hdXRvVXBkYXRlICYmICFfLmlzVW5kZWZpbmVkKG5vZGVWYWwpICYmIF8uaXNGdW5jdGlvbih2YXJpYWJsZS5pbnZva2UpICYmICFub1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgIF9pbnZva2UodmFyaWFibGUsICdpbnZva2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5DQVRFR09SWS5ERVZJQ0U6XG4gICAgICAgICAgICB2YXJpYWJsZVtub2RlTmFtZV0gPSBub2RlVmFsO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmF1dG9VcGRhdGUgJiYgIV8uaXNVbmRlZmluZWQobm9kZVZhbCkgJiYgXy5pc0Z1bmN0aW9uKHZhcmlhYmxlLmludm9rZSkgJiYgIW5vVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgX2ludm9rZSh2YXJpYWJsZSwgJ2ludm9rZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldERlcGVuZGVuY3kgPSAodHlwZTogc3RyaW5nLCByZWY6IGFueSkgPT4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdhcHBNYW5hZ2VyJzpcbiAgICAgICAgICAgIGFwcE1hbmFnZXIgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaHR0cCc6XG4gICAgICAgICAgICBodHRwU2VydmljZSA9IHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICBtZXRhZGF0YVNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmF2aWdhdGlvblNlcnZpY2UnOlxuICAgICAgICAgICAgbmF2aWdhdGlvblNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncm91dGVyJzpcbiAgICAgICAgICAgIHJvdXRlclNlcnZpY2UgPSByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9hc3Rlcic6XG4gICAgICAgICAgICB0b2FzdGVyU2VydmljZSA9ICByZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb0F1dGgnOlxuICAgICAgICAgICAgb2F1dGhTZXJ2aWNlID0gIHJlZjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWN1cml0eSc6XG4gICAgICAgICAgICBzZWN1cml0eVNlcnZpY2UgPSAgcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICAgICAgICBkaWFsb2dTZXJ2aWNlID0gcmVmO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYXRlQ2FsbGJhY2sgPSAodHlwZTogc3RyaW5nLCB2YXJpYWJsZTogYW55LCBkYXRhOiBhbnksIG9wdGlvbnM/OiBhbnksIHNraXBEZWZhdWx0Tm90aWZpY2F0aW9uPzogYm9vbGVhbikgPT4ge1xuXG4gICAgLypjaGVja2luZyBpZiBldmVudCBpcyBhdmFpbGFibGUgYW5kIHZhcmlhYmxlIGhhcyBldmVudCBwcm9wZXJ0eSBhbmQgdmFyaWFibGUgZXZlbnQgcHJvcGVydHkgYm91bmQgdG8gZnVuY3Rpb24qL1xuICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gdmFyaWFibGVbdHlwZV0sXG4gICAgICAgIGNhbGxCYWNrU2NvcGUgPSB2YXJpYWJsZS5fY29udGV4dDtcbiAgICBsZXQgZXJyb3JWYXJpYWJsZTtcbiAgICAvKipcbiAgICAgKiBGb3IgZXJyb3IgZXZlbnQ6XG4gICAgICogdHJpZ2dlciBhcHAgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAgICAgKiBpZiBubyBldmVudCBpcyBhc3NpZ25lZCwgdHJpZ2dlciBkZWZhdWx0IGFwcE5vdGlmaWNhdGlvbiB2YXJpYWJsZS5cbiAgICAgKi9cbiAgIGlmICh0eXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlQuRVJST1IgJiYgIXNraXBEZWZhdWx0Tm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGlmICghZXZlbnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIC8qIGluIGNhc2Ugb2YgZXJyb3IsIGlmIG5vIGV2ZW50IGFzc2lnbmVkLCBoYW5kbGUgdGhyb3VnaCBkZWZhdWx0IG5vdGlmaWNhdGlvbiB2YXJpYWJsZSAqL1xuICAgICAgICAgICAgZXJyb3JWYXJpYWJsZSA9IGNhbGxCYWNrU2NvcGUuQWN0aW9uc1tWQVJJQUJMRV9DT05TVEFOVFMuREVGQVVMVF9WQVIuTk9USUZJQ0FUSU9OXTtcbiAgICAgICAgICAgIGlmIChlcnJvclZhcmlhYmxlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVycm9yVmFyaWFibGUuZ2V0TWVzc2FnZSgpIHx8IGRhdGE7XG4gICAgICAgICAgICAgICAgZGF0YSA9IF8uaXNTdHJpbmcoZGF0YSkgPyBkYXRhIDogJ0FuIGVycm9yIGhhcyBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGFwcCBsb2dzLic7XG4gICAgICAgICAgICAgICAgZXJyb3JWYXJpYWJsZS5pbnZva2UoeyAnbWVzc2FnZScgOiBkYXRhfSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAkcm9vdFNjb3BlLiRlbWl0KFwiaW52b2tlLXNlcnZpY2VcIiwgVkFSSUFCTEVfQ09OU1RBTlRTLkRFRkFVTFRfVkFSLk5PVElGSUNBVElPTiwge3Njb3BlOiBjYWxsQmFja1Njb3BlLCBtZXNzYWdlOiByZXNwb25zZX0pO1xuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE86IFtWaWJodV0sIGNoZWNrIHdoZXRoZXIgdG8gc3VwcG9ydCBsZWdhY3kgZXZlbnQgY2FsbGluZyBtZWNoYW5pc20gKGlkZWFsbHksIGl0IHNob3VsZCBoYXZlIGJlZW4gbWlncmF0ZWQpXG4gICAgY29uc3QgZm4gPSAkcGFyc2VFdmVudCh2YXJpYWJsZVt0eXBlXSk7XG4gICAgaWYgKHR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVC5CRUZPUkVfVVBEQVRFKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLkxpdmVWYXJpYWJsZScgJiYgdmFyaWFibGUub3BlcmF0aW9uID09PSAncmVhZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YUZpbHRlcjogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhcmlhYmxlLl9jb250ZXh0LCB7dmFyaWFibGU6IHZhcmlhYmxlLCBpbnB1dERhdGE6IGRhdGEsIG9wdGlvbnM6IG9wdGlvbnN9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmbih2YXJpYWJsZS5fY29udGV4dCwge3ZhcmlhYmxlOiB2YXJpYWJsZSwgZGF0YTogZGF0YSwgb3B0aW9uczogb3B0aW9uc30pO1xuICAgIH1cbn07XG5cbmNvbnN0IHRyaWdnZXJPblRpbWVvdXQgPSAoc3VjY2VzcykgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0cmlnZ2VyRm4oc3VjY2Vzcyk7IH0sIDUwMCk7XG59O1xuXG5jb25zdCBkb3dubG9hZEZpbGVmcm9tUmVzcG9uc2UgPSAocmVzcG9uc2UsIGhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgLy8gY2hlY2sgZm9yIGEgZmlsZW5hbWVcbiAgICBsZXQgZmlsZW5hbWUgPSAnJyxcbiAgICAgICAgZmlsZW5hbWVSZWdleCxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYmxvYixcbiAgICAgICAgVVJMLFxuICAgICAgICBkb3dubG9hZFVybCxcbiAgICAgICAgcG9wdXA7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkZXJzLmdldCgnQ29udGVudC1EaXNwb3NpdGlvbicpO1xuICAgIGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XG4gICAgICAgIGZpbGVuYW1lUmVnZXggPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLztcbiAgICAgICAgbWF0Y2hlcyA9IGZpbGVuYW1lUmVnZXguZXhlYyhkaXNwb3NpdGlvbik7XG4gICAgICAgIGlmIChtYXRjaGVzICE9PSBudWxsICYmIG1hdGNoZXNbMV0pIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gbWF0Y2hlc1sxXS5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlID0gaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgIGJsb2IgPSBuZXcgQmxvYihbcmVzcG9uc2VdLCB7IHR5cGU6IHR5cGUgfSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gSUUgd29ya2Fyb3VuZCBmb3IgXCJIVE1MNzAwNzogT25lIG9yIG1vcmUgYmxvYiBVUkxzIHdlcmUgcmV2b2tlZCBieSBjbG9zaW5nIHRoZSBibG9iIGZvciB3aGljaCB0aGV5IHdlcmUgY3JlYXRlZC4gVGhlc2UgVVJMcyB3aWxsIG5vIGxvbmdlciByZXNvbHZlIGFzIHRoZSBkYXRhIGJhY2tpbmcgdGhlIFVSTCBoYXMgYmVlbiBmcmVlZC5cIlxuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgdHJpZ2dlck9uVGltZW91dChzdWNjZXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJGbihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBVUkwgICAgICAgICA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDtcbiAgICAgICAgZG93bmxvYWRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgICAgICAgLy8gdXNlIEhUTUw1IGFbZG93bmxvYWRdIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGZpbGVuYW1lXG4gICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGV0IHJlYWRlcjtcbiAgICAgICAgICAgIC8vIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGhpcyB5ZXRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYS5kb3dubG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlYWRlci5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpO1xuICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IHRyaWdnZXJPblRpbWVvdXQuYmluZCh1bmRlZmluZWQsIHN1Y2Nlc3MpO1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IGRvd25sb2FkVXJsO1xuICAgICAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wdXAgPSB3aW5kb3cub3Blbihkb3dubG9hZFVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG93bmxvYWRVcmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmlnZ2VyT25UaW1lb3V0KHN1Y2Nlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFVSTC5yZXZva2VPYmplY3RVUkwoZG93bmxvYWRVcmwpOyB9LCAxMDApOyAvLyBjbGVhbnVwXG4gICAgfVxufTtcblxuY29uc3QgZ2V0U2VydmljZSA9IChzZXJ2aWNlTmFtZSkgPT4ge1xuICAgIGlmICghc2VydmljZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmljZU5hbWU7XG4gICAgLy8gVG9kbzogU2h1YmhhbSwgdW5jb21tZW50IGJlbG93IGNvZGVcbiAgICAvKiAvISogZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IHdoZXJlIG5nLWFwcCBpcyBkZWZpbmVkICohL1xuICAgICBsZXQgYXBwRWwgPSBXTS5lbGVtZW50KCdbaWQ9bmctYXBwXScpLCBpbmplY3RvcjtcbiAgICAgaWYgKGFwcEVsKSB7XG4gICAgIHRyeSB7XG4gICAgIGluamVjdG9yID0gYXBwRWwuaW5qZWN0b3IoKTsgLy8gZ2V0IHRoZSBhbmd1bGFyIGluamVjdG9yXG4gICAgIGlmIChpbmplY3Rvcikge1xuICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lKTsgLy8gcmV0dXJuIHRoZSBzZXJ2aWNlXG4gICAgIH1cbiAgICAgfSBjYXRjaCAoZSkge1xuICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICB9XG4gICAgIH0qL1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgdGhlIGZvcm0gZGF0YSBwYXJhbXMgZnJvbSB0aGUgVVJMXG4gKiBAcGFyYW0gcXVlcnlQYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqL1xuY29uc3Qgc2V0UGFyYW1zRnJvbVVSTCA9IChxdWVyeVBhcmFtcywgcGFyYW1zKSA9PiB7XG4gICAgcXVlcnlQYXJhbXMgPSBfLnNwbGl0KHF1ZXJ5UGFyYW1zLCAnJicpO1xuICAgIF8uZm9yRWFjaChxdWVyeVBhcmFtcywgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgIHBhcmFtID0gXy5zcGxpdChwYXJhbSwgJz0nKTtcbiAgICAgICAgcGFyYW1zW3BhcmFtWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChfLmpvaW4oXy5zbGljZShwYXJhbSwgMSksICc9JykpO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBbVG9kbzogU2h1YmhhbV0sIEltcGxlbWVudCBEb3dubG9hZCB0aHJvdWdoIEkgZnJhbWVcbiAqIFNpbXVsYXRlcyBmaWxlIGRvd25sb2FkIGluIGFuIGFwcCB0aHJvdWdoIGNyZWF0aW5nIGFuZCBzdWJtaXR0aW5nIGEgaGlkZGVuIGZvcm0gaW4gRE9NLlxuICogVGhlIGFjdGlvbiB3aWxsIGJlIGluaXRpYXRlZCB0aHJvdWdoIGEgU2VydmljZSBWYXJpYWJsZVxuICpcbiAqIFF1ZXJ5IFBhcmFtc1xuICogVGhlIHJlcXVlc3QgcGFyYW1zIGxpa2UgcXVlcnkgcGFyYW1zIGFyZSBhZGRlZCBhcyBoaWRkZW4gaW5wdXQgZWxlbWVudHNcbiAqXG4gKiBIZWFkZXIgUGFyYW1zXG4gKiBUaGUgaGVhZGVyIHBhcmFtcyBmb3IgYSByZXF1ZXN0IGFyZSBhbHNvIGFkZGVkIGFsb25nIHdpdGggaGlkZGVuIGlucHV0IGVsZW1lbnRzLlxuICogVGhpcyBpcyBkb25lIGFzIGhlYWRlcnMgY2FuIG5vdCBiZSBzZXQgZm9yIGEgZm9ybSBQT1NUIGNhbGwgZnJvbSBKYXZhU2NyaXB0XG4gKlxuICogRmluYWxseSwgcmVxdWVzdCBwYXJhbWV0ZXJzIGFyZSBzZW50IGFzIGZvbGxvd3M6XG4gKiBGb3IgYSBHRVQgcmVxdWVzdCwgdGhlIHJlcXVlc3QgZGF0YSBpcyBzZW50IGFsb25nIHdpdGggdGhlIHF1ZXJ5IHBhcmFtcy5cbiAqIEZvciBQT1NULCBpdCBpcyBzZW50IGFzIHJlcXVlc3QgYm9keS5cbiAqXG4gKiBAcGFyYW0gdmFyaWFibGU6IHRoZSB2YXJpYWJsZSB0aGF0IGlzIGNhbGxlZCBmcm9tIHVzZXIgYWN0aW9uXG4gKiBAcGFyYW0gcmVxdWVzdFBhcmFtcyBvYmplY3QgY29uc2lzdGluZyB0aGUgaW5mbyB0byBjb25zdHJ1Y3QgdGhlIFhIUiByZXF1ZXN0IGZvciB0aGUgc2VydmljZVxuICovXG5jb25zdCBkb3dubG9hZFRocm91Z2hJZnJhbWUgPSAocmVxdWVzdFBhcmFtcywgc3VjY2VzcywgZGF0YUJpbmRpbmcpID0+IHtcbiAgICAvLyBUb2RvOiBTSHViaGFtOiBVUkwgY29udGFpbnMgJy8vJyBpbiBiZXR3ZWVuIHdoaWNoIHNob3VsZCBiZSBoYW5kbGVkIGF0IHRoZSBVUkwgZm9ybWF0aW9uIG9ubHlcbiAgICBpZiAocmVxdWVzdFBhcmFtcy51cmxbMV0gPT09ICcvJyAmJiByZXF1ZXN0UGFyYW1zLnVybFsyXSA9PT0gJy8nKSB7XG4gICAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gcmVxdWVzdFBhcmFtcy51cmwuc2xpY2UoMCwgMSkgKyByZXF1ZXN0UGFyYW1zLnVybC5zbGljZSgyKTtcbiAgICB9XG4gICAgbGV0IGlGcmFtZUVsZW1lbnQsXG4gICAgICAgIGZvcm1FbCxcbiAgICAgICAgcGFyYW1FbGVtZW50LFxuICAgICAgICBxdWVyeVBhcmFtcyAgICAgPSAnJyxcbiAgICAgICAgZGF0YTtcbiAgICBjb25zdCBJRlJBTUVfTkFNRSAgICAgPSAnZmlsZURvd25sb2FkSUZyYW1lJyxcbiAgICAgICAgRk9STV9OQU1FICAgICAgID0gJ2ZpbGVEb3dubG9hZEZvcm0nLFxuICAgICAgICBDT05URU5UX1RZUEUgICAgPSAnQ29udGVudC1UeXBlJyxcbiAgICAgICAgdXJsICAgICAgICAgICAgID0gcmVxdWVzdFBhcmFtcy51cmwsXG4gICAgICAgIGVuY1R5cGUgICAgICAgICA9IF8uZ2V0KHJlcXVlc3RQYXJhbXMuaGVhZGVycywgQ09OVEVOVF9UWVBFKSxcbiAgICAgICAgcGFyYW1zICAgICAgICAgID0gXy5waWNrQnkocmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtyZXR1cm4ga2V5ICE9PSBDT05URU5UX1RZUEU7IH0pO1xuICAgIC8qIFRvZG86IHNodWJoYW0gOiBkZWZpbmUgZ2V0U2VydmljZSBtZXRob2RcbiAgICAgV1NfQ09OU1RBTlRTICAgID0gZ2V0U2VydmljZSgnV1NfQ09OU1RBTlRTJyk7Ki9cblxuICAgIC8qIGxvb2sgZm9yIGV4aXN0aW5nIGlmcmFtZS4gSWYgZXhpc3RzLCByZW1vdmUgaXQgZmlyc3QgKi9cbiAgICBpRnJhbWVFbGVtZW50ID0gJCgnIycgKyBJRlJBTUVfTkFNRSk7XG4gICAgaWYgKGlGcmFtZUVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgIGlGcmFtZUVsZW1lbnQuZmlyc3QoKS5yZW1vdmUoKTtcbiAgICB9XG4gICAgaUZyYW1lRWxlbWVudCA9ICQoJzxpZnJhbWUgaWQ9XCInICsgSUZSQU1FX05BTUUgKyAnXCIgbmFtZT1cIicgKyBJRlJBTUVfTkFNRSArICdcIiBjbGFzcz1cIm5nLWhpZGVcIj48L2lmcmFtZT4nKTtcbiAgICBmb3JtRWwgICAgICAgID0gJCgnPGZvcm0gaWQ9XCInICsgRk9STV9OQU1FICsgJ1wiIG5hbWU9XCInICsgRk9STV9OQU1FICsgJ1wiPjwvZm9ybT4nKTtcbiAgICBmb3JtRWwuYXR0cih7XG4gICAgICAgICd0YXJnZXQnICA6IGlGcmFtZUVsZW1lbnQuYXR0cignbmFtZScpLFxuICAgICAgICAnYWN0aW9uJyAgOiB1cmwsXG4gICAgICAgICdtZXRob2QnICA6IHJlcXVlc3RQYXJhbXMubWV0aG9kLFxuICAgICAgICAnZW5jdHlwZScgOiAhKF8uaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmRhdGEpICYmIF8uaXNFbXB0eShxdWVyeVBhcmFtcykpID8gZW5jVHlwZSA6IFdTX0NPTlNUQU5UUy5DT05URU5UX1RZUEVTLk1VTFRJUEFSVF9GT1JNREFUQVxuICAgIH0pO1xuXG4gICAgLyogcHJvY2VzcyBxdWVyeSBwYXJhbXMsIGFwcGVuZCBhIGhpZGRlbiBpbnB1dCBlbGVtZW50IGluIHRoZSBmb3JtIGFnYWluc3QgZWFjaCBwYXJhbSAqL1xuICAgIHF1ZXJ5UGFyYW1zICs9IHVybC5pbmRleE9mKCc/JykgIT09IC0xID8gdXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZignPycpICsgMSkgOiAnJztcbiAgICBxdWVyeVBhcmFtcyArPSBlbmNUeXBlID09PSBXU19DT05TVEFOVFMuQ09OVEVOVF9UWVBFUy5GT1JNX1VSTF9FTkNPREVEID8gKChxdWVyeVBhcmFtcyA/ICcmJyA6ICcnKSArIHJlcXVlc3RQYXJhbXMuZGF0YVBhcmFtcykgOiAnJztcblxuICAgIC8vIEZvciBOb24gYm9keSBtZXRob2RzIG9ubHksIHNldCB0aGUgaW5wdXQgZmllbGRzIGZyb20gcXVlcnkgcGFyYW1ldGVyc1xuICAgIGlmIChfLmluY2x1ZGVzKFdTX0NPTlNUQU5UUy5OT05fQk9EWV9IVFRQX01FVEhPRFMsIF8udG9VcHBlcihyZXF1ZXN0UGFyYW1zLm1ldGhvZCkpKSB7XG4gICAgICAgIHNldFBhcmFtc0Zyb21VUkwocXVlcnlQYXJhbXMsIHBhcmFtcyk7IC8vIFNldCBwYXJhbXMgZm9yIFVSTCBxdWVyeSBwYXJhbXNcbiAgICB9XG4gICAgaWYoIV8uaXNFbXB0eShyZXF1ZXN0UGFyYW1zLmRhdGEpKSB7XG4gICAgICAgIHNldFBhcmFtc0Zyb21VUkwocmVxdWVzdFBhcmFtcy5kYXRhLCBwYXJhbXMpOy8vIFNldCBwYXJhbXMgZm9yIHJlcXVlc3QgZGF0YVxuICAgICAgICBkYXRhID0gcGFyYW1zO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBkYXRhQmluZGluZztcbiAgICB9XG4gICAgXy5mb3JFYWNoKGRhdGEsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgICBwYXJhbUVsZW1lbnQgPSAkKCc8aW5wdXQgdHlwZT1cImhpZGRlblwiPicpO1xuICAgICAgICBwYXJhbUVsZW1lbnQuYXR0cih7XG4gICAgICAgICAgICAnbmFtZScgIDoga2V5LFxuICAgICAgICAgICAgJ3ZhbHVlJyA6IHZhbFxuICAgICAgICB9KTtcbiAgICAgICAgZm9ybUVsLmFwcGVuZChwYXJhbUVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgLyogYXBwZW5kIGZvcm0gdG8gaUZyYW1lIGFuZCBpRnJhbWUgdG8gdGhlIGRvY3VtZW50IGFuZCBzdWJtaXQgdGhlIGZvcm0gKi9cbiAgICAkKCdib2R5JykuYXBwZW5kKGlGcmFtZUVsZW1lbnQpO1xuXG4gICAgLy8gdGltZW91dCBmb3IgSUUgMTAsIGlmcmFtZUVsZW1lbnQuY29udGVudHMoKSBpcyBlbXB0eSBpbiBJRSAxMCB3aXRob3V0IHRpbWVvdXRcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaUZyYW1lRWxlbWVudC5jb250ZW50cygpLmZpbmQoJ2JvZHknKS5hcHBlbmQoZm9ybUVsKTtcbiAgICAgICAgZm9ybUVsLnN1Ym1pdCgpO1xuICAgICAgICB0cmlnZ2VyRm4oc3VjY2Vzcyk7XG4gICAgfSwgMTAwKTtcbn07XG5cbi8qKlxuICogTWFrZXMgYW4gWEhSIGNhbGwgYWdhaW5zdCB0aGUgY29uZmlnXG4gKiB0aGUgcmVzcG9uc2UgaXMgY29udmVydGVkIGludG8gYSBibG9iIHVybCwgd2hpY2ggaXMgYXNzaWduZWQgdG8gdGhlIHNyYyBhdHRyaWJ1dGUgb2YgYW4gYW5jaG9yIGVsZW1lbnQgd2l0aCBkb3dubG9hZD10cnVlXG4gKiBhIGNsaWNrIGlzIHNpbXVsYXRlZCBvbiB0aGUgYW5jaG9yIHRvIGRvd25sb2FkIHRoZSBmaWxlXG4gKiBAcGFyYW0gY29uZmlnXG4gKiBAcGFyYW0gc3VjY2Vzc1xuICogQHBhcmFtIGVycm9yXG4gKi9cbmNvbnN0IGRvd25sb2FkVGhyb3VnaEFuY2hvciA9IChjb25maWcsIHN1Y2Nlc3MsIGVycm9yKSA9PiB7XG4gICAgY29uc3QgdXJsICAgICA9IGNvbmZpZy51cmwsXG4gICAgICAgIG1ldGhvZCAgPSBjb25maWcubWV0aG9kLFxuICAgICAgICBkYXRhICAgID0gY29uZmlnLmRhdGFQYXJhbXMgfHwgY29uZmlnLmRhdGEsXG4gICAgICAgIGhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gaGVhZGVyc1snQ29udGVudC1UeXBlJ10gfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG5cbiAgICAvLyBUb2RvOiBSZXBsYWNlIGh0dHAgd2l0aCBnZXRTZXJ2aWNlXG4gICAgaHR0cFNlcnZpY2Uuc2VuZCh7XG4gICAgICAgICd0YXJnZXQnIDogJ1dlYlNlcnZpY2UnLFxuICAgICAgICAnYWN0aW9uJyA6ICdpbnZva2VSdW50aW1lUmVzdENhbGwnLFxuICAgICAgICAnbWV0aG9kJyA6IG1ldGhvZCxcbiAgICAgICAgJ3VybCcgICAgOiB1cmwsXG4gICAgICAgICdoZWFkZXJzJzogaGVhZGVycyxcbiAgICAgICAgJ2RhdGEnICAgOiBkYXRhLFxuICAgICAgICAncmVzcG9uc2VUeXBlJzogJ2FycmF5YnVmZmVyJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG93bmxvYWRGaWxlZnJvbVJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlLmhlYWRlcnMsIHN1Y2Nlc3MsIGVycm9yKTtcbiAgICAgICAgfSwgOTAwKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRyaWdnZXJGbihlcnJvciwgZXJyKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogYXBwZW5kcyBhIHRpbWVzdGFtcCBvbiB0aGUgcGFzc2VkIGZpbGVuYW1lIHRvIHByZXZlbnQgY2FjaGluZ1xuICogcmV0dXJucyB0aGUgbW9kaWZpZWQgZmlsZSBuYW1lXG4gKiBAcGFyYW0gZmlsZU5hbWVcbiAqIEBwYXJhbSBleHBvcnRGb3JtYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldE1vZGlmaWVkRmlsZU5hbWUgPSAoZmlsZU5hbWUsIGV4cG9ydEZvcm1hdCkgPT4ge1xuICAgIGxldCBmaWxlRXh0ZW5zaW9uO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGV4cG9ydEZvcm1hdCkge1xuICAgICAgICBmaWxlRXh0ZW5zaW9uID0gZXhwb3J0VHlwZXNNYXBbZXhwb3J0Rm9ybWF0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmaWxlRXh0ZW5zaW9uID0gJy4nICsgXy5sYXN0KF8uc3BsaXQoZmlsZU5hbWUsICcuJykpO1xuICAgICAgICBmaWxlTmFtZSA9IF8ucmVwbGFjZShmaWxlTmFtZSwgZmlsZUV4dGVuc2lvbiwgJycpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZU5hbWUgKyAnXycgKyBjdXJyZW50VGltZXN0YW1wICsgZmlsZUV4dGVuc2lvbjtcbn07XG5cbmNvbnN0IGdldENvb2tpZUJ5TmFtZSA9IChuYW1lKSA9PiB7XG4gICAgLy8gVG9kbzogU2h1YmhhbSBJbXBsZW1lbnQgY29va2llIG5hdGl2ZSBqc1xuICAgIHJldHVybiAnY29va2llJztcbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb29raWVWYWx1ZSBpZiB4c3JmIGlzIGVuYWJsZWQuXG4gKiBJbiBkZXZpY2UsIHhzcmYgY29va2llIGlzIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UuXG4gKiBAcmV0dXJucyB4c3JmIGNvb2tpZSB2YWx1ZVxuICovXG5jb25zdCBpc1hzcmZFbmFibGVkID0gKCkgPT4ge1xuICAgIGlmIChDT05TVEFOVFMuaGFzQ29yZG92YSkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ09OU1RBTlRTLlhTUkZfQ09PS0lFX05BTUUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9iamVjdCBub2RlIGZvciBhIGJpbmQgb2JqZWN0LCB3aGVyZSB0aGUgdmFsdWUgaGFzIHRvIGJlIHVwZGF0ZWRcbiAqIG9iai50YXJnZXQgPSBcImFcIlxuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHJvb3RcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHJldHVybnMgeyp9XG4gKi9cbmNvbnN0IGdldFRhcmdldE9iaiA9IChvYmosIHJvb3QsIHZhcmlhYmxlKSA9PiB7XG4gICAgLypcbiAgICAgKiBpZiB0aGUgdGFyZ2V0IGtleSBpcyBpbiB0aGUgZm9ybSBhcyBcIlsnbXkucGFyYW0nXVwiXG4gICAgICoga2VlcCB0aGUgdGFyZ2V0IGtleSBhcyBcIm15LnBhcmFtXCIgYW5kIGRvIG5vdCBzcGxpdCBmdXJ0aGVyXG4gICAgICogdGhpcyBpcyBkb25lLCBzbyB0aGF0LCB0aGUgY29tcHV0ZWQgdmFsdWUgYWdhaW5zdCB0aGlzIGJpbmRpbmcgaXMgYXNzaWduZWQgYXNcbiAgICAgKiAgICAgIHtcIm15LnBhcmFtXCI6IFwidmFsdWVcIn1cbiAgICAgKiBhbmQgbm90IGFzXG4gICAgICogICAgICB7XG4gICAgICogICAgICAgICAgXCJteVwiOiB7XG4gICAgICogICAgICAgICAgICAgIFwicGFyYW1cIjogXCJ2YWx1ZVwiXG4gICAgICogICAgICAgICAgfVxuICAgICAqICAgICAgfVxuICAgICAqL1xuICAgIGxldCB0YXJnZXQgPSBvYmoudGFyZ2V0LFxuICAgICAgICB0YXJnZXRPYmo7XG4gICAgY29uc3Qgcm9vdE5vZGUgPSB2YXJpYWJsZVtyb290XTtcbiAgICBpZiAoRE9UX0VYUFJfUkVYLnRlc3QodGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXRPYmogPSByb290Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc3Vic3RyKDAsIHRhcmdldC5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgaWYgKG9iai50YXJnZXQgPT09IHJvb3QpIHtcbiAgICAgICAgICAgIHRhcmdldE9iaiA9IHZhcmlhYmxlO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgdGFyZ2V0T2JqID0gZmluZFZhbHVlT2Yocm9vdE5vZGUsIHRhcmdldCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRPYmogPSByb290Tm9kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0T2JqO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBrZXkgZm9yIHRoZSB0YXJnZXQgb2JqZWN0XG4gKiB0aGUgY29tcHV0ZWQgdmFsdWUgd2lsbCBiZSB1cGRhdGVkIGFnYWluc3QgdGhpcyBrZXkgaW4gdGhlIHRhcmdldE9iamVjdChjb21wdXRlZCBieSBnZXRUYXJnZXRPYmooKSlcbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEBwYXJhbSByZWdleFxuICogQHJldHVybnMgeyp9XG4gKi9cbmNvbnN0IGdldFRhcmdldE5vZGVLZXkgPSAodGFyZ2V0KSA9PiB7XG4gICAgLypcbiAgICAgKiBpZiB0aGUgdGFyZ2V0IGtleSBpcyBpbiB0aGUgZm9ybSBhcyBcIlsnbXkucGFyYW0nXVwiXG4gICAgICoga2VlcCB0aGUgdGFyZ2V0IGtleSBhcyBcIm15LnBhcmFtXCIgYW5kIGRvIG5vdCBzcGxpdCBmdXJ0aGVyXG4gICAgICogdGhpcyBpcyBkb25lLCBzbyB0aGF0LCB0aGUgY29tcHV0ZWQgdmFsdWUgYWdhaW5zdCB0aGlzIGJpbmRpbmcgaXMgYXNzaWduZWQgYXNcbiAgICAgKiAgICAgIHtcIm15LnBhcmFtXCI6IFwidmFsdWVcIn1cbiAgICAgKiBhbmQgbm90IGFzXG4gICAgICogICAgICB7XG4gICAgICogICAgICAgICAgXCJteVwiOiB7XG4gICAgICogICAgICAgICAgICAgIFwicGFyYW1cIjogXCJ2YWx1ZVwiXG4gICAgICogICAgICAgICAgfVxuICAgICAqICAgICAgfVxuICAgICAqL1xuICAgIGxldCB0YXJnZXROb2RlS2V5O1xuICAgIGlmIChET1RfRVhQUl9SRVgudGVzdCh0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSB0YXJnZXQucmVwbGFjZSgvXihcXFtbXCInXSl8KFtcIiddXFxdKSQvZywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSB0YXJnZXQuc3BsaXQoJy4nKS5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldE5vZGVLZXk7XG59O1xuXG5jb25zdCBzZXRWYWx1ZVRvTm9kZSA9ICh0YXJnZXQsIG9iaiwgcm9vdCwgdmFyaWFibGUsIHZhbHVlLCBub1VwZGF0ZT8pID0+IHtcbiAgICBjb25zdCB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpLFxuICAgICAgICB0YXJnZXRPYmogPSBnZXRUYXJnZXRPYmoob2JqLCByb290LCB2YXJpYWJsZSk7XG4gICAgdmFsdWUgPSAhXy5pc1VuZGVmaW5lZCh2YWx1ZSkgPyB2YWx1ZSA6IG9iai52YWx1ZTtcbiAgICAvKiBzYW5pdHkgY2hlY2ssIHVzZXIgY2FuIGJpbmQgcGFyZW50IG5vZGVzIHRvIG5vbi1vYmplY3QgdmFsdWVzLCBzbyBjaGlsZCBub2RlIGJpbmRpbmdzIG1heSBmYWlsICovXG4gICAgaWYgKHRhcmdldE9iaikge1xuICAgICAgICB0YXJnZXRPYmpbdGFyZ2V0Tm9kZUtleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcHJvY2Vzc1ZhcmlhYmxlUG9zdEJpbmRVcGRhdGUodGFyZ2V0Tm9kZUtleSwgdmFsdWUsIG9iai50eXBlLCB2YXJpYWJsZSwgbm9VcGRhdGUpO1xufTtcblxuLyoqXG4gKiBUaGUgbW9kZWwgaW50ZXJuYWxCb3VuZE5vZGVNYXAgc3RvcmVzIHRoZSByZWZlcmVuY2UgdG8gbGF0ZXN0IGNvbXB1dGVkIHZhbHVlcyBhZ2FpbnN0IGludGVybmFsKG5lc3RlZCkgYm91bmQgbm9kZXNcbiAqIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBpbnRlcm5hbCBub2RlJ3MgY29tcHV0ZWQgdmFsdWUgaXMgbm90IGxvc3QsIG9uY2UgaXRzIHBhcmVudCBub2RlJ3MgdmFsdWUgaXMgY29tcHV0ZWQgYXQgYSBsYXRlciBwb2ludFxuICogRS5nLlxuICogVmFyaWFibGUuZW1wbG95ZWVWYXIgaGFzIGZvbGxvd2luZyBiaW5kaW5nc1xuICogXCJkYXRhQmluZGluZ1wiOiBbXG4gICAgIHtcbiAgICAgICAgIFwidGFyZ2V0XCI6IFwiZGVwYXJ0bWVudC5idWRnZXRcIixcbiAgICAgICAgIFwidmFsdWVcIjogXCJiaW5kOlZhcmlhYmxlcy5idWRnZXRWYXIuZGF0YVNldFwiXG4gICAgIH0sXG4gICAgIHtcbiAgICAgICAgIFwidGFyZ2V0XCI6IFwiZGVwYXJ0bWVudFwiLFxuICAgICAgICAgXCJ2YWx1ZVwiOiBcImJpbmQ6VmFyaWFibGVzLmRlcGFydG1lbnRWYXIuZGF0YVNldFwiXG4gICAgIH1cbiBdXG4gKiBXaGVuIGRlcGFydG1lbnQuYnVkZ2V0IGlzIGNvbXB1dGVkLCBlbXBsb3llZVZhci5kYXRhU2V0ID0ge1xuICogIFwiZGVwYXJ0bWVudFwiOiB7XG4gKiAgICAgIFwiYnVkZ2V0XCI6IHtcInExXCI6IDExMTF9XG4gKiAgfVxuICogfVxuICpcbiAqIFdoZW4gZGVwYXJ0bWVudCBpcyBjb21wdXRlZFxuICogIFwiZGVwYXJ0bWVudFwiOiB7XG4gKiAgICAgIFwibmFtZVwiOiBcIkhSXCIsXG4gKiAgICAgIFwibG9jYXRpb25cIjogXCJIeWRlcmFiYWRcIlxuICogIH1cbiAqIFRoZSBidWRnZXQgZmllbGQgKGNvbXB1dGVkIGVhcmxpZXIpIGlzIExPU1QuXG4gKlxuICogVG8gYXZvaWQgdGhpcywgdGhlIGxhdGVzdCB2YWx1ZXMgYWdhaW5zdCBpbnRlcm5hbCBub2RlcyAoaW4gdGhpcyBjYXNlIGRlcGFydG1lbnQuYnVkZ2V0KSBhcmUgc3RvcmVkIGluIGEgbWFwXG4gKiBUaGVzZSB2YWx1ZXMgYXJlIGFzc2lnbmVkIGJhY2sgdG8gaW50ZXJuYWwgZmllbGRzIGlmIHRoZSBwYXJlbnQgaXMgY29tcHV0ZWQgKGluIHRoaXMgY2FzZSBkZXBhcnRtZW50KVxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHJvb3RcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICovXG5jb25zdCB1cGRhdGVJbnRlcm5hbE5vZGVzID0gKHRhcmdldCwgcm9vdCwgdmFyaWFibGUpID0+IHtcbiAgICBjb25zdCBib3VuZEludGVybmFsTm9kZXMgPSBfLmtleXMoXy5nZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3RdKSksXG4gICAgICAgIHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KHRhcmdldCk7XG4gICAgbGV0IGludGVybmFsTm9kZXM7XG4gICAgZnVuY3Rpb24gZmluZEludGVybmFsTm9kZUJvdW5kKCkge1xuICAgICAgICByZXR1cm4gXy5maWx0ZXIoYm91bmRJbnRlcm5hbE5vZGVzLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgLy8gdGhlIGxhdGVyIGNvbmRpdGlvbiBpbiBjaGVjayAodGFyZ2V0Tm9kZUtleSA9PT0gcm9vdCB8fCB0YXJnZXROb2RlS2V5ID09PSAnZGF0YUJpbmRpbmcnKSBpcyBzcGVjaWZpY2FsbHkgZm9yIGxpdmUgdmFyaWFibGUgb2YgaW5zZXJ0L3VwZGF0ZSB0eXBlc1xuICAgICAgICAgICAgcmV0dXJuIChub2RlICE9PSB0YXJnZXROb2RlS2V5ICYmIF8uaW5jbHVkZXMobm9kZSwgdGFyZ2V0Tm9kZUtleSkpIHx8ICgodGFyZ2V0Tm9kZUtleSA9PT0gcm9vdCB8fCB0YXJnZXROb2RlS2V5ID09PSAnZGF0YUJpbmRpbmcnKSAmJiBub2RlICE9PSB0YXJnZXROb2RlS2V5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludGVybmFsTm9kZXMgPSBmaW5kSW50ZXJuYWxOb2RlQm91bmQoKTtcbiAgICBpZiAoKGludGVybmFsTm9kZXMubGVuZ3RoKSkge1xuICAgICAgICBfLmZvckVhY2goaW50ZXJuYWxOb2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHNldFZhbHVlVG9Ob2RlKG5vZGUsIHt0YXJnZXQ6IG5vZGV9LCByb290LCB2YXJpYWJsZSwgXy5nZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3QsIG5vZGVdKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbi8qKlxuICogTmV3IEltcGxlbWVudGF0aW9uIChEYXRhQmluZGluZyBGbGF0IFN0cnVjdHVyZSB3aXRoIHgtcGF0aCB0YXJnZXRzKVxuICogcHJvY2Vzc2VzIGEgZGF0YUJpbmRpbmcgb2JqZWN0LCBpZiBib3VuZCB0byBleHByZXNzaW9uLCB3YXRjaGVzIG92ZXIgaXQsIGVsc2UgYXNzaWducyB2YWx1ZSB0byB0aGUgZXhwcmVzc2lvblxuICogQHBhcmFtIG9iaiBkYXRhQmluZGluZyBvYmplY3RcbiAqIEBwYXJhbSBzY29wZSBzY29wZSBvZiB0aGUgdmFyaWFibGVcbiAqIEBwYXJhbSByb290IHJvb3Qgbm9kZSBzdHJpbmcgKGRhdGFCaW5kaW5nIGZvciBhbGwgdmFyaWFibGVzLCBkYXRhU2V0IGZvciBzdGF0aWMgdmFyaWFibGUpXG4gKiBAcGFyYW0gdmFyaWFibGUgdmFyaWFibGUgb2JqZWN0XG4gKi9cbmNvbnN0IHByb2Nlc3NCaW5kT2JqZWN0ID0gKG9iaiwgc2NvcGUsIHJvb3QsIHZhcmlhYmxlKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gb2JqLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0T2JqID0gZ2V0VGFyZ2V0T2JqKG9iaiwgcm9vdCwgdmFyaWFibGUpLFxuICAgICAgICB0YXJnZXROb2RlS2V5ID0gZ2V0VGFyZ2V0Tm9kZUtleSh0YXJnZXQpLFxuICAgICAgICBydW5Nb2RlID0gdHJ1ZTtcbiAgICBjb25zdCBkZXN0cm95Rm4gPSBzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lciA/IHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyLmJpbmQoc2NvcGUpIDogXy5ub29wO1xuXG4gICAgaWYgKHN0cmluZ1N0YXJ0c1dpdGgob2JqLnZhbHVlLCAnYmluZDonKSkge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IChuZXdWYWwsIG9sZFZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKChuZXdWYWwgPT09IG9sZFZhbCAmJiBfLmlzVW5kZWZpbmVkKG5ld1ZhbCkpIHx8IChfLmlzVW5kZWZpbmVkKG5ld1ZhbCkgJiYgKCFfLmlzVW5kZWZpbmVkKG9sZFZhbCkgfHwgIV8uaXNVbmRlZmluZWQodGFyZ2V0T2JqW3RhcmdldE5vZGVLZXldKSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2tpcCBjbG9uaW5nIGZvciBibG9iIGNvbHVtblxuICAgICAgICAgICAgaWYgKCFfLmluY2x1ZGVzKFsnYmxvYicsICdmaWxlJ10sIG9iai50eXBlKSkge1xuICAgICAgICAgICAgICAgIG5ld1ZhbCA9IGdldENsb25lZE9iamVjdChuZXdWYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VmFsdWVUb05vZGUodGFyZ2V0LCBvYmosIHJvb3QsIHZhcmlhYmxlLCBuZXdWYWwpOyAvLyBjbG9uaW5nIG5ld1ZhbCB0byBrZWVwIHRoZSBzb3VyY2UgY2xlYW5cblxuICAgICAgICAgICAgaWYgKHJ1bk1vZGUpIHtcbiAgICAgICAgICAgICAgICAvKnNldCB0aGUgaW50ZXJuYWwgYm91bmQgbm9kZSBtYXAgd2l0aCB0aGUgbGF0ZXN0IHVwZGF0ZWQgdmFsdWUqL1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXJuYWxCb3VuZE5vZGVNYXAuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEJvdW5kTm9kZU1hcC5zZXQodmFyaWFibGUsIHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXy5zZXQoaW50ZXJuYWxCb3VuZE5vZGVNYXAuZ2V0KHZhcmlhYmxlKSwgW3ZhcmlhYmxlLm5hbWUsIHJvb3QsIHRhcmdldF0sIG5ld1ZhbCk7XG4gICAgICAgICAgICAgICAgLyp1cGRhdGUgdGhlIGludGVybmFsIG5vZGVzIGFmdGVyIGludGVybmFsIG5vZGUgbWFwIGlzIHNldCovXG4gICAgICAgICAgICAgICAgaWYgKF8uaXNPYmplY3QobmV3VmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJbnRlcm5hbE5vZGVzKHRhcmdldCwgcm9vdCwgdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZGVzdHJveUZuKCR3YXRjaChvYmoudmFsdWUucmVwbGFjZSgnYmluZDonLCAnJyksIHNjb3BlLCB7fSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICgpID0+IHZhcmlhYmxlLmlzTXV0ZWQpKTtcbiAgICB9IGVsc2UgaWYgKCFfLmlzVW5kZWZpbmVkKG9iai52YWx1ZSkpIHtcbiAgICAgICAgc2V0VmFsdWVUb05vZGUodGFyZ2V0LCBvYmosIHJvb3QsIHZhcmlhYmxlLCBvYmoudmFsdWUsIHRydWUpO1xuICAgICAgICBpZiAocnVuTW9kZSAmJiByb290ICE9PSB0YXJnZXROb2RlS2V5KSB7XG4gICAgICAgICAgICBpZiAoIWludGVybmFsQm91bmROb2RlTWFwLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEJvdW5kTm9kZU1hcC5zZXQodmFyaWFibGUsIHt9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF8uc2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCB0YXJnZXRdLCBvYmoudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFVCTElDICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vXG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgd2F0Y2hlcnMgZm9yIGJpbmRpbmcgZXhwcmVzc2lvbnMgY29uZmlndXJlZCBpbiB0aGUgdmFyaWFibGVcbiAqIEBwYXJhbSB2YXJpYWJsZVxuICogQHBhcmFtIGNvbnRleHQsIHNjb3BlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHZhcmlhYmxlIGV4aXN0c1xuICogQHBhcmFtIHtzdHJpbmd9IGJpbmRTb3VyY2UsICB0aGUgZmllbGQgaW4gdmFyaWFibGUgd2hlcmUgdGhlIGRhdGFiaW5kaW5ncyBhcmUgY29uZmlndXJlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9zdCB2YXJpYWJsZXMsIGl0IHdpbGwgYmUgJ2RhdGFCaW5kaW5nJywgaGVuY2UgZGVmYXVsdCBmYWxsYmFjayBpcyB0byAnZGF0YUJpbmRpbmcnXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzb21lIGl0IGNhbiBiZSAnZGF0YVNldCcgYW5kIGhlbmNlIHdpbGwgYmUgcGFzc2VkIGFzIHBhcmFtXG4gKiBAcGFyYW0ge3N0cmluZ30gYmluZFRhcmdldCwgdGhlIG9iamVjdCBmaWVsZCBpbiB2YXJpYWJsZSB3aGVyZSB0aGUgY29tcHV0ZWQgYmluZGluZ3Mgd2lsbCBiZSBzZXRcbiAqL1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NCaW5kaW5nID0gKHZhcmlhYmxlOiBhbnksIGNvbnRleHQ6IGFueSwgYmluZFNvdXJjZT86IHN0cmluZywgYmluZFRhcmdldD86IHN0cmluZykgPT4ge1xuICAgIGJpbmRTb3VyY2UgPSBiaW5kU291cmNlIHx8ICdkYXRhQmluZGluZyc7XG4gICAgYmluZFRhcmdldCA9IGJpbmRUYXJnZXQgfHwgJ2RhdGFCaW5kaW5nJztcblxuICAgIGNvbnN0IGJpbmRNYXAgPSB2YXJpYWJsZVtiaW5kU291cmNlXTtcbiAgICB2YXJpYWJsZVtiaW5kU291cmNlXSA9IHt9O1xuICAgIHZhcmlhYmxlWydfYmluZCcgKyBiaW5kU291cmNlXSA9IGJpbmRNYXA7XG4gICAgaWYgKCFiaW5kTWFwIHx8ICFfLmlzQXJyYXkoYmluZE1hcCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBiaW5kTWFwLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgLyogZm9yIHN0YXRpYyB2YXJpYWJsZSBjaGFuZ2UgdGhlIGJpbmRpbmcgd2l0aCB0YXJnZXQgJ2RhdGFCaW5kaW5nJyB0byAnZGF0YVNldCcsIGFzIHRoZSByZXN1bHRzIGhhdmUgdG8gcmVmbGVjdCBkaXJlY3RseSBpbiB0aGUgZGF0YVNldCAqL1xuICAgICAgICBpZiAodmFyaWFibGUuY2F0ZWdvcnkgPT09ICd3bS5WYXJpYWJsZScgJiYgbm9kZS50YXJnZXQgPT09ICdkYXRhQmluZGluZycpIHtcbiAgICAgICAgICAgIG5vZGUudGFyZ2V0ID0gJ2RhdGFTZXQnO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NCaW5kT2JqZWN0KG5vZGUsIGNvbnRleHQsIGJpbmRUYXJnZXQsIHZhcmlhYmxlKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogRG93bmxvYWRzIGEgZmlsZSBpbiB0aGUgYnJvd3Nlci5cbiAqIFR3byBtZXRob2RzIHRvIGRvIHNvLCBuYW1lbHk6XG4gKiAxLiBkb3dubG9hZFRocm91Z2hBbmNob3IsIGNhbGxlZCBpZlxuICogICAgICAtIGlmIGEgaGVhZGVyIGlzIHRvIGJlIHBhc3NlZFxuICogICAgICBPUlxuICogICAgICAtIGlmIHNlY3VyaXR5IGlzIE9OIGFuZCBYU1JGIHRva2VuIGlzIHRvIGJlIHNlbnQgYXMgd2VsbFxuICogTk9URTogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSB2ZXJzaW9uIDEwLjAgYW5kIGJlbG93XG4gKlxuICogMi4gZG93bmxvYWRUaHJvdWdoSWZyYW1lXG4gKiAgICAgIC0gdGhpcyBtZXRob2Qgd29ya3MgYWNyb3NzIGJyb3dzZXJzIGFuZCB1c2VzIGFuIGlmcmFtZSB0byBkb3dubGFkIHRoZSBmaWxlLlxuICogQHBhcmFtIHJlcXVlc3RQYXJhbXMgcmVxdWVzdCBwYXJhbXMgb2JqZWN0XG4gKiBAcGFyYW0gZmlsZU5hbWUgcmVwcmVzZW50cyB0aGUgZmlsZSBuYW1lXG4gKiBAcGFyYW0gZXhwb3J0Rm9ybWF0IGRvd25sb2FkZWQgZmlsZSBmb3JtYXRcbiAqIEBwYXJhbSBzdWNjZXNzIHN1Y2Nlc3MgY2FsbGJhY2tcbiAqIEBwYXJhbSBlcnJvciBlcnJvciBjYWxsYmFja1xuICovXG5leHBvcnQgY29uc3Qgc2ltdWxhdGVGaWxlRG93bmxvYWQgPSAocmVxdWVzdFBhcmFtcywgZmlsZU5hbWUsIGV4cG9ydEZvcm1hdCwgc3VjY2VzcywgZXJyb3IsIGRhdGFCaW5kaW5nKSA9PiB7XG4gICAgLypzdWNjZXNzIGFuZCBlcnJvciBjYWxsYmFja3MgYXJlIGV4ZWN1dGVkIGluY2FzZSBvZiBkb3dubG9hZFRocm91Z2hBbmNob3JcbiAgICAgRHVlIHRvIHRlY2huaWNhbCBsaW1pdGF0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBpbmNhc2Ugb2YgaWZyYW1lKi9cbiAgICBpZiAoQ09OU1RBTlRTLmhhc0NvcmRvdmEpIHtcbiAgICAgICAgbGV0IGZpbGVFeHRlbnNpb247XG4gICAgICAgIGlmIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGZpbGVFeHRlbnNpb24gPSBleHBvcnRUeXBlc01hcFtleHBvcnRGb3JtYXRdO1xuICAgICAgICB9XG4gICAgICAgIGFwcE1hbmFnZXIubm90aWZ5KCdkZXZpY2UtZmlsZS1kb3dubG9hZCcsIHsgdXJsOiByZXF1ZXN0UGFyYW1zLnVybCwgbmFtZTogZmlsZU5hbWUsIGV4dGVuc2lvbjogZmlsZUV4dGVuc2lvbiwgaGVhZGVyczogcmVxdWVzdFBhcmFtcy5oZWFkZXJzLCBzdWNjZXNzQ2I6IHN1Y2Nlc3MsIGVycm9yQ2I6IGVycm9yfSk7XG4gICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KHJlcXVlc3RQYXJhbXMuaGVhZGVycykgfHwgaXNYc3JmRW5hYmxlZCgpKSB7XG4gICAgICAgIGRvd25sb2FkVGhyb3VnaEFuY2hvcihyZXF1ZXN0UGFyYW1zLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG93bmxvYWRUaHJvdWdoSWZyYW1lKHJlcXVlc3RQYXJhbXMsIHN1Y2Nlc3MsIGRhdGFCaW5kaW5nKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIHNldHMgdGhlIHZhbHVlIGFnYWluc3QgcGFzc2VkIGtleSBvbiB0aGUgXCJpbnB1dEZpZWxkc1wiIG9iamVjdCBpbiB0aGUgdmFyaWFibGVcbiAqIEBwYXJhbSB0YXJnZXRPYmo6IHRoZSBvYmplY3QgaW4gd2hpY2ggdGhlIGtleSwgdmFsdWUgaXMgdG8gYmUgc2V0XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEBwYXJhbSBrZXk6IGNhbiBiZTpcbiAqICAtIGEgc3RyaW5nIGUuZy4gXCJ1c2VybmFtZVwiXG4gKiAgLSBhbiBvYmplY3QsIGUuZy4ge1widXNlcm5hbWVcIjogXCJqb2huXCIsIFwic3NuXCI6IFwiMTExMTFcIn1cbiAqIEBwYXJhbSB2YWxcbiAqIC0gaWYga2V5IGlzIHN0cmluZywgdGhlIHZhbHVlIGFnYWluc3QgaXQgKGZvciB0aGF0IGRhdGEgdHlwZSlcbiAqIC0gaWYga2V5IGlzIG9iamVjdCwgbm90IHJlcXVpcmVkXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGNvbnN0IHNldElucHV0ID0gKHRhcmdldE9iajogYW55LCBrZXk6IGFueSwgdmFsOiBhbnksIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgIHRhcmdldE9iaiA9IHRhcmdldE9iaiB8fCB7fTtcbiAgICBsZXQga2V5cyxcbiAgICAgICAgbGFzdEtleSxcbiAgICAgICAgcGFyYW1PYmogPSB7fTtcblxuICAgIC8vIGNvbnRlbnQgdHlwZSBjaGVja1xuICAgIGlmIChfLmlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIHN3aXRjaCAob3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdmaWxlJzpcbiAgICAgICAgICAgICAgICB2YWwgPSBnZXRCbG9iKHZhbCwgb3B0aW9ucy5jb250ZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgIHZhbCA9IF8uaXNOdW1iZXIodmFsKSA/IHZhbCA6IHBhcnNlSW50KHZhbCwgMTApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF8uaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBpcyBhbiBvYmplY3QgaXRzZWxmXG4gICAgICAgIHBhcmFtT2JqID0ga2V5O1xuICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciAnLicgaW4ga2V5IGUuZy4gJ2VtcGxveWVlLmRlcGFydG1lbnQnXG4gICAgICAgIGtleXMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgbGFzdEtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIC8vIEZpbmRpbmcgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUga2V5XG4gICAgICAgIHRhcmdldE9iaiA9IGZpbmRWYWx1ZU9mKHRhcmdldE9iaiwga2V5cy5qb2luKCcuJyksIHRydWUpO1xuICAgICAgICBrZXkgPSBsYXN0S2V5O1xuICAgICAgICBwYXJhbU9ialtrZXldID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtT2JqW2tleV0gPSB2YWw7XG4gICAgfVxuXG4gICAgXy5mb3JFYWNoKHBhcmFtT2JqLCBmdW5jdGlvbiAocGFyYW1WYWwsIHBhcmFtS2V5KSB7XG4gICAgICAgIHRhcmdldE9ialtwYXJhbUtleV0gPSBwYXJhbVZhbDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0T2JqO1xufTtcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWYgSFRNTDUgRmlsZSBBUEkgaXMgYXZhaWxhYmxlIGVsc2UgZmFsc2VcbiAqIEByZXR1cm5zIHt7cHJvdG90eXBlOiBCbG9iOyBuZXcoYmxvYlBhcnRzPzogYW55W10sIG9wdGlvbnM/OiBCbG9iUHJvcGVydHlCYWcpOiBCbG9ifX1cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRmlsZVVwbG9hZFN1cHBvcnRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYik7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFyT3JkZXJcbiAqIEBwYXJhbSBvcHRpb25zT3JkZXJcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFdmFsdWF0ZWRPcmRlckJ5ID0gKHZhck9yZGVyLCBvcHRpb25zT3JkZXIpID0+IHtcbiAgICBsZXQgb3B0aW9uRmllbGRzLFxuICAgICAgICB2YXJPcmRlckJ5O1xuICAgIC8vIElmIG9wdGlvbnMgb3JkZXIgYnkgaXMgbm90IGRlZmluZWQsIHJldHVybiB2YXJpYWJsZSBvcmRlclxuICAgIGlmICghb3B0aW9uc09yZGVyIHx8IF8uaXNFbXB0eShvcHRpb25zT3JkZXIpKSB7XG4gICAgICAgIHJldHVybiB2YXJPcmRlcjtcbiAgICB9XG4gICAgLy8gSWYgdmFyaWFibGUgb3JkZXIgYnkgaXMgbm90IGRlZmluZWQsIHJldHVybiBvcHRpb25zIG9yZGVyXG4gICAgaWYgKCF2YXJPcmRlcikge1xuICAgICAgICByZXR1cm4gb3B0aW9uc09yZGVyO1xuICAgIH1cbiAgICAvLyBJZiBib3RoIGFyZSBwcmVzZW50LCBjb21iaW5lIHRoZSBvcHRpb25zIG9yZGVyIGFuZCB2YXJpYWJsZSBvcmRlciwgd2l0aCBvcHRpb25zIG9yZGVyIGFzIHByZWNlZGVuY2VcbiAgICB2YXJPcmRlciAgICAgPSBfLnNwbGl0KHZhck9yZGVyLCAnLCcpO1xuICAgIG9wdGlvbnNPcmRlciA9IF8uc3BsaXQob3B0aW9uc09yZGVyLCAnLCcpO1xuICAgIG9wdGlvbkZpZWxkcyA9IF8ubWFwKG9wdGlvbnNPcmRlciwgZnVuY3Rpb24gKG9yZGVyKSB7XG4gICAgICAgIHJldHVybiBfLnNwbGl0KF8udHJpbShvcmRlciksICcgJylbMF07XG4gICAgfSk7XG4gICAgLy8gSWYgYSBmaWVsZCBpcyBwcmVzZW50IGluIGJvdGggb3B0aW9ucyBhbmQgdmFyaWFibGUsIHJlbW92ZSB0aGUgdmFyaWFibGUgb3JkZXJieVxuICAgIF8ucmVtb3ZlKHZhck9yZGVyLCBmdW5jdGlvbiAob3JkZXJCeSkge1xuICAgICAgICByZXR1cm4gXy5pbmNsdWRlcyhvcHRpb25GaWVsZHMsIF8uc3BsaXQoXy50cmltKG9yZGVyQnkpLCAnICcpWzBdKTtcbiAgICB9KTtcbiAgICB2YXJPcmRlckJ5ID0gdmFyT3JkZXIubGVuZ3RoID8gJywnICsgXy5qb2luKHZhck9yZGVyLCAnLCcpIDogJyc7XG4gICAgcmV0dXJuIF8uam9pbihvcHRpb25zT3JkZXIsICcsJykgKyB2YXJPcmRlckJ5O1xufTtcblxuLyoqXG4gKiBmb3JtYXR0aW5nIHRoZSBleHByZXNzaW9uIGFzIHJlcXVpcmVkIGJ5IGJhY2tlbmQgd2hpY2ggd2FzIGVuY2xvc2VkIGJ5ICR7PGV4cHJlc3Npb24+fS5cbiAqIEBwYXJhbSBmaWVsZERlZnNcbiAqIHJldHVybnMgZmllbGREZWZzXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFeHBvcnRFeHByZXNzaW9uID0gZmllbGREZWZzID0+IHtcbiAgICBfLmZvckVhY2goZmllbGREZWZzLCBmdW5jdGlvbiAoZmllbGREZWYpIHtcbiAgICAgICAgaWYgKGZpZWxkRGVmLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGZpZWxkRGVmLmV4cHJlc3Npb24gPSAnJHsnICsgZmllbGREZWYuZXhwcmVzc2lvbiArICd9JztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWVsZERlZnM7XG59O1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2VWYXJpYWJsZUNhbGwgPSBfaW52b2tlO1xuXG5jb25zdCBnZXREYXRlVGltZUZvcm1hdEZvclR5cGUgPSAodHlwZSkgPT4ge1xuICAgIHJldHVybiBERUZBVUxUX0ZPUk1BVFNbXy50b1VwcGVyKHR5cGUpXTtcbn07XG5cbi8vIEZvcm1hdCB2YWx1ZSBmb3IgZGF0ZXRpbWUgdHlwZXNcbmNvbnN0IF9mb3JtYXREYXRlID0gKGRhdGVWYWx1ZSwgdHlwZSkgPT4ge1xuICAgIGxldCBlcG9jaDtcbiAgICBpZiAoXy5pc0RhdGUoZGF0ZVZhbHVlKSkge1xuICAgICAgICBlcG9jaCA9IGRhdGVWYWx1ZS5nZXRUaW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFpc05hTihkYXRlVmFsdWUpKSB7XG4gICAgICAgICAgICBkYXRlVmFsdWUgPSBwYXJzZUludChkYXRlVmFsdWUsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBlcG9jaCA9IGRhdGVWYWx1ZSAmJiBtb21lbnQoZGF0ZVZhbHVlKS52YWx1ZU9mKCk7XG4gICAgfVxuICAgIGlmIChpc05hTihlcG9jaCkgJiYgdHlwZSAhPT0gRGF0YVR5cGUuVElNRSkge1xuICAgICAgICByZXR1cm4gZXBvY2g7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBEYXRhVHlwZS5USU1FU1RBTVApIHtcbiAgICAgICAgcmV0dXJuIGVwb2NoO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gRGF0YVR5cGUuVElNRSAmJiAhZXBvY2gpIHtcbiAgICAgICAgZXBvY2ggPSBtb21lbnQobmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSArICcgJyArIGRhdGVWYWx1ZSkudmFsdWVPZigpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZVZhbHVlICYmIGFwcE1hbmFnZXIuZ2V0UGlwZSgnZGF0ZScpLnRyYW5zZm9ybShlcG9jaCwgZ2V0RGF0ZVRpbWVGb3JtYXRGb3JUeXBlKHR5cGUpKTtcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGNvbnZlcnQgdmFsdWVzIG9mIGRhdGUgdGltZSB0eXBlcyBpbnRvIGRlZmF1bHQgZm9ybWF0c1xuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGUgPSAodmFsdWUsIHR5cGUpID0+IHtcbiAgICBpZiAoXy5pbmNsdWRlcyh0eXBlLCAnLicpKSB7XG4gICAgICAgIHR5cGUgPSBfLnRvTG93ZXIoZXh0cmFjdFR5cGUodHlwZSkpO1xuICAgIH1cbiAgICBpZiAoXy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXy5tYXAodmFsdWUsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBfZm9ybWF0RGF0ZSh2YWwsIHR5cGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9mb3JtYXREYXRlKHZhbHVlLCB0eXBlKTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZGVjb2RlcyB0aGUgdmFyaWFibGUgZGF0YSB3aGljaCBpcyBlbmNvZGVkIGZyb20gYmFja2VuZCBiZWZvcmUgc2hvd2luZyBpbiB0aGUgd2lkZ2V0cy5cbiAqIEl0IHRha2VzIHZhcmlhYmxlIHJlc3BvbnNlIGNvbnRlbnQgYXMgaW5wdXQgYW5kIGl0ZXJhdGVzIHJlY3Vyc2l2ZWx5LFxuICogaWYgdGhlIHZhbHVlIGlzIHN0cmluZyB0eXBlIHRoZW4gaXQgd2lsbCBkZWNvZGUgdGhlIGRhdGEuXG4gKiBAcGFyYW0gcmVzcG9uc2VDb250ZW50IChBcnJheSBvZiBvYmplY3RzKVxuICovXG5leHBvcnQgY29uc3QgZGVjb2RlRGF0YSA9IChyZXNwb25zZUNvbnRlbnQpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlQ29udGVudCkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZW50O1xuICAgIH1cbiAgICBpZiAoXy5pc0FycmF5KHJlc3BvbnNlQ29udGVudCkpIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlc3BvbnNlQ29udGVudCwgZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoXy5pc1N0cmluZyhkYXRhKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBodG1sRGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGRhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBfLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gaHRtbERlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZURhdGEodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChyZXNwb25zZUNvbnRlbnQpKSB7XG4gICAgICAgIF8uZm9yRWFjaChyZXNwb25zZUNvbnRlbnQsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgXy5pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRlbnRba2V5XSA9IGh0bWxEZWNvZGUodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGRlY29kZURhdGEodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcocmVzcG9uc2VDb250ZW50KSkge1xuICAgICAgICByZXNwb25zZUNvbnRlbnQgPSBodG1sRGVjb2RlKHJlc3BvbnNlQ29udGVudCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZUNvbnRlbnQ7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gaHRtbERlY29kZShpbnB1dCkge1xuICAgIHJldHVybiBoZS51bmVzY2FwZShpbnB1dCk7XG59XG4iXX0=
@@ -604,12 +604,12 @@ const setParamsFromURL = (queryParams, params) => {
604
604
  * @param variable: the variable that is called from user action
605
605
  * @param requestParams object consisting the info to construct the XHR request for the service
606
606
  */
607
- const downloadThroughIframe = (requestParams, success) => {
607
+ const downloadThroughIframe = (requestParams, success, dataBinding) => {
608
608
  // Todo: SHubham: URL contains '//' in between which should be handled at the URL formation only
609
609
  if (requestParams.url[1] === '/' && requestParams.url[2] === '/') {
610
610
  requestParams.url = requestParams.url.slice(0, 1) + requestParams.url.slice(2);
611
611
  }
612
- let iFrameElement, formEl, paramElement, queryParams = '';
612
+ let iFrameElement, formEl, paramElement, queryParams = '', data;
613
613
  const IFRAME_NAME = 'fileDownloadIFrame', FORM_NAME = 'fileDownloadForm', CONTENT_TYPE = 'Content-Type', url = requestParams.url, encType = _.get(requestParams.headers, CONTENT_TYPE), params = _.pickBy(requestParams.headers, function (val, key) { return key !== CONTENT_TYPE; });
614
614
  /* Todo: shubham : define getService method
615
615
  WS_CONSTANTS = getService('WS_CONSTANTS');*/
@@ -624,7 +624,7 @@ const downloadThroughIframe = (requestParams, success) => {
624
624
  'target': iFrameElement.attr('name'),
625
625
  'action': url,
626
626
  'method': requestParams.method,
627
- 'enctype': encType
627
+ 'enctype': !(_.isEmpty(requestParams.data) && _.isEmpty(queryParams)) ? encType : WS_CONSTANTS.CONTENT_TYPES.MULTIPART_FORMDATA
628
628
  });
629
629
  /* process query params, append a hidden input element in the form against each param */
630
630
  queryParams += url.indexOf('?') !== -1 ? url.substring(url.indexOf('?') + 1) : '';
@@ -633,8 +633,14 @@ const downloadThroughIframe = (requestParams, success) => {
633
633
  if (_.includes(WS_CONSTANTS.NON_BODY_HTTP_METHODS, _.toUpper(requestParams.method))) {
634
634
  setParamsFromURL(queryParams, params); // Set params for URL query params
635
635
  }
636
- setParamsFromURL(requestParams.data, params); // Set params for request data
637
- _.forEach(params, function (val, key) {
636
+ if (!_.isEmpty(requestParams.data)) {
637
+ setParamsFromURL(requestParams.data, params); // Set params for request data
638
+ data = params;
639
+ }
640
+ else {
641
+ data = dataBinding;
642
+ }
643
+ _.forEach(data, function (val, key) {
638
644
  paramElement = $('<input type="hidden">');
639
645
  paramElement.attr({
640
646
  'name': key,
@@ -930,7 +936,7 @@ const processBinding = (variable, context, bindSource, bindTarget) => {
930
936
  * @param success success callback
931
937
  * @param error error callback
932
938
  */
933
- const simulateFileDownload = (requestParams, fileName, exportFormat, success, error) => {
939
+ const simulateFileDownload = (requestParams, fileName, exportFormat, success, error, dataBinding) => {
934
940
  /*success and error callbacks are executed incase of downloadThroughAnchor
935
941
  Due to technical limitation cannot be executed incase of iframe*/
936
942
  if (CONSTANTS.hasCordova) {
@@ -944,7 +950,7 @@ const simulateFileDownload = (requestParams, fileName, exportFormat, success, er
944
950
  downloadThroughAnchor(requestParams, success, error);
945
951
  }
946
952
  else {
947
- downloadThroughIframe(requestParams, success);
953
+ downloadThroughIframe(requestParams, success, dataBinding);
948
954
  }
949
955
  };
950
956
  /**