single-scripture-rcl 3.3.1 → 3.3.2-beta

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.
@@ -1,18 +1,16 @@
1
1
  import "core-js/modules/es.array.concat.js";
2
+ import "core-js/modules/es.array.find-index.js";
2
3
  import "core-js/modules/es.array.includes.js";
3
4
  import "core-js/modules/es.array.is-array.js";
5
+ import "core-js/modules/es.array.join.js";
4
6
  import "core-js/modules/es.array.map.js";
5
- import "core-js/modules/es.parse-int.js";
7
+ import "core-js/modules/es.object.keys.js";
8
+ import "core-js/modules/es.regexp.exec.js";
6
9
  import "core-js/modules/es.string.includes.js";
10
+ import "core-js/modules/es.string.split.js";
7
11
  import "regenerator-runtime/runtime.js";
8
12
 
9
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
10
-
11
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
12
-
13
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
14
-
15
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
16
14
 
17
15
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
18
16
 
@@ -40,44 +38,25 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
40
38
 
41
39
  import * as React from 'react';
42
40
  import * as PropTypes from 'prop-types';
43
- import { RxLink2, RxLinkBreak2 } from 'react-icons/rx';
41
+ import { core } from 'scripture-resources-rcl';
42
+ import usfmjs from 'usfm-js';
43
+ import { useEdit } from 'gitea-react-toolkit';
44
44
  import { Card, useCardState, useUserBranch, ERROR_STATE, MANIFEST_NOT_LOADED_ERROR } from 'translation-helps-rcl';
45
- import { WordAligner } from 'word-aligner-rcl';
46
- import CheckOutlinedIcon from '@mui/icons-material/CheckOutlined';
47
- import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';
48
- import { IconButton } from '@mui/material';
45
+ import { AlignmentHelpers, UsfmFileConversionHelpers } from 'word-aligner-rcl';
46
+ import * as isEqual from 'deep-equal';
49
47
  import { ScripturePane, ScriptureSelector } from '..';
50
48
  import { useScriptureSettings } from '../../hooks/useScriptureSettings';
51
- import { getVerseDataFromScripConfig, getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
49
+ import { getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
52
50
  import { Title } from '../ScripturePane/styled';
53
51
  import { NT_ORIG_LANG, ORIGINAL_SOURCE, OT_ORIG_LANG } from '../../utils';
54
- import { useScriptureAlignmentEdit } from '../../hooks/useScriptureAlignmentEdit';
55
52
  var KEY_FONT_SIZE_BASE = 'scripturePaneFontSize_';
56
53
  var label = 'Version';
57
54
  var style = {
58
55
  marginTop: '16px',
59
56
  width: '500px'
60
57
  };
61
-
62
- function initializeVerseNumber(verse) {
63
- var initialVerse = verse;
64
-
65
- if (typeof verse === 'string' && verse.includes('-')) {
66
- initialVerse = parseInt(verse.charAt(0));
67
- }
68
-
69
- return initialVerse;
70
- }
71
-
72
- function getVerseObjectsForVerse(scriptureConfig, currentVerseNum) {
73
- var _currentVerseData$ver;
74
-
75
- var currentVerseData = getVerseDataFromScripConfig(scriptureConfig, currentVerseNum) || null;
76
- return (currentVerseData === null || currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || null;
77
- }
78
-
79
58
  export default function ScriptureCard(_ref) {
80
- var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso4, _scriptureConfig$reso5, _scriptureConfig$reso6, _scriptureConfig$vers;
59
+ var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _scriptureConfig$reso4, _scriptureConfig$reso6, _scriptureConfig$reso7, _scriptureConfig$reso8, _httpConfig, _httpConfig2;
81
60
 
82
61
  var id = _ref.id,
83
62
  isNT = _ref.isNT,
@@ -111,22 +90,33 @@ export default function ScriptureCard(_ref) {
111
90
  authentication = _ref.authentication,
112
91
  setSavedChanges = _ref.setSavedChanges,
113
92
  bookIndex = _ref.bookIndex,
114
- addVerseRange = _ref.addVerseRange;
93
+ addVerseRange = _ref.addVerseRange,
94
+ setWordAlignerStatus = _ref.setWordAlignerStatus;
115
95
 
116
96
  var _React$useState = React.useState({
117
- currentVerseNum: initializeVerseNumber(verse),
97
+ haveUnsavedChanges: false,
118
98
  ref: appRef,
99
+ saveContent: null,
100
+ sha: null,
101
+ startSave: false,
119
102
  urlError: null,
120
- usingUserBranch: false
103
+ usingUserBranch: false,
104
+ unsavedChangesList: {},
105
+ versesForRef: null
121
106
  }),
122
107
  _React$useState2 = _slicedToArray(_React$useState, 2),
123
108
  state = _React$useState2[0],
124
109
  setState_ = _React$useState2[1];
125
110
 
126
- var currentVerseNum = state.currentVerseNum,
127
- ref = state.ref,
111
+ var ref = state.ref,
112
+ saveContent = state.saveContent,
113
+ sha = state.sha,
114
+ startSave = state.startSave,
128
115
  urlError = state.urlError,
129
- usingUserBranch = state.usingUserBranch;
116
+ usingUserBranch = state.usingUserBranch,
117
+ unsavedChangesList = state.unsavedChangesList,
118
+ haveUnsavedChanges = state.haveUnsavedChanges,
119
+ versesForRef = state.versesForRef;
130
120
 
131
121
  var _useUserLocalStorage = useUserLocalStorage(KEY_FONT_SIZE_BASE + cardNum, 100),
132
122
  _useUserLocalStorage2 = _slicedToArray(_useUserLocalStorage, 2),
@@ -181,11 +171,28 @@ export default function ScriptureCard(_ref) {
181
171
  scriptureSettings = _useScriptureSettings.scriptureSettings,
182
172
  scriptureVersionHist = _useScriptureSettings.scriptureVersionHist;
183
173
 
184
- var currentVerseObjects = getVerseObjectsForVerse(scriptureConfig, currentVerseNum); // @ts-ignore
174
+ var fetchResp_ = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse; // @ts-ignore
175
+
176
+ var repo = "".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.languageId, "_").concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso2 = scriptureConfig.resource) === null || _scriptureConfig$reso2 === void 0 ? void 0 : _scriptureConfig$reso2.projectId);
177
+ var reference_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
178
+ React.useEffect(function () {
179
+ var _fetchResp_$data;
180
+
181
+ // get the _sha from last scripture download
182
+ var _sha = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data = fetchResp_.data) === null || _fetchResp_$data === void 0 ? void 0 : _fetchResp_$data.sha) || null;
185
183
 
186
- var cardResourceId = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.projectId) || resourceId; // @ts-ignore
184
+ console.log("for ".concat(JSON.stringify(reference_), " new sha is ").concat(_sha));
187
185
 
188
- var ref_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso2 = scriptureConfig.resource) === null || _scriptureConfig$reso2 === void 0 ? void 0 : _scriptureConfig$reso2.ref) || appRef;
186
+ if (_sha !== sha) {
187
+ setState({
188
+ sha: _sha
189
+ });
190
+ }
191
+ }, [fetchResp_]); // @ts-ignore
192
+
193
+ var cardResourceId = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso3 = scriptureConfig.resource) === null || _scriptureConfig$reso3 === void 0 ? void 0 : _scriptureConfig$reso3.projectId) || resourceId; // @ts-ignore
194
+
195
+ var ref_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso4 = scriptureConfig.resource) === null || _scriptureConfig$reso4 === void 0 ? void 0 : _scriptureConfig$reso4.ref) || appRef;
189
196
  var canUseEditBranch = loggedInUser && authentication && resourceId !== ORIGINAL_SOURCE && (ref_ === 'master' || ref_.substring(0, loggedInUser.length) === loggedInUser); // not tag
190
197
 
191
198
  var _useUserBranch = useUserBranch({
@@ -206,11 +213,6 @@ export default function ScriptureCard(_ref) {
206
213
  startEditBranch = _useUserBranch.actions.startEdit;
207
214
 
208
215
  var workingRef = canUseEditBranch ? workingResourceBranch : appRef;
209
- var reference_ = {
210
- bookId: bookId,
211
- chapter: chapter,
212
- verse: verse
213
- };
214
216
  var scriptureTitle;
215
217
  React.useEffect(function () {
216
218
  // select correct working ref - could be master, user branch, or release
@@ -231,10 +233,10 @@ export default function ScriptureCard(_ref) {
231
233
  }
232
234
  }, [workingRef, ref, appRef]);
233
235
  React.useEffect(function () {
234
- var _scriptureConfig$reso3;
236
+ var _scriptureConfig$reso5;
235
237
 
236
238
  // update display status if error
237
- var error = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso3 = scriptureConfig.resourceStatus) === null || _scriptureConfig$reso3 === void 0 ? void 0 : _scriptureConfig$reso3[ERROR_STATE];
239
+ var error = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso5 = scriptureConfig.resourceStatus) === null || _scriptureConfig$reso5 === void 0 ? void 0 : _scriptureConfig$reso5[ERROR_STATE];
238
240
 
239
241
  if (error) {
240
242
  // if error was found do callback
@@ -246,7 +248,7 @@ export default function ScriptureCard(_ref) {
246
248
  var isAccessError = resourceStatus[MANIFEST_NOT_LOADED_ERROR];
247
249
  onResourceError && onResourceError(message, isAccessError, resourceStatus);
248
250
  }
249
- }, [scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso4 = scriptureConfig.resourceStatus) === null || _scriptureConfig$reso4 === void 0 ? void 0 : _scriptureConfig$reso4[ERROR_STATE], onResourceError]);
251
+ }, [scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso6 = scriptureConfig.resourceStatus) === null || _scriptureConfig$reso6 === void 0 ? void 0 : _scriptureConfig$reso6[ERROR_STATE]]);
250
252
 
251
253
  if (scriptureConfig.title && scriptureConfig.version) {
252
254
  scriptureTitle = "".concat(scriptureConfig.title, " v").concat(scriptureConfig.version);
@@ -278,7 +280,7 @@ export default function ScriptureCard(_ref) {
278
280
  } // @ts-ignore
279
281
 
280
282
 
281
- var languageId_ = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso5 = scriptureConfig.resource) === null || _scriptureConfig$reso5 === void 0 ? void 0 : _scriptureConfig$reso5.languageId;
283
+ var languageId_ = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso7 = scriptureConfig.resource) === null || _scriptureConfig$reso7 === void 0 ? void 0 : _scriptureConfig$reso7.languageId;
282
284
  var language = getLanguage({
283
285
  languageId: languageId_
284
286
  });
@@ -290,12 +292,6 @@ export default function ScriptureCard(_ref) {
290
292
  var fontFactor = isHebrew ? 1.4 : 1; // we automatically scale up font size for Hebrew
291
293
 
292
294
  var scaledFontSize = fontSize * fontFactor;
293
-
294
- if (scriptureConfig.matchedVerse) {
295
- // support verse ranges
296
- reference.verse = scriptureConfig.matchedVerse;
297
- }
298
-
299
295
  var items = null;
300
296
 
301
297
  var _useCardState = useCardState({
@@ -325,7 +321,7 @@ export default function ScriptureCard(_ref) {
325
321
  }, [scaledFontSize]);
326
322
  var scriptureLabel = /*#__PURE__*/React.createElement(Title, null, scriptureTitle);
327
323
  var disableWordPopover_ = disableWordPopover;
328
- var usingOriginalBible = isOriginalBible((_scriptureConfig$reso6 = scriptureConfig['resource']) === null || _scriptureConfig$reso6 === void 0 ? void 0 : _scriptureConfig$reso6.projectId);
324
+ var usingOriginalBible = isOriginalBible((_scriptureConfig$reso8 = scriptureConfig['resource']) === null || _scriptureConfig$reso8 === void 0 ? void 0 : _scriptureConfig$reso8.projectId);
329
325
 
330
326
  if (disableWordPopover === undefined) {
331
327
  // if not specified, then determine if original language resource
@@ -336,19 +332,39 @@ export default function ScriptureCard(_ref) {
336
332
  // pre-cache glosses on verse change
337
333
  var fetchGlossDataForVerse = /*#__PURE__*/function () {
338
334
  var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
335
+ var _verseObjects2;
336
+
337
+ var verseObjects, _iterator, _step, _verseRef$verseData, verseRef, _verseObjects;
338
+
339
339
  return regeneratorRuntime.wrap(function _callee$(_context) {
340
340
  while (1) {
341
341
  switch (_context.prev = _context.next) {
342
342
  case 0:
343
- if (!(!disableWordPopover && currentVerseObjects && fetchGlossesForVerse)) {
344
- _context.next = 3;
343
+ verseObjects = []; // get verse objects of all the verses
344
+
345
+ _iterator = _createForOfIteratorHelper((scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef) || []);
346
+
347
+ try {
348
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
349
+ verseRef = _step.value;
350
+ _verseObjects = verseRef === null || verseRef === void 0 ? void 0 : (_verseRef$verseData = verseRef.verseData) === null || _verseRef$verseData === void 0 ? void 0 : _verseRef$verseData.verseObjects;
351
+ verseObjects = verseObjects.concat(_verseObjects);
352
+ }
353
+ } catch (err) {
354
+ _iterator.e(err);
355
+ } finally {
356
+ _iterator.f();
357
+ }
358
+
359
+ if (!(!disableWordPopover && (_verseObjects2 = verseObjects) !== null && _verseObjects2 !== void 0 && _verseObjects2.length && fetchGlossesForVerse)) {
360
+ _context.next = 6;
345
361
  break;
346
362
  }
347
363
 
348
- _context.next = 3;
349
- return fetchGlossesForVerse(currentVerseObjects, languageId_);
364
+ _context.next = 6;
365
+ return fetchGlossesForVerse(verseObjects, languageId_);
350
366
 
351
- case 3:
367
+ case 6:
352
368
  case "end":
353
369
  return _context.stop();
354
370
  }
@@ -361,118 +377,358 @@ export default function ScriptureCard(_ref) {
361
377
  };
362
378
  }();
363
379
 
364
- fetchGlossDataForVerse();
365
- }, [currentVerseObjects, disableWordPopover, languageId_, fetchGlossesForVerse]);
380
+ if (usingOriginalBible) {
381
+ fetchGlossDataForVerse();
382
+ }
383
+ }, [versesForRef, languageId_]);
366
384
  var enableEdit = !usingOriginalBible;
367
385
  var enableAlignment = !usingOriginalBible;
368
386
  var originalRepoUrl = isNewTestament ? greekRepoUrl : hebrewRepoUrl;
369
-
370
- var _useScriptureAlignmen = useScriptureAlignmentEdit({
387
+ var scriptureAlignmentEditConfig = {
371
388
  authentication: canUseEditBranch ? authentication : null,
389
+ bookIndex: bookIndex,
390
+ currentVerseRef: reference,
372
391
  enableEdit: enableEdit,
373
392
  enableAlignment: enableAlignment,
374
393
  httpConfig: httpConfig,
375
- initialVerseObjects: currentVerseObjects,
376
- isNewTestament: isNewTestament,
377
394
  // @ts-ignore
395
+ isNewTestament: isNewTestament,
378
396
  loggedInUser: canUseEditBranch ? loggedInUser : null,
379
397
  originalLanguageOwner: originalLanguageOwner,
380
- originalRepoUrl: originalRepoUrl,
381
398
  // @ts-ignore
399
+ originalRepoUrl: originalRepoUrl,
382
400
  scriptureConfig: scriptureConfig,
383
401
  scriptureSettings: scriptureSettings,
384
402
  startEditBranch: startEditBranch,
385
- bookIndex: bookIndex,
386
- workingResourceBranch: ref,
387
- currentVerseNum: currentVerseNum
403
+ setSavedChanges: _setSavedChanges,
404
+ sourceLanguage: isNT_ ? NT_ORIG_LANG : OT_ORIG_LANG,
405
+ targetLanguage: language,
406
+ title: scriptureTitle,
407
+ workingResourceBranch: ref
408
+ };
409
+ /**
410
+ * this gets called whenever a scripture pane has a change in save state
411
+ * @param {number} currentIndex
412
+ * @param {boolean} saved
413
+ * @param {function} getChanges - will be called whenever user clicks save button
414
+ * @param {function} clearChanges - will be called whenever save has completed
415
+ */
416
+
417
+ function _setSavedChanges(currentIndex, saved) {
418
+ var getChanges = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
419
+ var clearChanges = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
420
+
421
+ var _unsavedChangesList = _objectSpread({}, unsavedChangesList);
422
+
423
+ if (saved) {
424
+ if (_unsavedChangesList.hasOwnProperty(currentIndex)) {
425
+ delete _unsavedChangesList[currentIndex];
426
+ }
427
+ } else {
428
+ if (!_unsavedChangesList.hasOwnProperty(currentIndex)) {
429
+ _unsavedChangesList[currentIndex] = {
430
+ getChanges: getChanges,
431
+ clearChanges: clearChanges
432
+ };
433
+ }
434
+ }
435
+
436
+ var _haveUnsavedChanges = !!Object.keys(_unsavedChangesList).length;
437
+
438
+ if (haveUnsavedChanges != _haveUnsavedChanges) {
439
+ setSavedChanges && setSavedChanges(resourceId, !_haveUnsavedChanges);
440
+ setState({
441
+ haveUnsavedChanges: _haveUnsavedChanges
442
+ });
443
+ }
444
+
445
+ if (!isEqual(_unsavedChangesList, unsavedChangesList)) {
446
+ setState({
447
+ unsavedChangesList: _unsavedChangesList
448
+ });
449
+ }
450
+ }
451
+ /**
452
+ * search chapter or verse chunk to line that starts with findItem
453
+ * @param {number|string} findItem
454
+ * @param {string[]} chunks
455
+ */
456
+
457
+
458
+ function findRefInArray(findItem, chunks) {
459
+ var ref_ = findItem + '';
460
+ var refLen = ref_.length;
461
+ var index = chunks.findIndex(function (chunk, idx) {
462
+ if (idx > 0) {
463
+ if (chunk.substring(0, refLen) === ref_) {
464
+ var nextChar = chunk[ref_];
465
+
466
+ if (nextChar > '9' || nextChar < '0') {
467
+ return true;
468
+ }
469
+ }
470
+ }
471
+
472
+ return false;
473
+ });
474
+ return index;
475
+ }
476
+
477
+ function getBookName() {
478
+ var _scriptureConfig$refe;
479
+
480
+ var bookCaps = scriptureConfig !== null && scriptureConfig !== void 0 && (_scriptureConfig$refe = scriptureConfig.reference) !== null && _scriptureConfig$refe !== void 0 && _scriptureConfig$refe.projectId ? scriptureConfig.reference.projectId.toUpperCase() : '';
481
+ return "".concat(bookIndex, "-").concat(bookCaps, ".usfm");
482
+ }
483
+
484
+ var filepath = getBookName(); // keep track of verse edit state
485
+
486
+ var _useEdit = useEdit({
487
+ sha: sha,
488
+ owner: owner,
489
+ content: saveContent,
490
+ config: _objectSpread(_objectSpread({
491
+ cache: {
492
+ maxAge: 0
493
+ }
494
+ }, authentication === null || authentication === void 0 ? void 0 : authentication.config), {}, {
495
+ token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
496
+ // @ts-ignore
497
+ timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 5000
498
+ }),
499
+ author: loggedInUser,
500
+ token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
501
+ branch: workingResourceBranch,
502
+ filepath: filepath,
503
+ repo: repo
388
504
  }),
389
- _useScriptureAlignmen2 = _useScriptureAlignmen.actions,
390
- cancelAlignment = _useScriptureAlignmen2.cancelAlignment,
391
- editedVerseObjects = _useScriptureAlignmen2.editedVerseObjects,
392
- handleAlignmentClick = _useScriptureAlignmen2.handleAlignmentClick,
393
- onAlignmentsChange = _useScriptureAlignmen2.onAlignmentsChange,
394
- saveAlignment = _useScriptureAlignmen2.saveAlignment,
395
- setEditing = _useScriptureAlignmen2.setEditing,
396
- setVerseChanged = _useScriptureAlignmen2.setVerseChanged,
397
- saveChangesToCloud = _useScriptureAlignmen2.saveChangesToCloud,
398
- _useScriptureAlignmen3 = _useScriptureAlignmen.state,
399
- aligned = _useScriptureAlignmen3.aligned,
400
- alignerData = _useScriptureAlignmen3.alignerData,
401
- editing = _useScriptureAlignmen3.editing,
402
- unsavedChanges = _useScriptureAlignmen3.unsavedChanges;
505
+ onSaveEdit = _useEdit.onSaveEdit;
403
506
 
404
507
  React.useEffect(function () {
405
- // set saved changes whenever user edits verse text or alignments or if alignments are open
406
- var unsavedChanges_ = unsavedChanges || alignerData;
407
- setSavedChanges && setSavedChanges(resourceId, !unsavedChanges_);
408
- }, [unsavedChanges, alignerData]);
409
-
410
- function showPopover(PopoverTitle, wordDetails, positionCoord, rawData) {
411
- // TODO: make show popover pretty
412
- console.log("showPopover", rawData);
413
- window.prompt("User clicked on ".concat(JSON.stringify(rawData.token)));
414
- }
508
+ // when startSave goes true, save edits to user branch and then clear startSave
509
+ var _saveEdit = /*#__PURE__*/function () {
510
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
511
+ var branch;
512
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
513
+ while (1) {
514
+ switch (_context2.prev = _context2.next) {
515
+ case 0:
516
+ // begin uploading new USFM
517
+ branch = workingResourceBranch !== 'master' ? workingResourceBranch : undefined;
518
+
519
+ if (branch) {
520
+ _context2.next = 5;
521
+ break;
522
+ }
523
+
524
+ _context2.next = 4;
525
+ return startEditBranch();
526
+
527
+ case 4:
528
+ branch = _context2.sent;
529
+
530
+ case 5:
531
+ _context2.next = 7;
532
+ return onSaveEdit(branch).then(function (success) {
533
+ // push changed to server
534
+ if (success) {
535
+ console.log("saveChangesToCloud() - save scripture edits success");
536
+ setState({
537
+ startSave: false
538
+ });
539
+ var unsavedCardIndices = Object.keys(unsavedChangesList);
540
+
541
+ if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
542
+ var _iterator2 = _createForOfIteratorHelper(unsavedCardIndices),
543
+ _step2;
544
+
545
+ try {
546
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
547
+ var cardIndex = _step2.value;
548
+ var clearChanges = unsavedChangesList[cardIndex].clearChanges;
549
+ clearChanges && clearChanges();
550
+ }
551
+ } catch (err) {
552
+ _iterator2.e(err);
553
+ } finally {
554
+ _iterator2.f();
555
+ }
556
+ }
557
+
558
+ console.info('saveChangesToCloud() - Reloading resource');
559
+ scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
560
+ } else {
561
+ console.error('saveChangesToCloud() - saving changed scripture failed');
562
+ setState({
563
+ startSave: false
564
+ });
565
+ }
566
+ });
567
+
568
+ case 7:
569
+ case "end":
570
+ return _context2.stop();
571
+ }
572
+ }
573
+ }, _callee2);
574
+ }));
575
+
576
+ return function _saveEdit() {
577
+ return _ref3.apply(this, arguments);
578
+ };
579
+ }();
415
580
 
416
- var checkingState = aligned ? 'valid' : 'invalid';
417
- var titleText = checkingState === 'valid' ? 'Alignment is Valid' : 'Alignment is Invalid';
418
-
419
- var onRenderToolbar = function onRenderToolbar(_ref3) {
420
- var items = _ref3.items;
421
- return [].concat(_toConsumableArray(items), [/*#__PURE__*/React.createElement(IconButton, {
422
- className: classes.margin,
423
- key: "checking-button",
424
- onClick: function onClick() {
425
- return handleAlignmentClick();
426
- },
427
- title: titleText,
428
- "aria-label": titleText,
429
- style: {
430
- cursor: 'pointer'
581
+ if (startSave) {
582
+ console.log("saveChangesToCloud - calling _saveEdit()");
583
+
584
+ _saveEdit();
585
+ }
586
+ }, [startSave]);
587
+ /**
588
+ * for each unsaved change, call into versePane to get latest changes for verse to save
589
+ */
590
+
591
+ function saveChangesToCloud() {
592
+ var unsavedCardIndices = Object.keys(unsavedChangesList);
593
+
594
+ if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
595
+ var originalUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
596
+ var updatedBibleUsfm = originalUsfm;
597
+
598
+ var _iterator3 = _createForOfIteratorHelper(unsavedCardIndices),
599
+ _step3;
600
+
601
+ try {
602
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
603
+ var cardIndex = _step3.value;
604
+ var getChanges = unsavedChangesList[cardIndex].getChanges;
605
+
606
+ if (getChanges) {
607
+ var newUsfm = void 0;
608
+
609
+ var _getChanges = getChanges(),
610
+ newVerseText = _getChanges.newVerseText,
611
+ _ref4 = _getChanges.ref,
612
+ updatedVerseObjects = _getChanges.updatedVerseObjects;
613
+
614
+ if (updatedVerseObjects && updatedBibleUsfm) {
615
+ var _updatedBibleUsfm;
616
+
617
+ // just replace verse
618
+ var chapterChunks = (_updatedBibleUsfm = updatedBibleUsfm) === null || _updatedBibleUsfm === void 0 ? void 0 : _updatedBibleUsfm.split('\\c ');
619
+ var chapterIndex = findRefInArray(_ref4 === null || _ref4 === void 0 ? void 0 : _ref4.chapter, chapterChunks);
620
+
621
+ if (chapterIndex >= 0) {
622
+ var currentChapter = chapterChunks[chapterIndex];
623
+ var verseChunks = currentChapter.split('\\v ');
624
+ var verseIndex = findRefInArray(_ref4 === null || _ref4 === void 0 ? void 0 : _ref4.verse, verseChunks);
625
+
626
+ if (verseIndex >= 0) {
627
+ var newVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(updatedVerseObjects);
628
+ var oldVerse = verseChunks[verseIndex];
629
+ var verseNumLen = ((_ref4 === null || _ref4 === void 0 ? void 0 : _ref4.verse) + '').length;
630
+ verseChunks[verseIndex] = oldVerse.substring(0, verseNumLen + 1) + newVerseUsfm;
631
+ var newChapter = verseChunks.join('\\v ');
632
+ chapterChunks[chapterIndex] = newChapter;
633
+ newUsfm = chapterChunks.join('\\c ');
634
+ }
635
+ }
636
+ }
637
+
638
+ if (updatedVerseObjects && !newUsfm) {
639
+ var targetVerseObjects_ = null;
640
+
641
+ if (_ref4) {
642
+ if (newVerseText) {
643
+ var _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(updatedVerseObjects, newVerseText),
644
+ targetVerseObjects = _AlignmentHelpers$upd.targetVerseObjects;
645
+
646
+ targetVerseObjects_ = targetVerseObjects;
647
+ } else {
648
+ targetVerseObjects_ = updatedVerseObjects;
649
+ }
650
+ }
651
+
652
+ var newBookJson = targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(_ref4.chapter, _ref4.verse, {
653
+ verseObjects: targetVerseObjects_
654
+ }));
655
+ updatedBibleUsfm = usfmjs.toUSFM(newBookJson, {
656
+ forcedNewLines: true
657
+ });
658
+ }
659
+ }
660
+ }
661
+ } catch (err) {
662
+ _iterator3.e(err);
663
+ } finally {
664
+ _iterator3.f();
431
665
  }
432
- }, checkingState === 'valid' ? /*#__PURE__*/React.createElement(RxLink2, {
433
- id: "valid_icon",
434
- color: "#BBB"
435
- }) : /*#__PURE__*/React.createElement(RxLinkBreak2, {
436
- id: "invalid_icon",
437
- color: "#000"
438
- }))]);
439
- };
666
+
667
+ console.log("saveChangesToCloud() - saving new USFM: ".concat(updatedBibleUsfm.substring(0, 100), "..."));
668
+ setState({
669
+ saveContent: updatedBibleUsfm,
670
+ startSave: true
671
+ });
672
+ }
673
+ }
440
674
 
441
675
  React.useEffect(function () {
442
676
  // check for verse range
443
- var _verse = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.matchedVerse;
677
+ var _verse = reference.verse;
444
678
 
445
679
  if (addVerseRange && typeof _verse === 'string') {
446
680
  // @ts-ignore
447
681
  if (_verse.includes('-')) {
448
- var _scriptureConfig$refe;
682
+ var _scriptureConfig$refe2;
449
683
 
450
- addVerseRange("".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$refe = scriptureConfig.reference) === null || _scriptureConfig$refe === void 0 ? void 0 : _scriptureConfig$refe.chapter, ":").concat(_verse));
684
+ addVerseRange("".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$refe2 = scriptureConfig.reference) === null || _scriptureConfig$refe2 === void 0 ? void 0 : _scriptureConfig$refe2.chapter, ":").concat(_verse));
451
685
  }
452
686
  }
453
- }, [scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.matchedVerse]);
454
- var renderedScripturePanes = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$vers = scriptureConfig.versesForRef) === null || _scriptureConfig$vers === void 0 ? void 0 : _scriptureConfig$vers.map(function (_ref4, index) {
455
- var verse = _ref4.verse;
456
- var mappedVerseObjects = getVerseObjectsForVerse(scriptureConfig, verse);
457
- return /*#__PURE__*/React.createElement(ScripturePane, _extends({
458
- key: index,
459
- refStyle: refStyle
460
- }, scriptureConfig, {
461
- verseObjects: mappedVerseObjects,
462
- isNT: isNT_,
463
- server: server,
464
- reference: _objectSpread(_objectSpread({}, reference), {}, {
465
- verse: verse
466
- }),
467
- direction: direction,
687
+ }, [reference.verse]);
688
+ React.useEffect(function () {
689
+ if (!isEqual(versesForRef, scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef)) {
690
+ setState({
691
+ versesForRef: scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef
692
+ });
693
+ }
694
+ }, [scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef]);
695
+ var renderedScripturePanes = versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.map(function (_currentVerseData, index) {
696
+ var _currentVerseData$ver;
697
+
698
+ var initialVerseObjects = (_currentVerseData === null || _currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = _currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || null; // @ts-ignore
699
+
700
+ var _ref5 = _currentVerseData || {},
701
+ chapter = _ref5.chapter,
702
+ verse = _ref5.verse;
703
+
704
+ var _reference = _objectSpread(_objectSpread({}, reference), {}, {
705
+ chapter: chapter,
706
+ verse: verse
707
+ });
708
+
709
+ var _scriptureAlignmentEditConfig = _objectSpread(_objectSpread({}, scriptureAlignmentEditConfig), {}, {
710
+ currentIndex: index,
711
+ initialVerseObjects: initialVerseObjects,
712
+ reference: _reference
713
+ });
714
+
715
+ return /*#__PURE__*/React.createElement(ScripturePane, _extends({}, scriptureConfig, {
468
716
  contentStyle: contentStyle,
469
- fontSize: fontSize,
717
+ currentIndex: index,
718
+ direction: direction,
470
719
  disableWordPopover: disableWordPopover_,
720
+ fontSize: fontSize,
471
721
  getLexiconData: getLexiconData,
472
- translate: translate,
473
- editing: editing,
474
- setEditing: setEditing,
475
- setVerseChanged: setVerseChanged
722
+ isNT: isNT_,
723
+ key: index,
724
+ refStyle: refStyle,
725
+ reference: _reference,
726
+ saving: startSave // @ts-ignore
727
+ ,
728
+ scriptureAlignmentEditConfig: _scriptureAlignmentEditConfig,
729
+ setWordAlignerStatus: setWordAlignerStatus,
730
+ server: server,
731
+ translate: translate
476
732
  }));
477
733
  });
478
734
  return /*#__PURE__*/React.createElement(Card, {
@@ -497,63 +753,9 @@ export default function ScriptureCard(_ref) {
497
753
  return onMinimize(id);
498
754
  } : null,
499
755
  editable: enableEdit || enableAlignment,
500
- saved: !unsavedChanges,
501
- onSaveEdit: saveChangesToCloud,
502
- onBlur: function onBlur() {
503
- return setEditing(false);
504
- },
505
- onRenderToolbar: onRenderToolbar
506
- }, alignerData ? /*#__PURE__*/React.createElement("div", {
507
- style: {
508
- flexDirection: 'column'
509
- }
510
- }, /*#__PURE__*/React.createElement(WordAligner, {
511
- style: {
512
- maxHeight: '450px',
513
- overflowY: 'auto'
514
- },
515
- verseAlignments: alignerData.alignments,
516
- targetWords: alignerData.wordBank,
517
- translate: translate,
518
- contextId: {
519
- reference: reference_
520
- },
521
- targetLanguage: language,
522
- targetLanguageFont: '',
523
- sourceLanguage: isNT_ ? NT_ORIG_LANG : OT_ORIG_LANG,
524
- showPopover: showPopover,
525
- lexicons: {},
526
- loadLexiconEntry: getLexiconData,
527
- onChange: function onChange(results) {
528
- return onAlignmentsChange(results);
529
- }
530
- }), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("div", {
531
- style: {
532
- width: '100%'
533
- }
534
- }, /*#__PURE__*/React.createElement(IconButton, {
535
- disabled: false,
536
- className: classes.margin,
537
- key: "alignment-save",
538
- onClick: function onClick() {
539
- return saveAlignment();
540
- },
541
- "aria-label": 'Alignment Save'
542
- }, /*#__PURE__*/React.createElement(CheckOutlinedIcon, {
543
- id: "alignment-save-icon",
544
- htmlColor: "#000"
545
- })), /*#__PURE__*/React.createElement(IconButton, {
546
- disabled: false,
547
- className: classes.margin,
548
- key: "alignment-cancel",
549
- onClick: function onClick() {
550
- return cancelAlignment();
551
- },
552
- "aria-label": 'Alignment Cancel'
553
- }, /*#__PURE__*/React.createElement(CancelOutlinedIcon, {
554
- id: "alignment-cancel-icon",
555
- htmlColor: "#000"
556
- })))) : /*#__PURE__*/React.createElement("div", {
756
+ saved: startSave || !haveUnsavedChanges,
757
+ onSaveEdit: saveChangesToCloud
758
+ }, /*#__PURE__*/React.createElement("div", {
557
759
  id: "scripture-pane-list"
558
760
  }, renderedScripturePanes));
559
761
  }
@@ -656,6 +858,9 @@ ScriptureCard.propTypes = {
656
858
  bookIndex: PropTypes.string,
657
859
 
658
860
  /** callback to indicate that we are using a verse range here */
659
- addVerseRange: PropTypes.func
861
+ addVerseRange: PropTypes.func,
862
+
863
+ /** callback to update word aligner state */
864
+ setWordAlignerStatus: PropTypes.func
660
865
  };
661
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJSeExpbmsyIiwiUnhMaW5rQnJlYWsyIiwiQ2FyZCIsInVzZUNhcmRTdGF0ZSIsInVzZVVzZXJCcmFuY2giLCJFUlJPUl9TVEFURSIsIk1BTklGRVNUX05PVF9MT0FERURfRVJST1IiLCJXb3JkQWxpZ25lciIsIkNoZWNrT3V0bGluZWRJY29uIiwiQ2FuY2VsT3V0bGluZWRJY29uIiwiSWNvbkJ1dHRvbiIsIlNjcmlwdHVyZVBhbmUiLCJTY3JpcHR1cmVTZWxlY3RvciIsInVzZVNjcmlwdHVyZVNldHRpbmdzIiwiZ2V0VmVyc2VEYXRhRnJvbVNjcmlwQ29uZmlnIiwiZ2V0UmVzb3VyY2VMaW5rIiwiZ2V0UmVzb3VyY2VNZXNzYWdlIiwiZ2V0U2NyaXB0dXJlVmVyc2lvblNldHRpbmdzIiwiaXNPcmlnaW5hbEJpYmxlIiwiVGl0bGUiLCJOVF9PUklHX0xBTkciLCJPUklHSU5BTF9TT1VSQ0UiLCJPVF9PUklHX0xBTkciLCJ1c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0IiwiS0VZX0ZPTlRfU0laRV9CQVNFIiwibGFiZWwiLCJzdHlsZSIsIm1hcmdpblRvcCIsIndpZHRoIiwiaW5pdGlhbGl6ZVZlcnNlTnVtYmVyIiwidmVyc2UiLCJpbml0aWFsVmVyc2UiLCJpbmNsdWRlcyIsInBhcnNlSW50IiwiY2hhckF0IiwiZ2V0VmVyc2VPYmplY3RzRm9yVmVyc2UiLCJzY3JpcHR1cmVDb25maWciLCJjdXJyZW50VmVyc2VOdW0iLCJjdXJyZW50VmVyc2VEYXRhIiwidmVyc2VEYXRhIiwidmVyc2VPYmplY3RzIiwiU2NyaXB0dXJlQ2FyZCIsImlkIiwiaXNOVCIsInRpdGxlIiwic2VydmVyIiwiYXBwUmVmIiwiY2FyZE51bSIsImNsYXNzZXMiLCJyZXNvdXJjZSIsIm93bmVyIiwibGFuZ3VhZ2VJZCIsInJlc291cmNlSWQiLCJvcmlnaW5hbExhbmd1YWdlT3duZXIiLCJnZXRMYW5ndWFnZSIsInJlZmVyZW5jZSIsImNoYXB0ZXIiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJyZXNvdXJjZUxpbmsiLCJ1c2VVc2VyTG9jYWxTdG9yYWdlIiwiZGlzYWJsZVdvcmRQb3BvdmVyIiwib25SZXNvdXJjZUVycm9yIiwiaHR0cENvbmZpZyIsImdyZWVrUmVwb1VybCIsImhlYnJld1JlcG9VcmwiLCJnZXRMZXhpY29uRGF0YSIsImZldGNoR2xvc3Nlc0ZvclZlcnNlIiwidHJhbnNsYXRlIiwib25NaW5pbWl6ZSIsImxvZ2dlZEluVXNlciIsImF1dGhlbnRpY2F0aW9uIiwic2V0U2F2ZWRDaGFuZ2VzIiwiYm9va0luZGV4IiwiYWRkVmVyc2VSYW5nZSIsInVzZVN0YXRlIiwicmVmIiwidXJsRXJyb3IiLCJ1c2luZ1VzZXJCcmFuY2giLCJzdGF0ZSIsInNldFN0YXRlXyIsImZvbnRTaXplIiwic2V0Rm9udFNpemUiLCJpc05UXyIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJwcmV2U3RhdGUiLCJjYWNoZSIsIm1heEFnZSIsInNldFVybEVycm9yIiwiZXJyb3IiLCJ3aG9sZUJvb2siLCJpc05ld1Rlc3RhbWVudCIsInNldFNjcmlwdHVyZSIsInNjcmlwdHVyZVNldHRpbmdzIiwic2NyaXB0dXJlVmVyc2lvbkhpc3QiLCJjdXJyZW50VmVyc2VPYmplY3RzIiwiY2FyZFJlc291cmNlSWQiLCJyZWZfIiwiY2FuVXNlRWRpdEJyYW5jaCIsInN1YnN0cmluZyIsImxlbmd0aCIsImNhcmRJZCIsIndvcmtpbmdSZXNvdXJjZUJyYW5jaCIsInVzaW5nVXNlckJyYW5jaF8iLCJzdGFydEVkaXRCcmFuY2giLCJhY3Rpb25zIiwic3RhcnRFZGl0Iiwid29ya2luZ1JlZiIsInJlZmVyZW5jZV8iLCJzY3JpcHR1cmVUaXRsZSIsInVzZUVmZmVjdCIsIndvcmtpbmdSZWZfIiwicmVzb3VyY2VTdGF0dXMiLCJtZXNzYWdlIiwiaXNBY2Nlc3NFcnJvciIsInZlcnNpb24iLCJ1cGRhdGVUaXRsZSIsImdldFNjcmlwdHVyZVNlbGVjdG9yIiwic2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnIiwib25NZW51Q2xvc2UiLCJsYW5ndWFnZUlkXyIsImxhbmd1YWdlIiwiZGlyZWN0aW9uIiwiaXNIZWJyZXciLCJmb250RmFjdG9yIiwic2NhbGVkRm9udFNpemUiLCJtYXRjaGVkVmVyc2UiLCJpdGVtcyIsImhlYWRlcnMiLCJmaWx0ZXJzIiwiaXRlbUluZGV4IiwibWFya2Rvd25WaWV3Iiwic2V0RmlsdGVycyIsInNldEl0ZW1JbmRleCIsInNldE1hcmtkb3duVmlldyIsInJlZlN0eWxlIiwidXNlTWVtbyIsImZvbnRGYW1pbHkiLCJNYXRoIiwicm91bmQiLCJjb250ZW50U3R5bGUiLCJzY3JpcHR1cmVMYWJlbCIsImRpc2FibGVXb3JkUG9wb3Zlcl8iLCJ1c2luZ09yaWdpbmFsQmlibGUiLCJ1bmRlZmluZWQiLCJmZXRjaEdsb3NzRGF0YUZvclZlcnNlIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsIm9yaWdpbmFsUmVwb1VybCIsImluaXRpYWxWZXJzZU9iamVjdHMiLCJjYW5jZWxBbGlnbm1lbnQiLCJlZGl0ZWRWZXJzZU9iamVjdHMiLCJoYW5kbGVBbGlnbm1lbnRDbGljayIsIm9uQWxpZ25tZW50c0NoYW5nZSIsInNhdmVBbGlnbm1lbnQiLCJzZXRFZGl0aW5nIiwic2V0VmVyc2VDaGFuZ2VkIiwic2F2ZUNoYW5nZXNUb0Nsb3VkIiwiYWxpZ25lZCIsImFsaWduZXJEYXRhIiwiZWRpdGluZyIsInVuc2F2ZWRDaGFuZ2VzIiwidW5zYXZlZENoYW5nZXNfIiwic2hvd1BvcG92ZXIiLCJQb3BvdmVyVGl0bGUiLCJ3b3JkRGV0YWlscyIsInBvc2l0aW9uQ29vcmQiLCJyYXdEYXRhIiwiY29uc29sZSIsImxvZyIsIndpbmRvdyIsInByb21wdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b2tlbiIsImNoZWNraW5nU3RhdGUiLCJ0aXRsZVRleHQiLCJvblJlbmRlclRvb2xiYXIiLCJtYXJnaW4iLCJjdXJzb3IiLCJfdmVyc2UiLCJyZW5kZXJlZFNjcmlwdHVyZVBhbmVzIiwidmVyc2VzRm9yUmVmIiwibWFwIiwiaW5kZXgiLCJtYXBwZWRWZXJzZU9iamVjdHMiLCJmbGV4RGlyZWN0aW9uIiwibWF4SGVpZ2h0Iiwib3ZlcmZsb3dZIiwiYWxpZ25tZW50cyIsIndvcmRCYW5rIiwicmVzdWx0cyIsInByb3BUeXBlcyIsInN0cmluZyIsImZ1bmMiLCJpc1JlcXVpcmVkIiwibnVtYmVyIiwic2hhcGUiLCJvbmVPZlR5cGUiLCJib29sIiwib2JqZWN0IiwiYW55Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLQSxLQUFaLE1BQXVCLE9BQXZCO0FBQ0EsT0FBTyxLQUFLQyxTQUFaLE1BQTJCLFlBQTNCO0FBQ0EsU0FBU0MsT0FBVCxFQUFrQkMsWUFBbEIsUUFBc0MsZ0JBQXRDO0FBRUEsU0FDRUMsSUFERixFQUVFQyxZQUZGLEVBR0VDLGFBSEYsRUFJRUMsV0FKRixFQUtFQyx5QkFMRixRQU1PLHVCQU5QO0FBT0EsU0FBU0MsV0FBVCxRQUE0QixrQkFBNUI7QUFDQSxPQUFPQyxpQkFBUCxNQUE4QixtQ0FBOUI7QUFDQSxPQUFPQyxrQkFBUCxNQUErQixvQ0FBL0I7QUFDQSxTQUFTQyxVQUFULFFBQTJCLGVBQTNCO0FBQ0EsU0FBU0MsYUFBVCxFQUF3QkMsaUJBQXhCLFFBQWlELElBQWpEO0FBQ0EsU0FBU0Msb0JBQVQsUUFBcUMsa0NBQXJDO0FBQ0EsU0FDRUMsMkJBREYsRUFFRUMsZUFGRixFQUdFQyxrQkFIRixFQUlFQywyQkFKRixFQUtFQyxlQUxGLFFBTU8sK0JBTlA7QUFPQSxTQUFTQyxLQUFULFFBQXNCLHlCQUF0QjtBQUNBLFNBQ0VDLFlBREYsRUFFRUMsZUFGRixFQUdFQyxZQUhGLFFBSU8sYUFKUDtBQUtBLFNBQVNDLHlCQUFULFFBQTBDLHVDQUExQztBQUVBLElBQU1DLGtCQUFrQixH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QjtBQUNBN0gsRUFBQUEsWUFBWSxFQUFFdkUsU0FBUyxDQUFDbU0sTUE5REE7O0FBK0R4QjtBQUNBM0gsRUFBQUEsY0FBYyxFQUFFeEUsU0FBUyxDQUFDME0sTUFoRUY7O0FBaUV4QjtBQUNBakksRUFBQUEsZUFBZSxFQUFFekUsU0FBUyxDQUFDb00sSUFsRUg7O0FBbUV4QjtBQUNBMUgsRUFBQUEsU0FBUyxFQUFFMUUsU0FBUyxDQUFDbU0sTUFwRUc7O0FBcUV4QjtBQUNBeEgsRUFBQUEsYUFBYSxFQUFFM0UsU0FBUyxDQUFDb007QUF0RUQsQ0FBMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuaW1wb3J0IHsgUnhMaW5rMiwgUnhMaW5rQnJlYWsyIH0gZnJvbSAncmVhY3QtaWNvbnMvcngnXG5cbmltcG9ydCB7XG4gIENhcmQsXG4gIHVzZUNhcmRTdGF0ZSxcbiAgdXNlVXNlckJyYW5jaCxcbiAgRVJST1JfU1RBVEUsXG4gIE1BTklGRVNUX05PVF9MT0FERURfRVJST1IsXG59IGZyb20gJ3RyYW5zbGF0aW9uLWhlbHBzLXJjbCdcbmltcG9ydCB7IFdvcmRBbGlnbmVyIH0gZnJvbSAnd29yZC1hbGlnbmVyLXJjbCdcbmltcG9ydCBDaGVja091dGxpbmVkSWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrT3V0bGluZWQnXG5pbXBvcnQgQ2FuY2VsT3V0bGluZWRJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2FuY2VsT3V0bGluZWQnXG5pbXBvcnQgeyBJY29uQnV0dG9uIH0gZnJvbSAnQG11aS9tYXRlcmlhbCdcbmltcG9ydCB7IFNjcmlwdHVyZVBhbmUsIFNjcmlwdHVyZVNlbGVjdG9yIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyB1c2VTY3JpcHR1cmVTZXR0aW5ncyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVNjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHtcbiAgZ2V0VmVyc2VEYXRhRnJvbVNjcmlwQ29uZmlnLFxuICBnZXRSZXNvdXJjZUxpbmssXG4gIGdldFJlc291cmNlTWVzc2FnZSxcbiAgZ2V0U2NyaXB0dXJlVmVyc2lvblNldHRpbmdzLFxuICBpc09yaWdpbmFsQmlibGUsXG59IGZyb20gJy4uLy4uL3V0aWxzL1NjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHsgVGl0bGUgfSBmcm9tICcuLi9TY3JpcHR1cmVQYW5lL3N0eWxlZCdcbmltcG9ydCB7XG4gIE5UX09SSUdfTEFORyxcbiAgT1JJR0lOQUxfU09VUkNFLFxuICBPVF9PUklHX0xBTkcsXG59IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHsgdXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVNjcmlwdHVyZUFsaWdubWVudEVkaXQnXG5cbmNvbnN0IEtFWV9GT05UX1NJWkVfQkFTRSA9ICdzY3JpcHR1cmVQYW5lRm9udFNpemVfJ1xuY29uc3QgbGFiZWwgPSAnVmVyc2lvbidcbmNvbnN0IHN0eWxlID0geyBtYXJnaW5Ub3A6ICcxNnB4Jywgd2lkdGg6ICc1MDBweCcgfVxuXG5mdW5jdGlvbiBpbml0aWFsaXplVmVyc2VOdW1iZXIodmVyc2UpIHtcbiAgbGV0IGluaXRpYWxWZXJzZSA9IHZlcnNlXG4gIGlmICh0eXBlb2YgdmVyc2UgPT09ICdzdHJpbmcnICYmIHZlcnNlLmluY2x1ZGVzKCctJykpIHtcbiAgICBpbml0aWFsVmVyc2UgPSBwYXJzZUludCh2ZXJzZS5jaGFyQXQoMCkpXG4gIH1cbiAgcmV0dXJuIGluaXRpYWxWZXJzZVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzZU9iamVjdHNGb3JWZXJzZShzY3JpcHR1cmVDb25maWcsIGN1cnJlbnRWZXJzZU51bSkge1xuICBjb25zdCBjdXJyZW50VmVyc2VEYXRhID0gZ2V0VmVyc2VEYXRhRnJvbVNjcmlwQ29uZmlnKHNjcmlwdHVyZUNvbmZpZywgY3VycmVudFZlcnNlTnVtKSB8fCBudWxsXG4gIHJldHVybiBjdXJyZW50VmVyc2VEYXRhPy52ZXJzZURhdGE/LnZlcnNlT2JqZWN0cyB8fCBudWxsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNjcmlwdHVyZUNhcmQoe1xuICBpZCxcbiAgaXNOVCxcbiAgdGl0bGUsXG4gIHNlcnZlcixcbiAgYXBwUmVmLFxuICBjYXJkTnVtLFxuICBjbGFzc2VzLFxuICByZXNvdXJjZToge1xuICAgIG93bmVyLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgcmVzb3VyY2VJZCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gIH0sXG4gIGdldExhbmd1YWdlLFxuICByZWZlcmVuY2U6IHtcbiAgICB2ZXJzZSxcbiAgICBjaGFwdGVyLFxuICAgIHByb2plY3RJZDogYm9va0lkLFxuICB9LFxuICByZXNvdXJjZUxpbmssXG4gIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gIGRpc2FibGVXb3JkUG9wb3ZlcixcbiAgb25SZXNvdXJjZUVycm9yLFxuICBodHRwQ29uZmlnLFxuICBncmVla1JlcG9VcmwsXG4gIGhlYnJld1JlcG9VcmwsXG4gIGdldExleGljb25EYXRhLFxuICBmZXRjaEdsb3NzZXNGb3JWZXJzZSxcbiAgdHJhbnNsYXRlLFxuICBvbk1pbmltaXplLFxuICBsb2dnZWRJblVzZXIsXG4gIGF1dGhlbnRpY2F0aW9uLFxuICBzZXRTYXZlZENoYW5nZXMsXG4gIGJvb2tJbmRleCxcbiAgYWRkVmVyc2VSYW5nZSxcbn0pIHtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV9dID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGN1cnJlbnRWZXJzZU51bTogaW5pdGlhbGl6ZVZlcnNlTnVtYmVyKHZlcnNlKSxcbiAgICByZWY6IGFwcFJlZixcbiAgICB1cmxFcnJvcjogbnVsbCxcbiAgICB1c2luZ1VzZXJCcmFuY2g6IGZhbHNlLFxuICB9KVxuICBjb25zdCB7XG4gICAgY3VycmVudFZlcnNlTnVtLFxuICAgIHJlZixcbiAgICB1cmxFcnJvcixcbiAgICB1c2luZ1VzZXJCcmFuY2gsXG4gIH0gPSBzdGF0ZVxuXG4gIGNvbnN0IFtmb250U2l6ZSwgc2V0Rm9udFNpemVdID0gdXNlVXNlckxvY2FsU3RvcmFnZShLRVlfRk9OVF9TSVpFX0JBU0UgKyBjYXJkTnVtLCAxMDApXG4gIGNvbnN0IGlzTlRfID0gaXNOVChib29rSWQpXG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICBzZXRTdGF0ZV8ocHJldlN0YXRlID0+ICh7IC4uLnByZXZTdGF0ZSwgLi4ubmV3U3RhdGUgfSkpXG4gIH1cblxuICBpZiAodXNpbmdVc2VyQnJhbmNoKSB7XG4gICAgaHR0cENvbmZpZyA9IHsgLi4uaHR0cENvbmZpZywgY2FjaGU6IHsgbWF4QWdlOiAwIH0gfSAvLyBkaXNhYmxlIGh0dHAgY2FjaGluZ1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIHNjcmlwdHVyZUNvbmZpZyxcbiAgICBzZXRTY3JpcHR1cmUsXG4gICAgc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QsXG4gIH0gPSB1c2VTY3JpcHR1cmVTZXR0aW5ncyh7XG4gICAgaXNOVCxcbiAgICB0aXRsZSxcbiAgICB2ZXJzZSxcbiAgICBvd25lcixcbiAgICBib29rSWQsXG4gICAgYXBwUmVmOiByZWYsXG4gICAgc2VydmVyLFxuICAgIGNhcmROdW0sXG4gICAgY2hhcHRlcixcbiAgICBsYW5ndWFnZUlkLFxuICAgIHJlc291cmNlSWQsXG4gICAgcmVzb3VyY2VMaW5rLFxuICAgIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gICAgZGlzYWJsZVdvcmRQb3BvdmVyLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICBzZXRVcmxFcnJvcjogKGVycm9yKSA9PiBzZXRTdGF0ZSh7IHVybEVycm9yOiBlcnJvciB9KSxcbiAgICBodHRwQ29uZmlnLFxuICAgIGdyZWVrUmVwb1VybCxcbiAgICBoZWJyZXdSZXBvVXJsLFxuICAgIHdob2xlQm9vazogdHJ1ZSxcbiAgfSlcblxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzID0gZ2V0VmVyc2VPYmplY3RzRm9yVmVyc2Uoc2NyaXB0dXJlQ29uZmlnLCBjdXJyZW50VmVyc2VOdW0pXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBjYXJkUmVzb3VyY2VJZCA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnByb2plY3RJZCB8fCByZXNvdXJjZUlkXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBsZXQgcmVmXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnJlZiB8fCBhcHBSZWZcbiAgY29uc3QgY2FuVXNlRWRpdEJyYW5jaCA9IGxvZ2dlZEluVXNlciAmJiBhdXRoZW50aWNhdGlvbiAmJlxuICAgIChyZXNvdXJjZUlkICE9PSBPUklHSU5BTF9TT1VSQ0UpICYmXG4gICAgKChyZWZfID09PSAnbWFzdGVyJykgfHwgKHJlZl8uc3Vic3RyaW5nKDAsIGxvZ2dlZEluVXNlci5sZW5ndGgpID09PSBsb2dnZWRJblVzZXIpICkgLy8gbm90IHRhZ1xuXG4gIGNvbnN0IHtcbiAgICBzdGF0ZTogeyB3b3JraW5nUmVzb3VyY2VCcmFuY2gsIHVzaW5nVXNlckJyYW5jaDogdXNpbmdVc2VyQnJhbmNoXyB9LFxuICAgIGFjdGlvbnM6IHsgc3RhcnRFZGl0OiBzdGFydEVkaXRCcmFuY2ggfSxcbiAgfSA9IHVzZVVzZXJCcmFuY2goe1xuICAgIG93bmVyLFxuICAgIHNlcnZlcixcbiAgICBhcHBSZWYsXG4gICAgbGFuZ3VhZ2VJZCxcbiAgICBjYXJkSWQ6IGlkLFxuICAgIGxvZ2dlZEluVXNlcjogY2FuVXNlRWRpdEJyYW5jaCA/IGxvZ2dlZEluVXNlciA6IG51bGwsXG4gICAgYXV0aGVudGljYXRpb246IGNhblVzZUVkaXRCcmFuY2ggPyBhdXRoZW50aWNhdGlvbiA6IG51bGwsXG4gICAgY2FyZFJlc291cmNlSWQsXG4gICAgb25SZXNvdXJjZUVycm9yLFxuICAgIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gIH0pXG5cbiAgY29uc3Qgd29ya2luZ1JlZiA9IGNhblVzZUVkaXRCcmFuY2ggPyB3b3JraW5nUmVzb3VyY2VCcmFuY2ggOiBhcHBSZWZcbiAgY29uc3QgcmVmZXJlbmNlXyA9IHsgYm9va0lkLCBjaGFwdGVyLCB2ZXJzZSB9XG4gIGxldCBzY3JpcHR1cmVUaXRsZVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHNlbGVjdCBjb3JyZWN0IHdvcmtpbmcgcmVmIC0gY291bGQgYmUgbWFzdGVyLCB1c2VyIGJyYW5jaCwgb3IgcmVsZWFzZVxuICAgIGlmICh1c2luZ1VzZXJCcmFuY2hfICE9PSB1c2luZ1VzZXJCcmFuY2gpIHtcbiAgICAgIHNldFN0YXRlKHsgdXNpbmdVc2VyQnJhbmNoOiB1c2luZ1VzZXJCcmFuY2hfIH0pXG4gICAgfVxuICB9LCBbdXNpbmdVc2VyQnJhbmNoXywgdXNpbmdVc2VyQnJhbmNoXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBzZWxlY3QgY29ycmVjdCB3b3JraW5nIHJlZiAtIGNvdWxkIGJlIG1hc3RlciwgdXNlciBicmFuY2gsIG9yIHJlbGVhc2VcbiAgICBsZXQgd29ya2luZ1JlZl8gPSB3b3JraW5nUmVmIHx8IGFwcFJlZlxuXG4gICAgaWYgKHJlZiAhPT0gd29ya2luZ1JlZl8pIHtcbiAgICAgIHNldFN0YXRlKHsgcmVmOiB3b3JraW5nUmVmXyB9KVxuICAgIH1cbiAgfSwgW3dvcmtpbmdSZWYsIHJlZiwgYXBwUmVmXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB1cGRhdGUgZGlzcGxheSBzdGF0dXMgaWYgZXJyb3JcbiAgICBjb25zdCBlcnJvciA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXM/LltFUlJPUl9TVEFURV1cblxuICAgIGlmIChlcnJvcikgeyAvLyBpZiBlcnJvciB3YXMgZm91bmQgZG8gY2FsbGJhY2tcbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1c1xuICAgICAgY29uc3QgcmVzb3VyY2VMaW5rID0gZ2V0UmVzb3VyY2VMaW5rKHNjcmlwdHVyZUNvbmZpZylcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXRSZXNvdXJjZU1lc3NhZ2UocmVzb3VyY2VTdGF0dXMsIHNlcnZlciwgcmVzb3VyY2VMaW5rLCBpc05UXylcbiAgICAgIGNvbnN0IGlzQWNjZXNzRXJyb3IgPSByZXNvdXJjZVN0YXR1c1tNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SXVxuICAgICAgb25SZXNvdXJjZUVycm9yICYmIG9uUmVzb3VyY2VFcnJvcihtZXNzYWdlLCBpc0FjY2Vzc0Vycm9yLCByZXNvdXJjZVN0YXR1cylcbiAgICB9XG4gIH0sIFtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzPy5bRVJST1JfU1RBVEVdLCBvblJlc291cmNlRXJyb3JdKVxuXG4gIGlmIChzY3JpcHR1cmVDb25maWcudGl0bGUgJiYgc2NyaXB0dXJlQ29uZmlnLnZlcnNpb24pIHtcbiAgICBzY3JpcHR1cmVUaXRsZSA9IGAke3NjcmlwdHVyZUNvbmZpZy50aXRsZX0gdiR7c2NyaXB0dXJlQ29uZmlnLnZlcnNpb259YFxuICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LnVwZGF0ZVRpdGxlKHNjcmlwdHVyZUNvbmZpZy5yZXNvdXJjZUxpbmssIHNjcmlwdHVyZVRpdGxlKVxuICB9IGVsc2Uge1xuICAgIHNjcmlwdHVyZVRpdGxlID0gYFRpdGxlIG1pc3NpbmcgZnJvbSBwcm9qZWN0IG1hbmlmZXN0YFxuICB9XG5cbiAgLyoqIER5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlIHNjcmlwdHVyZSBzZWxlY3Rpb24gZHJvcGRvd24gdG8gYmUgaW5zZXJ0ZWQgaW50byBjYXJkIHNldHRpbmdzICovXG4gIGZ1bmN0aW9uIGdldFNjcmlwdHVyZVNlbGVjdG9yKCkge1xuICAgIGNvbnN0IHNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZyA9IGdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyh7XG4gICAgICBsYWJlbCxcbiAgICAgIHJlc291cmNlTGluazogc2NyaXB0dXJlQ29uZmlnLnJlc291cmNlTGluayxcbiAgICAgIHNldFNjcmlwdHVyZSxcbiAgICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LFxuICAgIH0pXG5cbiAgICByZXR1cm4gPFNjcmlwdHVyZVNlbGVjdG9yIHsuLi5zY3JpcHR1cmVTZWxlY3Rpb25Db25maWd9IHN0eWxlPXtzdHlsZX0gZXJyb3JNZXNzYWdlPXt1cmxFcnJvcn0gLz5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTWVudUNsb3NlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGBvbk1lbnVDbG9zZSgpYClcbiAgICBzZXRTdGF0ZSh7IHVybEVycm9yOiBudWxsIH0pXG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IGxhbmd1YWdlSWRfID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZFxuICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlKHsgbGFuZ3VhZ2VJZDogbGFuZ3VhZ2VJZF8gfSlcbiAgY29uc3QgZGlyZWN0aW9uID0gKGxhbmd1YWdlPy5kaXJlY3Rpb24pIHx8ICdsdHInXG4gIGNvbnN0IHJlZmVyZW5jZSA9IHsgLi4uc2NyaXB0dXJlQ29uZmlnLnJlZmVyZW5jZSB9XG5cbiAgY29uc3QgaXNIZWJyZXcgPSAobGFuZ3VhZ2VJZF8gPT09ICdoYm8nKVxuICBjb25zdCBmb250RmFjdG9yID0gaXNIZWJyZXcgPyAxLjQgOiAxIC8vIHdlIGF1dG9tYXRpY2FsbHkgc2NhbGUgdXAgZm9udCBzaXplIGZvciBIZWJyZXdcbiAgY29uc3Qgc2NhbGVkRm9udFNpemUgPSBmb250U2l6ZSAqIGZvbnRGYWN0b3JcblxuICBpZiAoc2NyaXB0dXJlQ29uZmlnLm1hdGNoZWRWZXJzZSkgeyAvLyBzdXBwb3J0IHZlcnNlIHJhbmdlc1xuICAgIHJlZmVyZW5jZS52ZXJzZSA9IHNjcmlwdHVyZUNvbmZpZy5tYXRjaGVkVmVyc2VcbiAgfVxuXG4gIGNvbnN0IGl0ZW1zID0gbnVsbFxuICBjb25zdCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIGhlYWRlcnMsIGZpbHRlcnMsIGl0ZW1JbmRleCwgbWFya2Rvd25WaWV3LFxuICAgIH0sXG4gICAgYWN0aW9uczoge1xuICAgICAgc2V0RmlsdGVycywgc2V0SXRlbUluZGV4LCBzZXRNYXJrZG93blZpZXcsXG4gICAgfSxcbiAgfSA9IHVzZUNhcmRTdGF0ZSh7IGl0ZW1zIH0pXG5cbiAgY29uc3QgcmVmU3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke01hdGgucm91bmQoc2NhbGVkRm9udFNpemUgKiAwLjkpfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBjb250ZW50U3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke3NjYWxlZEZvbnRTaXplfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBzY3JpcHR1cmVMYWJlbCA9IDxUaXRsZT57c2NyaXB0dXJlVGl0bGV9PC9UaXRsZT5cbiAgbGV0IGRpc2FibGVXb3JkUG9wb3Zlcl8gPSBkaXNhYmxlV29yZFBvcG92ZXJcbiAgY29uc3QgdXNpbmdPcmlnaW5hbEJpYmxlID0gaXNPcmlnaW5hbEJpYmxlKHNjcmlwdHVyZUNvbmZpZ1sncmVzb3VyY2UnXT8ucHJvamVjdElkKVxuXG4gIGlmIChkaXNhYmxlV29yZFBvcG92ZXIgPT09IHVuZGVmaW5lZCkgeyAvLyBpZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGRldGVybWluZSBpZiBvcmlnaW5hbCBsYW5ndWFnZSByZXNvdXJjZVxuICAgIGRpc2FibGVXb3JkUG9wb3Zlcl8gPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBwcmUtY2FjaGUgZ2xvc3NlcyBvbiB2ZXJzZSBjaGFuZ2VcbiAgICBjb25zdCBmZXRjaEdsb3NzRGF0YUZvclZlcnNlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFkaXNhYmxlV29yZFBvcG92ZXIgJiYgY3VycmVudFZlcnNlT2JqZWN0cyAmJiBmZXRjaEdsb3NzZXNGb3JWZXJzZSkge1xuICAgICAgICBhd2FpdCBmZXRjaEdsb3NzZXNGb3JWZXJzZShjdXJyZW50VmVyc2VPYmplY3RzLCBsYW5ndWFnZUlkXylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaEdsb3NzRGF0YUZvclZlcnNlKClcbiAgfSwgWyBjdXJyZW50VmVyc2VPYmplY3RzLCBkaXNhYmxlV29yZFBvcG92ZXIsIGxhbmd1YWdlSWRfLCBmZXRjaEdsb3NzZXNGb3JWZXJzZSBdKVxuXG4gIGNvbnN0IGVuYWJsZUVkaXQgPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIGNvbnN0IGVuYWJsZUFsaWdubWVudCA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgY29uc3Qgb3JpZ2luYWxSZXBvVXJsID0gaXNOZXdUZXN0YW1lbnQgPyBncmVla1JlcG9VcmwgOiBoZWJyZXdSZXBvVXJsXG4gIGNvbnN0IHtcbiAgICBhY3Rpb25zOiB7XG4gICAgICBjYW5jZWxBbGlnbm1lbnQsXG4gICAgICBlZGl0ZWRWZXJzZU9iamVjdHMsXG4gICAgICBoYW5kbGVBbGlnbm1lbnRDbGljayxcbiAgICAgIG9uQWxpZ25tZW50c0NoYW5nZSxcbiAgICAgIHNhdmVBbGlnbm1lbnQsXG4gICAgICBzZXRFZGl0aW5nLFxuICAgICAgc2V0VmVyc2VDaGFuZ2VkLFxuICAgICAgc2F2ZUNoYW5nZXNUb0Nsb3VkLFxuICAgIH0sXG4gICAgc3RhdGU6IHtcbiAgICAgIGFsaWduZWQsXG4gICAgICBhbGlnbmVyRGF0YSxcbiAgICAgIGVkaXRpbmcsXG4gICAgICB1bnNhdmVkQ2hhbmdlcyxcbiAgICB9LFxuICB9ID0gdXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCh7XG4gICAgYXV0aGVudGljYXRpb246IGNhblVzZUVkaXRCcmFuY2ggPyBhdXRoZW50aWNhdGlvbiA6IG51bGwsXG4gICAgZW5hYmxlRWRpdCxcbiAgICBlbmFibGVBbGlnbm1lbnQsXG4gICAgaHR0cENvbmZpZyxcbiAgICBpbml0aWFsVmVyc2VPYmplY3RzOiBjdXJyZW50VmVyc2VPYmplY3RzLFxuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2dnZWRJblVzZXI6IGNhblVzZUVkaXRCcmFuY2ggPyBsb2dnZWRJblVzZXIgOiBudWxsLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICBvcmlnaW5hbFJlcG9VcmwsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNjcmlwdHVyZUNvbmZpZyxcbiAgICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgICBzdGFydEVkaXRCcmFuY2gsXG4gICAgYm9va0luZGV4LFxuICAgIHdvcmtpbmdSZXNvdXJjZUJyYW5jaDogcmVmLFxuICAgIGN1cnJlbnRWZXJzZU51bSxcbiAgfSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBzZXQgc2F2ZWQgY2hhbmdlcyB3aGVuZXZlciB1c2VyIGVkaXRzIHZlcnNlIHRleHQgb3IgYWxpZ25tZW50cyBvciBpZiBhbGlnbm1lbnRzIGFyZSBvcGVuXG4gICAgY29uc3QgdW5zYXZlZENoYW5nZXNfID0gdW5zYXZlZENoYW5nZXMgfHwgYWxpZ25lckRhdGFcbiAgICBzZXRTYXZlZENoYW5nZXMgJiYgc2V0U2F2ZWRDaGFuZ2VzKHJlc291cmNlSWQsICF1bnNhdmVkQ2hhbmdlc18pXG4gIH0sIFt1bnNhdmVkQ2hhbmdlcywgYWxpZ25lckRhdGFdKVxuXG4gIGZ1bmN0aW9uIHNob3dQb3BvdmVyKFBvcG92ZXJUaXRsZSwgd29yZERldGFpbHMsIHBvc2l0aW9uQ29vcmQsIHJhd0RhdGEpIHtcbiAgICAvLyBUT0RPOiBtYWtlIHNob3cgcG9wb3ZlciBwcmV0dHlcbiAgICBjb25zb2xlLmxvZyhgc2hvd1BvcG92ZXJgLCByYXdEYXRhKVxuICAgIHdpbmRvdy5wcm9tcHQoYFVzZXIgY2xpY2tlZCBvbiAke0pTT04uc3RyaW5naWZ5KHJhd0RhdGEudG9rZW4pfWApXG4gIH1cblxuICBjb25zdCBjaGVja2luZ1N0YXRlID0gYWxpZ25lZCA/ICd2YWxpZCcgOiAnaW52YWxpZCdcbiAgY29uc3QgdGl0bGVUZXh0ID0gY2hlY2tpbmdTdGF0ZSA9PT0gJ3ZhbGlkJyA/ICdBbGlnbm1lbnQgaXMgVmFsaWQnIDogJ0FsaWdubWVudCBpcyBJbnZhbGlkJ1xuICBjb25zdCBvblJlbmRlclRvb2xiYXIgPSAoeyBpdGVtcyB9KSA9PiBbXG4gICAgLi4uaXRlbXMsXG4gICAgPEljb25CdXR0b25cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlcy5tYXJnaW59XG4gICAgICBrZXk9J2NoZWNraW5nLWJ1dHRvbidcbiAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUFsaWdubWVudENsaWNrKCl9XG4gICAgICB0aXRsZT17dGl0bGVUZXh0fVxuICAgICAgYXJpYS1sYWJlbD17dGl0bGVUZXh0fVxuICAgICAgc3R5bGU9e3sgY3Vyc29yOiAncG9pbnRlcicgfX1cbiAgICA+XG4gICAgICB7Y2hlY2tpbmdTdGF0ZSA9PT0gJ3ZhbGlkJyA/IChcbiAgICAgICAgPFJ4TGluazIgaWQ9J3ZhbGlkX2ljb24nIGNvbG9yPScjQkJCJyAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPFJ4TGlua0JyZWFrMiBpZD0naW52YWxpZF9pY29uJyBjb2xvcj0nIzAwMCcgLz5cbiAgICAgICl9XG4gICAgPC9JY29uQnV0dG9uPixcbiAgXVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gY2hlY2sgZm9yIHZlcnNlIHJhbmdlXG4gICAgY29uc3QgX3ZlcnNlID0gc2NyaXB0dXJlQ29uZmlnPy5tYXRjaGVkVmVyc2VcblxuICAgIGlmIChhZGRWZXJzZVJhbmdlICYmICh0eXBlb2YgX3ZlcnNlID09PSAnc3RyaW5nJykpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmIChfdmVyc2UuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICBhZGRWZXJzZVJhbmdlKGAke3NjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlPy5jaGFwdGVyfToke192ZXJzZX1gKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3NjcmlwdHVyZUNvbmZpZz8ubWF0Y2hlZFZlcnNlXSlcblxuXG4gIGNvbnN0IHJlbmRlcmVkU2NyaXB0dXJlUGFuZXMgPSBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZj8ubWFwKCh7dmVyc2V9LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG1hcHBlZFZlcnNlT2JqZWN0cyA9IGdldFZlcnNlT2JqZWN0c0ZvclZlcnNlKHNjcmlwdHVyZUNvbmZpZywgdmVyc2UpXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNjcmlwdHVyZVBhbmVcbiAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgcmVmU3R5bGU9e3JlZlN0eWxlfVxuICAgICAgICB7Li4uc2NyaXB0dXJlQ29uZmlnfVxuICAgICAgICB2ZXJzZU9iamVjdHM9e21hcHBlZFZlcnNlT2JqZWN0c31cbiAgICAgICAgaXNOVD17aXNOVF99XG4gICAgICAgIHNlcnZlcj17c2VydmVyfVxuICAgICAgICByZWZlcmVuY2U9e3suLi5yZWZlcmVuY2UsIHZlcnNlfX1cbiAgICAgICAgZGlyZWN0aW9uPXtkaXJlY3Rpb259XG4gICAgICAgIGNvbnRlbnRTdHlsZT17Y29udGVudFN0eWxlfVxuICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgIGRpc2FibGVXb3JkUG9wb3Zlcj17ZGlzYWJsZVdvcmRQb3BvdmVyX31cbiAgICAgICAgZ2V0TGV4aWNvbkRhdGE9e2dldExleGljb25EYXRhfVxuICAgICAgICB0cmFuc2xhdGU9e3RyYW5zbGF0ZX1cbiAgICAgICAgZWRpdGluZz17ZWRpdGluZ31cbiAgICAgICAgc2V0RWRpdGluZz17c2V0RWRpdGluZ31cbiAgICAgICAgc2V0VmVyc2VDaGFuZ2VkPXtzZXRWZXJzZUNoYW5nZWR9XG4gICAgICAvPlxuICAgIClcbiAgfSlcblxuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBpZD17YHNjcmlwdHVyZV9jYXJkXyR7Y2FyZE51bX1gfVxuICAgICAgdGl0bGU9e3NjcmlwdHVyZUxhYmVsfVxuICAgICAgc2V0dGluZ3NUaXRsZT17c2NyaXB0dXJlVGl0bGUgKyAnIFNldHRpbmdzJ31cbiAgICAgIGl0ZW1zPXtpdGVtc31cbiAgICAgIGNsYXNzZXM9e2NsYXNzZXN9XG4gICAgICBoZWFkZXJzPXtoZWFkZXJzfVxuICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgIGl0ZW1JbmRleD17aXRlbUluZGV4fVxuICAgICAgc2V0RmlsdGVycz17c2V0RmlsdGVyc31cbiAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cbiAgICAgIHNldEl0ZW1JbmRleD17c2V0SXRlbUluZGV4fVxuICAgICAgbWFya2Rvd25WaWV3PXttYXJrZG93blZpZXd9XG4gICAgICBzZXRNYXJrZG93blZpZXc9e3NldE1hcmtkb3duVmlld31cbiAgICAgIGdldEN1c3RvbUNvbXBvbmVudD17Z2V0U2NyaXB0dXJlU2VsZWN0b3J9XG4gICAgICBoaWRlTWFya2Rvd25Ub2dnbGVcbiAgICAgIG9uTWVudUNsb3NlPXtvbk1lbnVDbG9zZX1cbiAgICAgIG9uTWluaW1pemU9e29uTWluaW1pemUgPyAoKSA9PiBvbk1pbmltaXplKGlkKSA6IG51bGx9XG4gICAgICBlZGl0YWJsZT17ZW5hYmxlRWRpdCB8fCBlbmFibGVBbGlnbm1lbnR9XG4gICAgICBzYXZlZD17IXVuc2F2ZWRDaGFuZ2VzfVxuICAgICAgb25TYXZlRWRpdD17c2F2ZUNoYW5nZXNUb0Nsb3VkfVxuICAgICAgb25CbHVyPXsoKSA9PiBzZXRFZGl0aW5nKGZhbHNlKX1cbiAgICAgIG9uUmVuZGVyVG9vbGJhcj17b25SZW5kZXJUb29sYmFyfVxuICAgID5cbiAgICAgIHthbGlnbmVyRGF0YSA/XG4gICAgICAgIDxkaXYgc3R5bGU9e3sgZmxleERpcmVjdGlvbjogJ2NvbHVtbicgfX0+XG4gICAgICAgICAgPFdvcmRBbGlnbmVyXG4gICAgICAgICAgICBzdHlsZT17eyBtYXhIZWlnaHQ6ICc0NTBweCcsIG92ZXJmbG93WTogJ2F1dG8nIH19XG4gICAgICAgICAgICB2ZXJzZUFsaWdubWVudHM9e2FsaWduZXJEYXRhLmFsaWdubWVudHN9XG4gICAgICAgICAgICB0YXJnZXRXb3Jkcz17YWxpZ25lckRhdGEud29yZEJhbmt9XG4gICAgICAgICAgICB0cmFuc2xhdGU9e3RyYW5zbGF0ZX1cbiAgICAgICAgICAgIGNvbnRleHRJZD17eyByZWZlcmVuY2U6IHJlZmVyZW5jZV8gfX1cbiAgICAgICAgICAgIHRhcmdldExhbmd1YWdlPXtsYW5ndWFnZX1cbiAgICAgICAgICAgIHRhcmdldExhbmd1YWdlRm9udD17Jyd9XG4gICAgICAgICAgICBzb3VyY2VMYW5ndWFnZT17aXNOVF8gPyBOVF9PUklHX0xBTkcgOiBPVF9PUklHX0xBTkd9XG4gICAgICAgICAgICBzaG93UG9wb3Zlcj17c2hvd1BvcG92ZXJ9XG4gICAgICAgICAgICBsZXhpY29ucz17e319XG4gICAgICAgICAgICBsb2FkTGV4aWNvbkVudHJ5PXtnZXRMZXhpY29uRGF0YX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsocmVzdWx0cykgPT4gb25BbGlnbm1lbnRzQ2hhbmdlKHJlc3VsdHMpfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEwMCUnIH19PlxuICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2ZhbHNlfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMubWFyZ2lufVxuICAgICAgICAgICAgICBrZXk9J2FsaWdubWVudC1zYXZlJ1xuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzYXZlQWxpZ25tZW50KCl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9eydBbGlnbm1lbnQgU2F2ZSd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxDaGVja091dGxpbmVkSWNvbiBpZD0nYWxpZ25tZW50LXNhdmUtaWNvbicgaHRtbENvbG9yPScjMDAwJyAvPlxuICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2ZhbHNlfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMubWFyZ2lufVxuICAgICAgICAgICAgICBrZXk9J2FsaWdubWVudC1jYW5jZWwnXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNhbmNlbEFsaWdubWVudCgpfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXsnQWxpZ25tZW50IENhbmNlbCd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxDYW5jZWxPdXRsaW5lZEljb24gaWQ9J2FsaWdubWVudC1jYW5jZWwtaWNvbicgaHRtbENvbG9yPScjMDAwJyAvPlxuICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgOlxuICAgICAgICA8ZGl2IGlkPVwic2NyaXB0dXJlLXBhbmUtbGlzdFwiPlxuICAgICAgICAgIHtyZW5kZXJlZFNjcmlwdHVyZVBhbmVzfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L0NhcmQ+XG4gIClcbn1cblxuU2NyaXB0dXJlQ2FyZC5wcm9wVHlwZXMgPSB7XG4gIC8qKiBodG1sIGlkZW50aWZpZXIgdG8gdXNlIGZvciBjYXJkICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogbWV0aG9kIHRvIGRldGVybWluZSBpZiBOVCBvciBPVCAqL1xuICBpc05UOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogdGl0bGUgZm9yIHNjcmlwdHVyZSBjYXJkICovXG4gIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBnZXQgbGFuZ3VhZ2UgZGV0YWlscyAqL1xuICBnZXRMYW5ndWFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIHNjcmlwdHVyZSBjYXJkIG51bWJlciAoMCB0byAyIGZvciBleGFtcGxlKSAqL1xuICBjYXJkTnVtOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIC8qKiByZXNvdXJjZSBvYmplY3QgKi9cbiAgcmVzb3VyY2U6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgLyoqIHJlc291cmNlIGxhbmd1YWdlIHRvIHVzZSAqL1xuICAgIGxhbmd1YWdlSWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVwbyBvd25lciBzdWNoIGFzIHVuZm9sZGluZ1dvcmQgKi9cbiAgICBvd25lcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiByZXNvdXJjZUlkIHRvIHVzZSAoZS5nLiB1Z250KSAqL1xuICAgIHJlc291cmNlSWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVwbyBvd25lciBmb3Igb3JpZ2luYWwgbGFuZ3VhZ2VzIHN1Y2ggYXMgdW5mb2xkaW5nV29yZCAqL1xuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICB9KSxcbiAgcmVmZXJlbmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiBwcm9qZWN0SWQgKGJvb2tJRCkgdG8gdXNlICovXG4gICAgcHJvamVjdElkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIGN1cnJlbnQgY2hhcHRlciBudW1iZXIgKi9cbiAgICBjaGFwdGVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSkuaXNSZXF1aXJlZCxcbiAgICAvKiogY3VycmVudCB2ZXJzZSBudW1iZXIgKi9cbiAgICB2ZXJzZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWQsXG4gIH0pLFxuICAvKiogc2VydmVyIChlLmcuICdodHRwczovL2dpdC5kb29yNDMub3JnJykgKi9cbiAgc2VydmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiByZXBvIGJyYW5jaCBvciB0YWcgc3VjaCBhcyBtYXN0ZXIgKi9cbiAgYXBwUmVmOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBpZiB0cnVlIHRoZW4gd29yZCBkYXRhIGhvdmVyIGlzIHNob3duICovXG4gIGRpc2FibGVXb3JkUG9wb3ZlcjogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKiBDU1MgY2xhc3NlcyAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogcmVzb3VyY2VMaW5rICovXG4gIHJlc291cmNlTGluazogUHJvcFR5cGVzLmFueSxcbiAgLyoqIHVzZSBtZXRob2QgZm9yIHVzaW5nIGxvY2FsIHN0b3JhZ2Ugc3BlY2lmaWMgZm9yIHVzZXIgKi9cbiAgdXNlVXNlckxvY2FsU3RvcmFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIG9wdGlvbmFsIGNhbGxiYWNrIGlmIGVycm9yIGxvYWRpbmcgcmVzb3VyY2UsIHBhcmFtZXRlciByZXR1cm5lZCBhcmU6XG4gICAqICAgICh7c3RyaW5nfSBlcnJvck1lc3NhZ2UsIHtib29sZWFufSBpc0FjY2Vzc0Vycm9yLCB7b2JqZWN0fSByZXNvdXJjZVN0YXR1cylcbiAgICogICAgICAtIGlzQWNjZXNzRXJyb3IgLSBpcyB0cnVlIGlmIHRoaXMgd2FzIGFuIGVycm9yIHRyeWluZyB0byBhY2Nlc3MgZmlsZVxuICAgKiAgICAgIC0gcmVzb3VyY2VTdGF0dXMgLSBpcyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHByb2JsZW1zIGZldGNoaW5nIHJlc291cmNlICovXG4gIG9uUmVzb3VyY2VFcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBvcHRpb25hbCBodHRwIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBmZXRjaGluZyByZXNvdXJjZXMsIGRlZmF1bHQgaXMgMCAodmVyeSBsb25nIHdhaXQpICovXG4gIGh0dHBDb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKiBvcHRpb25hbCB1cmwgZm9yIGdyZWVrIHJlcG8gKi9cbiAgZ3JlZWtSZXBvVXJsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogb3B0aW9uYWwgdXJsIGZvciBoZWJyZXcgcmVwbyAqL1xuICBoZWJyZXdSZXBvVXJsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogZnVuY3Rpb24gdG8gZ2V0IGxhdGVzdCBsZXhpY29uIGRhdGEgKi9cbiAgZ2V0TGV4aWNvbkRhdGE6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogZnVuY3Rpb24gdG8gcHJlLWxvYWQgbGV4aWNvbiBkYXRhIGZvciB2ZXJzZSAqL1xuICBmZXRjaEdsb3NzZXNGb3JWZXJzZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBvcHRpb25hbCBmdW5jdGlvbiBmb3IgbG9jYWxpemF0aW9uICovXG4gIHRyYW5zbGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBmdW5jdGlvbiB0byBtaW5pbWl6ZSB0aGUgY2FyZCAob3B0aW9uYWwpICovXG4gIG9uTWluaW1pemU6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogdXNlci1uYW1lICovXG4gIGxvZ2dlZEluVXNlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIGF1dGhlbnRpY2F0aW9uIGluZm8gKi9cbiAgYXV0aGVudGljYXRpb246IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKiBmdW5jdGlvbiB0byBzZXQgc3RhdGUgaW4gYXBwIHRoYXQgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyAqL1xuICBzZXRTYXZlZENoYW5nZXM6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogaW5kZXggZm9yIGN1cnJlbnQgYm9vayAoZS5nLiAnMDEnIGZvciAnZ2VuJykqL1xuICBib29rSW5kZXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSB1c2luZyBhIHZlcnNlIHJhbmdlIGhlcmUgKi9cbiAgYWRkVmVyc2VSYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG59XG4iXX0=
866
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJjb3JlIiwidXNmbWpzIiwidXNlRWRpdCIsIkNhcmQiLCJ1c2VDYXJkU3RhdGUiLCJ1c2VVc2VyQnJhbmNoIiwiRVJST1JfU1RBVEUiLCJNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SIiwiQWxpZ25tZW50SGVscGVycyIsIlVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMiLCJpc0VxdWFsIiwiU2NyaXB0dXJlUGFuZSIsIlNjcmlwdHVyZVNlbGVjdG9yIiwidXNlU2NyaXB0dXJlU2V0dGluZ3MiLCJnZXRSZXNvdXJjZUxpbmsiLCJnZXRSZXNvdXJjZU1lc3NhZ2UiLCJnZXRTY3JpcHR1cmVWZXJzaW9uU2V0dGluZ3MiLCJpc09yaWdpbmFsQmlibGUiLCJUaXRsZSIsIk5UX09SSUdfTEFORyIsIk9SSUdJTkFMX1NPVVJDRSIsIk9UX09SSUdfTEFORyIsIktFWV9GT05UX1NJWkVfQkFTRSIsImxhYmVsIiwic3R5bGUiLCJtYXJnaW5Ub3AiLCJ3aWR0aCIsIlNjcmlwdHVyZUNhcmQiLCJpZCIsImlzTlQiLCJ0aXRsZSIsInNlcnZlciIsImFwcFJlZiIsImNhcmROdW0iLCJjbGFzc2VzIiwicmVzb3VyY2UiLCJvd25lciIsImxhbmd1YWdlSWQiLCJyZXNvdXJjZUlkIiwib3JpZ2luYWxMYW5ndWFnZU93bmVyIiwiZ2V0TGFuZ3VhZ2UiLCJyZWZlcmVuY2UiLCJ2ZXJzZSIsImNoYXB0ZXIiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJyZXNvdXJjZUxpbmsiLCJ1c2VVc2VyTG9jYWxTdG9yYWdlIiwiZGlzYWJsZVdvcmRQb3BvdmVyIiwib25SZXNvdXJjZUVycm9yIiwiaHR0cENvbmZpZyIsImdyZWVrUmVwb1VybCIsImhlYnJld1JlcG9VcmwiLCJnZXRMZXhpY29uRGF0YSIsImZldGNoR2xvc3Nlc0ZvclZlcnNlIiwidHJhbnNsYXRlIiwib25NaW5pbWl6ZSIsImxvZ2dlZEluVXNlciIsImF1dGhlbnRpY2F0aW9uIiwic2V0U2F2ZWRDaGFuZ2VzIiwiYm9va0luZGV4IiwiYWRkVmVyc2VSYW5nZSIsInNldFdvcmRBbGlnbmVyU3RhdHVzIiwidXNlU3RhdGUiLCJoYXZlVW5zYXZlZENoYW5nZXMiLCJyZWYiLCJzYXZlQ29udGVudCIsInNoYSIsInN0YXJ0U2F2ZSIsInVybEVycm9yIiwidXNpbmdVc2VyQnJhbmNoIiwidW5zYXZlZENoYW5nZXNMaXN0IiwidmVyc2VzRm9yUmVmIiwic3RhdGUiLCJzZXRTdGF0ZV8iLCJmb250U2l6ZSIsInNldEZvbnRTaXplIiwiaXNOVF8iLCJzZXRTdGF0ZSIsIm5ld1N0YXRlIiwicHJldlN0YXRlIiwiY2FjaGUiLCJtYXhBZ2UiLCJzZXRVcmxFcnJvciIsImVycm9yIiwid2hvbGVCb29rIiwiaXNOZXdUZXN0YW1lbnQiLCJzY3JpcHR1cmVDb25maWciLCJzZXRTY3JpcHR1cmUiLCJzY3JpcHR1cmVTZXR0aW5ncyIsInNjcmlwdHVyZVZlcnNpb25IaXN0IiwiZmV0Y2hSZXNwXyIsImZldGNoUmVzcG9uc2UiLCJyZXBvIiwicmVmZXJlbmNlXyIsInVzZUVmZmVjdCIsIl9zaGEiLCJkYXRhIiwiY29uc29sZSIsImxvZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYXJkUmVzb3VyY2VJZCIsInJlZl8iLCJjYW5Vc2VFZGl0QnJhbmNoIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiY2FyZElkIiwid29ya2luZ1Jlc291cmNlQnJhbmNoIiwidXNpbmdVc2VyQnJhbmNoXyIsInN0YXJ0RWRpdEJyYW5jaCIsImFjdGlvbnMiLCJzdGFydEVkaXQiLCJ3b3JraW5nUmVmIiwic2NyaXB0dXJlVGl0bGUiLCJ3b3JraW5nUmVmXyIsInJlc291cmNlU3RhdHVzIiwibWVzc2FnZSIsImlzQWNjZXNzRXJyb3IiLCJ2ZXJzaW9uIiwidXBkYXRlVGl0bGUiLCJnZXRTY3JpcHR1cmVTZWxlY3RvciIsInNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZyIsIm9uTWVudUNsb3NlIiwibGFuZ3VhZ2VJZF8iLCJsYW5ndWFnZSIsImRpcmVjdGlvbiIsImlzSGVicmV3IiwiZm9udEZhY3RvciIsInNjYWxlZEZvbnRTaXplIiwiaXRlbXMiLCJoZWFkZXJzIiwiZmlsdGVycyIsIml0ZW1JbmRleCIsIm1hcmtkb3duVmlldyIsInNldEZpbHRlcnMiLCJzZXRJdGVtSW5kZXgiLCJzZXRNYXJrZG93blZpZXciLCJyZWZTdHlsZSIsInVzZU1lbW8iLCJmb250RmFtaWx5IiwiTWF0aCIsInJvdW5kIiwiY29udGVudFN0eWxlIiwic2NyaXB0dXJlTGFiZWwiLCJkaXNhYmxlV29yZFBvcG92ZXJfIiwidXNpbmdPcmlnaW5hbEJpYmxlIiwidW5kZWZpbmVkIiwiZmV0Y2hHbG9zc0RhdGFGb3JWZXJzZSIsInZlcnNlT2JqZWN0cyIsInZlcnNlUmVmIiwiX3ZlcnNlT2JqZWN0cyIsInZlcnNlRGF0YSIsImNvbmNhdCIsImVuYWJsZUVkaXQiLCJlbmFibGVBbGlnbm1lbnQiLCJvcmlnaW5hbFJlcG9VcmwiLCJzY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnIiwiY3VycmVudFZlcnNlUmVmIiwiX3NldFNhdmVkQ2hhbmdlcyIsInNvdXJjZUxhbmd1YWdlIiwidGFyZ2V0TGFuZ3VhZ2UiLCJjdXJyZW50SW5kZXgiLCJzYXZlZCIsImdldENoYW5nZXMiLCJjbGVhckNoYW5nZXMiLCJfdW5zYXZlZENoYW5nZXNMaXN0IiwiaGFzT3duUHJvcGVydHkiLCJfaGF2ZVVuc2F2ZWRDaGFuZ2VzIiwiT2JqZWN0Iiwia2V5cyIsImZpbmRSZWZJbkFycmF5IiwiZmluZEl0ZW0iLCJjaHVua3MiLCJyZWZMZW4iLCJpbmRleCIsImZpbmRJbmRleCIsImNodW5rIiwiaWR4IiwibmV4dENoYXIiLCJnZXRCb29rTmFtZSIsImJvb2tDYXBzIiwidG9VcHBlckNhc2UiLCJmaWxlcGF0aCIsImNvbnRlbnQiLCJjb25maWciLCJ0b2tlbiIsInRpbWVvdXQiLCJzZXJ2ZXJUaW1lT3V0IiwiYXV0aG9yIiwiYnJhbmNoIiwib25TYXZlRWRpdCIsIl9zYXZlRWRpdCIsInRoZW4iLCJzdWNjZXNzIiwidW5zYXZlZENhcmRJbmRpY2VzIiwiY2FyZEluZGV4IiwiaW5mbyIsInJlbG9hZFJlc291cmNlIiwic2F2ZUNoYW5nZXNUb0Nsb3VkIiwib3JpZ2luYWxVc2ZtIiwiZ2V0UmVzcG9uc2VEYXRhIiwidXBkYXRlZEJpYmxlVXNmbSIsIm5ld1VzZm0iLCJuZXdWZXJzZVRleHQiLCJ1cGRhdGVkVmVyc2VPYmplY3RzIiwiY2hhcHRlckNodW5rcyIsInNwbGl0IiwiY2hhcHRlckluZGV4IiwiY3VycmVudENoYXB0ZXIiLCJ2ZXJzZUNodW5rcyIsInZlcnNlSW5kZXgiLCJuZXdWZXJzZVVzZm0iLCJjb252ZXJ0VmVyc2VEYXRhVG9VU0ZNIiwib2xkVmVyc2UiLCJ2ZXJzZU51bUxlbiIsIm5ld0NoYXB0ZXIiLCJqb2luIiwidGFyZ2V0VmVyc2VPYmplY3RzXyIsInVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlIiwidGFyZ2V0VmVyc2VPYmplY3RzIiwibmV3Qm9va0pzb24iLCJ1cGRhdGVWZXJzZSIsInRvVVNGTSIsImZvcmNlZE5ld0xpbmVzIiwiX3ZlcnNlIiwiaW5jbHVkZXMiLCJyZW5kZXJlZFNjcmlwdHVyZVBhbmVzIiwibWFwIiwiX2N1cnJlbnRWZXJzZURhdGEiLCJpbml0aWFsVmVyc2VPYmplY3RzIiwiX3JlZmVyZW5jZSIsIl9zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnIiwicHJvcFR5cGVzIiwic3RyaW5nIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJudW1iZXIiLCJzaGFwZSIsIm9uZU9mVHlwZSIsImJvb2wiLCJvYmplY3QiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLQSxLQUFaLE1BQXVCLE9BQXZCO0FBQ0EsT0FBTyxLQUFLQyxTQUFaLE1BQTJCLFlBQTNCO0FBQ0EsU0FB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Q29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuaW1wb3J0IHsgY29yZSB9IGZyb20gJ3NjcmlwdHVyZS1yZXNvdXJjZXMtcmNsJ1xuaW1wb3J0IHVzZm1qcyBmcm9tICd1c2ZtLWpzJ1xuaW1wb3J0IHsgdXNlRWRpdCB9IGZyb20gJ2dpdGVhLXJlYWN0LXRvb2xraXQnXG5pbXBvcnQge1xuICBDYXJkLFxuICB1c2VDYXJkU3RhdGUsXG4gIHVzZVVzZXJCcmFuY2gsXG4gIEVSUk9SX1NUQVRFLFxuICBNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SLFxufSBmcm9tICd0cmFuc2xhdGlvbi1oZWxwcy1yY2wnXG5pbXBvcnQgeyBBbGlnbm1lbnRIZWxwZXJzLCBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIH0gZnJvbSAnd29yZC1hbGlnbmVyLXJjbCdcbmltcG9ydCAqIGFzIGlzRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCdcbmltcG9ydCB7IFNjcmlwdHVyZVBhbmUsIFNjcmlwdHVyZVNlbGVjdG9yIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyB1c2VTY3JpcHR1cmVTZXR0aW5ncyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVNjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHtcbiAgZ2V0UmVzb3VyY2VMaW5rLFxuICBnZXRSZXNvdXJjZU1lc3NhZ2UsXG4gIGdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyxcbiAgaXNPcmlnaW5hbEJpYmxlLFxufSBmcm9tICcuLi8uLi91dGlscy9TY3JpcHR1cmVTZXR0aW5ncydcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnLi4vU2NyaXB0dXJlUGFuZS9zdHlsZWQnXG5pbXBvcnQge1xuICBOVF9PUklHX0xBTkcsXG4gIE9SSUdJTkFMX1NPVVJDRSxcbiAgT1RfT1JJR19MQU5HLFxufSBmcm9tICcuLi8uLi91dGlscydcblxuY29uc3QgS0VZX0ZPTlRfU0laRV9CQVNFID0gJ3NjcmlwdHVyZVBhbmVGb250U2l6ZV8nXG5jb25zdCBsYWJlbCA9ICdWZXJzaW9uJ1xuY29uc3Qgc3R5bGUgPSB7IG1hcmdpblRvcDogJzE2cHgnLCB3aWR0aDogJzUwMHB4JyB9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNjcmlwdHVyZUNhcmQoe1xuICBpZCxcbiAgaXNOVCxcbiAgdGl0bGUsXG4gIHNlcnZlcixcbiAgYXBwUmVmLFxuICBjYXJkTnVtLFxuICBjbGFzc2VzLFxuICByZXNvdXJjZToge1xuICAgIG93bmVyLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgcmVzb3VyY2VJZCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gIH0sXG4gIGdldExhbmd1YWdlLFxuICByZWZlcmVuY2U6IHtcbiAgICB2ZXJzZSxcbiAgICBjaGFwdGVyLFxuICAgIHByb2plY3RJZDogYm9va0lkLFxuICB9LFxuICByZXNvdXJjZUxpbmssXG4gIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gIGRpc2FibGVXb3JkUG9wb3ZlcixcbiAgb25SZXNvdXJjZUVycm9yLFxuICBodHRwQ29uZmlnLFxuICBncmVla1JlcG9VcmwsXG4gIGhlYnJld1JlcG9VcmwsXG4gIGdldExleGljb25EYXRhLFxuICBmZXRjaEdsb3NzZXNGb3JWZXJzZSxcbiAgdHJhbnNsYXRlLFxuICBvbk1pbmltaXplLFxuICBsb2dnZWRJblVzZXIsXG4gIGF1dGhlbnRpY2F0aW9uLFxuICBzZXRTYXZlZENoYW5nZXMsXG4gIGJvb2tJbmRleCxcbiAgYWRkVmVyc2VSYW5nZSxcbiAgc2V0V29yZEFsaWduZXJTdGF0dXMsXG59KSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVfXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBoYXZlVW5zYXZlZENoYW5nZXM6IGZhbHNlLFxuICAgIHJlZjogYXBwUmVmLFxuICAgIHNhdmVDb250ZW50OiBudWxsLFxuICAgIHNoYTogbnVsbCxcbiAgICBzdGFydFNhdmU6IGZhbHNlLFxuICAgIHVybEVycm9yOiBudWxsLFxuICAgIHVzaW5nVXNlckJyYW5jaDogZmFsc2UsXG4gICAgdW5zYXZlZENoYW5nZXNMaXN0OiB7fSxcbiAgICB2ZXJzZXNGb3JSZWY6IG51bGwsXG4gIH0pXG4gIGNvbnN0IHtcbiAgICByZWYsXG4gICAgc2F2ZUNvbnRlbnQsXG4gICAgc2hhLFxuICAgIHN0YXJ0U2F2ZSxcbiAgICB1cmxFcnJvcixcbiAgICB1c2luZ1VzZXJCcmFuY2gsXG4gICAgdW5zYXZlZENoYW5nZXNMaXN0LFxuICAgIGhhdmVVbnNhdmVkQ2hhbmdlcyxcbiAgICB2ZXJzZXNGb3JSZWYsXG4gIH0gPSBzdGF0ZVxuXG4gIGNvbnN0IFtmb250U2l6ZSwgc2V0Rm9udFNpemVdID0gdXNlVXNlckxvY2FsU3RvcmFnZShLRVlfRk9OVF9TSVpFX0JBU0UgKyBjYXJkTnVtLCAxMDApXG4gIGNvbnN0IGlzTlRfID0gaXNOVChib29rSWQpXG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICBzZXRTdGF0ZV8ocHJldlN0YXRlID0+ICh7IC4uLnByZXZTdGF0ZSwgLi4ubmV3U3RhdGUgfSkpXG4gIH1cblxuICBpZiAodXNpbmdVc2VyQnJhbmNoKSB7XG4gICAgaHR0cENvbmZpZyA9IHsgLi4uaHR0cENvbmZpZywgY2FjaGU6IHsgbWF4QWdlOiAwIH0gfSAvLyBkaXNhYmxlIGh0dHAgY2FjaGluZ1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIHNjcmlwdHVyZUNvbmZpZyxcbiAgICBzZXRTY3JpcHR1cmUsXG4gICAgc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QsXG4gIH0gPSB1c2VTY3JpcHR1cmVTZXR0aW5ncyh7XG4gICAgaXNOVCxcbiAgICB0aXRsZSxcbiAgICB2ZXJzZSxcbiAgICBvd25lcixcbiAgICBib29rSWQsXG4gICAgYXBwUmVmOiByZWYsXG4gICAgc2VydmVyLFxuICAgIGNhcmROdW0sXG4gICAgY2hhcHRlcixcbiAgICBsYW5ndWFnZUlkLFxuICAgIHJlc291cmNlSWQsXG4gICAgcmVzb3VyY2VMaW5rLFxuICAgIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gICAgZGlzYWJsZVdvcmRQb3BvdmVyLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICBzZXRVcmxFcnJvcjogKGVycm9yKSA9PiBzZXRTdGF0ZSh7IHVybEVycm9yOiBlcnJvciB9KSxcbiAgICBodHRwQ29uZmlnLFxuICAgIGdyZWVrUmVwb1VybCxcbiAgICBoZWJyZXdSZXBvVXJsLFxuICAgIHdob2xlQm9vazogdHJ1ZSxcbiAgfSlcblxuICBjb25zdCBmZXRjaFJlc3BfID0gc2NyaXB0dXJlQ29uZmlnPy5mZXRjaFJlc3BvbnNlXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgcmVwbyA9IGAke3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/Lmxhbmd1YWdlSWR9XyR7c2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ucHJvamVjdElkfWBcbiAgY29uc3QgcmVmZXJlbmNlXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlIHx8IG51bGxcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBnZXQgdGhlIF9zaGEgZnJvbSBsYXN0IHNjcmlwdHVyZSBkb3dubG9hZFxuICAgIGNvbnN0IF9zaGEgPSBmZXRjaFJlc3BfPy5kYXRhPy5zaGEgfHwgbnVsbFxuICAgIGNvbnNvbGUubG9nKGBmb3IgJHtKU09OLnN0cmluZ2lmeShyZWZlcmVuY2VfKX0gbmV3IHNoYSBpcyAke19zaGF9YClcblxuICAgIGlmIChfc2hhICE9PSBzaGEpIHtcbiAgICAgIHNldFN0YXRlKHsgc2hhOiBfc2hhIH0pXG4gICAgfVxuICB9LCBbZmV0Y2hSZXNwX10pXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBjYXJkUmVzb3VyY2VJZCA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnByb2plY3RJZCB8fCByZXNvdXJjZUlkXG4gIC8vIEB0cy1pZ25vcmVcbiAgbGV0IHJlZl8gPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5yZWYgfHwgYXBwUmVmXG4gIGNvbnN0IGNhblVzZUVkaXRCcmFuY2ggPSBsb2dnZWRJblVzZXIgJiYgYXV0aGVudGljYXRpb24gJiZcbiAgICAocmVzb3VyY2VJZCAhPT0gT1JJR0lOQUxfU09VUkNFKSAmJlxuICAgICgocmVmXyA9PT0gJ21hc3RlcicpIHx8IChyZWZfLnN1YnN0cmluZygwLCBsb2dnZWRJblVzZXIubGVuZ3RoKSA9PT0gbG9nZ2VkSW5Vc2VyKSApIC8vIG5vdCB0YWdcblxuICBjb25zdCB7XG4gICAgc3RhdGU6IHsgd29ya2luZ1Jlc291cmNlQnJhbmNoLCB1c2luZ1VzZXJCcmFuY2g6IHVzaW5nVXNlckJyYW5jaF8gfSxcbiAgICBhY3Rpb25zOiB7IHN0YXJ0RWRpdDogc3RhcnRFZGl0QnJhbmNoIH0sXG4gIH0gPSB1c2VVc2VyQnJhbmNoKHtcbiAgICBvd25lcixcbiAgICBzZXJ2ZXIsXG4gICAgYXBwUmVmLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgY2FyZElkOiBpZCxcbiAgICBsb2dnZWRJblVzZXI6IGNhblVzZUVkaXRCcmFuY2ggPyBsb2dnZWRJblVzZXIgOiBudWxsLFxuICAgIGF1dGhlbnRpY2F0aW9uOiBjYW5Vc2VFZGl0QnJhbmNoID8gYXV0aGVudGljYXRpb24gOiBudWxsLFxuICAgIGNhcmRSZXNvdXJjZUlkLFxuICAgIG9uUmVzb3VyY2VFcnJvcixcbiAgICB1c2VVc2VyTG9jYWxTdG9yYWdlLFxuICB9KVxuXG4gIGNvbnN0IHdvcmtpbmdSZWYgPSBjYW5Vc2VFZGl0QnJhbmNoID8gd29ya2luZ1Jlc291cmNlQnJhbmNoIDogYXBwUmVmXG4gIGxldCBzY3JpcHR1cmVUaXRsZVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHNlbGVjdCBjb3JyZWN0IHdvcmtpbmcgcmVmIC0gY291bGQgYmUgbWFzdGVyLCB1c2VyIGJyYW5jaCwgb3IgcmVsZWFzZVxuICAgIGlmICh1c2luZ1VzZXJCcmFuY2hfICE9PSB1c2luZ1VzZXJCcmFuY2gpIHtcbiAgICAgIHNldFN0YXRlKHsgdXNpbmdVc2VyQnJhbmNoOiB1c2luZ1VzZXJCcmFuY2hfIH0pXG4gICAgfVxuICB9LCBbdXNpbmdVc2VyQnJhbmNoXywgdXNpbmdVc2VyQnJhbmNoXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBzZWxlY3QgY29ycmVjdCB3b3JraW5nIHJlZiAtIGNvdWxkIGJlIG1hc3RlciwgdXNlciBicmFuY2gsIG9yIHJlbGVhc2VcbiAgICBsZXQgd29ya2luZ1JlZl8gPSB3b3JraW5nUmVmIHx8IGFwcFJlZlxuXG4gICAgaWYgKHJlZiAhPT0gd29ya2luZ1JlZl8pIHtcbiAgICAgIHNldFN0YXRlKHsgcmVmOiB3b3JraW5nUmVmXyB9KVxuICAgIH1cbiAgfSwgW3dvcmtpbmdSZWYsIHJlZiwgYXBwUmVmXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB1cGRhdGUgZGlzcGxheSBzdGF0dXMgaWYgZXJyb3JcbiAgICBjb25zdCBlcnJvciA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXM/LltFUlJPUl9TVEFURV1cblxuICAgIGlmIChlcnJvcikgeyAvLyBpZiBlcnJvciB3YXMgZm91bmQgZG8gY2FsbGJhY2tcbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1c1xuICAgICAgY29uc3QgcmVzb3VyY2VMaW5rID0gZ2V0UmVzb3VyY2VMaW5rKHNjcmlwdHVyZUNvbmZpZylcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXRSZXNvdXJjZU1lc3NhZ2UocmVzb3VyY2VTdGF0dXMsIHNlcnZlciwgcmVzb3VyY2VMaW5rLCBpc05UXylcbiAgICAgIGNvbnN0IGlzQWNjZXNzRXJyb3IgPSByZXNvdXJjZVN0YXR1c1tNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SXVxuICAgICAgb25SZXNvdXJjZUVycm9yICYmIG9uUmVzb3VyY2VFcnJvcihtZXNzYWdlLCBpc0FjY2Vzc0Vycm9yLCByZXNvdXJjZVN0YXR1cylcbiAgICB9XG4gIH0sIFtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzPy5bRVJST1JfU1RBVEVdXSlcblxuICBpZiAoc2NyaXB0dXJlQ29uZmlnLnRpdGxlICYmIHNjcmlwdHVyZUNvbmZpZy52ZXJzaW9uKSB7XG4gICAgc2NyaXB0dXJlVGl0bGUgPSBgJHtzY3JpcHR1cmVDb25maWcudGl0bGV9IHYke3NjcmlwdHVyZUNvbmZpZy52ZXJzaW9ufWBcbiAgICBzY3JpcHR1cmVWZXJzaW9uSGlzdC51cGRhdGVUaXRsZShzY3JpcHR1cmVDb25maWcucmVzb3VyY2VMaW5rLCBzY3JpcHR1cmVUaXRsZSlcbiAgfSBlbHNlIHtcbiAgICBzY3JpcHR1cmVUaXRsZSA9IGBUaXRsZSBtaXNzaW5nIGZyb20gcHJvamVjdCBtYW5pZmVzdGBcbiAgfVxuXG4gIC8qKiBEeW5hbWljYWxseSBjcmVhdGVzIHRoZSBzY3JpcHR1cmUgc2VsZWN0aW9uIGRyb3Bkb3duIHRvIGJlIGluc2VydGVkIGludG8gY2FyZCBzZXR0aW5ncyAqL1xuICBmdW5jdGlvbiBnZXRTY3JpcHR1cmVTZWxlY3RvcigpIHtcbiAgICBjb25zdCBzY3JpcHR1cmVTZWxlY3Rpb25Db25maWcgPSBnZXRTY3JpcHR1cmVWZXJzaW9uU2V0dGluZ3Moe1xuICAgICAgbGFiZWwsXG4gICAgICByZXNvdXJjZUxpbms6IHNjcmlwdHVyZUNvbmZpZy5yZXNvdXJjZUxpbmssXG4gICAgICBzZXRTY3JpcHR1cmUsXG4gICAgICBzY3JpcHR1cmVWZXJzaW9uSGlzdCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIDxTY3JpcHR1cmVTZWxlY3RvciB7Li4uc2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnfSBzdHlsZT17c3R5bGV9IGVycm9yTWVzc2FnZT17dXJsRXJyb3J9IC8+XG4gIH1cblxuICBmdW5jdGlvbiBvbk1lbnVDbG9zZSgpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhgb25NZW51Q2xvc2UoKWApXG4gICAgc2V0U3RhdGUoeyB1cmxFcnJvcjogbnVsbCB9KVxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBsYW5ndWFnZUlkXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/Lmxhbmd1YWdlSWRcbiAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZSh7IGxhbmd1YWdlSWQ6IGxhbmd1YWdlSWRfIH0pXG4gIGNvbnN0IGRpcmVjdGlvbiA9IChsYW5ndWFnZT8uZGlyZWN0aW9uKSB8fCAnbHRyJ1xuICBjb25zdCByZWZlcmVuY2UgPSB7IC4uLnNjcmlwdHVyZUNvbmZpZy5yZWZlcmVuY2UgfVxuXG4gIGNvbnN0IGlzSGVicmV3ID0gKGxhbmd1YWdlSWRfID09PSAnaGJvJylcbiAgY29uc3QgZm9udEZhY3RvciA9IGlzSGVicmV3ID8gMS40IDogMSAvLyB3ZSBhdXRvbWF0aWNhbGx5IHNjYWxlIHVwIGZvbnQgc2l6ZSBmb3IgSGVicmV3XG4gIGNvbnN0IHNjYWxlZEZvbnRTaXplID0gZm9udFNpemUgKiBmb250RmFjdG9yXG5cbiAgY29uc3QgaXRlbXMgPSBudWxsXG4gIGNvbnN0IHtcbiAgICBzdGF0ZToge1xuICAgICAgaGVhZGVycywgZmlsdGVycywgaXRlbUluZGV4LCBtYXJrZG93blZpZXcsXG4gICAgfSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICBzZXRGaWx0ZXJzLCBzZXRJdGVtSW5kZXgsIHNldE1hcmtkb3duVmlldyxcbiAgICB9LFxuICB9ID0gdXNlQ2FyZFN0YXRlKHsgaXRlbXMgfSlcblxuICBjb25zdCByZWZTdHlsZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBmb250RmFtaWx5OiAnTm90byBTYW5zJyxcbiAgICBmb250U2l6ZTogYCR7TWF0aC5yb3VuZChzY2FsZWRGb250U2l6ZSAqIDAuOSl9JWAsXG4gIH0pLCBbc2NhbGVkRm9udFNpemVdKVxuXG4gIGNvbnN0IGNvbnRlbnRTdHlsZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBmb250RmFtaWx5OiAnTm90byBTYW5zJyxcbiAgICBmb250U2l6ZTogYCR7c2NhbGVkRm9udFNpemV9JWAsXG4gIH0pLCBbc2NhbGVkRm9udFNpemVdKVxuXG4gIGNvbnN0IHNjcmlwdHVyZUxhYmVsID0gPFRpdGxlPntzY3JpcHR1cmVUaXRsZX08L1RpdGxlPlxuICBsZXQgZGlzYWJsZVdvcmRQb3BvdmVyXyA9IGRpc2FibGVXb3JkUG9wb3ZlclxuICBjb25zdCB1c2luZ09yaWdpbmFsQmlibGUgPSBpc09yaWdpbmFsQmlibGUoc2NyaXB0dXJlQ29uZmlnWydyZXNvdXJjZSddPy5wcm9qZWN0SWQpXG5cbiAgaWYgKGRpc2FibGVXb3JkUG9wb3ZlciA9PT0gdW5kZWZpbmVkKSB7IC8vIGlmIG5vdCBzcGVjaWZpZWQsIHRoZW4gZGV0ZXJtaW5lIGlmIG9yaWdpbmFsIGxhbmd1YWdlIHJlc291cmNlXG4gICAgZGlzYWJsZVdvcmRQb3BvdmVyXyA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHByZS1jYWNoZSBnbG9zc2VzIG9uIHZlcnNlIGNoYW5nZVxuICAgIGNvbnN0IGZldGNoR2xvc3NEYXRhRm9yVmVyc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdmVyc2VPYmplY3RzID0gW11cblxuICAgICAgLy8gZ2V0IHZlcnNlIG9iamVjdHMgb2YgYWxsIHRoZSB2ZXJzZXNcbiAgICAgIGZvciAoY29uc3QgdmVyc2VSZWYgb2Ygc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWYgfHwgW10pIHtcbiAgICAgICAgY29uc3QgX3ZlcnNlT2JqZWN0cyA9IHZlcnNlUmVmPy52ZXJzZURhdGE/LnZlcnNlT2JqZWN0c1xuICAgICAgICB2ZXJzZU9iamVjdHMgPSB2ZXJzZU9iamVjdHMuY29uY2F0KF92ZXJzZU9iamVjdHMpXG4gICAgICB9XG5cbiAgICAgIGlmICghZGlzYWJsZVdvcmRQb3BvdmVyICYmIHZlcnNlT2JqZWN0cz8ubGVuZ3RoICYmIGZldGNoR2xvc3Nlc0ZvclZlcnNlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGF3YWl0IGZldGNoR2xvc3Nlc0ZvclZlcnNlKHZlcnNlT2JqZWN0cywgbGFuZ3VhZ2VJZF8pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVzaW5nT3JpZ2luYWxCaWJsZSkge1xuICAgICAgZmV0Y2hHbG9zc0RhdGFGb3JWZXJzZSgpXG4gICAgfVxuICB9LCBbIHZlcnNlc0ZvclJlZiwgbGFuZ3VhZ2VJZF8gXSlcblxuICBjb25zdCBlbmFibGVFZGl0ID0gIXVzaW5nT3JpZ2luYWxCaWJsZVxuICBjb25zdCBlbmFibGVBbGlnbm1lbnQgPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIGNvbnN0IG9yaWdpbmFsUmVwb1VybCA9IGlzTmV3VGVzdGFtZW50ID8gZ3JlZWtSZXBvVXJsIDogaGVicmV3UmVwb1VybFxuICBjb25zdCBzY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnID0ge1xuICAgIGF1dGhlbnRpY2F0aW9uOiBjYW5Vc2VFZGl0QnJhbmNoID8gYXV0aGVudGljYXRpb24gOiBudWxsLFxuICAgIGJvb2tJbmRleCxcbiAgICBjdXJyZW50VmVyc2VSZWY6IHJlZmVyZW5jZSxcbiAgICBlbmFibGVFZGl0LFxuICAgIGVuYWJsZUFsaWdubWVudCxcbiAgICBodHRwQ29uZmlnLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpc05ld1Rlc3RhbWVudCxcbiAgICBsb2dnZWRJblVzZXI6IGNhblVzZUVkaXRCcmFuY2ggPyBsb2dnZWRJblVzZXIgOiBudWxsLFxuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3JpZ2luYWxSZXBvVXJsLFxuICAgIHNjcmlwdHVyZUNvbmZpZyxcbiAgICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgICBzdGFydEVkaXRCcmFuY2gsXG4gICAgc2V0U2F2ZWRDaGFuZ2VzOiBfc2V0U2F2ZWRDaGFuZ2VzLFxuICAgIHNvdXJjZUxhbmd1YWdlOiBpc05UXyA/IE5UX09SSUdfTEFORyA6IE9UX09SSUdfTEFORyxcbiAgICB0YXJnZXRMYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgdGl0bGU6IHNjcmlwdHVyZVRpdGxlLFxuICAgIHdvcmtpbmdSZXNvdXJjZUJyYW5jaDogcmVmLFxuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbmV2ZXIgYSBzY3JpcHR1cmUgcGFuZSBoYXMgYSBjaGFuZ2UgaW4gc2F2ZSBzdGF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudEluZGV4XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2F2ZWRcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZ2V0Q2hhbmdlcyAtIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHVzZXIgY2xpY2tzIHNhdmUgYnV0dG9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNsZWFyQ2hhbmdlcyAtIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHNhdmUgaGFzIGNvbXBsZXRlZFxuICAgKi9cbiAgZnVuY3Rpb24gX3NldFNhdmVkQ2hhbmdlcyhjdXJyZW50SW5kZXgsIHNhdmVkLCBnZXRDaGFuZ2VzID0gbnVsbCwgY2xlYXJDaGFuZ2VzID0gbnVsbCkge1xuICAgIGNvbnN0IF91bnNhdmVkQ2hhbmdlc0xpc3QgPSB7IC4uLnVuc2F2ZWRDaGFuZ2VzTGlzdCB9XG5cbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIGlmIChfdW5zYXZlZENoYW5nZXNMaXN0Lmhhc093blByb3BlcnR5KGN1cnJlbnRJbmRleCkpIHtcbiAgICAgICAgZGVsZXRlIF91bnNhdmVkQ2hhbmdlc0xpc3RbY3VycmVudEluZGV4XVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV91bnNhdmVkQ2hhbmdlc0xpc3QuaGFzT3duUHJvcGVydHkoY3VycmVudEluZGV4KSkge1xuICAgICAgICBfdW5zYXZlZENoYW5nZXNMaXN0W2N1cnJlbnRJbmRleF0gPSB7IGdldENoYW5nZXMsIGNsZWFyQ2hhbmdlcyB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgX2hhdmVVbnNhdmVkQ2hhbmdlcyA9ICEhT2JqZWN0LmtleXMoX3Vuc2F2ZWRDaGFuZ2VzTGlzdCkubGVuZ3RoXG5cbiAgICBpZiAoaGF2ZVVuc2F2ZWRDaGFuZ2VzICE9IF9oYXZlVW5zYXZlZENoYW5nZXMpIHtcbiAgICAgIHNldFNhdmVkQ2hhbmdlcyAmJiBzZXRTYXZlZENoYW5nZXMocmVzb3VyY2VJZCwgIV9oYXZlVW5zYXZlZENoYW5nZXMpXG4gICAgICBzZXRTdGF0ZSh7IGhhdmVVbnNhdmVkQ2hhbmdlczogX2hhdmVVbnNhdmVkQ2hhbmdlcyB9KVxuICAgIH1cblxuICAgIGlmICghaXNFcXVhbChfdW5zYXZlZENoYW5nZXNMaXN0LCB1bnNhdmVkQ2hhbmdlc0xpc3QpKSB7XG4gICAgICBzZXRTdGF0ZSh7IHVuc2F2ZWRDaGFuZ2VzTGlzdDogX3Vuc2F2ZWRDaGFuZ2VzTGlzdCB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZWFyY2ggY2hhcHRlciBvciB2ZXJzZSBjaHVuayB0byBsaW5lIHRoYXQgc3RhcnRzIHdpdGggZmluZEl0ZW1cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBmaW5kSXRlbVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjaHVua3NcbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRSZWZJbkFycmF5KGZpbmRJdGVtLCBjaHVua3MpIHtcbiAgICBjb25zdCByZWZfID0gZmluZEl0ZW0gKyAnJ1xuICAgIGNvbnN0IHJlZkxlbiA9IHJlZl8ubGVuZ3RoXG4gICAgY29uc3QgaW5kZXggPSBjaHVua3MuZmluZEluZGV4KChjaHVuaywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgICBpZiAoY2h1bmsuc3Vic3RyaW5nKDAsIHJlZkxlbikgPT09IHJlZl8pIHtcbiAgICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNodW5rW3JlZl9dXG5cbiAgICAgICAgICBpZiAoKG5leHRDaGFyID4gJzknKSB8fCAobmV4dENoYXIgPCAnMCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaW5kZXhcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJvb2tOYW1lKCkge1xuICAgIGNvbnN0IGJvb2tDYXBzID0gc2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2U/LnByb2plY3RJZCA/IHNjcmlwdHVyZUNvbmZpZy5yZWZlcmVuY2UucHJvamVjdElkLnRvVXBwZXJDYXNlKCkgOiAnJ1xuICAgIHJldHVybiBgJHtib29rSW5kZXh9LSR7Ym9va0NhcHN9LnVzZm1gXG4gIH1cblxuICBjb25zdCBmaWxlcGF0aCA9IGdldEJvb2tOYW1lKClcblxuICAvLyBrZWVwIHRyYWNrIG9mIHZlcnNlIGVkaXQgc3RhdGVcbiAgY29uc3QgeyBvblNhdmVFZGl0IH0gPSB1c2VFZGl0KHtcbiAgICBzaGEsXG4gICAgb3duZXIsXG4gICAgY29udGVudDogc2F2ZUNvbnRlbnQsXG4gICAgY29uZmlnOiB7XG4gICAgICBjYWNoZTogeyBtYXhBZ2U6IDAgfSxcbiAgICAgIC4uLmF1dGhlbnRpY2F0aW9uPy5jb25maWcsXG4gICAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGltZW91dDogaHR0cENvbmZpZz8uc2VydmVyVGltZU91dCB8fCBodHRwQ29uZmlnPy50aW1lb3V0IHx8IDUwMDAsXG4gICAgfSxcbiAgICBhdXRob3I6IGxvZ2dlZEluVXNlcixcbiAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgIGJyYW5jaDogd29ya2luZ1Jlc291cmNlQnJhbmNoLFxuICAgIGZpbGVwYXRoLFxuICAgIHJlcG8sXG4gIH0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gd2hlbiBzdGFydFNhdmUgZ29lcyB0cnVlLCBzYXZlIGVkaXRzIHRvIHVzZXIgYnJhbmNoIGFuZCB0aGVuIGNsZWFyIHN0YXJ0U2F2ZVxuICAgIGNvbnN0IF9zYXZlRWRpdCA9IGFzeW5jICgpID0+IHsgLy8gYmVnaW4gdXBsb2FkaW5nIG5ldyBVU0ZNXG4gICAgICBsZXQgYnJhbmNoID0gKHdvcmtpbmdSZXNvdXJjZUJyYW5jaCAhPT0gJ21hc3RlcicpID8gd29ya2luZ1Jlc291cmNlQnJhbmNoIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICghYnJhbmNoKSB7XG4gICAgICAgIGJyYW5jaCA9IGF3YWl0IHN0YXJ0RWRpdEJyYW5jaCgpIC8vIG1ha2Ugc3VyZSB1c2VyIGJyYW5jaCBleGlzdHMgYW5kIGdldCBuYW1lXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9uU2F2ZUVkaXQoYnJhbmNoKS50aGVuKChzdWNjZXNzKSA9PiB7IC8vIHB1c2ggY2hhbmdlZCB0byBzZXJ2ZXJcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZlIHNjcmlwdHVyZSBlZGl0cyBzdWNjZXNzYClcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBzdGFydFNhdmU6IGZhbHNlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCB1bnNhdmVkQ2FyZEluZGljZXMgPSBPYmplY3Qua2V5cyh1bnNhdmVkQ2hhbmdlc0xpc3QpXG5cbiAgICAgICAgICBpZiAodW5zYXZlZENhcmRJbmRpY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2FyZEluZGV4IG9mIHVuc2F2ZWRDYXJkSW5kaWNlcykge1xuICAgICAgICAgICAgICBjb25zdCB7IGNsZWFyQ2hhbmdlcyB9ID0gdW5zYXZlZENoYW5nZXNMaXN0W2NhcmRJbmRleF1cbiAgICAgICAgICAgICAgY2xlYXJDaGFuZ2VzICYmIGNsZWFyQ2hhbmdlcygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIFJlbG9hZGluZyByZXNvdXJjZScpXG4gICAgICAgICAgc2NyaXB0dXJlQ29uZmlnPy5yZWxvYWRSZXNvdXJjZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZpbmcgY2hhbmdlZCBzY3JpcHR1cmUgZmFpbGVkJylcbiAgICAgICAgICBzZXRTdGF0ZSh7IHN0YXJ0U2F2ZTogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRTYXZlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gY2FsbGluZyBfc2F2ZUVkaXQoKWApXG4gICAgICBfc2F2ZUVkaXQoKVxuICAgIH1cbiAgfSwgW3N0YXJ0U2F2ZV0pXG5cblxuICAvKipcbiAgICogZm9yIGVhY2ggdW5zYXZlZCBjaGFuZ2UsIGNhbGwgaW50byB2ZXJzZVBhbmUgdG8gZ2V0IGxhdGVzdCBjaGFuZ2VzIGZvciB2ZXJzZSB0byBzYXZlXG4gICAqL1xuICBmdW5jdGlvbiBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSB7XG4gICAgY29uc3QgdW5zYXZlZENhcmRJbmRpY2VzID0gT2JqZWN0LmtleXModW5zYXZlZENoYW5nZXNMaXN0KVxuXG4gICAgaWYgKHVuc2F2ZWRDYXJkSW5kaWNlcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFVzZm0gPSBjb3JlLmdldFJlc3BvbnNlRGF0YShzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2UpXG4gICAgICBsZXQgdXBkYXRlZEJpYmxlVXNmbSA9IG9yaWdpbmFsVXNmbVxuXG4gICAgICBmb3IgKGNvbnN0IGNhcmRJbmRleCBvZiB1bnNhdmVkQ2FyZEluZGljZXMpIHtcbiAgICAgICAgY29uc3QgeyBnZXRDaGFuZ2VzIH0gPSB1bnNhdmVkQ2hhbmdlc0xpc3RbY2FyZEluZGV4XVxuXG4gICAgICAgIGlmIChnZXRDaGFuZ2VzKSB7XG4gICAgICAgICAgbGV0IG5ld1VzZm1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBuZXdWZXJzZVRleHQsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgICAgICB1cGRhdGVkVmVyc2VPYmplY3RzLFxuICAgICAgICAgIH0gPSBnZXRDaGFuZ2VzKClcblxuICAgICAgICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzICYmIHVwZGF0ZWRCaWJsZVVzZm0pIHsgLy8ganVzdCByZXBsYWNlIHZlcnNlXG4gICAgICAgICAgICBjb25zdCBjaGFwdGVyQ2h1bmtzID0gdXBkYXRlZEJpYmxlVXNmbT8uc3BsaXQoJ1xcXFxjICcpXG4gICAgICAgICAgICBjb25zdCBjaGFwdGVySW5kZXggPSBmaW5kUmVmSW5BcnJheShyZWY/LmNoYXB0ZXIsIGNoYXB0ZXJDaHVua3MpXG5cbiAgICAgICAgICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhcHRlciA9IGNoYXB0ZXJDaHVua3NbY2hhcHRlckluZGV4XVxuICAgICAgICAgICAgICBjb25zdCB2ZXJzZUNodW5rcyA9IGN1cnJlbnRDaGFwdGVyLnNwbGl0KCdcXFxcdiAnKVxuICAgICAgICAgICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgICAgICAgICAgaWYgKHZlcnNlSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZlcnNlVXNmbSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTSh1cGRhdGVkVmVyc2VPYmplY3RzKVxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZlcnNlID0gdmVyc2VDaHVua3NbdmVyc2VJbmRleF1cbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICAgICAgICAgIHZlcnNlQ2h1bmtzW3ZlcnNlSW5kZXhdID0gb2xkVmVyc2Uuc3Vic3RyaW5nKDAsIHZlcnNlTnVtTGVuICsgMSkgKyBuZXdWZXJzZVVzZm1cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDaGFwdGVyID0gdmVyc2VDaHVua3Muam9pbignXFxcXHYgJylcbiAgICAgICAgICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgICAgICAgICAgbmV3VXNmbSA9IGNoYXB0ZXJDaHVua3Muam9pbignXFxcXGMgJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzICYmICFuZXdVc2ZtKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG51bGxcblxuICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICBpZiAobmV3VmVyc2VUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB0YXJnZXRWZXJzZU9iamVjdHMgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UodXBkYXRlZFZlcnNlT2JqZWN0cywgbmV3VmVyc2VUZXh0KVxuICAgICAgICAgICAgICAgIHRhcmdldFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0c1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0Jvb2tKc29uID0gdGFyZ2V0VmVyc2VPYmplY3RzXyAmJiBzY3JpcHR1cmVDb25maWc/LnVwZGF0ZVZlcnNlKHJlZi5jaGFwdGVyLCByZWYudmVyc2UsIHsgdmVyc2VPYmplY3RzOiB0YXJnZXRWZXJzZU9iamVjdHNfIH0pXG4gICAgICAgICAgICB1cGRhdGVkQmlibGVVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwgeyBmb3JjZWROZXdMaW5lczogdHJ1ZSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZpbmcgbmV3IFVTRk06ICR7dXBkYXRlZEJpYmxlVXNmbS5zdWJzdHJpbmcoMCwgMTAwKX0uLi5gKVxuICAgICAgc2V0U3RhdGUoeyBzYXZlQ29udGVudDogdXBkYXRlZEJpYmxlVXNmbSwgc3RhcnRTYXZlOiB0cnVlIH0pXG4gICAgfVxuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBjaGVjayBmb3IgdmVyc2UgcmFuZ2VcbiAgICBjb25zdCBfdmVyc2UgPSByZWZlcmVuY2UudmVyc2VcblxuICAgIGlmIChhZGRWZXJzZVJhbmdlICYmICh0eXBlb2YgX3ZlcnNlID09PSAnc3RyaW5nJykpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmIChfdmVyc2UuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICBhZGRWZXJzZVJhbmdlKGAke3NjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlPy5jaGFwdGVyfToke192ZXJzZX1gKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3JlZmVyZW5jZS52ZXJzZV0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzRXF1YWwodmVyc2VzRm9yUmVmLCBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZikpIHtcbiAgICAgIHNldFN0YXRlKHsgdmVyc2VzRm9yUmVmOiBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZiB9KVxuICAgIH1cbiAgfSwgW3NjcmlwdHVyZUNvbmZpZz8udmVyc2VzRm9yUmVmXSlcblxuICBjb25zdCByZW5kZXJlZFNjcmlwdHVyZVBhbmVzID0gdmVyc2VzRm9yUmVmPy5tYXAoKF9jdXJyZW50VmVyc2VEYXRhLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxWZXJzZU9iamVjdHMgPSBfY3VycmVudFZlcnNlRGF0YT8udmVyc2VEYXRhPy52ZXJzZU9iamVjdHMgfHwgbnVsbFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IGNoYXB0ZXIsIHZlcnNlIH0gPSBfY3VycmVudFZlcnNlRGF0YSB8fCB7fVxuICAgIGNvbnN0IF9yZWZlcmVuY2UgPSB7XG4gICAgICAuLi5yZWZlcmVuY2UsXG4gICAgICBjaGFwdGVyLFxuICAgICAgdmVyc2UsXG4gICAgfVxuICAgIGNvbnN0IF9zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnID0ge1xuICAgICAgLi4uc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyxcbiAgICAgIGN1cnJlbnRJbmRleDogaW5kZXgsXG4gICAgICBpbml0aWFsVmVyc2VPYmplY3RzLFxuICAgICAgcmVmZXJlbmNlOiBfcmVmZXJlbmNlLFxuICAgIH1cblxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTY3JpcHR1cmVQYW5lXG4gICAgICAgIHsuLi5zY3JpcHR1cmVDb25maWd9XG4gICAgICAgIGNvbnRlbnRTdHlsZT17Y29udGVudFN0eWxlfVxuICAgICAgICBjdXJyZW50SW5kZXg9e2luZGV4fVxuICAgICAgICBkaXJlY3Rpb249e2RpcmVjdGlvbn1cbiAgICAgICAgZGlzYWJsZVdvcmRQb3BvdmVyPXtkaXNhYmxlV29yZFBvcG92ZXJffVxuICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgIGdldExleGljb25EYXRhPXtnZXRMZXhpY29uRGF0YX1cbiAgICAgICAgaXNOVD17aXNOVF99XG4gICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgIHJlZlN0eWxlPXtyZWZTdHlsZX1cbiAgICAgICAgcmVmZXJlbmNlPXtfcmVmZXJlbmNlfVxuICAgICAgICBzYXZpbmc9e3N0YXJ0U2F2ZX1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnPXtfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZ31cbiAgICAgICAgc2V0V29yZEFsaWduZXJTdGF0dXM9e3NldFdvcmRBbGlnbmVyU3RhdHVzfVxuICAgICAgICBzZXJ2ZXI9e3NlcnZlcn1cbiAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAvPlxuICAgIClcbiAgfSlcblxuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBpZD17YHNjcmlwdHVyZV9jYXJkXyR7Y2FyZE51bX1gfVxuICAgICAgdGl0bGU9e3NjcmlwdHVyZUxhYmVsfVxuICAgICAgc2V0dGluZ3NUaXRsZT17c2NyaXB0dXJlVGl0bGUgKyAnIFNldHRpbmdzJ31cbiAgICAgIGl0ZW1zPXtpdGVtc31cbiAgICAgIGNsYXNzZXM9e2NsYXNzZXN9XG4gICAgICBoZWFkZXJzPXtoZWFkZXJzfVxuICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgIGl0ZW1JbmRleD17aXRlbUluZGV4fVxuICAgICAgc2V0RmlsdGVycz17c2V0RmlsdGVyc31cbiAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cbiAgICAgIHNldEl0ZW1JbmRleD17c2V0SXRlbUluZGV4fVxuICAgICAgbWFya2Rvd25WaWV3PXttYXJrZG93blZpZXd9XG4gICAgICBzZXRNYXJrZG93blZpZXc9e3NldE1hcmtkb3duVmlld31cbiAgICAgIGdldEN1c3RvbUNvbXBvbmVudD17Z2V0U2NyaXB0dXJlU2VsZWN0b3J9XG4gICAgICBoaWRlTWFya2Rvd25Ub2dnbGVcbiAgICAgIG9uTWVudUNsb3NlPXtvbk1lbnVDbG9zZX1cbiAgICAgIG9uTWluaW1pemU9e29uTWluaW1pemUgPyAoKSA9PiBvbk1pbmltaXplKGlkKSA6IG51bGx9XG4gICAgICBlZGl0YWJsZT17ZW5hYmxlRWRpdCB8fCBlbmFibGVBbGlnbm1lbnR9XG4gICAgICBzYXZlZD17c3RhcnRTYXZlIHx8ICFoYXZlVW5zYXZlZENoYW5nZXN9XG4gICAgICBvblNhdmVFZGl0PXtzYXZlQ2hhbmdlc1RvQ2xvdWR9XG4gICAgPlxuICAgICAgPGRpdiBpZD1cInNjcmlwdHVyZS1wYW5lLWxpc3RcIj5cbiAgICAgICAge3JlbmRlcmVkU2NyaXB0dXJlUGFuZXN9XG4gICAgICA8L2Rpdj5cbiAgICA8L0NhcmQ+XG4gIClcbn1cblxuU2NyaXB0dXJlQ2FyZC5wcm9wVHlwZXMgPSB7XG4gIC8qKiBodG1sIGlkZW50aWZpZXIgdG8gdXNlIGZvciBjYXJkICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogbWV0aG9kIHRvIGRldGVybWluZSBpZiBOVCBvciBPVCAqL1xuICBpc05UOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogdGl0bGUgZm9yIHNjcmlwdHVyZSBjYXJkICovXG4gIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBnZXQgbGFuZ3VhZ2UgZGV0YWlscyAqL1xuICBnZXRMYW5ndWFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIHNjcmlwdHVyZSBjYXJkIG51bWJlciAoMCB0byAyIGZvciBleGFtcGxlKSAqL1xuICBjYXJkTnVtOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIC8qKiByZXNvdXJjZSBvYmplY3QgKi9cbiAgcmVzb3VyY2U6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgLyoqIHJlc291cmNlIGxhbmd1YWdlIHRvIHVzZSAqL1xuICAgIGxhbmd1YWdlSWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVwbyBvd25lciBzdWNoIGFzIHVuZm9sZGluZ1dvcmQgKi9cbiAgICBvd25lcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiByZXNvdXJjZUlkIHRvIHVzZSAoZS5nLiB1Z250KSAqL1xuICAgIHJlc291cmNlSWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVwbyBvd25lciBmb3Igb3JpZ2luYWwgbGFuZ3VhZ2VzIHN1Y2ggYXMgdW5mb2xkaW5nV29yZCAqL1xuICAgIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICB9KSxcbiAgcmVmZXJlbmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiBwcm9qZWN0SWQgKGJvb2tJRCkgdG8gdXNlICovXG4gICAgcHJvamVjdElkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIGN1cnJlbnQgY2hhcHRlciBudW1iZXIgKi9cbiAgICBjaGFwdGVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSkuaXNSZXF1aXJlZCxcbiAgICAvKiogY3VycmVudCB2ZXJzZSBudW1iZXIgKi9cbiAgICB2ZXJzZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWQsXG4gIH0pLFxuICAvKiogc2VydmVyIChlLmcuICdodHRwczovL2dpdC5kb29yNDMub3JnJykgKi9cbiAgc2VydmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiByZXBvIGJyYW5jaCBvciB0YWcgc3VjaCBhcyBtYXN0ZXIgKi9cbiAgYXBwUmVmOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBpZiB0cnVlIHRoZW4gd29yZCBkYXRhIGhvdmVyIGlzIHNob3duICovXG4gIGRpc2FibGVXb3JkUG9wb3ZlcjogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKiBDU1MgY2xhc3NlcyAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogcmVzb3VyY2VMaW5rICovXG4gIHJlc291cmNlTGluazogUHJvcFR5cGVzLmFueSxcbiAgLyoqIHVzZSBtZXRob2QgZm9yIHVzaW5nIGxvY2FsIHN0b3JhZ2Ugc3BlY2lmaWMgZm9yIHVzZXIgKi9cbiAgdXNlVXNlckxvY2FsU3RvcmFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIG9wdGlvbmFsIGNhbGxiYWNrIGlmIGVycm9yIGxvYWRpbmcgcmVzb3VyY2UsIHBhcmFtZXRlciByZXR1cm5lZCBhcmU6XG4gICAqICAgICh7c3RyaW5nfSBlcnJvck1lc3NhZ2UsIHtib29sZWFufSBpc0FjY2Vzc0Vycm9yLCB7b2JqZWN0fSByZXNvdXJjZVN0YXR1cylcbiAgICogICAgICAtIGlzQWNjZXNzRXJyb3IgLSBpcyB0cnVlIGlmIHRoaXMgd2FzIGFuIGVycm9yIHRyeWluZyB0byBhY2Nlc3MgZmlsZVxuICAgKiAgICAgIC0gcmVzb3VyY2VTdGF0dXMgLSBpcyBvYmplY3QgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHByb2JsZW1zIGZldGNoaW5nIHJlc291cmNlICovXG4gIG9uUmVzb3VyY2VFcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBvcHRpb25hbCBodHRwIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBmZXRjaGluZyByZXNvdXJjZXMsIGRlZmF1bHQgaXMgMCAodmVyeSBsb25nIHdhaXQpICovXG4gIGh0dHBDb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKiBvcHRpb25hbCB1cmwgZm9yIGdyZWVrIHJlcG8gKi9cbiAgZ3JlZWtSZXBvVXJsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogb3B0aW9uYWwgdXJsIGZvciBoZWJyZXcgcmVwbyAqL1xuICBoZWJyZXdSZXBvVXJsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogZnVuY3Rpb24gdG8gZ2V0IGxhdGVzdCBsZXhpY29uIGRhdGEgKi9cbiAgZ2V0TGV4aWNvbkRhdGE6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogZnVuY3Rpb24gdG8gcHJlLWxvYWQgbGV4aWNvbiBkYXRhIGZvciB2ZXJzZSAqL1xuICBmZXRjaEdsb3NzZXNGb3JWZXJzZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBvcHRpb25hbCBmdW5jdGlvbiBmb3IgbG9jYWxpemF0aW9uICovXG4gIHRyYW5zbGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBmdW5jdGlvbiB0byBtaW5pbWl6ZSB0aGUgY2FyZCAob3B0aW9uYWwpICovXG4gIG9uTWluaW1pemU6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogdXNlci1uYW1lICovXG4gIGxvZ2dlZEluVXNlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIGF1dGhlbnRpY2F0aW9uIGluZm8gKi9cbiAgYXV0aGVudGljYXRpb246IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKiBmdW5jdGlvbiB0byBzZXQgc3RhdGUgaW4gYXBwIHRoYXQgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyAqL1xuICBzZXRTYXZlZENoYW5nZXM6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogaW5kZXggZm9yIGN1cnJlbnQgYm9vayAoZS5nLiAnMDEnIGZvciAnZ2VuJykqL1xuICBib29rSW5kZXg6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSB1c2luZyBhIHZlcnNlIHJhbmdlIGhlcmUgKi9cbiAgYWRkVmVyc2VSYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBjYWxsYmFjayB0byB1cGRhdGUgd29yZCBhbGlnbmVyIHN0YXRlICovXG4gIHNldFdvcmRBbGlnbmVyU3RhdHVzOiBQcm9wVHlwZXMuZnVuYyxcbn1cbiJdfQ==