@microsoft/ocsdk 0.5.19 → 0.5.21-main.cc89d16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SDK.js +347 -214
- package/dist/SDK.min.js +2 -2
- package/package.json +2 -2
package/dist/SDK.js
CHANGED
|
@@ -493,7 +493,9 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
493
493
|
const knownAdapters = {
|
|
494
494
|
http: _http_js__WEBPACK_IMPORTED_MODULE_1__["default"],
|
|
495
495
|
xhr: _xhr_js__WEBPACK_IMPORTED_MODULE_2__["default"],
|
|
496
|
-
fetch:
|
|
496
|
+
fetch: {
|
|
497
|
+
get: _fetch_js__WEBPACK_IMPORTED_MODULE_3__["getFetch"],
|
|
498
|
+
}
|
|
497
499
|
}
|
|
498
500
|
|
|
499
501
|
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].forEach(knownAdapters, (fn, value) => {
|
|
@@ -512,7 +514,7 @@ const renderReason = (reason) => `- ${reason}`;
|
|
|
512
514
|
const isResolvedHandle = (adapter) => _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isFunction(adapter) || adapter === null || adapter === false;
|
|
513
515
|
|
|
514
516
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
515
|
-
getAdapter: (adapters) => {
|
|
517
|
+
getAdapter: (adapters, config) => {
|
|
516
518
|
adapters = _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isArray(adapters) ? adapters : [adapters];
|
|
517
519
|
|
|
518
520
|
const {length} = adapters;
|
|
@@ -535,7 +537,7 @@ const isResolvedHandle = (adapter) => _utils_js__WEBPACK_IMPORTED_MODULE_0__["de
|
|
|
535
537
|
}
|
|
536
538
|
}
|
|
537
539
|
|
|
538
|
-
if (adapter) {
|
|
540
|
+
if (adapter && (_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isFunction(adapter) || (adapter = adapter.get(config)))) {
|
|
539
541
|
break;
|
|
540
542
|
}
|
|
541
543
|
|
|
@@ -571,11 +573,12 @@ const isResolvedHandle = (adapter) => _utils_js__WEBPACK_IMPORTED_MODULE_0__["de
|
|
|
571
573
|
/*!**************************************************!*\
|
|
572
574
|
!*** ./node_modules/axios/lib/adapters/fetch.js ***!
|
|
573
575
|
\**************************************************/
|
|
574
|
-
/*! exports provided: default */
|
|
576
|
+
/*! exports provided: getFetch, default */
|
|
575
577
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
576
578
|
|
|
577
579
|
"use strict";
|
|
578
580
|
__webpack_require__.r(__webpack_exports__);
|
|
581
|
+
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFetch", function() { return getFetch; });
|
|
579
582
|
/* harmony import */ var _platform_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../platform/index.js */ "./node_modules/axios/lib/platform/index.js");
|
|
580
583
|
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ "./node_modules/axios/lib/utils.js");
|
|
581
584
|
/* harmony import */ var _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/AxiosError.js */ "./node_modules/axios/lib/core/AxiosError.js");
|
|
@@ -595,14 +598,18 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
595
598
|
|
|
596
599
|
|
|
597
600
|
|
|
598
|
-
const
|
|
599
|
-
|
|
601
|
+
const DEFAULT_CHUNK_SIZE = 64 * 1024;
|
|
602
|
+
|
|
603
|
+
const {isFunction} = _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"];
|
|
604
|
+
|
|
605
|
+
const globalFetchAPI = (({Request, Response}) => ({
|
|
606
|
+
Request, Response
|
|
607
|
+
}))(_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].global);
|
|
608
|
+
|
|
609
|
+
const {
|
|
610
|
+
ReadableStream, TextEncoder
|
|
611
|
+
} = _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].global;
|
|
600
612
|
|
|
601
|
-
// used only inside the fetch adapter
|
|
602
|
-
const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?
|
|
603
|
-
((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :
|
|
604
|
-
async (str) => new Uint8Array(await new Response(str).arrayBuffer())
|
|
605
|
-
);
|
|
606
613
|
|
|
607
614
|
const test = (fn, ...args) => {
|
|
608
615
|
try {
|
|
@@ -612,208 +619,263 @@ const test = (fn, ...args) => {
|
|
|
612
619
|
}
|
|
613
620
|
}
|
|
614
621
|
|
|
615
|
-
const
|
|
616
|
-
|
|
622
|
+
const factory = (env) => {
|
|
623
|
+
env = _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].merge.call({
|
|
624
|
+
skipUndefined: true
|
|
625
|
+
}, globalFetchAPI, env);
|
|
617
626
|
|
|
618
|
-
const
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
duplexAccessed = true;
|
|
623
|
-
return 'half';
|
|
624
|
-
},
|
|
625
|
-
}).headers.has('Content-Type');
|
|
627
|
+
const {fetch: envFetch, Request, Response} = env;
|
|
628
|
+
const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';
|
|
629
|
+
const isRequestSupported = isFunction(Request);
|
|
630
|
+
const isResponseSupported = isFunction(Response);
|
|
626
631
|
|
|
627
|
-
|
|
628
|
-
|
|
632
|
+
if (!isFetchSupported) {
|
|
633
|
+
return false;
|
|
634
|
+
}
|
|
629
635
|
|
|
630
|
-
const
|
|
636
|
+
const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);
|
|
631
637
|
|
|
632
|
-
const
|
|
633
|
-
|
|
638
|
+
const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?
|
|
639
|
+
((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :
|
|
640
|
+
async (str) => new Uint8Array(await new Request(str).arrayBuffer())
|
|
641
|
+
);
|
|
634
642
|
|
|
643
|
+
const supportsRequestStream = isRequestSupported && isReadableStreamSupported && test(() => {
|
|
644
|
+
let duplexAccessed = false;
|
|
635
645
|
|
|
636
|
-
const
|
|
637
|
-
|
|
638
|
-
|
|
646
|
+
const hasContentType = new Request(_platform_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].origin, {
|
|
647
|
+
body: new ReadableStream(),
|
|
648
|
+
method: 'POST',
|
|
649
|
+
get duplex() {
|
|
650
|
+
duplexAccessed = true;
|
|
651
|
+
return 'half';
|
|
652
|
+
},
|
|
653
|
+
}).headers.has('Content-Type');
|
|
639
654
|
|
|
640
|
-
|
|
641
|
-
['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {
|
|
642
|
-
!resolvers[type] && (resolvers[type] = _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isFunction(res[type]) ? (res) => res[type]() :
|
|
643
|
-
(_, config) => {
|
|
644
|
-
throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__["default"](`Response type '${type}' is not supported`, _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__["default"].ERR_NOT_SUPPORT, config);
|
|
645
|
-
})
|
|
655
|
+
return duplexAccessed && !hasContentType;
|
|
646
656
|
});
|
|
647
|
-
})(new Response));
|
|
648
657
|
|
|
649
|
-
const
|
|
650
|
-
|
|
651
|
-
return 0;
|
|
652
|
-
}
|
|
658
|
+
const supportsResponseStream = isResponseSupported && isReadableStreamSupported &&
|
|
659
|
+
test(() => _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isReadableStream(new Response('').body));
|
|
653
660
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
}
|
|
661
|
+
const resolvers = {
|
|
662
|
+
stream: supportsResponseStream && ((res) => res.body)
|
|
663
|
+
};
|
|
657
664
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
665
|
+
isFetchSupported && ((() => {
|
|
666
|
+
['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {
|
|
667
|
+
!resolvers[type] && (resolvers[type] = (res, config) => {
|
|
668
|
+
let method = res && res[type];
|
|
669
|
+
|
|
670
|
+
if (method) {
|
|
671
|
+
return method.call(res);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__["default"](`Response type '${type}' is not supported`, _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__["default"].ERR_NOT_SUPPORT, config);
|
|
675
|
+
})
|
|
662
676
|
});
|
|
663
|
-
|
|
664
|
-
}
|
|
677
|
+
})());
|
|
665
678
|
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
679
|
+
const getBodyLength = async (body) => {
|
|
680
|
+
if (body == null) {
|
|
681
|
+
return 0;
|
|
682
|
+
}
|
|
669
683
|
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
684
|
+
if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isBlob(body)) {
|
|
685
|
+
return body.size;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isSpecCompliantForm(body)) {
|
|
689
|
+
const _request = new Request(_platform_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].origin, {
|
|
690
|
+
method: 'POST',
|
|
691
|
+
body,
|
|
692
|
+
});
|
|
693
|
+
return (await _request.arrayBuffer()).byteLength;
|
|
694
|
+
}
|
|
673
695
|
|
|
674
|
-
|
|
675
|
-
|
|
696
|
+
if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isArrayBufferView(body) || _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isArrayBuffer(body)) {
|
|
697
|
+
return body.byteLength;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isURLSearchParams(body)) {
|
|
701
|
+
body = body + '';
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isString(body)) {
|
|
705
|
+
return (await encodeText(body)).byteLength;
|
|
706
|
+
}
|
|
676
707
|
}
|
|
677
|
-
}
|
|
678
708
|
|
|
679
|
-
const resolveBodyLength = async (headers, body) => {
|
|
680
|
-
|
|
709
|
+
const resolveBodyLength = async (headers, body) => {
|
|
710
|
+
const length = _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].toFiniteNumber(headers.getContentLength());
|
|
681
711
|
|
|
682
|
-
|
|
683
|
-
}
|
|
712
|
+
return length == null ? getBodyLength(body) : length;
|
|
713
|
+
}
|
|
684
714
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
715
|
+
return async (config) => {
|
|
716
|
+
let {
|
|
717
|
+
url,
|
|
718
|
+
method,
|
|
719
|
+
data,
|
|
720
|
+
signal,
|
|
721
|
+
cancelToken,
|
|
722
|
+
timeout,
|
|
723
|
+
onDownloadProgress,
|
|
724
|
+
onUploadProgress,
|
|
725
|
+
responseType,
|
|
726
|
+
headers,
|
|
727
|
+
withCredentials = 'same-origin',
|
|
728
|
+
fetchOptions
|
|
729
|
+
} = Object(_helpers_resolveConfig_js__WEBPACK_IMPORTED_MODULE_7__["default"])(config);
|
|
700
730
|
|
|
701
|
-
|
|
731
|
+
let _fetch = envFetch || fetch;
|
|
702
732
|
|
|
703
|
-
|
|
733
|
+
responseType = responseType ? (responseType + '').toLowerCase() : 'text';
|
|
704
734
|
|
|
705
|
-
|
|
735
|
+
let composedSignal = Object(_helpers_composeSignals_js__WEBPACK_IMPORTED_MODULE_3__["default"])([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
|
|
706
736
|
|
|
707
|
-
|
|
737
|
+
let request = null;
|
|
738
|
+
|
|
739
|
+
const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
|
|
708
740
|
composedSignal.unsubscribe();
|
|
709
|
-
|
|
741
|
+
});
|
|
710
742
|
|
|
711
|
-
|
|
743
|
+
let requestContentLength;
|
|
712
744
|
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
745
|
+
try {
|
|
746
|
+
if (
|
|
747
|
+
onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&
|
|
748
|
+
(requestContentLength = await resolveBodyLength(headers, data)) !== 0
|
|
749
|
+
) {
|
|
750
|
+
let _request = new Request(url, {
|
|
751
|
+
method: 'POST',
|
|
752
|
+
body: data,
|
|
753
|
+
duplex: "half"
|
|
754
|
+
});
|
|
723
755
|
|
|
724
|
-
|
|
756
|
+
let contentTypeHeader;
|
|
725
757
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
758
|
+
if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
|
|
759
|
+
headers.setContentType(contentTypeHeader)
|
|
760
|
+
}
|
|
729
761
|
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
762
|
+
if (_request.body) {
|
|
763
|
+
const [onProgress, flush] = Object(_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["progressEventDecorator"])(
|
|
764
|
+
requestContentLength,
|
|
765
|
+
Object(_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["progressEventReducer"])(Object(_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["asyncDecorator"])(onUploadProgress))
|
|
766
|
+
);
|
|
735
767
|
|
|
736
|
-
|
|
768
|
+
data = Object(_helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_4__["trackStream"])(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
|
|
769
|
+
}
|
|
737
770
|
}
|
|
738
|
-
}
|
|
739
771
|
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
772
|
+
if (!_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isString(withCredentials)) {
|
|
773
|
+
withCredentials = withCredentials ? 'include' : 'omit';
|
|
774
|
+
}
|
|
743
775
|
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
request = new Request(url, {
|
|
748
|
-
...fetchOptions,
|
|
749
|
-
signal: composedSignal,
|
|
750
|
-
method: method.toUpperCase(),
|
|
751
|
-
headers: headers.normalize().toJSON(),
|
|
752
|
-
body: data,
|
|
753
|
-
duplex: "half",
|
|
754
|
-
credentials: isCredentialsSupported ? withCredentials : undefined
|
|
755
|
-
});
|
|
776
|
+
// Cloudflare Workers throws when credentials are defined
|
|
777
|
+
// see https://github.com/cloudflare/workerd/issues/902
|
|
778
|
+
const isCredentialsSupported = isRequestSupported && "credentials" in Request.prototype;
|
|
756
779
|
|
|
757
|
-
|
|
780
|
+
const resolvedOptions = {
|
|
781
|
+
...fetchOptions,
|
|
782
|
+
signal: composedSignal,
|
|
783
|
+
method: method.toUpperCase(),
|
|
784
|
+
headers: headers.normalize().toJSON(),
|
|
785
|
+
body: data,
|
|
786
|
+
duplex: "half",
|
|
787
|
+
credentials: isCredentialsSupported ? withCredentials : undefined
|
|
788
|
+
};
|
|
758
789
|
|
|
759
|
-
|
|
790
|
+
request = isRequestSupported && new Request(url, resolvedOptions);
|
|
760
791
|
|
|
761
|
-
|
|
762
|
-
const options = {};
|
|
792
|
+
let response = await (isRequestSupported ? _fetch(request, fetchOptions) : _fetch(url, resolvedOptions));
|
|
763
793
|
|
|
764
|
-
|
|
765
|
-
options[prop] = response[prop];
|
|
766
|
-
});
|
|
794
|
+
const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');
|
|
767
795
|
|
|
768
|
-
|
|
796
|
+
if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
|
|
797
|
+
const options = {};
|
|
769
798
|
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
) || [];
|
|
799
|
+
['status', 'statusText', 'headers'].forEach(prop => {
|
|
800
|
+
options[prop] = response[prop];
|
|
801
|
+
});
|
|
774
802
|
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
803
|
+
const responseContentLength = _utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].toFiniteNumber(response.headers.get('content-length'));
|
|
804
|
+
|
|
805
|
+
const [onProgress, flush] = onDownloadProgress && Object(_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["progressEventDecorator"])(
|
|
806
|
+
responseContentLength,
|
|
807
|
+
Object(_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["progressEventReducer"])(Object(_helpers_progressEventReducer_js__WEBPACK_IMPORTED_MODULE_6__["asyncDecorator"])(onDownloadProgress), true)
|
|
808
|
+
) || [];
|
|
809
|
+
|
|
810
|
+
response = new Response(
|
|
811
|
+
Object(_helpers_trackStream_js__WEBPACK_IMPORTED_MODULE_4__["trackStream"])(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
|
|
812
|
+
flush && flush();
|
|
813
|
+
unsubscribe && unsubscribe();
|
|
814
|
+
}),
|
|
815
|
+
options
|
|
816
|
+
);
|
|
817
|
+
}
|
|
783
818
|
|
|
784
|
-
|
|
819
|
+
responseType = responseType || 'text';
|
|
785
820
|
|
|
786
|
-
|
|
821
|
+
let responseData = await resolvers[_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].findKey(resolvers, responseType) || 'text'](response, config);
|
|
787
822
|
|
|
788
|
-
|
|
823
|
+
!isStreamResponse && unsubscribe && unsubscribe();
|
|
789
824
|
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
825
|
+
return await new Promise((resolve, reject) => {
|
|
826
|
+
Object(_core_settle_js__WEBPACK_IMPORTED_MODULE_8__["default"])(resolve, reject, {
|
|
827
|
+
data: responseData,
|
|
828
|
+
headers: _core_AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_5__["default"].from(response.headers),
|
|
829
|
+
status: response.status,
|
|
830
|
+
statusText: response.statusText,
|
|
831
|
+
config,
|
|
832
|
+
request
|
|
833
|
+
})
|
|
798
834
|
})
|
|
799
|
-
})
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
835
|
+
} catch (err) {
|
|
836
|
+
unsubscribe && unsubscribe();
|
|
837
|
+
|
|
838
|
+
if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {
|
|
839
|
+
throw Object.assign(
|
|
840
|
+
new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__["default"]('Network Error', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__["default"].ERR_NETWORK, config, request),
|
|
841
|
+
{
|
|
842
|
+
cause: err.cause || err
|
|
843
|
+
}
|
|
844
|
+
)
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
throw _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_2__["default"].from(err, err && err.code, config, request);
|
|
810
848
|
}
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
const seedCache = new Map();
|
|
853
|
+
|
|
854
|
+
const getFetch = (config) => {
|
|
855
|
+
let env = config ? config.env : {};
|
|
856
|
+
const {fetch, Request, Response} = env;
|
|
857
|
+
const seeds = [
|
|
858
|
+
Request, Response, fetch
|
|
859
|
+
];
|
|
811
860
|
|
|
812
|
-
|
|
861
|
+
let len = seeds.length, i = len,
|
|
862
|
+
seed, target, map = seedCache;
|
|
863
|
+
|
|
864
|
+
while (i--) {
|
|
865
|
+
seed = seeds[i];
|
|
866
|
+
target = map.get(seed);
|
|
867
|
+
|
|
868
|
+
target === undefined && map.set(seed, target = (i ? new Map() : factory(env)))
|
|
869
|
+
|
|
870
|
+
map = target;
|
|
813
871
|
}
|
|
814
|
-
}));
|
|
815
872
|
|
|
873
|
+
return target;
|
|
874
|
+
};
|
|
816
875
|
|
|
876
|
+
const adapter = getFetch();
|
|
877
|
+
|
|
878
|
+
/* harmony default export */ __webpack_exports__["default"] = (adapter);
|
|
817
879
|
|
|
818
880
|
|
|
819
881
|
/***/ }),
|
|
@@ -943,15 +1005,18 @@ const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
|
|
|
943
1005
|
};
|
|
944
1006
|
|
|
945
1007
|
// Handle low level network errors
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
1008
|
+
request.onerror = function handleError(event) {
|
|
1009
|
+
// Browsers deliver a ProgressEvent in XHR onerror
|
|
1010
|
+
// (message may be empty; when present, surface it)
|
|
1011
|
+
// See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event
|
|
1012
|
+
const msg = event && event.message ? event.message : 'Network Error';
|
|
1013
|
+
const err = new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"](msg, _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_3__["default"].ERR_NETWORK, config, request);
|
|
1014
|
+
// attach the underlying event for consumers who want details
|
|
1015
|
+
err.event = event || null;
|
|
1016
|
+
reject(err);
|
|
1017
|
+
request = null;
|
|
953
1018
|
};
|
|
954
|
-
|
|
1019
|
+
|
|
955
1020
|
// Handle timeout
|
|
956
1021
|
request.ontimeout = function handleTimeout() {
|
|
957
1022
|
let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';
|
|
@@ -1404,7 +1469,7 @@ const validators = _helpers_validator_js__WEBPACK_IMPORTED_MODULE_6__["default"]
|
|
|
1404
1469
|
*/
|
|
1405
1470
|
class Axios {
|
|
1406
1471
|
constructor(instanceConfig) {
|
|
1407
|
-
this.defaults = instanceConfig;
|
|
1472
|
+
this.defaults = instanceConfig || {};
|
|
1408
1473
|
this.interceptors = {
|
|
1409
1474
|
request: new _InterceptorManager_js__WEBPACK_IMPORTED_MODULE_2__["default"](),
|
|
1410
1475
|
response: new _InterceptorManager_js__WEBPACK_IMPORTED_MODULE_2__["default"]()
|
|
@@ -1537,8 +1602,8 @@ class Axios {
|
|
|
1537
1602
|
|
|
1538
1603
|
if (!synchronousRequestInterceptors) {
|
|
1539
1604
|
const chain = [_dispatchRequest_js__WEBPACK_IMPORTED_MODULE_3__["default"].bind(this), undefined];
|
|
1540
|
-
chain.unshift
|
|
1541
|
-
chain.push
|
|
1605
|
+
chain.unshift(...requestInterceptorChain);
|
|
1606
|
+
chain.push(...responseInterceptorChain);
|
|
1542
1607
|
len = chain.length;
|
|
1543
1608
|
|
|
1544
1609
|
promise = Promise.resolve(config);
|
|
@@ -1554,8 +1619,6 @@ class Axios {
|
|
|
1554
1619
|
|
|
1555
1620
|
let newConfig = config;
|
|
1556
1621
|
|
|
1557
|
-
i = 0;
|
|
1558
|
-
|
|
1559
1622
|
while (i < len) {
|
|
1560
1623
|
const onFulfilled = requestInterceptorChain[i++];
|
|
1561
1624
|
const onRejected = requestInterceptorChain[i++];
|
|
@@ -1729,11 +1792,18 @@ AxiosError.from = (error, code, config, request, response, customProps) => {
|
|
|
1729
1792
|
return prop !== 'isAxiosError';
|
|
1730
1793
|
});
|
|
1731
1794
|
|
|
1732
|
-
|
|
1795
|
+
const msg = error && error.message ? error.message : 'Error';
|
|
1733
1796
|
|
|
1734
|
-
|
|
1797
|
+
// Prefer explicit code; otherwise copy the low-level error's code (e.g. ECONNREFUSED)
|
|
1798
|
+
const errCode = code == null && error ? error.code : code;
|
|
1799
|
+
AxiosError.call(axiosError, msg, errCode, config, request, response);
|
|
1800
|
+
|
|
1801
|
+
// Chain the original error on the standard field; non-enumerable to avoid JSON noise
|
|
1802
|
+
if (error && axiosError.cause == null) {
|
|
1803
|
+
Object.defineProperty(axiosError, 'cause', { value: error, configurable: true });
|
|
1804
|
+
}
|
|
1735
1805
|
|
|
1736
|
-
axiosError.name = error.name;
|
|
1806
|
+
axiosError.name = (error && error.name) || 'Error';
|
|
1737
1807
|
|
|
1738
1808
|
customProps && Object.assign(axiosError, customProps);
|
|
1739
1809
|
|
|
@@ -1858,10 +1928,18 @@ class AxiosHeaders {
|
|
|
1858
1928
|
setHeaders(header, valueOrRewrite)
|
|
1859
1929
|
} else if(_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
|
|
1860
1930
|
setHeaders(Object(_helpers_parseHeaders_js__WEBPACK_IMPORTED_MODULE_1__["default"])(header), valueOrRewrite);
|
|
1861
|
-
} else if (_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].
|
|
1862
|
-
|
|
1863
|
-
|
|
1931
|
+
} else if (_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isObject(header) && _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isIterable(header)) {
|
|
1932
|
+
let obj = {}, dest, key;
|
|
1933
|
+
for (const entry of header) {
|
|
1934
|
+
if (!_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isArray(entry)) {
|
|
1935
|
+
throw TypeError('Object iterator must return a key-value pair');
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
obj[key = entry[0]] = (dest = obj[key]) ?
|
|
1939
|
+
(_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];
|
|
1864
1940
|
}
|
|
1941
|
+
|
|
1942
|
+
setHeaders(obj, valueOrRewrite)
|
|
1865
1943
|
} else {
|
|
1866
1944
|
header != null && setHeader(valueOrRewrite, header, rewrite);
|
|
1867
1945
|
}
|
|
@@ -2003,6 +2081,10 @@ class AxiosHeaders {
|
|
|
2003
2081
|
return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n');
|
|
2004
2082
|
}
|
|
2005
2083
|
|
|
2084
|
+
getSetCookie() {
|
|
2085
|
+
return this.get("set-cookie") || [];
|
|
2086
|
+
}
|
|
2087
|
+
|
|
2006
2088
|
get [Symbol.toStringTag]() {
|
|
2007
2089
|
return 'AxiosHeaders';
|
|
2008
2090
|
}
|
|
@@ -2176,7 +2258,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2176
2258
|
*/
|
|
2177
2259
|
function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
|
|
2178
2260
|
let isRelativeUrl = !Object(_helpers_isAbsoluteURL_js__WEBPACK_IMPORTED_MODULE_0__["default"])(requestedURL);
|
|
2179
|
-
if (baseURL && isRelativeUrl || allowAbsoluteUrls == false) {
|
|
2261
|
+
if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {
|
|
2180
2262
|
return Object(_helpers_combineURLs_js__WEBPACK_IMPORTED_MODULE_1__["default"])(baseURL, requestedURL);
|
|
2181
2263
|
}
|
|
2182
2264
|
return requestedURL;
|
|
@@ -2249,7 +2331,7 @@ function dispatchRequest(config) {
|
|
|
2249
2331
|
config.headers.setContentType('application/x-www-form-urlencoded', false);
|
|
2250
2332
|
}
|
|
2251
2333
|
|
|
2252
|
-
const adapter = _adapters_adapters_js__WEBPACK_IMPORTED_MODULE_5__["default"].getAdapter(config.adapter || _defaults_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].adapter);
|
|
2334
|
+
const adapter = _adapters_adapters_js__WEBPACK_IMPORTED_MODULE_5__["default"].getAdapter(config.adapter || _defaults_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].adapter, config);
|
|
2253
2335
|
|
|
2254
2336
|
return adapter(config).then(function onAdapterResolution(response) {
|
|
2255
2337
|
throwIfCancellationRequested(config);
|
|
@@ -2396,7 +2478,7 @@ function mergeConfig(config1, config2) {
|
|
|
2396
2478
|
headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)
|
|
2397
2479
|
};
|
|
2398
2480
|
|
|
2399
|
-
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].forEach(Object.keys(
|
|
2481
|
+
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].forEach(Object.keys({...config1, ...config2}), function computeConfigValue(prop) {
|
|
2400
2482
|
const merge = mergeMap[prop] || mergeDeepProperties;
|
|
2401
2483
|
const configValue = merge(config1[prop], config2[prop], prop);
|
|
2402
2484
|
(_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
|
|
@@ -2624,7 +2706,7 @@ const defaults = {
|
|
|
2624
2706
|
const strictJSONParsing = !silentJSONParsing && JSONRequested;
|
|
2625
2707
|
|
|
2626
2708
|
try {
|
|
2627
|
-
return JSON.parse(data);
|
|
2709
|
+
return JSON.parse(data, this.parseReviver);
|
|
2628
2710
|
} catch (e) {
|
|
2629
2711
|
if (strictJSONParsing) {
|
|
2630
2712
|
if (e.name === 'SyntaxError') {
|
|
@@ -2706,7 +2788,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2706
2788
|
"use strict";
|
|
2707
2789
|
__webpack_require__.r(__webpack_exports__);
|
|
2708
2790
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERSION", function() { return VERSION; });
|
|
2709
|
-
const VERSION = "1.
|
|
2791
|
+
const VERSION = "1.12.2";
|
|
2710
2792
|
|
|
2711
2793
|
/***/ }),
|
|
2712
2794
|
|
|
@@ -2917,9 +2999,7 @@ function encode(val) {
|
|
|
2917
2999
|
replace(/%3A/gi, ':').
|
|
2918
3000
|
replace(/%24/g, '$').
|
|
2919
3001
|
replace(/%2C/gi, ',').
|
|
2920
|
-
replace(/%20/g, '+')
|
|
2921
|
-
replace(/%5B/gi, '[').
|
|
2922
|
-
replace(/%5D/gi, ']');
|
|
3002
|
+
replace(/%20/g, '+');
|
|
2923
3003
|
}
|
|
2924
3004
|
|
|
2925
3005
|
/**
|
|
@@ -3513,11 +3593,11 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3513
3593
|
/* harmony default export */ __webpack_exports__["default"] = ((config) => {
|
|
3514
3594
|
const newConfig = Object(_core_mergeConfig_js__WEBPACK_IMPORTED_MODULE_5__["default"])({}, config);
|
|
3515
3595
|
|
|
3516
|
-
let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;
|
|
3596
|
+
let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;
|
|
3517
3597
|
|
|
3518
3598
|
newConfig.headers = headers = _core_AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_6__["default"].from(headers);
|
|
3519
3599
|
|
|
3520
|
-
newConfig.url = Object(_buildURL_js__WEBPACK_IMPORTED_MODULE_7__["default"])(Object(_core_buildFullPath_js__WEBPACK_IMPORTED_MODULE_4__["default"])(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);
|
|
3600
|
+
newConfig.url = Object(_buildURL_js__WEBPACK_IMPORTED_MODULE_7__["default"])(Object(_core_buildFullPath_js__WEBPACK_IMPORTED_MODULE_4__["default"])(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);
|
|
3521
3601
|
|
|
3522
3602
|
// HTTP basic authentication
|
|
3523
3603
|
if (auth) {
|
|
@@ -3526,17 +3606,21 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3526
3606
|
);
|
|
3527
3607
|
}
|
|
3528
3608
|
|
|
3529
|
-
let contentType;
|
|
3530
|
-
|
|
3531
3609
|
if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isFormData(data)) {
|
|
3532
3610
|
if (_platform_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].hasStandardBrowserEnv || _platform_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].hasStandardBrowserWebWorkerEnv) {
|
|
3533
|
-
headers.setContentType(undefined); //
|
|
3534
|
-
} else if ((
|
|
3535
|
-
//
|
|
3536
|
-
const
|
|
3537
|
-
headers
|
|
3611
|
+
headers.setContentType(undefined); // browser handles it
|
|
3612
|
+
} else if (_utils_js__WEBPACK_IMPORTED_MODULE_1__["default"].isFunction(data.getHeaders)) {
|
|
3613
|
+
// Node.js FormData (like form-data package)
|
|
3614
|
+
const formHeaders = data.getHeaders();
|
|
3615
|
+
// Only set safe headers to avoid overwriting security headers
|
|
3616
|
+
const allowedHeaders = ['content-type', 'content-length'];
|
|
3617
|
+
Object.entries(formHeaders).forEach(([key, val]) => {
|
|
3618
|
+
if (allowedHeaders.includes(key.toLowerCase())) {
|
|
3619
|
+
headers.set(key, val);
|
|
3620
|
+
}
|
|
3621
|
+
});
|
|
3538
3622
|
}
|
|
3539
|
-
}
|
|
3623
|
+
}
|
|
3540
3624
|
|
|
3541
3625
|
// Add xsrf header
|
|
3542
3626
|
// This is only done if running in a standard browser environment.
|
|
@@ -3700,7 +3784,7 @@ function throttle(fn, freq) {
|
|
|
3700
3784
|
clearTimeout(timer);
|
|
3701
3785
|
timer = null;
|
|
3702
3786
|
}
|
|
3703
|
-
fn
|
|
3787
|
+
fn(...args);
|
|
3704
3788
|
}
|
|
3705
3789
|
|
|
3706
3790
|
const throttled = (...args) => {
|
|
@@ -3863,6 +3947,10 @@ function toFormData(obj, formData, options) {
|
|
|
3863
3947
|
return value.toISOString();
|
|
3864
3948
|
}
|
|
3865
3949
|
|
|
3950
|
+
if (_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isBoolean(value)) {
|
|
3951
|
+
return value.toString();
|
|
3952
|
+
}
|
|
3953
|
+
|
|
3866
3954
|
if (!useBlob && _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isBlob(value)) {
|
|
3867
3955
|
throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__["default"]('Blob is not supported. Use a Buffer instead.');
|
|
3868
3956
|
}
|
|
@@ -3985,7 +4073,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3985
4073
|
|
|
3986
4074
|
|
|
3987
4075
|
function toURLEncodedForm(data, options) {
|
|
3988
|
-
return Object(_toFormData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(data, new _platform_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].classes.URLSearchParams(),
|
|
4076
|
+
return Object(_toFormData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(data, new _platform_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].classes.URLSearchParams(), {
|
|
3989
4077
|
visitor: function(value, key, path, helpers) {
|
|
3990
4078
|
if (_platform_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].isNode && _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].isBuffer(value)) {
|
|
3991
4079
|
this.append(key, value.toString('base64'));
|
|
@@ -3993,8 +4081,9 @@ function toURLEncodedForm(data, options) {
|
|
|
3993
4081
|
}
|
|
3994
4082
|
|
|
3995
4083
|
return helpers.defaultVisitor.apply(this, arguments);
|
|
3996
|
-
}
|
|
3997
|
-
|
|
4084
|
+
},
|
|
4085
|
+
...options
|
|
4086
|
+
});
|
|
3998
4087
|
}
|
|
3999
4088
|
|
|
4000
4089
|
|
|
@@ -4399,6 +4488,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
4399
4488
|
|
|
4400
4489
|
const {toString} = Object.prototype;
|
|
4401
4490
|
const {getPrototypeOf} = Object;
|
|
4491
|
+
const {iterator, toStringTag} = Symbol;
|
|
4402
4492
|
|
|
4403
4493
|
const kindOf = (cache => thing => {
|
|
4404
4494
|
const str = toString.call(thing);
|
|
@@ -4525,7 +4615,28 @@ const isPlainObject = (val) => {
|
|
|
4525
4615
|
}
|
|
4526
4616
|
|
|
4527
4617
|
const prototype = getPrototypeOf(val);
|
|
4528
|
-
return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(
|
|
4618
|
+
return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);
|
|
4619
|
+
}
|
|
4620
|
+
|
|
4621
|
+
/**
|
|
4622
|
+
* Determine if a value is an empty object (safely handles Buffers)
|
|
4623
|
+
*
|
|
4624
|
+
* @param {*} val The value to test
|
|
4625
|
+
*
|
|
4626
|
+
* @returns {boolean} True if value is an empty object, otherwise false
|
|
4627
|
+
*/
|
|
4628
|
+
const isEmptyObject = (val) => {
|
|
4629
|
+
// Early return for non-objects or Buffers to prevent RangeError
|
|
4630
|
+
if (!isObject(val) || isBuffer(val)) {
|
|
4631
|
+
return false;
|
|
4632
|
+
}
|
|
4633
|
+
|
|
4634
|
+
try {
|
|
4635
|
+
return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;
|
|
4636
|
+
} catch (e) {
|
|
4637
|
+
// Fallback for any other objects that might cause RangeError with Object.keys()
|
|
4638
|
+
return false;
|
|
4639
|
+
}
|
|
4529
4640
|
}
|
|
4530
4641
|
|
|
4531
4642
|
/**
|
|
@@ -4650,6 +4761,11 @@ function forEach(obj, fn, {allOwnKeys = false} = {}) {
|
|
|
4650
4761
|
fn.call(null, obj[i], i, obj);
|
|
4651
4762
|
}
|
|
4652
4763
|
} else {
|
|
4764
|
+
// Buffer check
|
|
4765
|
+
if (isBuffer(obj)) {
|
|
4766
|
+
return;
|
|
4767
|
+
}
|
|
4768
|
+
|
|
4653
4769
|
// Iterate over object keys
|
|
4654
4770
|
const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
|
|
4655
4771
|
const len = keys.length;
|
|
@@ -4663,6 +4779,10 @@ function forEach(obj, fn, {allOwnKeys = false} = {}) {
|
|
|
4663
4779
|
}
|
|
4664
4780
|
|
|
4665
4781
|
function findKey(obj, key) {
|
|
4782
|
+
if (isBuffer(obj)){
|
|
4783
|
+
return null;
|
|
4784
|
+
}
|
|
4785
|
+
|
|
4666
4786
|
key = key.toLowerCase();
|
|
4667
4787
|
const keys = Object.keys(obj);
|
|
4668
4788
|
let i = keys.length;
|
|
@@ -4703,7 +4823,7 @@ const isContextDefined = (context) => !isUndefined(context) && context !== _glob
|
|
|
4703
4823
|
* @returns {Object} Result of all merge properties
|
|
4704
4824
|
*/
|
|
4705
4825
|
function merge(/* obj1, obj2, obj3, ... */) {
|
|
4706
|
-
const {caseless} = isContextDefined(this) && this || {};
|
|
4826
|
+
const {caseless, skipUndefined} = isContextDefined(this) && this || {};
|
|
4707
4827
|
const result = {};
|
|
4708
4828
|
const assignValue = (val, key) => {
|
|
4709
4829
|
const targetKey = caseless && findKey(result, key) || key;
|
|
@@ -4713,7 +4833,7 @@ function merge(/* obj1, obj2, obj3, ... */) {
|
|
|
4713
4833
|
result[targetKey] = merge({}, val);
|
|
4714
4834
|
} else if (isArray(val)) {
|
|
4715
4835
|
result[targetKey] = val.slice();
|
|
4716
|
-
} else {
|
|
4836
|
+
} else if (!skipUndefined || !isUndefined(val)) {
|
|
4717
4837
|
result[targetKey] = val;
|
|
4718
4838
|
}
|
|
4719
4839
|
}
|
|
@@ -4876,13 +4996,13 @@ const isTypedArray = (TypedArray => {
|
|
|
4876
4996
|
* @returns {void}
|
|
4877
4997
|
*/
|
|
4878
4998
|
const forEachEntry = (obj, fn) => {
|
|
4879
|
-
const generator = obj && obj[
|
|
4999
|
+
const generator = obj && obj[iterator];
|
|
4880
5000
|
|
|
4881
|
-
const
|
|
5001
|
+
const _iterator = generator.call(obj);
|
|
4882
5002
|
|
|
4883
5003
|
let result;
|
|
4884
5004
|
|
|
4885
|
-
while ((result =
|
|
5005
|
+
while ((result = _iterator.next()) && !result.done) {
|
|
4886
5006
|
const pair = result.value;
|
|
4887
5007
|
fn.call(obj, pair[0], pair[1]);
|
|
4888
5008
|
}
|
|
@@ -4995,6 +5115,8 @@ const toFiniteNumber = (value, defaultValue) => {
|
|
|
4995
5115
|
return value != null && Number.isFinite(value = +value) ? value : defaultValue;
|
|
4996
5116
|
}
|
|
4997
5117
|
|
|
5118
|
+
|
|
5119
|
+
|
|
4998
5120
|
/**
|
|
4999
5121
|
* If the thing is a FormData object, return true, otherwise return false.
|
|
5000
5122
|
*
|
|
@@ -5003,7 +5125,7 @@ const toFiniteNumber = (value, defaultValue) => {
|
|
|
5003
5125
|
* @returns {boolean}
|
|
5004
5126
|
*/
|
|
5005
5127
|
function isSpecCompliantForm(thing) {
|
|
5006
|
-
return !!(thing && isFunction(thing.append) && thing[
|
|
5128
|
+
return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);
|
|
5007
5129
|
}
|
|
5008
5130
|
|
|
5009
5131
|
const toJSONObject = (obj) => {
|
|
@@ -5016,6 +5138,11 @@ const toJSONObject = (obj) => {
|
|
|
5016
5138
|
return;
|
|
5017
5139
|
}
|
|
5018
5140
|
|
|
5141
|
+
//Buffer check
|
|
5142
|
+
if (isBuffer(source)) {
|
|
5143
|
+
return source;
|
|
5144
|
+
}
|
|
5145
|
+
|
|
5019
5146
|
if(!('toJSON' in source)) {
|
|
5020
5147
|
stack[i] = source;
|
|
5021
5148
|
const target = isArray(source) ? [] : {};
|
|
@@ -5072,6 +5199,10 @@ const asap = typeof queueMicrotask !== 'undefined' ?
|
|
|
5072
5199
|
|
|
5073
5200
|
// *********************
|
|
5074
5201
|
|
|
5202
|
+
|
|
5203
|
+
const isIterable = (thing) => thing != null && isFunction(thing[iterator]);
|
|
5204
|
+
|
|
5205
|
+
|
|
5075
5206
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
5076
5207
|
isArray,
|
|
5077
5208
|
isArrayBuffer,
|
|
@@ -5083,6 +5214,7 @@ const asap = typeof queueMicrotask !== 'undefined' ?
|
|
|
5083
5214
|
isBoolean,
|
|
5084
5215
|
isObject,
|
|
5085
5216
|
isPlainObject,
|
|
5217
|
+
isEmptyObject,
|
|
5086
5218
|
isReadableStream,
|
|
5087
5219
|
isRequest,
|
|
5088
5220
|
isResponse,
|
|
@@ -5127,7 +5259,8 @@ const asap = typeof queueMicrotask !== 'undefined' ?
|
|
|
5127
5259
|
isAsyncFn,
|
|
5128
5260
|
isThenable,
|
|
5129
5261
|
setImmediate: _setImmediate,
|
|
5130
|
-
asap
|
|
5262
|
+
asap,
|
|
5263
|
+
isIterable
|
|
5131
5264
|
});
|
|
5132
5265
|
|
|
5133
5266
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../timers-browserify/main.js */ "./node_modules/timers-browserify/main.js").setImmediate, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js")))
|
|
@@ -8801,7 +8934,7 @@ module.exports = g;
|
|
|
8801
8934
|
/*! exports provided: name, version, description, files, main, types, scripts, repository, keywords, author, license, devDependencies, dependencies, default */
|
|
8802
8935
|
/***/ (function(module) {
|
|
8803
8936
|
|
|
8804
|
-
module.exports = JSON.parse("{\"name\":\"@microsoft/ocsdk\",\"version\":\"0.5.
|
|
8937
|
+
module.exports = JSON.parse("{\"name\":\"@microsoft/ocsdk\",\"version\":\"0.5.21-main.cc89d16\",\"description\":\"Microsoft Omnichannel SDK\",\"files\":[\"dist/**/*\",\"lib/**/*\"],\"main\":\"lib/index.js\",\"types\":\"lib/index.d.ts\",\"scripts\":{\"test\":\"karma start karma.conf.js\",\"start\":\"webpack-dev-server\",\"watch\":\"webpack --watch --config webpack.config.js --mode development\",\"build:tsc\":\"tsc --project tsconfig.json\",\"build:babel\":\"babel src --extensions .js,.ts --out-dir lib --verbose\",\"build:dev\":\"webpack --config webpack.config.js --mode development\",\"build:prod\":\"export NODE_OPTIONS=--openssl-legacy-provider && npm run build:tsc && npm run build:babel && webpack --config webpack.config.js --mode production\",\"format\":\"prettier --write \\\"src/**/*.ts\\\" \\\"src/**/*.js\\\"\",\"lint\":\"eslint src --ext .ts\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/microsoft/omnichannel-sdk.git\"},\"keywords\":[],\"author\":\"Microsoft Corporation\",\"license\":\"MIT\",\"devDependencies\":{\"@babel/cli\":\"^7.15.7\",\"@babel/core\":\"^7.15.5\",\"@babel/plugin-proposal-class-properties\":\"^7.14.5\",\"@babel/plugin-transform-runtime\":\"^7.15.0\",\"@babel/preset-env\":\"^7.15.6\",\"@babel/preset-typescript\":\"^7.15.0\",\"@dhigroup/karma-vsts-reporter\":\"^1.3.0\",\"@types/crypto-js\":\"^4.2.2\",\"@types/jasmine\":\"^3.9.1\",\"@typescript-eslint/eslint-plugin\":\"^3.10.1\",\"@typescript-eslint/parser\":\"^3.10.1\",\"axios-mock-adapter\":\"^2.0.0\",\"danger\":\"^13.0.4\",\"eslint\":\"^7.32.0\",\"eslint-plugin-security\":\"^1.4.0\",\"istanbul-instrumenter-loader\":\"^3.0.1\",\"jasmine\":\"^3.9.0\",\"karma\":\"^6.3.16\",\"karma-chrome-launcher\":\"^3.1.0\",\"karma-cli\":\"^2.0.0\",\"karma-coverage-istanbul-reporter\":\"^2.1.1\",\"karma-jasmine\":\"^2.0.1\",\"karma-spec-reporter\":\"0.0.32\",\"karma-webpack\":\"^4.0.2\",\"prettier\":\"^1.19.1\",\"ts-loader\":\"^8.4.0\",\"typescript\":\"^4.9.5\",\"webpack\":\"^4.47.0\",\"webpack-cli\":\"^3.3.12\",\"webpack-dev-server\":\"^3.11.2\",\"webpack-merge\":\"^4.2.2\"},\"dependencies\":{\"@babel/runtime\":\"^7.15.4\",\"@types/node\":\"^22.13.10\",\"axios\":\"^1.12.0\",\"axios-retry\":\"^3.9.1\",\"crypto-js\":\"^4.2.0\"}}");
|
|
8805
8938
|
|
|
8806
8939
|
/***/ }),
|
|
8807
8940
|
|
|
@@ -9130,4 +9263,4 @@ var cov_1sepedd72b=function(){var path="/home/runner/work/omnichannel-sdk/omnich
|
|
|
9130
9263
|
/***/ })
|
|
9131
9264
|
|
|
9132
9265
|
/******/ })));
|
|
9133
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zLXJldHJ5L2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvYWRhcHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9mZXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvaXNDYW5jZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0hlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9lbnYvZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbXBvc2VTaWduYWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL251bGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Jlc29sdmVDb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Rocm90dGxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b0Zvcm1EYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90cmFja1N0cmVhbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL0Jsb2IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvRm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2VuYy1oZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9zaGEyNTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzLXJldHJ5LWFsbG93ZWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vQ29uc3RhbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vRW51bXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvbW1vbi9FdmVudE5hbWVzLnRzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vTG9jYWxlcy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL09DU0RLTG9nZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9Nb2RlbC9Mb2dMZXZlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU0RLLnRzIiwid2VicGFjazovLy8uL3NyYy9TREtQcm92aWRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvQnJvd3NlckluZm8udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhLnRzIiwid2VicGFjazovLy8uL3NyYy9VdGlscy9EZXZpY2VJbmZvLnRzIiwid2VicGFjazovLy8uL3NyYy9VdGlscy9FdmVudE1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL09TSW5mby50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL1RlbGVtZXRyeUhlbHBlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvVGltZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL2F4aW9zUmV0cnlIYW5kbGVyLnRzIiwid2VicGFjazovLy8uL3NyYy9VdGlscy9lbmRwb2ludHNDcmVhdG9ycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvaHR0cEhlYWRlcnNVdGlscy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvaXNFeHBlY3RlZEF4aW9zRXJyb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL3V1aWQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL3dhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLnRzIiwid2VicGFjazovLy8uL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly8vY3J5cHRvIChpZ25vcmVkKSJdLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIkVudW1zXzEiLCJyZXF1aXJlIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiZGVmYXVsdEhlYWRlcnMiLCJieXBhc3NDYWNoZUhlYWRlcnMiLCJkZWZhdWx0Q2hhbm5lbElkIiwiQ2hhbm5lbElkIiwiTENXIiwiZGVmYXVsdExvY2FsZSIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwibm90Rm91bmRTdGF0dXNDb2RlIiwiYmFkUmVxdWVzdFN0YXR1c0NvZGUiLCJvdXRPZk9mZmljZUVycm9yQ29kZSIsInNlbnNpdGl2ZVByb3BlcnRpZXMiLCJ0cmFuc2FjdGlvbmlkIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsImhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlciIsImF4aW9zVGltZW91dEVycm9yQ29kZSIsImRlZmF1bHQiLCJTREtFcnJvciIsIkxpdmVDaGF0VmVyc2lvbiIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJPcGVyYXRpbmdTeXN0ZW0iLCJEZXZpY2VUeXBlIiwiQnJvd3NlciIsIkJyb3dzZXJWZW5kb3IiLCJFdmVudE5hbWVzIiwiZ2V0IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiX19pbXBvcnREZWZhdWx0IiwibW9kIiwiX19lc01vZHVsZSIsIlRlbGVtZXRyeUhlbHBlcl8xIiwiT0NTREtMb2dnZXIiLCJsb2dnZXIiLCJwcm90b3R5cGUiLCJsb2ciLCJsb2dsZXZlbCIsInRlbGVtZXRyeUV2ZW50IiwiY3VzdG9tRGF0YSIsImRlc2NyaXB0aW9uIiwiaXNMb2dnaW5nRW5hYmxlZCIsImxvZ0RhdGEiLCJHRVRURUxFTUVUUllFVkVOVERBVEEiLCJsb2dFdmVudCIsImxvZ0xldmVsIiwibG9nQ2xpZW50U2RrVGVsZW1ldHJ5RXZlbnQiLCJpc051bGxPclVuZGVmaW5lZCIsIm9iaiIsInVuZGVmaW5lZCIsIk9tbmljaGFubmVsRW5kcG9pbnRzIiwiTGl2ZUNoYXRDb25uZWN0b3JQYXRoIiwiTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCIsIkxjd0Zjc0RldGFpbHNQYXRoIiwiTGl2ZUNoYXRDb25maWdQYXRoIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyR2V0Q2hhdFRva2VuUGF0aCIsIkxpdmVDaGF0djNHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2NEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHY0QXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2M0F1dGhHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwiTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlQYXRoIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJhdXRob3JpemF0aW9uIiwib3JnYW5pemF0aW9uSWQiLCJ3aWRnZXRBcHBJZCIsInJlcXVlc3RJZCIsImF1dGhDb2RlTm9uY2UiLCJvY1Nlc3Npb25JZCIsIm9jVXNlckFnZW50IiwiY29ycmVsYXRpb25JZCIsInBhZ2VUb2tlbiIsIkxvZ0xldmVsIiwiX19hc3NpZ24iLCJhc3NpZ24iLCJ0IiwicyIsImkiLCJuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwicCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFwcGx5IiwiX19jcmVhdGVCaW5kaW5nIiwiY3JlYXRlIiwibyIsIm0iLCJrIiwiazIiLCJkZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwid3JpdGFibGUiLCJfX3NldE1vZHVsZURlZmF1bHQiLCJ2IiwiX19pbXBvcnRTdGFyIiwicmVzdWx0IiwiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJyZXNvbHZlIiwiUHJvbWlzZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwiZG9uZSIsInRoZW4iLCJfX2dlbmVyYXRvciIsImJvZHkiLCJfIiwibGFiZWwiLCJzZW50IiwidHJ5cyIsIm9wcyIsImYiLCJ5IiwiZyIsInZlcmIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIm9wIiwiVHlwZUVycm9yIiwicG9wIiwicHVzaCIsImF4aW9zXzEiLCJheGlvc1JldHJ5SGFuZGxlcl8xIiwiQnJvd3NlckluZm9fMSIsIkNvbnN0YW50c18xIiwiQ3VzdG9tQ29udGV4dERhdGFfMSIsIkRldmljZUluZm9fMSIsImVuY19oZXhfMSIsIkxvY2FsZXNfMSIsIkxvZ0xldmVsXzEiLCJMb2dnaW5nU2FuaXRpemVyXzEiLCJPU0luZm9fMSIsIk9tbmljaGFubmVsRW5kcG9pbnRzXzEiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEiLCJzaGEyNTZfMSIsIlRpbWVyXzEiLCJodHRwSGVhZGVyc1V0aWxzXzEiLCJlbmRwb2ludHNDcmVhdG9yc18xIiwiaXNFeHBlY3RlZEF4aW9zRXJyb3JfMSIsIlNlc3Npb25Jbml0UmV0cnlIYW5kbGVyXzEiLCJ1dWlkXzEiLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnc18xIiwiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwiX3RoaXMiLCJIVFRQVGltZU91dEVycm9yTWVzc2FnZSIsImNvbmNhdCIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JOYW1lIiwiQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2UiLCJzZXRBdXRoQ29kZU5vbmNlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJzZXRTZXNzaW9uSWRIZWFkZXIiLCJzZXNzaW9uSWQiLCJzZXRSZXF1ZXN0SWRIZWFkZXIiLCJzZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIiLCJrZXlzIiwiX2kiLCJfYSIsImtleSIsIl9iIiwiX2MiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJpbmNsdWRlcyIsIkVycm9yIiwiY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMiLCJfZCIsIl9lIiwibGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJnZXRMY3dGY3NEZXRhaWxzIiwidGltZXIiLCJyZXF1ZXN0UGF0aCIsIm1ldGhvZCIsInVybCIsImF4aW9zSW5zdGFuY2UiLCJyZXF1ZXN0SGVhZGVycyIsImJhY2tlbmRUaW1lciIsInJlc3BvbnNlIiwiaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwiZGF0YSIsImVycm9yXzEiLCJUaW1lciIsIlRJTUVSIiwibG9nV2l0aExvZ2dlciIsIklORk8iLCJHRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRCIsIm9yZ0lkIiwib3JnVXJsIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwid2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXMiLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnIiwiZ2V0Q2hhdENvbmZpZyIsImFkZE9jVXNlckFnZW50SGVhZGVyIiwidGltZW91dCIsImRlZmF1bHRSZXF1ZXN0VGltZW91dCIsInJlcXVlc3RUaW1lb3V0Q29uZmlnIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsIkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQiLCJFUlJPUiIsIkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQiLCJieXBhc3NDYWNoZSIsImVycm9yXzIiLCJHRVRDSEFUQ09ORklHRlNUQVJURUQiLCJ1dWlkdjQiLCJ3aWRnZXRJZCIsImFkZERlZmF1bHRIZWFkZXJzIiwiR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCIsIkdFVENIQVRDT05GSUdGQUlMRUQiLCJnZXRMV0lEZXRhaWxzIiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwicmVjb25uZWN0SWQiLCJzaG91bGRVc2VTaWdRdWVyeVBhcmFtIiwicGFyYW1zIiwib3B0aW9ucyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCIsImhlYWRlck92ZXJ3cml0ZXMiLCJ1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0iLCJzaWciLCJlcnJvcl8zIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwiZ2V0Q2hhdFRva2VuIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJNc09jQm90QXBwbGljYXRpb25JZCIsIm11bHRpQm90IiwiZW5kcG9pbnQiLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQiLCJyZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSIsImVycm9yXzQiLCJ0b0xvd2VyQ2FzZSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsInJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NUQVJURUQiLCJlcnJvcl81IiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVEIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVEIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5Iiwib3B0aW9uYWxQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVEIiwiZXJyb3JfNiIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIldBUk4iLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwidGVtcEFyciIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsImN1c3RvbUNvbnRleHREYXRhIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJKU09OIiwic3RyaW5naWZ5IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRhdGFfMSIsImVycm9yXzciLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiYmFzZVBhdGgiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzaG91bGRSZXRyeSIsImVycm9yIiwiZXJyb3JfOCIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJjcmVhdGVDb252ZXJzYXRpb24iLCJkYXRhXzIiLCJlcnJvcl85IiwiQ1JFQVRFU0VTU0lPTlNUQVJURUQiLCJDUkVBVEVTRVNTSU9OU1VDQ0VFREVEIiwiQ1JFQVRFU0VTU0lPTkZBSUxFRCIsInNlc3Npb25DbG9zZSIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJlcnJvcl8xMCIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsImNvZGUiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImVycm9yXzExIiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJlcnJvcl8xMiIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJnZXRTdXJ2ZXlJbnZpdGVMaW5rIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiZXJyb3JfMTMiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsImdldENoYXRUcmFuc2NyaXB0cyIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJlcnJvcl8xNCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnkiLCJnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcyIsInBhZ2VTaXplIiwiZXJyb3JNZXNzYWdlIiwiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1RBUlRFRCIsIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCIsImVycm9yXzE1IiwiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1VDQ0VFREVEIiwiZW1haWxUcmFuc2NyaXB0IiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsImVycm9yXzE2IiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiZmV0Y2hEYXRhTWFza2luZ0luZm8iLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsImVycm9yXzE3IiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsImVycm9yXzE4IiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiZXJyb3JfMTkiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsInJlcXVlc3RQYXlsb2FkIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwic2FuaXRpemVkUmVxdWVzdEhlYWRlcnMiLCJhdXRoVG9rZW5EZXRhaWxzIiwic3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMiLCJhdG9iIiwicGF5bG9hZCIsInNwbGl0IiwianNvbkRhdGEiLCJwYXJzZSIsImx3aUNvbnRleHRzIiwic3ViIiwiZXhwIiwibHdpQ29udGV4dHNEYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIkh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwiVHJhbnNhY3Rpb25JZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsIlJlcXVlc3RIZWFkZXJzIiwiUmVzcG9uc2VFcnJvcmNvZGUiLCJlcnJvcmNvZGUiLCJBdXRoVG9rZW5EZXRhaWxzIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIiwic3Vic3RyaW5nIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIiwiT0NTREtMb2dnZXJfMSIsIlNES18xIiwiU0RLUHJvdmlkZXIiLCJnZXRTREsiLCJpbG9nZ2VyIiwiVU5LTk9XTl9WRVJTSU9OIiwiUkVHRVhfVkVSU0lPTiIsImdldFVzZXJBZ2VudCIsInVzZXJBZ2VudCIsInVzZXJBZ2VudENvbnRhaW5zU3RyaW5nIiwic2VhcmNoU3RyaW5nIiwiaW5kZXhPZiIsImlzQ2hyb21lIiwiQ0hST01FIiwiRURHRSIsIkVER0VfQ0hST01JVU0iLCJpc0llIiwiaXNFZGdlIiwiaXNPcGVyYSIsIk9QRVJBIiwiRklSRUZPWCIsIlNBRkFSSSIsIklFIiwiVU5LTk9XTiIsImdldEJyb3dzZXJWZXJzaW9uIiwiZ2V0SWVWZXJzaW9uIiwiY2xhc3NpY0llVmVyc2lvbk1hdGNoZXMiLCJtYXRjaCIsIlJlZ0V4cCIsImllVmVyc2lvbk1hdGNoZXMiLCJnZXRPdGhlclZlcnNpb24iLCJicm93c2VyU3RyaW5nIiwibWF0Y2hlcyIsIm5hdmlnYXRvciIsIkFycmF5IiwiZm9yRWFjaCIsImEiLCJiIiwia2V5QSIsInRvVXBwZXJDYXNlIiwia2V5QiIsIm1vYmlsZSIsInRhYmxldCIsIk1vYmlsZSIsIlRhYmxldCIsIkRlc2t0b3AiLCJFdmVudE1hbmFnZXIiLCJyYWlzZUN1c3RvbUV2ZW50IiwiZXZlbnROYW1lIiwiZXZlbnQiLCJjcmVhdGVDdXN0b21FdmVudCIsImRpc3BhdGNoRXZlbnQiLCJldmVudERldGFpbHMiLCJkZXRhaWwiLCJDdXN0b21FdmVudCIsImNyZWF0ZUV2ZW50IiwiaW5pdEN1c3RvbUV2ZW50IiwiY29udGV4dEtleSIsInJlc3BvbnNlS2V5Iiwic3RyaXBBdXRoZW50aWNhdGlvblVzZXJUb2tlbiIsInN0cmlwUmVxdWVzdFBheWxvYWREYXRhIiwiY29uZmlnT2JqZWN0Iiwic3RyaXBFbWFpbERhdGFGcm9tRXJyb3IiLCJyZXBsYWNlIiwiZW1haWxSZWdleCIsInN0cmlwQXhpb3NFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJlcnJvck9iamVjdCIsIl9mIiwiX2ciLCJfaCIsIl9qIiwiX2siLCJpc0F4aW9zRXJyb3IiLCJjb25maWciLCJ3aW4iLCJ3aW5ydCIsIndpbnBob25lIiwib3N4IiwiaW9zIiwibGludXgiLCJhbmRyb2lkIiwiV0lORE9XU19QSE9ORSIsIldJTkRPV1NfUlQiLCJJT1MiLCJBTkRST0lEIiwiTElOVVgiLCJNQUNPU1giLCJXSU5ET1dTIiwiYXhpb3NfcmV0cnlfMSIsInNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIiwicGFyc2VJbnQiLCJpc1JldHJ5YWJsZUVycm9yIiwiaXNOZXR3b3JrRXJyb3IiLCJUZWxlbWV0cnlIZWxwZXIiLCJEZXNjcmlwdGlvbiIsIkV2ZW50IiwidGltZVN0YXJ0IiwiRGF0ZSIsImdldFRpbWUiLCJheGlvc1JldHJ5SGFuZGxlciIsImF4aW9zIiwiYXhpb3NSZXRyeU9wdGlvbnMiLCJyZXRyeUNvbmRpdGlvbiIsIm9uUmV0cnkiLCJyZXRyeUNvdW50IiwicmVxdWVzdENvbmZpZyIsImhlYWRlck92ZXJ3cml0ZXNfMSIsImhlYWRlck5hbWUiLCJyZXNwb25zZUhlYWRlciIsInRvTG9jYWxlTG93ZXJDYXNlIiwicmV0cnlEZWxheSIsInRpbWVCZXR3ZWVuUmV0cnkiLCJyZXRyeUFmdGVySGVhZGVyIiwicmV0cnlBZnRlclRpbWUiLCJyZXRyeUFmdGVyVmFsdWUiLCJpc05hTiIsInJldHJ5QWZ0ZXJEYXRlIiwiY3VycmVudFRpbWUiLCJpc0Zpbml0ZSIsIk1hdGgiLCJtYXgiLCJwb3ciLCJhdXRoIiwiY29waWxvdEJvdFByZXNlbnQiLCJlbmRwb2ludHNNYXBwaW5nIiwiVjEiLCJWMyIsImF1dGhFbmRwb2ludHNNYXBwaW5nIiwiX19zcHJlYWRBcnJheSIsInRvIiwiZnJvbSIsInBhY2siLCJsIiwiYXIiLCJzbGljZSIsInZlcnNpb24iLCJkZWZhdXRVc2VyQWdlbnQiLCJqb2luIiwiaXNFeHBlY3RlZEF4aW9zRXJyb3IiLCJ2YWxpZGF0aW9uUnVsZSIsImMiLCJyIiwicmFuZG9tIiwiRXZlbnRNYW5hZ2VyXzEiLCJFdmVudE5hbWVzXzEiLCJTREtQcm92aWRlcl8xIiwiZ2xvYmFsIiwiTWljcm9zb2Z0IiwiQ1JNIiwiT21uaWNoYW5uZWwiLCJVdGlsIiwiT0NTREtMT0FEIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFD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RUE7QUFDQSwwQkFBMEIsZUFBZTs7QUFFekM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLGFBQWE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsV0FBVyxjQUFjO0FBQzVCLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFDOzs7Ozs7Ozs7Ozs7OztBQ2p1QlU7O0FBRVo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsVUFBVTtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVZOztBQUVaLGFBQWEsbUJBQU8sQ0FBQyxvREFBVztBQUNoQyxjQUFjLG1CQUFPLENBQUMsZ0RBQVM7QUFDL0IsY0FBYyxtQkFBTyxDQUFDLGdEQUFTOztBQUUvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG1EQUFtRDtBQUN4RTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFVBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSx1Q0FBdUMsU0FBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlCQUFpQjtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxFQUFFO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0EscUJBQXFCLGVBQWU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFlBQVk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxtQkFBbUIsY0FBYztBQUNqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdURBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxXQUFXOztBQUVuQjtBQUNBO0FBQ0E7QUFDQSxRQUFRLFdBQVc7O0FBRW5CO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLFdBQVc7O0FBRW5CO0FBQ0E7QUFDQSxRQUFRLFVBQVU7O0FBRWxCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNwRmE7O0FBRWI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0Q0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ0pBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7Ozs7Ozs7Ozs7OztBQ3ZMdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDLHNCQUFzQixFQUFFO0FBQ2xFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7O0FDekxEO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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RSxNQURiLENBRjZCLENBQXZDLENBTUgsQ0FQRCw4QkFwQlMsc0JBNEJULGdDQUFPaUUsUUFBUCw0QkFBbUJpUyxlQUFlemtCLE9BQWYsQ0FBdUJ5ZSxnQkFBdkIsQ0FBd0NpRyxhQUFhMWtCLE9BQWIsQ0FBcUJpbEIsU0FBN0QsQ0FBbkIsRUFDSCxDQTdCRCxJOzs7Ozs7Ozs7Ozs7QUNiQSxlIiwiZmlsZSI6IlNESy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LnRzXCIpO1xuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgeyBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IH0ga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgaXNSZXRyeUFsbG93ZWQgZnJvbSAnaXMtcmV0cnktYWxsb3dlZCc7XG5leHBvcnQgdmFyIG5hbWVzcGFjZSA9ICdheGlvcy1yZXRyeSc7XG4vKipcbiAqIEBwYXJhbSAge0Vycm9yfSAgZXJyb3JcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV0d29ya0Vycm9yKGVycm9yKSB7XG4gIHZhciBDT0RFX0VYQ0xVREVfTElTVCA9IFsnRVJSX0NBTkNFTEVEJywgJ0VDT05OQUJPUlRFRCddO1xuICByZXR1cm4gIWVycm9yLnJlc3BvbnNlICYmIEJvb2xlYW4oZXJyb3IuY29kZSkgJiYgLy8gUHJldmVudHMgcmV0cnlpbmcgY2FuY2VsbGVkIHJlcXVlc3RzXG4gICFDT0RFX0VYQ0xVREVfTElTVC5pbmNsdWRlcyhlcnJvci5jb2RlKSAmJiAvLyBQcmV2ZW50cyByZXRyeWluZyB0aW1lZCBvdXQgJiBjYW5jZWxsZWQgcmVxdWVzdHNcbiAgaXNSZXRyeUFsbG93ZWQoZXJyb3IpIC8vIFByZXZlbnRzIHJldHJ5aW5nIHVuc2FmZSBlcnJvcnNcbiAgO1xufVxudmFyIFNBRkVfSFRUUF9NRVRIT0RTID0gWydnZXQnLCAnaGVhZCcsICdvcHRpb25zJ107XG52YXIgSURFTVBPVEVOVF9IVFRQX01FVEhPRFMgPSBTQUZFX0hUVFBfTUVUSE9EUy5jb25jYXQoWydwdXQnLCAnZGVsZXRlJ10pO1xuLyoqXG4gKiBAcGFyYW0gIHtFcnJvcn0gIGVycm9yXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldHJ5YWJsZUVycm9yKGVycm9yKSB7XG4gIHJldHVybiBlcnJvci5jb2RlICE9PSAnRUNPTk5BQk9SVEVEJyAmJiAoIWVycm9yLnJlc3BvbnNlIHx8IGVycm9yLnJlc3BvbnNlLnN0YXR1cyA+PSA1MDAgJiYgZXJyb3IucmVzcG9uc2Uuc3RhdHVzIDw9IDU5OSk7XG59XG4vKipcbiAqIEBwYXJhbSAge0Vycm9yfSAgZXJyb3JcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZVJlcXVlc3RFcnJvcihlcnJvcikge1xuICBpZiAoIWVycm9yLmNvbmZpZykge1xuICAgIC8vIENhbm5vdCBkZXRlcm1pbmUgaWYgdGhlIHJlcXVlc3QgY2FuIGJlIHJldHJpZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNSZXRyeWFibGVFcnJvcihlcnJvcikgJiYgU0FGRV9IVFRQX01FVEhPRFMuaW5kZXhPZihlcnJvci5jb25maWcubWV0aG9kKSAhPT0gLTE7XG59XG4vKipcbiAqIEBwYXJhbSAge0Vycm9yfSAgZXJyb3JcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbXBvdGVudFJlcXVlc3RFcnJvcihlcnJvcikge1xuICBpZiAoIWVycm9yLmNvbmZpZykge1xuICAgIC8vIENhbm5vdCBkZXRlcm1pbmUgaWYgdGhlIHJlcXVlc3QgY2FuIGJlIHJldHJpZWRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNSZXRyeWFibGVFcnJvcihlcnJvcikgJiYgSURFTVBPVEVOVF9IVFRQX01FVEhPRFMuaW5kZXhPZihlcnJvci5jb25maWcubWV0aG9kKSAhPT0gLTE7XG59XG4vKipcbiAqIEBwYXJhbSAge0Vycm9yfSAgZXJyb3JcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV0d29ya09ySWRlbXBvdGVudFJlcXVlc3RFcnJvcihlcnJvcikge1xuICByZXR1cm4gaXNOZXR3b3JrRXJyb3IoZXJyb3IpIHx8IGlzSWRlbXBvdGVudFJlcXVlc3RFcnJvcihlcnJvcik7XG59XG4vKipcbiAqIEByZXR1cm4ge251bWJlcn0gLSBkZWxheSBpbiBtaWxsaXNlY29uZHMsIGFsd2F5cyAwXG4gKi9cblxuZnVuY3Rpb24gbm9EZWxheSgpIHtcbiAgcmV0dXJuIDA7XG59XG4vKipcbiAqIFNldCBkZWxheUZhY3RvciAxMDAwIGZvciBhbiBleHBvbmVudGlhbCBkZWxheSB0byBvY2N1ciBvbiB0aGUgb3JkZXJcbiAqIG9mIHNlY29uZHNcbiAqIEBwYXJhbSAge251bWJlcn0gW3JldHJ5TnVtYmVyPTBdXG4gKiBAcGFyYW0gIHtFcnJvcn0gIGVycm9yIC0gdW51c2VkOyBmb3IgZXhpc3RpbmcgQVBJIG9mIHJldHJ5RGVsYXkgY2FsbGJhY2tcbiAqIEBwYXJhbSAge251bWJlcn0gW2RlbGF5RmFjdG9yPTEwMF0gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJuIHtudW1iZXJ9IC0gZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gZXhwb25lbnRpYWxEZWxheSgpIHtcbiAgdmFyIHJldHJ5TnVtYmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuICB2YXIgZXJyb3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGRlbGF5RmFjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxMDA7XG4gIHZhciBkZWxheSA9IE1hdGgucG93KDIsIHJldHJ5TnVtYmVyKSAqIGRlbGF5RmFjdG9yO1xuICB2YXIgcmFuZG9tU3VtID0gZGVsYXkgKiAwLjIgKiBNYXRoLnJhbmRvbSgpOyAvLyAwLTIwJSBvZiB0aGUgZGVsYXlcblxuICByZXR1cm4gZGVsYXkgKyByYW5kb21TdW07XG59XG4vKiogQHR5cGUge0lBeGlvc1JldHJ5Q29uZmlnfSAqL1xuXG5leHBvcnQgdmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcmV0cmllczogMyxcbiAgcmV0cnlDb25kaXRpb246IGlzTmV0d29ya09ySWRlbXBvdGVudFJlcXVlc3RFcnJvcixcbiAgcmV0cnlEZWxheTogbm9EZWxheSxcbiAgc2hvdWxkUmVzZXRUaW1lb3V0OiBmYWxzZSxcbiAgb25SZXRyeTogKCkgPT4ge31cbn07XG4vKipcbiAqIFJldHVybnMgdGhlIGF4aW9zLXJldHJ5IG9wdGlvbnMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3RcbiAqIEBwYXJhbSAge0F4aW9zUmVxdWVzdENvbmZpZ30gY29uZmlnXG4gKiBAcGFyYW0gIHtJQXhpb3NSZXRyeUNvbmZpZ30gZGVmYXVsdE9wdGlvbnNcbiAqIEByZXR1cm4ge0lBeGlvc1JldHJ5Q29uZmlnRXh0ZW5kZWR9XG4gKi9cblxuZnVuY3Rpb24gZ2V0UmVxdWVzdE9wdGlvbnMoY29uZmlnLCBkZWZhdWx0T3B0aW9ucykge1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIERFRkFVTFRfT1BUSU9OUyksIGRlZmF1bHRPcHRpb25zKSwgY29uZmlnW25hbWVzcGFjZV0pO1xufVxuLyoqXG4gKiBJbml0aWFsaXplcyBhbmQgcmV0dXJucyB0aGUgcmV0cnkgc3RhdGUgZm9yIHRoZSBnaXZlbiByZXF1ZXN0L2NvbmZpZ1xuICogQHBhcmFtICB7QXhpb3NSZXF1ZXN0Q29uZmlnfSBjb25maWdcbiAqIEBwYXJhbSAge0lBeGlvc1JldHJ5Q29uZmlnfSBkZWZhdWx0T3B0aW9uc1xuICogQHJldHVybiB7SUF4aW9zUmV0cnlDb25maWdFeHRlbmRlZH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRTdGF0ZShjb25maWcsIGRlZmF1bHRPcHRpb25zKSB7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBnZXRSZXF1ZXN0T3B0aW9ucyhjb25maWcsIGRlZmF1bHRPcHRpb25zKTtcbiAgY3VycmVudFN0YXRlLnJldHJ5Q291bnQgPSBjdXJyZW50U3RhdGUucmV0cnlDb3VudCB8fCAwO1xuICBjb25maWdbbmFtZXNwYWNlXSA9IGN1cnJlbnRTdGF0ZTtcbiAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbn1cbi8qKlxuICogQHBhcmFtICB7QXhpb3N9IGF4aW9zXG4gKiBAcGFyYW0gIHtBeGlvc1JlcXVlc3RDb25maWd9IGNvbmZpZ1xuICovXG5cblxuZnVuY3Rpb24gZml4Q29uZmlnKGF4aW9zLCBjb25maWcpIHtcbiAgaWYgKGF4aW9zLmRlZmF1bHRzLmFnZW50ID09PSBjb25maWcuYWdlbnQpIHtcbiAgICBkZWxldGUgY29uZmlnLmFnZW50O1xuICB9XG5cbiAgaWYgKGF4aW9zLmRlZmF1bHRzLmh0dHBBZ2VudCA9PT0gY29uZmlnLmh0dHBBZ2VudCkge1xuICAgIGRlbGV0ZSBjb25maWcuaHR0cEFnZW50O1xuICB9XG5cbiAgaWYgKGF4aW9zLmRlZmF1bHRzLmh0dHBzQWdlbnQgPT09IGNvbmZpZy5odHRwc0FnZW50KSB7XG4gICAgZGVsZXRlIGNvbmZpZy5odHRwc0FnZW50O1xuICB9XG59XG4vKipcbiAqIENoZWNrcyByZXRyeUNvbmRpdGlvbiBpZiByZXF1ZXN0IGNhbiBiZSByZXRyaWVkLiBIYW5kbGVzIGl0J3MgcmV0dXJuaW5nIHZhbHVlIG9yIFByb21pc2UuXG4gKiBAcGFyYW0gIHtJQXhpb3NSZXRyeUNvbmZpZ0V4dGVuZGVkfSBjdXJyZW50U3RhdGVcbiAqIEBwYXJhbSAge0Vycm9yfSBlcnJvclxuICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuXG5cbmZ1bmN0aW9uIHNob3VsZFJldHJ5KF94LCBfeDIpIHtcbiAgcmV0dXJuIF9zaG91bGRSZXRyeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBBZGRzIHJlc3BvbnNlIGludGVyY2VwdG9ycyB0byBhbiBheGlvcyBpbnN0YW5jZSB0byByZXRyeSByZXF1ZXN0cyBmYWlsZWQgZHVlIHRvIG5ldHdvcmsgaXNzdWVzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuICpcbiAqIGF4aW9zUmV0cnkoYXhpb3MsIHsgcmV0cmllczogMyB9KTtcbiAqXG4gKiBheGlvcy5nZXQoJ2h0dHA6Ly9leGFtcGxlLmNvbS90ZXN0JykgLy8gVGhlIGZpcnN0IHJlcXVlc3QgZmFpbHMgYW5kIHRoZSBzZWNvbmQgcmV0dXJucyAnb2snXG4gKiAgIC50aGVuKHJlc3VsdCA9PiB7XG4gKiAgICAgcmVzdWx0LmRhdGE7IC8vICdvaydcbiAqICAgfSk7XG4gKlxuICogLy8gRXhwb25lbnRpYWwgYmFjay1vZmYgcmV0cnkgZGVsYXkgYmV0d2VlbiByZXF1ZXN0c1xuICogYXhpb3NSZXRyeShheGlvcywgeyByZXRyeURlbGF5IDogYXhpb3NSZXRyeS5leHBvbmVudGlhbERlbGF5fSk7XG4gKlxuICogLy8gQ3VzdG9tIHJldHJ5IGRlbGF5XG4gKiBheGlvc1JldHJ5KGF4aW9zLCB7IHJldHJ5RGVsYXkgOiAocmV0cnlDb3VudCkgPT4ge1xuICogICByZXR1cm4gcmV0cnlDb3VudCAqIDEwMDA7XG4gKiB9fSk7XG4gKlxuICogLy8gQWxzbyB3b3JrcyB3aXRoIGN1c3RvbSBheGlvcyBpbnN0YW5jZXNcbiAqIGNvbnN0IGNsaWVudCA9IGF4aW9zLmNyZWF0ZSh7IGJhc2VVUkw6ICdodHRwOi8vZXhhbXBsZS5jb20nIH0pO1xuICogYXhpb3NSZXRyeShjbGllbnQsIHsgcmV0cmllczogMyB9KTtcbiAqXG4gKiBjbGllbnQuZ2V0KCcvdGVzdCcpIC8vIFRoZSBmaXJzdCByZXF1ZXN0IGZhaWxzIGFuZCB0aGUgc2Vjb25kIHJldHVybnMgJ29rJ1xuICogICAudGhlbihyZXN1bHQgPT4ge1xuICogICAgIHJlc3VsdC5kYXRhOyAvLyAnb2snXG4gKiAgIH0pO1xuICpcbiAqIC8vIEFsbG93cyByZXF1ZXN0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAqIGNsaWVudFxuICogICAuZ2V0KCcvdGVzdCcsIHtcbiAqICAgICAnYXhpb3MtcmV0cnknOiB7XG4gKiAgICAgICByZXRyaWVzOiAwXG4gKiAgICAgfVxuICogICB9KVxuICogICAuY2F0Y2goZXJyb3IgPT4geyAvLyBUaGUgZmlyc3QgcmVxdWVzdCBmYWlsc1xuICogICAgIGVycm9yICE9PSB1bmRlZmluZWRcbiAqICAgfSk7XG4gKlxuICogQHBhcmFtIHtBeGlvc30gYXhpb3MgQW4gYXhpb3MgaW5zdGFuY2UgKHRoZSBheGlvcyBvYmplY3Qgb3Igb25lIGNyZWF0ZWQgZnJvbSBheGlvcy5jcmVhdGUpXG4gKiBAcGFyYW0ge09iamVjdH0gW2RlZmF1bHRPcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtkZWZhdWx0T3B0aW9ucy5yZXRyaWVzPTNdIE51bWJlciBvZiByZXRyaWVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtkZWZhdWx0T3B0aW9ucy5zaG91bGRSZXNldFRpbWVvdXQ9ZmFsc2VdXG4gKiAgICAgICAgRGVmaW5lcyBpZiB0aGUgdGltZW91dCBzaG91bGQgYmUgcmVzZXQgYmV0d2VlbiByZXRyaWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZGVmYXVsdE9wdGlvbnMucmV0cnlDb25kaXRpb249aXNOZXR3b3JrT3JJZGVtcG90ZW50UmVxdWVzdEVycm9yXVxuICogICAgICAgIEEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBlcnJvciBjYW4gYmUgcmV0cmllZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2RlZmF1bHRPcHRpb25zLnJldHJ5RGVsYXk9bm9EZWxheV1cbiAqICAgICAgICBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgZGVsYXkgYmV0d2VlbiByZXRyeSByZXF1ZXN0c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2RlZmF1bHRPcHRpb25zLm9uUmV0cnk9KCk9Pnt9XVxuICogICAgICAgIEEgZnVuY3Rpb24gdG8gZ2V0IG5vdGlmaWVkIHdoZW4gYSByZXRyeSBvY2N1cnNcbiAqIEByZXR1cm4ge3sgcmVxdWVzdEludGVyY2VwdG9ySWQ6IG51bWJlciwgcmVzcG9uc2VJbnRlcmNlcHRvcklkOiBudW1iZXIgfX1cbiAqICAgICAgICBUaGUgaWRzIG9mIHRoZSBpbnRlcmNlcHRvcnMgYWRkZWQgdG8gdGhlIHJlcXVlc3QgYW5kIHRvIHRoZSByZXNwb25zZSAoc28gdGhleSBjYW4gYmUgZWplY3RlZCBhdCBhIGxhdGVyIHRpbWUpXG4gKi9cblxuXG5mdW5jdGlvbiBfc2hvdWxkUmV0cnkoKSB7XG4gIF9zaG91bGRSZXRyeSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoY3VycmVudFN0YXRlLCBlcnJvcikge1xuICAgIHZhciB7XG4gICAgICByZXRyaWVzLFxuICAgICAgcmV0cnlDb25kaXRpb25cbiAgICB9ID0gY3VycmVudFN0YXRlO1xuICAgIHZhciBzaG91bGRSZXRyeU9yUHJvbWlzZSA9IGN1cnJlbnRTdGF0ZS5yZXRyeUNvdW50IDwgcmV0cmllcyAmJiByZXRyeUNvbmRpdGlvbihlcnJvcik7IC8vIFRoaXMgY291bGQgYmUgYSBwcm9taXNlXG5cbiAgICBpZiAodHlwZW9mIHNob3VsZFJldHJ5T3JQcm9taXNlID09PSAnb2JqZWN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHNob3VsZFJldHJ5UHJvbWlzZVJlc3VsdCA9IHlpZWxkIHNob3VsZFJldHJ5T3JQcm9taXNlOyAvLyBrZWVwIHJldHVybiB0cnVlIHVubGVzcyBzaG91bGRSZXRyeVByb21pc2VSZXN1bHQgcmV0dXJuIGZhbHNlIGZvciBjb21wYXRpYmlsaXR5XG5cbiAgICAgICAgcmV0dXJuIHNob3VsZFJldHJ5UHJvbWlzZVJlc3VsdCAhPT0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkUmV0cnlPclByb21pc2U7XG4gIH0pO1xuICByZXR1cm4gX3Nob3VsZFJldHJ5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF4aW9zUmV0cnkoYXhpb3MsIGRlZmF1bHRPcHRpb25zKSB7XG4gIHZhciByZXF1ZXN0SW50ZXJjZXB0b3JJZCA9IGF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShjb25maWcgPT4ge1xuICAgIHZhciBjdXJyZW50U3RhdGUgPSBnZXRDdXJyZW50U3RhdGUoY29uZmlnLCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgY3VycmVudFN0YXRlLmxhc3RSZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSk7XG4gIHZhciByZXNwb25zZUludGVyY2VwdG9ySWQgPSBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKG51bGwsIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGVycm9yKSB7XG4gICAgICB2YXIge1xuICAgICAgICBjb25maWdcbiAgICAgIH0gPSBlcnJvcjsgLy8gSWYgd2UgaGF2ZSBubyBpbmZvcm1hdGlvbiB0byByZXRyeSB0aGUgcmVxdWVzdFxuXG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3VycmVudFN0YXRlID0gZ2V0Q3VycmVudFN0YXRlKGNvbmZpZywgZGVmYXVsdE9wdGlvbnMpO1xuXG4gICAgICBpZiAoeWllbGQgc2hvdWxkUmV0cnkoY3VycmVudFN0YXRlLCBlcnJvcikpIHtcbiAgICAgICAgY3VycmVudFN0YXRlLnJldHJ5Q291bnQgKz0gMTtcbiAgICAgICAgdmFyIHtcbiAgICAgICAgICByZXRyeURlbGF5LFxuICAgICAgICAgIHNob3VsZFJlc2V0VGltZW91dCxcbiAgICAgICAgICBvblJldHJ5XG4gICAgICAgIH0gPSBjdXJyZW50U3RhdGU7XG4gICAgICAgIHZhciBkZWxheSA9IHJldHJ5RGVsYXkoY3VycmVudFN0YXRlLnJldHJ5Q291bnQsIGVycm9yKTsgLy8gQXhpb3MgZmFpbHMgbWVyZ2luZyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBiZWNhdXNlIGl0IGhhcyBhbiBpc3N1ZVxuICAgICAgICAvLyB3aXRoIGNpcmN1bGFyIHN0cnVjdHVyZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zL2lzc3Vlcy8zNzBcblxuICAgICAgICBmaXhDb25maWcoYXhpb3MsIGNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzaG91bGRSZXNldFRpbWVvdXQgJiYgY29uZmlnLnRpbWVvdXQgJiYgY3VycmVudFN0YXRlLmxhc3RSZXF1ZXN0VGltZSkge1xuICAgICAgICAgIHZhciBsYXN0UmVxdWVzdER1cmF0aW9uID0gRGF0ZS5ub3coKSAtIGN1cnJlbnRTdGF0ZS5sYXN0UmVxdWVzdFRpbWU7XG4gICAgICAgICAgdmFyIHRpbWVvdXQgPSBjb25maWcudGltZW91dCAtIGxhc3RSZXF1ZXN0RHVyYXRpb24gLSBkZWxheTtcblxuICAgICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uZmlnLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3QgPSBbZGF0YSA9PiBkYXRhXTtcbiAgICAgICAgeWllbGQgb25SZXRyeShjdXJyZW50U3RhdGUucmV0cnlDb3VudCwgZXJyb3IsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZShheGlvcyhjb25maWcpKSwgZGVsYXkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7XG4gICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKSk7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdEludGVyY2VwdG9ySWQsXG4gICAgcmVzcG9uc2VJbnRlcmNlcHRvcklkXG4gIH07XG59IC8vIENvbXBhdGliaWxpdHkgd2l0aCBDb21tb25KU1xuXG5heGlvc1JldHJ5LmlzTmV0d29ya0Vycm9yID0gaXNOZXR3b3JrRXJyb3I7XG5heGlvc1JldHJ5LmlzU2FmZVJlcXVlc3RFcnJvciA9IGlzU2FmZVJlcXVlc3RFcnJvcjtcbmF4aW9zUmV0cnkuaXNJZGVtcG90ZW50UmVxdWVzdEVycm9yID0gaXNJZGVtcG90ZW50UmVxdWVzdEVycm9yO1xuYXhpb3NSZXRyeS5pc05ldHdvcmtPcklkZW1wb3RlbnRSZXF1ZXN0RXJyb3IgPSBpc05ldHdvcmtPcklkZW1wb3RlbnRSZXF1ZXN0RXJyb3I7XG5heGlvc1JldHJ5LmV4cG9uZW50aWFsRGVsYXkgPSBleHBvbmVudGlhbERlbGF5O1xuYXhpb3NSZXRyeS5pc1JldHJ5YWJsZUVycm9yID0gaXNSZXRyeWFibGVFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBheGlvcyBmcm9tICcuL2xpYi9heGlvcy5qcyc7XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIHVud3JhcCBBeGlvcyBkZWZhdWx0IGV4cG9ydCBhcyBuYW1lZC5cbi8vIEtlZXAgdG9wLWxldmVsIGV4cG9ydCBzYW1lIHdpdGggc3RhdGljIHByb3BlcnRpZXNcbi8vIHNvIHRoYXQgaXQgY2FuIGtlZXAgc2FtZSB3aXRoIGVzIG1vZHVsZSBvciBjanNcbmNvbnN0IHtcbiAgQXhpb3MsXG4gIEF4aW9zRXJyb3IsXG4gIENhbmNlbGVkRXJyb3IsXG4gIGlzQ2FuY2VsLFxuICBDYW5jZWxUb2tlbixcbiAgVkVSU0lPTixcbiAgYWxsLFxuICBDYW5jZWwsXG4gIGlzQXhpb3NFcnJvcixcbiAgc3ByZWFkLFxuICB0b0Zvcm1EYXRhLFxuICBBeGlvc0hlYWRlcnMsXG4gIEh0dHBTdGF0dXNDb2RlLFxuICBmb3JtVG9KU09OLFxuICBnZXRBZGFwdGVyLFxuICBtZXJnZUNvbmZpZ1xufSA9IGF4aW9zO1xuXG5leHBvcnQge1xuICBheGlvcyBhcyBkZWZhdWx0LFxuICBBeGlvcyxcbiAgQXhpb3NFcnJvcixcbiAgQ2FuY2VsZWRFcnJvcixcbiAgaXNDYW5jZWwsXG4gIENhbmNlbFRva2VuLFxuICBWRVJTSU9OLFxuICBhbGwsXG4gIENhbmNlbCxcbiAgaXNBeGlvc0Vycm9yLFxuICBzcHJlYWQsXG4gIHRvRm9ybURhdGEsXG4gIEF4aW9zSGVhZGVycyxcbiAgSHR0cFN0YXR1c0NvZGUsXG4gIGZvcm1Ub0pTT04sXG4gIGdldEFkYXB0ZXIsXG4gIG1lcmdlQ29uZmlnXG59XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IGh0dHBBZGFwdGVyIGZyb20gJy4vaHR0cC5qcyc7XG5pbXBvcnQgeGhyQWRhcHRlciBmcm9tICcuL3hoci5qcyc7XG5pbXBvcnQgZmV0Y2hBZGFwdGVyIGZyb20gJy4vZmV0Y2guanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBrbm93bkFkYXB0ZXJzID0ge1xuICBodHRwOiBodHRwQWRhcHRlcixcbiAgeGhyOiB4aHJBZGFwdGVyLFxuICBmZXRjaDogZmV0Y2hBZGFwdGVyXG59XG5cbnV0aWxzLmZvckVhY2goa25vd25BZGFwdGVycywgKGZuLCB2YWx1ZSkgPT4ge1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHt2YWx1ZX0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdhZGFwdGVyTmFtZScsIHt2YWx1ZX0pO1xuICB9XG59KTtcblxuY29uc3QgcmVuZGVyUmVhc29uID0gKHJlYXNvbikgPT4gYC0gJHtyZWFzb259YDtcblxuY29uc3QgaXNSZXNvbHZlZEhhbmRsZSA9IChhZGFwdGVyKSA9PiB1dGlscy5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IGFkYXB0ZXIgPT09IG51bGwgfHwgYWRhcHRlciA9PT0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0QWRhcHRlcjogKGFkYXB0ZXJzKSA9PiB7XG4gICAgYWRhcHRlcnMgPSB1dGlscy5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufVxuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gXCIuLi9wbGF0Zm9ybS9pbmRleC5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuaW1wb3J0IGNvbXBvc2VTaWduYWxzIGZyb20gXCIuLi9oZWxwZXJzL2NvbXBvc2VTaWduYWxzLmpzXCI7XG5pbXBvcnQge3RyYWNrU3RyZWFtfSBmcm9tIFwiLi4vaGVscGVycy90cmFja1N0cmVhbS5qc1wiO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi4vY29yZS9BeGlvc0hlYWRlcnMuanNcIjtcbmltcG9ydCB7cHJvZ3Jlc3NFdmVudFJlZHVjZXIsIHByb2dyZXNzRXZlbnREZWNvcmF0b3IsIGFzeW5jRGVjb3JhdG9yfSBmcm9tIFwiLi4vaGVscGVycy9wcm9ncmVzc0V2ZW50UmVkdWNlci5qc1wiO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuaW1wb3J0IHNldHRsZSBmcm9tIFwiLi4vY29yZS9zZXR0bGUuanNcIjtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuY29uc3Qgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJiB0ZXN0KCgpID0+IHtcbiAgbGV0IGR1cGxleEFjY2Vzc2VkID0gZmFsc2U7XG5cbiAgY29uc3QgaGFzQ29udGVudFR5cGUgPSBuZXcgUmVxdWVzdChwbGF0Zm9ybS5vcmlnaW4sIHtcbiAgICBib2R5OiBuZXcgUmVhZGFibGVTdHJlYW0oKSxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBnZXQgZHVwbGV4KCkge1xuICAgICAgZHVwbGV4QWNjZXNzZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuICdoYWxmJztcbiAgICB9LFxuICB9KS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJyk7XG5cbiAgcmV0dXJuIGR1cGxleEFjY2Vzc2VkICYmICFoYXNDb250ZW50VHlwZTtcbn0pO1xuXG5jb25zdCBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7XG5cbmNvbnN0IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gPSBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmXG4gIHRlc3QoKCkgPT4gdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzLmlzRnVuY3Rpb24ocmVzW3R5cGVdKSA/IChyZXMpID0+IHJlc1t0eXBlXSgpIDpcbiAgICAgIChfLCBjb25maWcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoYFJlc3BvbnNlIHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBzdXBwb3J0ZWRgLCBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCwgY29uZmlnKTtcbiAgICAgIH0pXG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscy5pc0Jsb2IoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplO1xuICB9XG5cbiAgaWYodXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShib2R5KSkge1xuICAgIGNvbnN0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gICAgcmV0dXJuIChhd2FpdCBfcmVxdWVzdC5hcnJheUJ1ZmZlcigpKS5ieXRlTGVuZ3RoO1xuICB9XG5cbiAgaWYodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMuaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgIHJldHVybiBib2R5LmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuICAgIGJvZHkgPSBib2R5ICsgJyc7XG4gIH1cblxuICBpZih1dGlscy5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufVxuXG5jb25zdCByZXNvbHZlQm9keUxlbmd0aCA9IGFzeW5jIChoZWFkZXJzLCBib2R5KSA9PiB7XG4gIGNvbnN0IGxlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0ZldGNoU3VwcG9ydGVkICYmIChhc3luYyAoY29uZmlnKSA9PiB7XG4gIGxldCB7XG4gICAgdXJsLFxuICAgIG1ldGhvZCxcbiAgICBkYXRhLFxuICAgIHNpZ25hbCxcbiAgICBjYW5jZWxUb2tlbixcbiAgICB0aW1lb3V0LFxuICAgIG9uRG93bmxvYWRQcm9ncmVzcyxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIHJlc3BvbnNlVHlwZSxcbiAgICBoZWFkZXJzLFxuICAgIHdpdGhDcmVkZW50aWFscyA9ICdzYW1lLW9yaWdpbicsXG4gICAgZmV0Y2hPcHRpb25zXG4gIH0gPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG5cbiAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlID8gKHJlc3BvbnNlVHlwZSArICcnKS50b0xvd2VyQ2FzZSgpIDogJ3RleHQnO1xuXG4gIGxldCBjb21wb3NlZFNpZ25hbCA9IGNvbXBvc2VTaWduYWxzKFtzaWduYWwsIGNhbmNlbFRva2VuICYmIGNhbmNlbFRva2VuLnRvQWJvcnRTaWduYWwoKV0sIHRpbWVvdXQpO1xuXG4gIGxldCByZXF1ZXN0O1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gY29tcG9zZWRTaWduYWwgJiYgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUgJiYgKCgpID0+IHtcbiAgICAgIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlKCk7XG4gIH0pO1xuXG4gIGxldCByZXF1ZXN0Q29udGVudExlbmd0aDtcblxuICB0cnkge1xuICAgIGlmIChcbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MgJiYgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtICYmIG1ldGhvZCAhPT0gJ2dldCcgJiYgbWV0aG9kICE9PSAnaGVhZCcgJiZcbiAgICAgIChyZXF1ZXN0Q29udGVudExlbmd0aCA9IGF3YWl0IHJlc29sdmVCb2R5TGVuZ3RoKGhlYWRlcnMsIGRhdGEpKSAhPT0gMFxuICAgICkge1xuICAgICAgbGV0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICBkdXBsZXg6IFwiaGFsZlwiXG4gICAgICB9KTtcblxuICAgICAgbGV0IGNvbnRlbnRUeXBlSGVhZGVyO1xuXG4gICAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpXG4gICAgICB9XG5cbiAgICAgIGlmIChfcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IFtvblByb2dyZXNzLCBmbHVzaF0gPSBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgIHJlcXVlc3RDb250ZW50TGVuZ3RoLFxuICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uVXBsb2FkUHJvZ3Jlc3MpKVxuICAgICAgICApO1xuXG4gICAgICAgIGRhdGEgPSB0cmFja1N0cmVhbShfcmVxdWVzdC5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsIGZsdXNoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXV0aWxzLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICB9XG5cbiAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWw6IGNvbXBvc2VkU2lnbmFsLFxuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgZHVwbGV4OiBcImhhbGZcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICBpZiAoc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAob25Eb3dubG9hZFByb2dyZXNzIHx8IChpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKTtcblxuICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9IG9uRG93bmxvYWRQcm9ncmVzcyAmJiBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICByZXNwb25zZUNvbnRlbnRMZW5ndGgsXG4gICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uRG93bmxvYWRQcm9ncmVzcyksIHRydWUpXG4gICAgICApIHx8IFtdO1xuXG4gICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShcbiAgICAgICAgdHJhY2tTdHJlYW0ocmVzcG9uc2UuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCAoKSA9PiB7XG4gICAgICAgICAgZmx1c2ggJiYgZmx1c2goKTtcbiAgICAgICAgICB1bnN1YnNjcmliZSAmJiB1bnN1YnNjcmliZSgpO1xuICAgICAgICB9KSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgfHwgJ3RleHQnO1xuXG4gICAgbGV0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc29sdmVyc1t1dGlscy5maW5kS2V5KHJlc29sdmVycywgcmVzcG9uc2VUeXBlKSB8fCAndGV4dCddKHJlc3BvbnNlLCBjb25maWcpO1xuXG4gICAgIWlzU3RyZWFtUmVzcG9uc2UgJiYgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgaGVhZGVyczogQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdUeXBlRXJyb3InICYmIC9mZXRjaC9pLnRlc3QoZXJyLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKFxuICAgICAgICBuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCksXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogZXJyLmNhdXNlIHx8IGVyclxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGVyciwgZXJyICYmIGVyci5jb2RlLCBjb25maWcsIHJlcXVlc3QpO1xuICB9XG59KTtcblxuXG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgc2V0dGxlIGZyb20gJy4vLi4vY29yZS9zZXR0bGUuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IHBhcnNlUHJvdG9jb2wgZnJvbSAnLi4vaGVscGVycy9wYXJzZVByb3RvY29sLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCB7cHJvZ3Jlc3NFdmVudFJlZHVjZXJ9IGZyb20gJy4uL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMnO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oX2NvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICBsZXQge3Jlc3BvbnNlVHlwZSwgb25VcGxvYWRQcm9ncmVzcywgb25Eb3dubG9hZFByb2dyZXNzfSA9IF9jb25maWc7XG4gICAgbGV0IG9uQ2FuY2VsZWQ7XG4gICAgbGV0IHVwbG9hZFRocm90dGxlZCwgZG93bmxvYWRUaHJvdHRsZWQ7XG4gICAgbGV0IGZsdXNoVXBsb2FkLCBmbHVzaERvd25sb2FkO1xuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGZsdXNoVXBsb2FkICYmIGZsdXNoVXBsb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuICAgICAgZmx1c2hEb3dubG9hZCAmJiBmbHVzaERvd25sb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG5cbiAgICAgIF9jb25maWcuc2lnbmFsICYmIF9jb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3Qub3BlbihfY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBfY29uZmlnLnVybCwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IF9jb25maWcudGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG9ubG9hZGVuZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oXG4gICAgICAgICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9ICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgbGV0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBfY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgX2NvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IF9jb25maWcudHJhbnNpdGlvbmFsIHx8IHRyYW5zaXRpb25hbERlZmF1bHRzO1xuICAgICAgaWYgKF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgIHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQgJiYgcmVxdWVzdEhlYWRlcnMuc2V0Q29udGVudFR5cGUobnVsbCk7XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoX2NvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICEhX2NvbmZpZy53aXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlc3BvbnNlVHlwZSB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gX2NvbmZpZy5yZXNwb25zZVR5cGU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmIChvbkRvd25sb2FkUHJvZ3Jlc3MpIHtcbiAgICAgIChbZG93bmxvYWRUaHJvdHRsZWQsIGZsdXNoRG93bmxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25Eb3dubG9hZFByb2dyZXNzLCB0cnVlKSk7XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgZG93bmxvYWRUaHJvdHRsZWQpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKG9uVXBsb2FkUHJvZ3Jlc3MgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIChbdXBsb2FkVGhyb3R0bGVkLCBmbHVzaFVwbG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvblVwbG9hZFByb2dyZXNzKSk7XG5cbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdXBsb2FkVGhyb3R0bGVkKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVuZCcsIGZsdXNoVXBsb2FkKTtcbiAgICB9XG5cbiAgICBpZiAoX2NvbmZpZy5jYW5jZWxUb2tlbiB8fCBfY29uZmlnLnNpZ25hbCkge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIG9uQ2FuY2VsZWQgPSBjYW5jZWwgPT4ge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCFjYW5jZWwgfHwgY2FuY2VsLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcXVlc3QpIDogY2FuY2VsKTtcbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG4gICAgICBpZiAoX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgX2NvbmZpZy5zaWduYWwuYWJvcnRlZCA/IG9uQ2FuY2VsZWQoKSA6IF9jb25maWcuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwYXJzZVByb3RvY29sKF9jb25maWcudXJsKTtcblxuICAgIGlmIChwcm90b2NvbCAmJiBwbGF0Zm9ybS5wcm90b2NvbHMuaW5kZXhPZihwcm90b2NvbCkgPT09IC0xKSB7XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCArICc6JywgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIGNvbmZpZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcbmltcG9ydCBBeGlvcyBmcm9tICcuL2NvcmUvQXhpb3MuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vY29yZS9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbFRva2VuIGZyb20gJy4vY2FuY2VsL0NhbmNlbFRva2VuLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4vZW52L2RhdGEuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHNwcmVhZCBmcm9tICcuL2hlbHBlcnMvc3ByZWFkLmpzJztcbmltcG9ydCBpc0F4aW9zRXJyb3IgZnJvbSAnLi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSAnLi9hZGFwdGVycy9hZGFwdGVycy5qcyc7XG5pbXBvcnQgSHR0cFN0YXR1c0NvZGUgZnJvbSAnLi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxuY29uc3QgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW47XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuYXhpb3MuVkVSU0lPTiA9IFZFUlNJT047XG5heGlvcy50b0Zvcm1EYXRhID0gdG9Gb3JtRGF0YTtcblxuLy8gRXhwb3NlIEF4aW9zRXJyb3IgY2xhc3NcbmF4aW9zLkF4aW9zRXJyb3IgPSBBeGlvc0Vycm9yO1xuXG4vLyBhbGlhcyBmb3IgQ2FuY2VsZWRFcnJvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuYXhpb3MuQ2FuY2VsID0gYXhpb3MuQ2FuY2VsZWRFcnJvcjtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcblxuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBpc0F4aW9zRXJyb3I7XG5cbi8vIEV4cG9zZSBtZXJnZUNvbmZpZ1xuYXhpb3MubWVyZ2VDb25maWcgPSBtZXJnZUNvbmZpZztcblxuYXhpb3MuQXhpb3NIZWFkZXJzID0gQXhpb3NIZWFkZXJzO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZTtcblxuYXhpb3MuZGVmYXVsdCA9IGF4aW9zO1xuXG4vLyB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBoYXZlIGEgZGVmYXVsdCBleHBvcnRcbmV4cG9ydCBkZWZhdWx0IGF4aW9zXG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vQ2FuY2VsZWRFcnJvci5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgdG9BYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgYWJvcnQgPSAoZXJyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KGVycik7XG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIGNvbnRyb2xsZXIuc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdGhpcy51bnN1YnNjcmliZShhYm9ydCk7XG5cbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxUb2tlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsZWRFcnJvcmAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdD19IHJlcXVlc3QgVGhlIHJlcXVlc3QuXG4gKlxuICogQHJldHVybnMge0NhbmNlbGVkRXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgQXhpb3NFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UgPT0gbnVsbCA/ICdjYW5jZWxlZCcgOiBtZXNzYWdlLCBBeGlvc0Vycm9yLkVSUl9DQU5DRUxFRCwgY29uZmlnLCByZXF1ZXN0KTtcbiAgdGhpcy5uYW1lID0gJ0NhbmNlbGVkRXJyb3InO1xufVxuXG51dGlscy5pbmhlcml0cyhDYW5jZWxlZEVycm9yLCBBeGlvc0Vycm9yLCB7XG4gIF9fQ0FOQ0VMX186IHRydWVcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxlZEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBidWlsZFVSTCBmcm9tICcuLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBJbnRlcmNlcHRvck1hbmFnZXIgZnJvbSAnLi9JbnRlcmNlcHRvck1hbmFnZXIuanMnO1xuaW1wb3J0IGRpc3BhdGNoUmVxdWVzdCBmcm9tICcuL2Rpc3BhdGNoUmVxdWVzdC5qcyc7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSAnLi9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tICcuL2J1aWxkRnVsbFBhdGguanMnO1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcuLi9oZWxwZXJzL3ZhbGlkYXRvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4vQXhpb3NIZWFkZXJzLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5jbGFzcyBBeGlvcyB7XG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICBhc3luYyByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbGV0IGR1bW15ID0ge307XG5cbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSkgOiAoZHVtbXkgPSBuZXcgRXJyb3IoKSk7XG5cbiAgICAgICAgLy8gc2xpY2Ugb2ZmIHRoZSBFcnJvcjogLi4uIGxpbmVcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBkdW1teS5zdGFjayA/IGR1bW15LnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sICcnKSA6ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFjayAmJiAhU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2sucmVwbGFjZSgvXi4rXFxuLitcXG4vLCAnJykpKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgKz0gJ1xcbicgKyBzdGFja1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGUgY2FzZSB3aGVyZSBcInN0YWNrXCIgaXMgYW4gdW4td3JpdGFibGUgcHJvcGVydHlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBjb25maWdPclVybCB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgY29uc3Qge3RyYW5zaXRpb25hbCwgcGFyYW1zU2VyaWFsaXplciwgaGVhZGVyc30gPSBjb25maWc7XG5cbiAgICBpZiAodHJhbnNpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgICBzaWxlbnRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zU2VyaWFsaXplciAhPSBudWxsKSB7XG4gICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMocGFyYW1zU2VyaWFsaXplciwge1xuICAgICAgICAgIGVuY29kZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICBzZXJpYWxpemU6IHZhbGlkYXRvcnMuZnVuY3Rpb25cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbmZpZy5hbGxvd0Fic29sdXRlVXJsc1xuICAgIGlmIChjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKGNvbmZpZywge1xuICAgICAgYmFzZVVybDogdmFsaWRhdG9ycy5zcGVsbGluZygnYmFzZVVSTCcpLFxuICAgICAgd2l0aFhzcmZUb2tlbjogdmFsaWRhdG9ycy5zcGVsbGluZygnd2l0aFhTUkZUb2tlbicpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICAgIGNvbmZpZy5tZXRob2QgPSAoY29uZmlnLm1ldGhvZCB8fCB0aGlzLmRlZmF1bHRzLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICAgIGxldCBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMubWVyZ2UoXG4gICAgICBoZWFkZXJzLmNvbW1vbixcbiAgICAgIGhlYWRlcnNbY29uZmlnLm1ldGhvZF1cbiAgICApO1xuXG4gICAgaGVhZGVycyAmJiB1dGlscy5mb3JFYWNoKFxuICAgICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgICAobWV0aG9kKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBoZWFkZXJzW21ldGhvZF07XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmNvbmNhdChjb250ZXh0SGVhZGVycywgaGVhZGVycyk7XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gICAgY29uc3QgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICBsZXQgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IucnVuV2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcmNlcHRvci5ydW5XaGVuKGNvbmZpZykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xuXG4gICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgbGV0IHByb21pc2U7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW47XG5cbiAgICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LmJpbmQodGhpcyksIHVuZGVmaW5lZF07XG4gICAgICBjaGFpbi51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoLmFwcGx5KGNoYWluLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgbGVuID0gY2hhaW4ubGVuZ3RoO1xuXG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW5baSsrXSwgY2hhaW5baSsrXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGxlbiA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG5cbiAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwsIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnXSBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBBeGlvc0Vycm9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9ICdBeGlvc0Vycm9yJztcbiAgY29kZSAmJiAodGhpcy5jb2RlID0gY29kZSk7XG4gIGNvbmZpZyAmJiAodGhpcy5jb25maWcgPSBjb25maWcpO1xuICByZXF1ZXN0ICYmICh0aGlzLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzID8gcmVzcG9uc2Uuc3RhdHVzIDogbnVsbDtcbiAgfVxufVxuXG51dGlscy5pbmhlcml0cyhBeGlvc0Vycm9yLCBFcnJvciwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB1dGlscy50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1c1xuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc0Vycm9yLnByb3RvdHlwZTtcbmNvbnN0IGRlc2NyaXB0b3JzID0ge307XG5cbltcbiAgJ0VSUl9CQURfT1BUSU9OX1ZBTFVFJyxcbiAgJ0VSUl9CQURfT1BUSU9OJyxcbiAgJ0VDT05OQUJPUlRFRCcsXG4gICdFVElNRURPVVQnLFxuICAnRVJSX05FVFdPUksnLFxuICAnRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUycsXG4gICdFUlJfREVQUkVDQVRFRCcsXG4gICdFUlJfQkFEX1JFU1BPTlNFJyxcbiAgJ0VSUl9CQURfUkVRVUVTVCcsXG4gICdFUlJfQ0FOQ0VMRUQnLFxuICAnRVJSX05PVF9TVVBQT1JUJyxcbiAgJ0VSUl9JTlZBTElEX1VSTCdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5dLmZvckVhY2goY29kZSA9PiB7XG4gIGRlc2NyaXB0b3JzW2NvZGVdID0ge3ZhbHVlOiBjb2RlfTtcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBeGlvc0Vycm9yLCBkZXNjcmlwdG9ycyk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG5cbiAgdXRpbHMudG9GbGF0T2JqZWN0KGVycm9yLCBheGlvc0Vycm9yLCBmdW5jdGlvbiBmaWx0ZXIob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAhPT0gRXJyb3IucHJvdG90eXBlO1xuICB9LCBwcm9wID0+IHtcbiAgICByZXR1cm4gcHJvcCAhPT0gJ2lzQXhpb3NFcnJvcic7XG4gIH0pO1xuXG4gIEF4aW9zRXJyb3IuY2FsbChheGlvc0Vycm9yLCBlcnJvci5tZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcblxuICBheGlvc0Vycm9yLmNhdXNlID0gZXJyb3I7XG5cbiAgYXhpb3NFcnJvci5uYW1lID0gZXJyb3IubmFtZTtcblxuICBjdXN0b21Qcm9wcyAmJiBPYmplY3QuYXNzaWduKGF4aW9zRXJyb3IsIGN1c3RvbVByb3BzKTtcblxuICByZXR1cm4gYXhpb3NFcnJvcjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgcGFyc2VIZWFkZXJzIGZyb20gJy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzJztcblxuY29uc3QgJGludGVybmFscyA9IFN5bWJvbCgnaW50ZXJuYWxzJyk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlciAmJiBTdHJpbmcoaGVhZGVyKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5zKHN0cikge1xuICBjb25zdCB0b2tlbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCB0b2tlbnNSRSA9IC8oW15cXHMsOz1dKylcXHMqKD86PVxccyooW14sO10rKSk/L2c7XG4gIGxldCBtYXRjaDtcblxuICB3aGlsZSAoKG1hdGNoID0gdG9rZW5zUkUuZXhlYyhzdHIpKSkge1xuICAgIHRva2Vuc1ttYXRjaFsxXV0gPSBtYXRjaFsyXTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmNvbnN0IGlzVmFsaWRIZWFkZXJOYW1lID0gKHN0cikgPT4gL15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChzdHIudHJpbSgpKTtcblxuZnVuY3Rpb24gbWF0Y2hIZWFkZXJWYWx1ZShjb250ZXh0LCB2YWx1ZSwgaGVhZGVyLCBmaWx0ZXIsIGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICBpZiAodXRpbHMuaXNGdW5jdGlvbihmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMsIHZhbHVlLCBoZWFkZXIpO1xuICB9XG5cbiAgaWYgKGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICAgIHZhbHVlID0gaGVhZGVyO1xuICB9XG5cbiAgaWYgKCF1dGlscy5pc1N0cmluZyh2YWx1ZSkpIHJldHVybjtcblxuICBpZiAodXRpbHMuaXNTdHJpbmcoZmlsdGVyKSkge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGZpbHRlcikgIT09IC0xO1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzUmVnRXhwKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QodmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlci50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oW2EtelxcZF0pKFxcdyopL2csICh3LCBjaGFyLCBzdHIpID0+IHtcbiAgICAgIHJldHVybiBjaGFyLnRvVXBwZXJDYXNlKCkgKyBzdHI7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWNjZXNzb3JzKG9iaiwgaGVhZGVyKSB7XG4gIGNvbnN0IGFjY2Vzc29yTmFtZSA9IHV0aWxzLnRvQ2FtZWxDYXNlKCcgJyArIGhlYWRlcik7XG5cbiAgWydnZXQnLCAnc2V0JywgJ2hhcyddLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSArIGFjY2Vzc29yTmFtZSwge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0uY2FsbCh0aGlzLCBoZWFkZXIsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY2xhc3MgQXhpb3NIZWFkZXJzIHtcbiAgY29uc3RydWN0b3IoaGVhZGVycykge1xuICAgIGhlYWRlcnMgJiYgdGhpcy5zZXQoaGVhZGVycyk7XG4gIH1cblxuICBzZXQoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSwgcmV3cml0ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghbEhlYWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoc2VsZiwgbEhlYWRlcik7XG5cbiAgICAgIGlmKCFrZXkgfHwgc2VsZltrZXldID09PSB1bmRlZmluZWQgfHwgX3Jld3JpdGUgPT09IHRydWUgfHwgKF9yZXdyaXRlID09PSB1bmRlZmluZWQgJiYgc2VsZltrZXldICE9PSBmYWxzZSkpIHtcbiAgICAgICAgc2VsZltrZXkgfHwgX2hlYWRlcl0gPSBub3JtYWxpemVWYWx1ZShfdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldEhlYWRlcnMgPSAoaGVhZGVycywgX3Jld3JpdGUpID0+XG4gICAgICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIChfdmFsdWUsIF9oZWFkZXIpID0+IHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSk7XG5cbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChoZWFkZXIpIHx8IGhlYWRlciBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIHNldEhlYWRlcnMoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSlcbiAgICB9IGVsc2UgaWYodXRpbHMuaXNTdHJpbmcoaGVhZGVyKSAmJiAoaGVhZGVyID0gaGVhZGVyLnRyaW0oKSkgJiYgIWlzVmFsaWRIZWFkZXJOYW1lKGhlYWRlcikpIHtcbiAgICAgIHNldEhlYWRlcnMocGFyc2VIZWFkZXJzKGhlYWRlciksIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzSGVhZGVycyhoZWFkZXIpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBoZWFkZXIuZW50cmllcygpKSB7XG4gICAgICAgIHNldEhlYWRlcih2YWx1ZSwga2V5LCByZXdyaXRlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyICE9IG51bGwgJiYgc2V0SGVhZGVyKHZhbHVlT3JSZXdyaXRlLCBoZWFkZXIsIHJld3JpdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KGhlYWRlciwgcGFyc2VyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VyID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5zKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmNhbGwodGhpcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNSZWdFeHAocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhcyhoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgcmV0dXJuICEhKGtleSAmJiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlcikpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkZWxldGUoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGRlbGV0ZUhlYWRlcihfaGVhZGVyKSB7XG4gICAgICBfaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoX2hlYWRlcikge1xuICAgICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIF9oZWFkZXIpO1xuXG4gICAgICAgIGlmIChrZXkgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUoc2VsZiwgc2VsZltrZXldLCBrZXksIG1hdGNoZXIpKSkge1xuICAgICAgICAgIGRlbGV0ZSBzZWxmW2tleV07XG5cbiAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5KGhlYWRlcikpIHtcbiAgICAgIGhlYWRlci5mb3JFYWNoKGRlbGV0ZUhlYWRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZUhlYWRlcihoZWFkZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgY2xlYXIobWF0Y2hlcikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlciwgdHJ1ZSkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBub3JtYWxpemUoZm9ybWF0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShoZWFkZXJzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHNlbGZba2V5XSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZm9ybWF0ID8gZm9ybWF0SGVhZGVyKGhlYWRlcikgOiBTdHJpbmcoaGVhZGVyKS50cmltKCk7XG5cbiAgICAgIGlmIChub3JtYWxpemVkICE9PSBoZWFkZXIpIHtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgIH1cblxuICAgICAgc2VsZltub3JtYWxpemVkXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcblxuICAgICAgaGVhZGVyc1tub3JtYWxpemVkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbmNhdCguLi50YXJnZXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsIC4uLnRhcmdldHMpO1xuICB9XG5cbiAgdG9KU09OKGFzU3RyaW5ncykge1xuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB1dGlscy5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSAmJiAob2JqW2hlYWRlcl0gPSBhc1N0cmluZ3MgJiYgdXRpbHMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsICcpIDogdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbaGVhZGVyLCB2YWx1ZV0pID0+IGhlYWRlciArICc6ICcgKyB2YWx1ZSkuam9pbignXFxuJyk7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBeGlvc0hlYWRlcnMnO1xuICB9XG5cbiAgc3RhdGljIGZyb20odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiB0aGlzID8gdGhpbmcgOiBuZXcgdGhpcyh0aGluZyk7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGZpcnN0LCAuLi50YXJnZXRzKSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBuZXcgdGhpcyhmaXJzdCk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gY29tcHV0ZWQuc2V0KHRhcmdldCkpO1xuXG4gICAgcmV0dXJuIGNvbXB1dGVkO1xuICB9XG5cbiAgc3RhdGljIGFjY2Vzc29yKGhlYWRlcikge1xuICAgIGNvbnN0IGludGVybmFscyA9IHRoaXNbJGludGVybmFsc10gPSAodGhpc1skaW50ZXJuYWxzXSA9IHtcbiAgICAgIGFjY2Vzc29yczoge31cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IGludGVybmFscy5hY2Nlc3NvcnM7XG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVBY2Nlc3NvcihfaGVhZGVyKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWFjY2Vzc29yc1tsSGVhZGVyXSkge1xuICAgICAgICBidWlsZEFjY2Vzc29ycyhwcm90b3R5cGUsIF9oZWFkZXIpO1xuICAgICAgICBhY2Nlc3NvcnNbbEhlYWRlcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzLmlzQXJyYXkoaGVhZGVyKSA/IGhlYWRlci5mb3JFYWNoKGRlZmluZUFjY2Vzc29yKSA6IGRlZmluZUFjY2Vzc29yKGhlYWRlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5BeGlvc0hlYWRlcnMuYWNjZXNzb3IoWydDb250ZW50LVR5cGUnLCAnQ29udGVudC1MZW5ndGgnLCAnQWNjZXB0JywgJ0FjY2VwdC1FbmNvZGluZycsICdVc2VyLUFnZW50JywgJ0F1dGhvcml6YXRpb24nXSk7XG5cbi8vIHJlc2VydmVkIG5hbWVzIGhvdGZpeFxudXRpbHMucmVkdWNlRGVzY3JpcHRvcnMoQXhpb3NIZWFkZXJzLnByb3RvdHlwZSwgKHt2YWx1ZX0sIGtleSkgPT4ge1xuICBsZXQgbWFwcGVkID0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7IC8vIG1hcCBgc2V0YCA9PiBgU2V0YFxuICByZXR1cm4ge1xuICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgc2V0KGhlYWRlclZhbHVlKSB7XG4gICAgICB0aGlzW21hcHBlZF0gPSBoZWFkZXJWYWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG51dGlscy5mcmVlemVNZXRob2RzKEF4aW9zSGVhZGVycyk7XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zSGVhZGVycztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG5jbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICovXG4gIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgc3luY2hyb25vdXM6IG9wdGlvbnMgPyBvcHRpb25zLnN5bmNocm9ub3VzIDogZmFsc2UsXG4gICAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW50ZXJjZXB0b3Igd2FzIHJlbW92ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBlamVjdChpZCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAgICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChmbikge1xuICAgIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgICAgZm4oaCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgaXNBYnNvbHV0ZVVSTCBmcm9tICcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMnO1xuaW1wb3J0IGNvbWJpbmVVUkxzIGZyb20gJy4uL2hlbHBlcnMvY29tYmluZVVSTHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwsIGFsbG93QWJzb2x1dGVVcmxzKSB7XG4gIGxldCBpc1JlbGF0aXZlVXJsID0gIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKTtcbiAgaWYgKGJhc2VVUkwgJiYgaXNSZWxhdGl2ZVVybCB8fCBhbGxvd0Fic29sdXRlVXJscyA9PSBmYWxzZSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0cmFuc2Zvcm1EYXRhIGZyb20gJy4vdHJhbnNmb3JtRGF0YS5qcyc7XG5pbXBvcnQgaXNDYW5jZWwgZnJvbSAnLi4vY2FuY2VsL2lzQ2FuY2VsLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCBhZGFwdGVycyBmcm9tIFwiLi4vYWRhcHRlcnMvYWRhcHRlcnMuanNcIjtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbmZpZy5oZWFkZXJzKTtcblxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXG4gIGNvbmZpZy5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgIGNvbmZpZyxcbiAgICBjb25maWcudHJhbnNmb3JtUmVxdWVzdFxuICApO1xuXG4gIGlmIChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10uaW5kZXhPZihjb25maWcubWV0aG9kKSAhPT0gLTEpIHtcbiAgICBjb25maWcuaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywgZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgYWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXIoY29uZmlnLmFkYXB0ZXIgfHwgZGVmYXVsdHMuYWRhcHRlcik7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICByZXNwb25zZVxuICAgICk7XG5cbiAgICByZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20ocmVhc29uLnJlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSBcIi4vQXhpb3NIZWFkZXJzLmpzXCI7XG5cbmNvbnN0IGhlYWRlcnNUb09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgaW5zdGFuY2VvZiBBeGlvc0hlYWRlcnMgPyB7IC4uLnRoaW5nIH0gOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIHByb3AsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiB1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBwcm9wICwgY2FzZWxlc3MpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYiwgcHJvcCAsIGNhc2VsZXNzKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSwgcHJvcCAsIGNhc2VsZXNzKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEaXJlY3RLZXlzKGEsIGIsIHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYik7XG4gICAgfSBlbHNlIGlmIChwcm9wIGluIGNvbmZpZzEpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlTWFwID0ge1xuICAgIHVybDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBtZXRob2Q6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgZGF0YTogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBiYXNlVVJMOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXRNZXNzYWdlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhDcmVkZW50aWFsczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoWFNSRlRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGFkYXB0ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VUeXBlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZDb29raWVOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZIZWFkZXJOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGRlY29tcHJlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Q29udGVudExlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhCb2R5TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGJlZm9yZVJlZGlyZWN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zcG9ydDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cHNBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBjYW5jZWxUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBzb2NrZXRQYXRoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlRW5jb2Rpbmc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdmFsaWRhdGVTdGF0dXM6IG1lcmdlRGlyZWN0S2V5cyxcbiAgICBoZWFkZXJzOiAoYSwgYiAsIHByb3ApID0+IG1lcmdlRGVlcFByb3BlcnRpZXMoaGVhZGVyc1RvT2JqZWN0KGEpLCBoZWFkZXJzVG9PYmplY3QoYikscHJvcCwgdHJ1ZSlcbiAgfTtcblxuICB1dGlscy5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZzEsIGNvbmZpZzIpKSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW3Byb3BdIHx8IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdLCBwcm9wKTtcbiAgICAodXRpbHMuaXNVbmRlZmluZWQoY29uZmlnVmFsdWUpICYmIG1lcmdlICE9PSBtZXJnZURpcmVjdEtleXMpIHx8IChjb25maWdbcHJvcF0gPSBjb25maWdWYWx1ZSk7XG4gIH0pO1xuXG4gIHJldHVybiBjb25maWc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vQXhpb3NFcnJvci5qcyc7XG5cbi8qKlxuICogUmVzb2x2ZSBvciByZWplY3QgYSBQcm9taXNlIGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCBBIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICBjb25zdCB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgW0F4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IocmVzcG9uc2Uuc3RhdHVzIC8gMTAwKSAtIDRdLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL2luZGV4LmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi4vY29yZS9BeGlvc0hlYWRlcnMuanMnO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZm5zLCByZXNwb25zZSkge1xuICBjb25zdCBjb25maWcgPSB0aGlzIHx8IGRlZmF1bHRzO1xuICBjb25zdCBjb250ZXh0ID0gcmVzcG9uc2UgfHwgY29uZmlnO1xuICBjb25zdCBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29udGV4dC5oZWFkZXJzKTtcbiAgbGV0IGRhdGEgPSBjb250ZXh0LmRhdGE7XG5cbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xuICAgIGRhdGEgPSBmbi5jYWxsKGNvbmZpZywgZGF0YSwgaGVhZGVycy5ub3JtYWxpemUoKSwgcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiB1bmRlZmluZWQpO1xuICB9KTtcblxuICBoZWFkZXJzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IHRvVVJMRW5jb2RlZEZvcm0gZnJvbSAnLi4vaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcsIHRyaWVzIHRvIHBhcnNlIGl0LCBhbmQgaWYgaXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7YW55fSByYXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcnNlciAtIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBzdHJpbmcgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlciAtIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgcmF3VmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscy5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG5jb25zdCBkZWZhdWx0cyA9IHtcblxuICB0cmFuc2l0aW9uYWw6IHRyYW5zaXRpb25hbERlZmF1bHRzLFxuXG4gIGFkYXB0ZXI6IFsneGhyJywgJ2h0dHAnLCAnZmV0Y2gnXSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzLmdldENvbnRlbnRUeXBlKCkgfHwgJyc7XG4gICAgY29uc3QgaGFzSlNPTkNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID4gLTE7XG4gICAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdXRpbHMuaXNPYmplY3QoZGF0YSk7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkICYmIHV0aWxzLmlzSFRNTEZvcm0oZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGb3JtRGF0YSA9IHV0aWxzLmlzRm9ybURhdGEoZGF0YSk7XG5cbiAgICBpZiAoaXNGb3JtRGF0YSkge1xuICAgICAgcmV0dXJuIGhhc0pTT05Db250ZW50VHlwZSA/IEpTT04uc3RyaW5naWZ5KGZvcm1EYXRhVG9KU09OKGRhdGEpKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzUmVhZGFibGVTdHJlYW0oZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscy5pc0ZpbGVMaXN0KGRhdGEpKSB8fCBjb250ZW50VHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPiAtMSkge1xuICAgICAgICBjb25zdCBfRm9ybURhdGEgPSB0aGlzLmVudiAmJiB0aGlzLmVudi5Gb3JtRGF0YTtcblxuICAgICAgICByZXR1cm4gdG9Gb3JtRGF0YShcbiAgICAgICAgICBpc0ZpbGVMaXN0ID8geydmaWxlc1tdJzogZGF0YX0gOiBkYXRhLFxuICAgICAgICAgIF9Gb3JtRGF0YSAmJiBuZXcgX0Zvcm1EYXRhKCksXG4gICAgICAgICAgdGhpcy5mb3JtU2VyaWFsaXplclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgfHwgaGFzSlNPTkNvbnRlbnRUeXBlICkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24vanNvbicsIGZhbHNlKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICBjb25zdCBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgY29uc3QgSlNPTlJlcXVlc3RlZCA9IHRoaXMucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICBpZiAodXRpbHMuaXNSZXNwb25zZShkYXRhKSB8fCB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscy5pc1N0cmluZyhkYXRhKSAmJiAoKGZvcmNlZEpTT05QYXJzaW5nICYmICF0aGlzLnJlc3BvbnNlVHlwZSkgfHwgSlNPTlJlcXVlc3RlZCkpIHtcbiAgICAgIGNvbnN0IHNpbGVudEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5zaWxlbnRKU09OUGFyc2luZztcbiAgICAgIGNvbnN0IHN0cmljdEpTT05QYXJzaW5nID0gIXNpbGVudEpTT05QYXJzaW5nICYmIEpTT05SZXF1ZXN0ZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZSwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLCB0aGlzLCBudWxsLCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgZW52OiB7XG4gICAgRm9ybURhdGE6IHBsYXRmb3JtLmNsYXNzZXMuRm9ybURhdGEsXG4gICAgQmxvYjogcGxhdGZvcm0uY2xhc3Nlcy5CbG9iXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkXG4gICAgfVxuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcbiIsImV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIxLjguMlwiOyIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgY29uc3QgY2hhck1hcCA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgIFwiJ1wiOiAnJTI3JyxcbiAgICAnKCc6ICclMjgnLFxuICAgICcpJzogJyUyOScsXG4gICAgJ34nOiAnJTdFJyxcbiAgICAnJTIwJzogJysnLFxuICAgICclMDAnOiAnXFx4MDAnXG4gIH07XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKX5dfCUyMHwlMDAvZywgZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgICByZXR1cm4gY2hhck1hcFttYXRjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGFyYW1zIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBhIEZvcm1EYXRhIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEF4aW9zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5fcGFpcnMgPSBbXTtcblxuICBwYXJhbXMgJiYgdG9Gb3JtRGF0YShwYXJhbXMsIHRoaXMsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc1VSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG5cbnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fcGFpcnMucHVzaChbbmFtZSwgdmFsdWVdKTtcbn07XG5cbnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGVuY29kZXIpIHtcbiAgY29uc3QgX2VuY29kZSA9IGVuY29kZXIgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVyLmNhbGwodGhpcywgdmFsdWUsIGVuY29kZSk7XG4gIH0gOiBlbmNvZGU7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gIH0sICcnKS5qb2luKCcmJyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsImNvbnN0IEh0dHBTdGF0dXNDb2RlID0ge1xuICBDb250aW51ZTogMTAwLFxuICBTd2l0Y2hpbmdQcm90b2NvbHM6IDEwMSxcbiAgUHJvY2Vzc2luZzogMTAyLFxuICBFYXJseUhpbnRzOiAxMDMsXG4gIE9rOiAyMDAsXG4gIENyZWF0ZWQ6IDIwMSxcbiAgQWNjZXB0ZWQ6IDIwMixcbiAgTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uOiAyMDMsXG4gIE5vQ29udGVudDogMjA0LFxuICBSZXNldENvbnRlbnQ6IDIwNSxcbiAgUGFydGlhbENvbnRlbnQ6IDIwNixcbiAgTXVsdGlTdGF0dXM6IDIwNyxcbiAgQWxyZWFkeVJlcG9ydGVkOiAyMDgsXG4gIEltVXNlZDogMjI2LFxuICBNdWx0aXBsZUNob2ljZXM6IDMwMCxcbiAgTW92ZWRQZXJtYW5lbnRseTogMzAxLFxuICBGb3VuZDogMzAyLFxuICBTZWVPdGhlcjogMzAzLFxuICBOb3RNb2RpZmllZDogMzA0LFxuICBVc2VQcm94eTogMzA1LFxuICBVbnVzZWQ6IDMwNixcbiAgVGVtcG9yYXJ5UmVkaXJlY3Q6IDMwNyxcbiAgUGVybWFuZW50UmVkaXJlY3Q6IDMwOCxcbiAgQmFkUmVxdWVzdDogNDAwLFxuICBVbmF1dGhvcml6ZWQ6IDQwMSxcbiAgUGF5bWVudFJlcXVpcmVkOiA0MDIsXG4gIEZvcmJpZGRlbjogNDAzLFxuICBOb3RGb3VuZDogNDA0LFxuICBNZXRob2ROb3RBbGxvd2VkOiA0MDUsXG4gIE5vdEFjY2VwdGFibGU6IDQwNixcbiAgUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOiA0MDcsXG4gIFJlcXVlc3RUaW1lb3V0OiA0MDgsXG4gIENvbmZsaWN0OiA0MDksXG4gIEdvbmU6IDQxMCxcbiAgTGVuZ3RoUmVxdWlyZWQ6IDQxMSxcbiAgUHJlY29uZGl0aW9uRmFpbGVkOiA0MTIsXG4gIFBheWxvYWRUb29MYXJnZTogNDEzLFxuICBVcmlUb29Mb25nOiA0MTQsXG4gIFVuc3VwcG9ydGVkTWVkaWFUeXBlOiA0MTUsXG4gIFJhbmdlTm90U2F0aXNmaWFibGU6IDQxNixcbiAgRXhwZWN0YXRpb25GYWlsZWQ6IDQxNyxcbiAgSW1BVGVhcG90OiA0MTgsXG4gIE1pc2RpcmVjdGVkUmVxdWVzdDogNDIxLFxuICBVbnByb2Nlc3NhYmxlRW50aXR5OiA0MjIsXG4gIExvY2tlZDogNDIzLFxuICBGYWlsZWREZXBlbmRlbmN5OiA0MjQsXG4gIFRvb0Vhcmx5OiA0MjUsXG4gIFVwZ3JhZGVSZXF1aXJlZDogNDI2LFxuICBQcmVjb25kaXRpb25SZXF1aXJlZDogNDI4LFxuICBUb29NYW55UmVxdWVzdHM6IDQyOSxcbiAgUmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlOiA0MzEsXG4gIFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOiA0NTEsXG4gIEludGVybmFsU2VydmVyRXJyb3I6IDUwMCxcbiAgTm90SW1wbGVtZW50ZWQ6IDUwMSxcbiAgQmFkR2F0ZXdheTogNTAyLFxuICBTZXJ2aWNlVW5hdmFpbGFibGU6IDUwMyxcbiAgR2F0ZXdheVRpbWVvdXQ6IDUwNCxcbiAgSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6IDUwNSxcbiAgVmFyaWFudEFsc29OZWdvdGlhdGVzOiA1MDYsXG4gIEluc3VmZmljaWVudFN0b3JhZ2U6IDUwNyxcbiAgTG9vcERldGVjdGVkOiA1MDgsXG4gIE5vdEV4dGVuZGVkOiA1MTAsXG4gIE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkOiA1MTEsXG59O1xuXG5PYmplY3QuZW50cmllcyhIdHRwU3RhdHVzQ29kZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gIEh0dHBTdGF0dXNDb2RlW3ZhbHVlXSA9IGtleTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBIdHRwU3RhdHVzQ29kZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBmcm9tICcuLi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzJztcblxuLyoqXG4gKiBJdCByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjaGFyYWN0ZXJzIGA6YCwgYCRgLCBgLGAsIGArYCwgYFtgLCBhbmQgYF1gIHdpdGggdGhlaXJcbiAqIFVSSSBlbmNvZGVkIGNvdW50ZXJwYXJ0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIHZhbHVlIHRvIGJlIGVuY29kZWQuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcGFyYW0gez8ob2JqZWN0fEZ1bmN0aW9uKX0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgXG4gIGNvbnN0IF9lbmNvZGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RlIHx8IGVuY29kZTtcblxuICBpZiAodXRpbHMuaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBzZXJpYWxpemU6IG9wdGlvbnNcbiAgICB9O1xuICB9IFxuXG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZTtcblxuICBsZXQgc2VyaWFsaXplZFBhcmFtcztcblxuICBpZiAoc2VyaWFsaXplRm4pIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gc2VyaWFsaXplRm4ocGFyYW1zLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvP1xcLyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn1cbiIsImltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gXCIuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qc1wiO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuY29uc3QgY29tcG9zZVNpZ25hbHMgPSAoc2lnbmFscywgdGltZW91dCkgPT4ge1xuICBjb25zdCB7bGVuZ3RofSA9IChzaWduYWxzID0gc2lnbmFscyA/IHNpZ25hbHMuZmlsdGVyKEJvb2xlYW4pIDogW10pO1xuXG4gIGlmICh0aW1lb3V0IHx8IGxlbmd0aCkge1xuICAgIGxldCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgbGV0IGFib3J0ZWQ7XG5cbiAgICBjb25zdCBvbmFib3J0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaWYgKCFhYm9ydGVkKSB7XG4gICAgICAgIGFib3J0ZWQgPSB0cnVlO1xuICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICBjb25zdCBlcnIgPSByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbiA6IHRoaXMucmVhc29uO1xuICAgICAgICBjb250cm9sbGVyLmFib3J0KGVyciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IgPyBlcnIgOiBuZXcgQ2FuY2VsZWRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRpbWVyID0gdGltZW91dCAmJiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIG9uYWJvcnQobmV3IEF4aW9zRXJyb3IoYHRpbWVvdXQgJHt0aW1lb3V0fSBvZiBtcyBleGNlZWRlZGAsIEF4aW9zRXJyb3IuRVRJTUVET1VUKSlcbiAgICB9LCB0aW1lb3V0KVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICBpZiAoc2lnbmFscykge1xuICAgICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgIHNpZ25hbHMuZm9yRWFjaChzaWduYWwgPT4ge1xuICAgICAgICAgIHNpZ25hbC51bnN1YnNjcmliZSA/IHNpZ25hbC51bnN1YnNjcmliZShvbmFib3J0KSA6IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uYWJvcnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2lnbmFscyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2lnbmFscy5mb3JFYWNoKChzaWduYWwpID0+IHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uYWJvcnQpKTtcblxuICAgIGNvbnN0IHtzaWduYWx9ID0gY29udHJvbGxlcjtcblxuICAgIHNpZ25hbC51bnN1YnNjcmliZSA9ICgpID0+IHV0aWxzLmFzYXAodW5zdWJzY3JpYmUpO1xuXG4gICAgcmV0dXJuIHNpZ25hbDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjb21wb3NlU2lnbmFscztcbiIsImltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gIHtcbiAgICB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IFtuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKV07XG5cbiAgICAgIHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpICYmIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcblxuICAgICAgdXRpbHMuaXNTdHJpbmcocGF0aCkgJiYgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuXG4gICAgICB1dGlscy5pc1N0cmluZyhkb21haW4pICYmIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG5cbiAgICAgIHNlY3VyZSA9PT0gdHJ1ZSAmJiBjb29raWUucHVzaCgnc2VjdXJlJyk7XG5cbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgIH0sXG5cbiAgICByZWFkKG5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgfSxcblxuICAgIHJlbW92ZShuYW1lKSB7XG4gICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgIH1cbiAgfVxuXG4gIDpcblxuICAvLyBOb24tc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIHtcbiAgICB3cml0ZSgpIHt9LFxuICAgIHJlYWQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHJlbW92ZSgpIHt9XG4gIH07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZyBsaWtlIGBmb29beF1beV1bel1gIGFuZCByZXR1cm5zIGFuIGFycmF5IGxpa2UgYFsnZm9vJywgJ3gnLCAneScsICd6J11cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQcm9wUGF0aChuYW1lKSB7XG4gIC8vIGZvb1t4XVt5XVt6XVxuICAvLyBmb28ueC55LnpcbiAgLy8gZm9vLXgteS16XG4gIC8vIGZvbyB4IHkgelxuICByZXR1cm4gdXRpbHMubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLCBuYW1lKS5tYXAobWF0Y2ggPT4ge1xuICAgIHJldHVybiBtYXRjaFswXSA9PT0gJ1tdJyA/ICcnIDogbWF0Y2hbMV0gfHwgbWF0Y2hbMF07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYXJyYXkgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNvbnZlcnQgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyB0aGUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5VG9PYmplY3QoYXJyKSB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyKTtcbiAgbGV0IGk7XG4gIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICBsZXQga2V5O1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuICAgIG9ialtrZXldID0gYXJyW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIEZvcm1EYXRhIG9iamVjdCBhbmQgcmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gY29udmVydCB0byBKU09OLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3Q8c3RyaW5nLCBhbnk+IHwgbnVsbH0gVGhlIGNvbnZlcnRlZCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGZvcm1EYXRhVG9KU09OKGZvcm1EYXRhKSB7XG4gIGZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0LCBpbmRleCkge1xuICAgIGxldCBuYW1lID0gcGF0aFtpbmRleCsrXTtcblxuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBpc051bWVyaWNLZXkgPSBOdW1iZXIuaXNGaW5pdGUoK25hbWUpO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID49IHBhdGgubGVuZ3RoO1xuICAgIG5hbWUgPSAhbmFtZSAmJiB1dGlscy5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubGVuZ3RoIDogbmFtZTtcblxuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIGlmICh1dGlscy5oYXNPd25Qcm9wKHRhcmdldCwgbmFtZSkpIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gW3RhcmdldFtuYW1lXSwgdmFsdWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0W25hbWVdIHx8ICF1dGlscy5pc09iamVjdCh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldFtuYW1lXSwgaW5kZXgpO1xuXG4gICAgaWYgKHJlc3VsdCAmJiB1dGlscy5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IGFycmF5VG9PYmplY3QodGFyZ2V0W25hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKGZvcm1EYXRhKSAmJiB1dGlscy5pc0Z1bmN0aW9uKGZvcm1EYXRhLmVudHJpZXMpKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICB1dGlscy5mb3JFYWNoRW50cnkoZm9ybURhdGEsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgYnVpbGRQYXRoKHBhcnNlUHJvcFBhdGgobmFtZSksIHZhbHVlLCBvYmosIDApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmb3JtRGF0YVRvSlNPTjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcbiAgLy8gQSBVUkwgaXMgY29uc2lkZXJlZCBhYnNvbHV0ZSBpZiBpdCBiZWdpbnMgd2l0aCBcIjxzY2hlbWU+Oi8vXCIgb3IgXCIvL1wiIChwcm90b2NvbC1yZWxhdGl2ZSBVUkwpLlxuICAvLyBSRkMgMzk4NiBkZWZpbmVzIHNjaGVtZSBuYW1lIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZWdpbm5pbmcgd2l0aCBhIGxldHRlciBhbmQgZm9sbG93ZWRcbiAgLy8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXG4gIHJldHVybiAvXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvc1xuICpcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvcywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQXhpb3NFcnJvcihwYXlsb2FkKSB7XG4gIHJldHVybiB1dGlscy5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufVxuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID8gKChvcmlnaW4sIGlzTVNJRSkgPT4gKHVybCkgPT4ge1xuICB1cmwgPSBuZXcgVVJMKHVybCwgcGxhdGZvcm0ub3JpZ2luKTtcblxuICByZXR1cm4gKFxuICAgIG9yaWdpbi5wcm90b2NvbCA9PT0gdXJsLnByb3RvY29sICYmXG4gICAgb3JpZ2luLmhvc3QgPT09IHVybC5ob3N0ICYmXG4gICAgKGlzTVNJRSB8fCBvcmlnaW4ucG9ydCA9PT0gdXJsLnBvcnQpXG4gICk7XG59KShcbiAgbmV3IFVSTChwbGF0Zm9ybS5vcmlnaW4pLFxuICBwbGF0Zm9ybS5uYXZpZ2F0b3IgJiYgLyhtc2llfHRyaWRlbnQpL2kudGVzdChwbGF0Zm9ybS5uYXZpZ2F0b3IudXNlckFnZW50KVxuKSA6ICgpID0+IHRydWU7XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG5leHBvcnQgZGVmYXVsdCBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbi8vIFJhd0F4aW9zSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbmNvbnN0IGlnbm9yZUR1cGxpY2F0ZU9mID0gdXRpbHMudG9PYmplY3RTZXQoW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl0pO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmF3SGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKlxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgcmF3SGVhZGVycyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHt9O1xuICBsZXQga2V5O1xuICBsZXQgdmFsO1xuICBsZXQgaTtcblxuICByYXdIZWFkZXJzICYmIHJhd0hlYWRlcnMuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gbGluZS5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcblxuICAgIGlmICgha2V5IHx8IChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZltrZXldKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgaWYgKHBhcnNlZFtrZXldKSB7XG4gICAgICAgIHBhcnNlZFtrZXldLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gW3ZhbF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VQcm90b2NvbCh1cmwpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyh1cmwpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG59XG4iLCJpbXBvcnQgc3BlZWRvbWV0ZXIgZnJvbSBcIi4vc3BlZWRvbWV0ZXIuanNcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwiLi90aHJvdHRsZS5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuXG5leHBvcnQgY29uc3QgcHJvZ3Jlc3NFdmVudFJlZHVjZXIgPSAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGUsXG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiB0b3RhbCAhPSBudWxsLFxuICAgICAgW2lzRG93bmxvYWRTdHJlYW0gPyAnZG93bmxvYWQnIDogJ3VwbG9hZCddOiB0cnVlXG4gICAgfTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9LCBmcmVxKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2dyZXNzRXZlbnREZWNvcmF0b3IgPSAodG90YWwsIHRocm90dGxlZCkgPT4ge1xuICBjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT0gbnVsbDtcblxuICByZXR1cm4gWyhsb2FkZWQpID0+IHRocm90dGxlZFswXSh7XG4gICAgbGVuZ3RoQ29tcHV0YWJsZSxcbiAgICB0b3RhbCxcbiAgICBsb2FkZWRcbiAgfSksIHRocm90dGxlZFsxXV07XG59XG5cbmV4cG9ydCBjb25zdCBhc3luY0RlY29yYXRvciA9IChmbikgPT4gKC4uLmFyZ3MpID0+IHV0aWxzLmFzYXAoKCkgPT4gZm4oLi4uYXJncykpO1xuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gXCIuLi9wbGF0Zm9ybS9pbmRleC5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IGlzVVJMU2FtZU9yaWdpbiBmcm9tIFwiLi9pc1VSTFNhbWVPcmlnaW4uanNcIjtcbmltcG9ydCBjb29raWVzIGZyb20gXCIuL2Nvb2tpZXMuanNcIjtcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gXCIuLi9jb3JlL2J1aWxkRnVsbFBhdGguanNcIjtcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tIFwiLi4vY29yZS9tZXJnZUNvbmZpZy5qc1wiO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi4vY29yZS9BeGlvc0hlYWRlcnMuanNcIjtcbmltcG9ydCBidWlsZFVSTCBmcm9tIFwiLi9idWlsZFVSTC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoY29uZmlnKSA9PiB7XG4gIGNvbnN0IG5ld0NvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuXG4gIGxldCB7ZGF0YSwgd2l0aFhTUkZUb2tlbiwgeHNyZkhlYWRlck5hbWUsIHhzcmZDb29raWVOYW1lLCBoZWFkZXJzLCBhdXRofSA9IG5ld0NvbmZpZztcblxuICBuZXdDb25maWcuaGVhZGVycyA9IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShoZWFkZXJzKTtcblxuICBuZXdDb25maWcudXJsID0gYnVpbGRVUkwoYnVpbGRGdWxsUGF0aChuZXdDb25maWcuYmFzZVVSTCwgbmV3Q29uZmlnLnVybCksIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcblxuICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gIGlmIChhdXRoKSB7XG4gICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArXG4gICAgICBidG9hKChhdXRoLnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChhdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgucGFzc3dvcmQpKSA6ICcnKSlcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvbnRlbnRUeXBlO1xuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscy5pc0Z1bmN0aW9uKHdpdGhYU1JGVG9rZW4pICYmICh3aXRoWFNSRlRva2VuID0gd2l0aFhTUkZUb2tlbihuZXdDb25maWcpKTtcblxuICAgIGlmICh3aXRoWFNSRlRva2VuIHx8ICh3aXRoWFNSRlRva2VuICE9PSBmYWxzZSAmJiBpc1VSTFNhbWVPcmlnaW4obmV3Q29uZmlnLnVybCkpKSB7XG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIGNvbnN0IHhzcmZWYWx1ZSA9IHhzcmZIZWFkZXJOYW1lICYmIHhzcmZDb29raWVOYW1lICYmIGNvb2tpZXMucmVhZCh4c3JmQ29va2llTmFtZSk7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgaGVhZGVycy5zZXQoeHNyZkhlYWRlck5hbWUsIHhzcmZWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NvbmZpZztcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENhbGN1bGF0ZSBkYXRhIG1heFJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlc0NvdW50PSAxMF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWluPSAxMDAwXVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBzcGVlZG9tZXRlcihzYW1wbGVzQ291bnQsIG1pbikge1xuICBzYW1wbGVzQ291bnQgPSBzYW1wbGVzQ291bnQgfHwgMTA7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGNvbnN0IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgbGV0IGhlYWQgPSAwO1xuICBsZXQgdGFpbCA9IDA7XG4gIGxldCBmaXJzdFNhbXBsZVRTO1xuXG4gIG1pbiA9IG1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogMTAwMDtcblxuICByZXR1cm4gZnVuY3Rpb24gcHVzaChjaHVua0xlbmd0aCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aW1lc3RhbXBzW3RhaWxdO1xuXG4gICAgaWYgKCFmaXJzdFNhbXBsZVRTKSB7XG4gICAgICBmaXJzdFNhbXBsZVRTID0gbm93O1xuICAgIH1cblxuICAgIGJ5dGVzW2hlYWRdID0gY2h1bmtMZW5ndGg7XG4gICAgdGltZXN0YW1wc1toZWFkXSA9IG5vdztcblxuICAgIGxldCBpID0gdGFpbDtcbiAgICBsZXQgYnl0ZXNDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaSAhPT0gaGVhZCkge1xuICAgICAgYnl0ZXNDb3VudCArPSBieXRlc1tpKytdO1xuICAgICAgaSA9IGkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IChoZWFkICsgMSkgJSBzYW1wbGVzQ291bnQ7XG5cbiAgICBpZiAoaGVhZCA9PT0gdGFpbCkge1xuICAgICAgdGFpbCA9ICh0YWlsICsgMSkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vdyAtIGZpcnN0U2FtcGxlVFMgPCBtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzZWQgPSBzdGFydGVkQXQgJiYgbm93IC0gc3RhcnRlZEF0O1xuXG4gICAgcmV0dXJuIHBhc3NlZCA/IE1hdGgucm91bmQoYnl0ZXNDb3VudCAqIDEwMDAgLyBwYXNzZWQpIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBzcGVlZG9tZXRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59XG4iLCIvKipcbiAqIFRocm90dGxlIGRlY29yYXRvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmcmVxXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUoZm4sIGZyZXEpIHtcbiAgbGV0IHRpbWVzdGFtcCA9IDA7XG4gIGxldCB0aHJlc2hvbGQgPSAxMDAwIC8gZnJlcTtcbiAgbGV0IGxhc3RBcmdzO1xuICBsZXQgdGltZXI7XG5cbiAgY29uc3QgaW52b2tlID0gKGFyZ3MsIG5vdyA9IERhdGUubm93KCkpID0+IHtcbiAgICB0aW1lc3RhbXAgPSBub3c7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIH1cblxuICBjb25zdCB0aHJvdHRsZWQgPSAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcGFzc2VkID0gbm93IC0gdGltZXN0YW1wO1xuICAgIGlmICggcGFzc2VkID49IHRocmVzaG9sZCkge1xuICAgICAgaW52b2tlKGFyZ3MsIG5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RBcmdzID0gYXJncztcbiAgICAgIGlmICghdGltZXIpIHtcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgICAgaW52b2tlKGxhc3RBcmdzKVxuICAgICAgICB9LCB0aHJlc2hvbGQgLSBwYXNzZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZsdXNoID0gKCkgPT4gbGFzdEFyZ3MgJiYgaW52b2tlKGxhc3RBcmdzKTtcblxuICByZXR1cm4gW3Rocm90dGxlZCwgZmx1c2hdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0aHJvdHRsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG4vLyB0ZW1wb3JhcnkgaG90Zml4IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMgdW50aWwgQXhpb3NVUkxTZWFyY2hQYXJhbXMgaXMgcmVmYWN0b3JlZFxuaW1wb3J0IFBsYXRmb3JtRm9ybURhdGEgZnJvbSAnLi4vcGxhdGZvcm0vbm9kZS9jbGFzc2VzL0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscy5pc1BsYWluT2JqZWN0KHRoaW5nKSB8fCB1dGlscy5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscy5pc0FycmF5KGFycikgJiYgIWFyci5zb21lKGlzVmlzaXRhYmxlKTtcbn1cblxuY29uc3QgcHJlZGljYXRlcyA9IHV0aWxzLnRvRmxhdE9iamVjdCh1dGlscywge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBmb3JtRGF0YSA9IGZvcm1EYXRhIHx8IG5ldyAoUGxhdGZvcm1Gb3JtRGF0YSB8fCBGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzLnRvRmxhdE9iamVjdChvcHRpb25zLCB7XG4gICAgbWV0YVRva2VuczogdHJ1ZSxcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBpbmRleGVzOiBmYWxzZVxuICB9LCBmYWxzZSwgZnVuY3Rpb24gZGVmaW5lZChvcHRpb24sIHNvdXJjZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgIHJldHVybiAhdXRpbHMuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscy5pc1NwZWNDb21wbGlhbnRGb3JtKGZvcm1EYXRhKTtcblxuICBpZiAoIXV0aWxzLmlzRnVuY3Rpb24odmlzaXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJyc7XG5cbiAgICBpZiAodXRpbHMuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzLmlzQmxvYih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKHZhbHVlKSB8fCB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdXNlQmxvYiAmJiB0eXBlb2YgQmxvYiA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBCbG9iKFt2YWx1ZV0pIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMuZW5kc1dpdGgoa2V5LCAne30nKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gbWV0YVRva2VucyA/IGtleSA6IGtleS5zbGljZSgwLCAtMik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh1dGlscy5pc0FycmF5KHZhbHVlKSAmJiBpc0ZsYXRBcnJheSh2YWx1ZSkpIHx8XG4gICAgICAgICgodXRpbHMuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSkgJiYgKGFyciA9IHV0aWxzLnRvQXJyYXkodmFsdWUpKVxuICAgICAgICApKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSByZW1vdmVCcmFja2V0cyhrZXkpO1xuXG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIGVhY2goZWwsIGluZGV4KSB7XG4gICAgICAgICAgISh1dGlscy5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZSA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpIDogKGluZGV4ZXMgPT09IG51bGwgPyBrZXkgOiBrZXkgKyAnW10nKSxcbiAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGF0aC5qb2luKCcuJykpO1xuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gZWFjaChlbCwga2V5KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgdmlzaXRvci5jYWxsKFxuICAgICAgICBmb3JtRGF0YSwgZWwsIHV0aWxzLmlzU3RyaW5nKGtleSkgPyBrZXkudHJpbSgpIDoga2V5LCBwYXRoLCBleHBvc2VkSGVscGVyc1xuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICBidWlsZChlbCwgcGF0aCA/IHBhdGguY29uY2F0KGtleSkgOiBba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RhdGEgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIGJ1aWxkKG9iaik7XG5cbiAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0Zvcm1EYXRhO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgb3B0aW9ucykge1xuICByZXR1cm4gdG9Gb3JtRGF0YShkYXRhLCBuZXcgcGxhdGZvcm0uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMoKSwgT2JqZWN0LmFzc2lnbih7XG4gICAgdmlzaXRvcjogZnVuY3Rpb24odmFsdWUsIGtleSwgcGF0aCwgaGVscGVycykge1xuICAgICAgaWYgKHBsYXRmb3JtLmlzTm9kZSAmJiB1dGlscy5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCBvcHRpb25zKSk7XG59XG4iLCJcbmV4cG9ydCBjb25zdCBzdHJlYW1DaHVuayA9IGZ1bmN0aW9uKiAoY2h1bmssIGNodW5rU2l6ZSkge1xuICBsZXQgbGVuID0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICBpZiAoIWNodW5rU2l6ZSB8fCBsZW4gPCBjaHVua1NpemUpIHtcbiAgICB5aWVsZCBjaHVuaztcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcG9zID0gMDtcbiAgbGV0IGVuZDtcblxuICB3aGlsZSAocG9zIDwgbGVuKSB7XG4gICAgZW5kID0gcG9zICsgY2h1bmtTaXplO1xuICAgIHlpZWxkIGNodW5rLnNsaWNlKHBvcywgZW5kKTtcbiAgICBwb3MgPSBlbmQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlYWRCeXRlcyA9IGFzeW5jIGZ1bmN0aW9uKiAoaXRlcmFibGUsIGNodW5rU2l6ZSkge1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlYWRTdHJlYW0oaXRlcmFibGUpKSB7XG4gICAgeWllbGQqIHN0cmVhbUNodW5rKGNodW5rLCBjaHVua1NpemUpO1xuICB9XG59XG5cbmNvbnN0IHJlYWRTdHJlYW0gPSBhc3luYyBmdW5jdGlvbiogKHN0cmVhbSkge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHlpZWxkKiBzdHJlYW07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHtkb25lLCB2YWx1ZX0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0cmFja1N0cmVhbSA9IChzdHJlYW0sIGNodW5rU2l6ZSwgb25Qcm9ncmVzcywgb25GaW5pc2gpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7ZG9uZSwgdmFsdWV9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICBfb25GaW5pc2goKTtcbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlbiA9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgbGV0IGxvYWRlZEJ5dGVzID0gYnl0ZXMgKz0gbGVuO1xuICAgICAgICAgIG9uUHJvZ3Jlc3MobG9hZGVkQnl0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9vbkZpbmlzaChlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSxcbiAgICBjYW5jZWwocmVhc29uKSB7XG4gICAgICBfb25GaW5pc2gocmVhc29uKTtcbiAgICAgIHJldHVybiBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICB9XG4gIH0sIHtcbiAgICBoaWdoV2F0ZXJNYXJrOiAyXG4gIH0pXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7VkVSU0lPTn0gZnJvbSAnLi4vZW52L2RhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9yc1t0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzLnRyYW5zaXRpb25hbCA9IGZ1bmN0aW9uIHRyYW5zaXRpb25hbCh2YWxpZGF0b3IsIHZlcnNpb24sIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShvcHQsIGRlc2MpIHtcbiAgICByZXR1cm4gJ1tBeGlvcyB2JyArIFZFUlNJT04gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuICh2YWx1ZSwgb3B0LCBvcHRzKSA9PiB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSksXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURURcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIG9wdCxcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yID8gdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdHMpIDogdHJ1ZTtcbiAgfTtcbn07XG5cbnZhbGlkYXRvcnMuc3BlbGxpbmcgPSBmdW5jdGlvbiBzcGVsbGluZyhjb3JyZWN0U3BlbGxpbmcpIHtcbiAgcmV0dXJuICh2YWx1ZSwgb3B0KSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oYCR7b3B0fSBpcyBsaWtlbHkgYSBtaXNzcGVsbGluZyBvZiAke2NvcnJlY3RTcGVsbGluZ31gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgY29uc3Qgb3B0ID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnNcbn07XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IG51bGxcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMnO1xuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsImltcG9ydCBVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi9jbGFzc2VzL1VSTFNlYXJjaFBhcmFtcy5qcydcbmltcG9ydCBGb3JtRGF0YSBmcm9tICcuL2NsYXNzZXMvRm9ybURhdGEuanMnXG5pbXBvcnQgQmxvYiBmcm9tICcuL2NsYXNzZXMvQmxvYi5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0Jyb3dzZXI6IHRydWUsXG4gIGNsYXNzZXM6IHtcbiAgICBVUkxTZWFyY2hQYXJhbXMsXG4gICAgRm9ybURhdGEsXG4gICAgQmxvYlxuICB9LFxuICBwcm90b2NvbHM6IFsnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2Jsb2InLCAndXJsJywgJ2RhdGEnXVxufTtcbiIsImNvbnN0IGhhc0Jyb3dzZXJFbnYgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5jb25zdCBfbmF2aWdhdG9yID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yIHx8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9IGhhc0Jyb3dzZXJFbnYgJiZcbiAgKCFfbmF2aWdhdG9yIHx8IFsnUmVhY3ROYXRpdmUnLCAnTmF0aXZlU2NyaXB0JywgJ05TJ10uaW5kZXhPZihfbmF2aWdhdG9yLnByb2R1Y3QpIDwgMCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmNvbnN0IG9yaWdpbiA9IGhhc0Jyb3dzZXJFbnYgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG5leHBvcnQge1xuICBoYXNCcm93c2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlckVudixcbiAgX25hdmlnYXRvciBhcyBuYXZpZ2F0b3IsXG4gIG9yaWdpblxufVxuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4vbm9kZS9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL2NvbW1vbi91dGlscy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLi4udXRpbHMsXG4gIC4uLnBsYXRmb3JtXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3Qge3RvU3RyaW5nfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7Z2V0UHJvdG90eXBlT2Z9ID0gT2JqZWN0O1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufVxuXG5jb25zdCB0eXBlT2ZUZXN0ID0gdHlwZSA9PiB0aGluZyA9PiB0eXBlb2YgdGhpbmcgPT09IHR5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCB7aXNBcnJheX0gPSBBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VuZGVmaW5lZCA9IHR5cGVPZlRlc3QoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIGlzRnVuY3Rpb24odmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIGxldCByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKGlzQXJyYXlCdWZmZXIodmFsLmJ1ZmZlcikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJpbmcgPSB0eXBlT2ZUZXN0KCdzdHJpbmcnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Z1bmN0aW9uID0gdHlwZU9mVGVzdCgnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc051bWJlciA9IHR5cGVPZlRlc3QoJ251bWJlcicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJvb2xlYW4sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jvb2xlYW4gPSB0aGluZyA9PiB0aGluZyA9PT0gdHJ1ZSB8fCB0aGluZyA9PT0gZmFsc2U7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWwpID0+IHtcbiAgaWYgKGtpbmRPZih2YWwpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbmNvbnN0IFtpc1JlYWRhYmxlU3RyZWFtLCBpc1JlcXVlc3QsIGlzUmVzcG9uc2UsIGlzSGVhZGVyc10gPSBbJ1JlYWRhYmxlU3RyZWFtJywgJ1JlcXVlc3QnLCAnUmVzcG9uc2UnLCAnSGVhZGVycyddLm1hcChraW5kT2ZUZXN0KTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuY29uc3QgdHJpbSA9IChzdHIpID0+IHN0ci50cmltID9cbiAgc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywgJycpO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7YWxsT3duS2V5cyA9IGZhbHNlfSA9IHt9KSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGk7XG4gIGxldCBsO1xuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yIChpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBjb25zdCBrZXlzID0gYWxsT3duS2V5cyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqLCBrZXkpIHtcbiAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICBsZXQgX2tleTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBfa2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoa2V5ID09PSBfa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBfa2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgX2dsb2JhbCA9ICgoKSA9PiB7XG4gIC8qZXNsaW50IG5vLXVuZGVmOjAqL1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWxUaGlzO1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxufSkoKTtcblxuY29uc3QgaXNDb250ZXh0RGVmaW5lZCA9IChjb250ZXh0KSA9PiAhaXNVbmRlZmluZWQoY29udGV4dCkgJiYgY29udGV4dCAhPT0gX2dsb2JhbDtcblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICBjb25zdCB7Y2FzZWxlc3N9ID0gaXNDb250ZXh0RGVmaW5lZCh0aGlzKSAmJiB0aGlzIHx8IHt9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3QgYXNzaWduVmFsdWUgPSAodmFsLCBrZXkpID0+IHtcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBjYXNlbGVzcyAmJiBmaW5kS2V5KHJlc3VsdCwga2V5KSB8fCBrZXk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W3RhcmdldEtleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZShyZXN1bHRbdGFyZ2V0S2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJndW1lbnRzW2ldICYmIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXNdXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmNvbnN0IGV4dGVuZCA9IChhLCBiLCB0aGlzQXJnLCB7YWxsT3duS2V5c309IHt9KSA9PiB7XG4gIGZvckVhY2goYiwgKHZhbCwga2V5KSA9PiB7XG4gICAgaWYgKHRoaXNBcmcgJiYgaXNGdW5jdGlvbih2YWwpKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0sIHthbGxPd25LZXlzfSk7XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2Rlc2NyaXB0b3JzXVxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBpbmhlcml0cyA9IChjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSA9PiB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgJ3N1cGVyJywge1xuICAgIHZhbHVlOiBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZVxuICB9KTtcbiAgcHJvcHMgJiYgT2JqZWN0LmFzc2lnbihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3BzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9iamVjdCB3aXRoIGRlZXAgcHJvdG90eXBlIGNoYWluIHRvIGEgZmxhdCBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VPYmogc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IFtkZXN0T2JqXVxuICogQHBhcmFtIHtGdW5jdGlvbnxCb29sZWFufSBbZmlsdGVyXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb3BGaWx0ZXJdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuY29uc3QgdG9GbGF0T2JqZWN0ID0gKHNvdXJjZU9iaiwgZGVzdE9iaiwgZmlsdGVyLCBwcm9wRmlsdGVyKSA9PiB7XG4gIGxldCBwcm9wcztcbiAgbGV0IGk7XG4gIGxldCBwcm9wO1xuICBjb25zdCBtZXJnZWQgPSB7fTtcblxuICBkZXN0T2JqID0gZGVzdE9iaiB8fCB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIGlmIChzb3VyY2VPYmogPT0gbnVsbCkgcmV0dXJuIGRlc3RPYmo7XG5cbiAgZG8ge1xuICAgIHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlT2JqKTtcbiAgICBpID0gcHJvcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICBwcm9wID0gcHJvcHNbaV07XG4gICAgICBpZiAoKCFwcm9wRmlsdGVyIHx8IHByb3BGaWx0ZXIocHJvcCwgc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgIW1lcmdlZFtwcm9wXSkge1xuICAgICAgICBkZXN0T2JqW3Byb3BdID0gc291cmNlT2JqW3Byb3BdO1xuICAgICAgICBtZXJnZWRbcHJvcF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VPYmogPSBmaWx0ZXIgIT09IGZhbHNlICYmIGdldFByb3RvdHlwZU9mKHNvdXJjZU9iaik7XG4gIH0gd2hpbGUgKHNvdXJjZU9iaiAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgc291cmNlT2JqICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuICByZXR1cm4gZGVzdE9iajtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgZnJvbSBhcnJheSBsaWtlIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICpcbiAqIEBwYXJhbSB7Kn0gW3RoaW5nXVxuICpcbiAqIEByZXR1cm5zIHs/QXJyYXl9XG4gKi9cbmNvbnN0IHRvQXJyYXkgPSAodGhpbmcpID0+IHtcbiAgaWYgKCF0aGluZykgcmV0dXJuIG51bGw7XG4gIGlmIChpc0FycmF5KHRoaW5nKSkgcmV0dXJuIHRoaW5nO1xuICBsZXQgaSA9IHRoaW5nLmxlbmd0aDtcbiAgaWYgKCFpc051bWJlcihpKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFyciA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBhcnJbaV0gPSB0aGluZ1tpXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vKipcbiAqIENoZWNraW5nIGlmIHRoZSBVaW50OEFycmF5IGV4aXN0cyBhbmQgaWYgaXQgZG9lcywgaXQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZVxuICogdGhpbmcgcGFzc2VkIGluIGlzIGFuIGluc3RhbmNlIG9mIFVpbnQ4QXJyYXlcbiAqXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9XG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuY29uc3QgaXNUeXBlZEFycmF5ID0gKFR5cGVkQXJyYXkgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gdGhpbmcgPT4ge1xuICAgIHJldHVybiBUeXBlZEFycmF5ICYmIHRoaW5nIGluc3RhbmNlb2YgVHlwZWRBcnJheTtcbiAgfTtcbn0pKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSk7XG5cbi8qKlxuICogRm9yIGVhY2ggZW50cnkgaW4gdGhlIG9iamVjdCwgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUga2V5IGFuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgZm9yRWFjaEVudHJ5ID0gKG9iaiwgZm4pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gb2JqICYmIG9ialtTeW1ib2wuaXRlcmF0b3JdO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ2VuZXJhdG9yLmNhbGwob2JqKTtcblxuICBsZXQgcmVzdWx0O1xuXG4gIHdoaWxlICgocmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBwYWlyID0gcmVzdWx0LnZhbHVlO1xuICAgIGZuLmNhbGwob2JqLCBwYWlyWzBdLCBwYWlyWzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICAgIHJldHVybiBwMS50b1VwcGVyQ2FzZSgpICsgcDI7XG4gICAgfVxuICApO1xufTtcblxuLyogQ3JlYXRpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSAoKHtoYXNPd25Qcm9wZXJ0eX0pID0+IChvYmosIHByb3ApID0+IGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59XG5cbi8qKlxuICogTWFrZXMgYWxsIG1ldGhvZHMgcmVhZC1vbmx5XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKi9cblxuY29uc3QgZnJlZXplTWV0aG9kcyA9IChvYmopID0+IHtcbiAgcmVkdWNlRGVzY3JpcHRvcnMob2JqLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIC8vIHNraXAgcmVzdHJpY3RlZCBwcm9wcyBpbiBzdHJpY3QgbW9kZVxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikgJiYgWydhcmd1bWVudHMnLCAnY2FsbGVyJywgJ2NhbGxlZSddLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpbbmFtZV07XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24odmFsdWUpKSByZXR1cm47XG5cbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcblxuICAgIGlmICgnd3JpdGFibGUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICBkZXNjcmlwdG9yLnNldCA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kIFxcJycgKyBuYW1lICsgJ1xcJycpO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufVxuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YScgJiYgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSk7XG59XG5cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXJyYXkoMTApO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSwgaSkgPT4ge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmIChzdGFjay5pbmRleE9mKHNvdXJjZSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmKCEoJ3RvSlNPTicgaW4gc291cmNlKSkge1xuICAgICAgICBzdGFja1tpXSA9IHNvdXJjZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSwgaSArIDEpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YWNrW2ldID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiB2aXNpdChvYmosIDApO1xufVxuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbi8vIG9yaWdpbmFsIGNvZGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWdpdGFsQnJhaW5KUy9BeGlvc1Byb21pc2UvYmxvYi8xNmRlYWIxMzcxMGVjMDk3Nzk5MjIxMzFmM2ZhNTk1NDMyMGY4M2FiL2xpYi91dGlscy5qcyNMMTEtTDM0XG5cbmNvbnN0IF9zZXRJbW1lZGlhdGUgPSAoKHNldEltbWVkaWF0ZVN1cHBvcnRlZCwgcG9zdE1lc3NhZ2VTdXBwb3J0ZWQpID0+IHtcbiAgaWYgKHNldEltbWVkaWF0ZVN1cHBvcnRlZCkge1xuICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gIH1cblxuICByZXR1cm4gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgPyAoKHRva2VuLCBjYWxsYmFja3MpID0+IHtcbiAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsICh7c291cmNlLCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZSA9PT0gX2dsb2JhbCAmJiBkYXRhID09PSB0b2tlbikge1xuICAgICAgICBjYWxsYmFja3MubGVuZ3RoICYmIGNhbGxiYWNrcy5zaGlmdCgpKCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgX2dsb2JhbC5wb3N0TWVzc2FnZSh0b2tlbiwgXCIqXCIpO1xuICAgIH1cbiAgfSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLCBbXSkgOiAoY2IpID0+IHNldFRpbWVvdXQoY2IpO1xufSkoXG4gIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsXG4gIGlzRnVuY3Rpb24oX2dsb2JhbC5wb3N0TWVzc2FnZSlcbik7XG5cbmNvbnN0IGFzYXAgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgIT09ICd1bmRlZmluZWQnID9cbiAgcXVldWVNaWNyb3Rhc2suYmluZChfZ2xvYmFsKSA6ICggdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MubmV4dFRpY2sgfHwgX3NldEltbWVkaWF0ZSk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlcXVlc3QsXG4gIGlzUmVzcG9uc2UsXG4gIGlzSGVhZGVycyxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRGF0ZSxcbiAgaXNGaWxlLFxuICBpc0Jsb2IsXG4gIGlzUmVnRXhwLFxuICBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzVHlwZWRBcnJheSxcbiAgaXNGaWxlTGlzdCxcbiAgZm9yRWFjaCxcbiAgbWVyZ2UsXG4gIGV4dGVuZCxcbiAgdHJpbSxcbiAgc3RyaXBCT00sXG4gIGluaGVyaXRzLFxuICB0b0ZsYXRPYmplY3QsXG4gIGtpbmRPZixcbiAga2luZE9mVGVzdCxcbiAgZW5kc1dpdGgsXG4gIHRvQXJyYXksXG4gIGZvckVhY2hFbnRyeSxcbiAgbWF0Y2hBbGwsXG4gIGlzSFRNTEZvcm0sXG4gIGhhc093blByb3BlcnR5LFxuICBoYXNPd25Qcm9wOiBoYXNPd25Qcm9wZXJ0eSwgLy8gYW4gYWxpYXMgdG8gYXZvaWQgRVNMaW50IG5vLXByb3RvdHlwZS1idWlsdGlucyBkZXRlY3Rpb25cbiAgcmVkdWNlRGVzY3JpcHRvcnMsXG4gIGZyZWV6ZU1ldGhvZHMsXG4gIHRvT2JqZWN0U2V0LFxuICB0b0NhbWVsQ2FzZSxcbiAgbm9vcCxcbiAgdG9GaW5pdGVOdW1iZXIsXG4gIGZpbmRLZXksXG4gIGdsb2JhbDogX2dsb2JhbCxcbiAgaXNDb250ZXh0RGVmaW5lZCxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcFxufTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRyb290LkNyeXB0b0pTID0gZmFjdG9yeSgpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcblxuXHQvKmdsb2JhbHMgd2luZG93LCBnbG9iYWwsIHJlcXVpcmUqL1xuXG5cdC8qKlxuXHQgKiBDcnlwdG9KUyBjb3JlIGNvbXBvbmVudHMuXG5cdCAqL1xuXHR2YXIgQ3J5cHRvSlMgPSBDcnlwdG9KUyB8fCAoZnVuY3Rpb24gKE1hdGgsIHVuZGVmaW5lZCkge1xuXG5cdCAgICB2YXIgY3J5cHRvO1xuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd2luZG93IChCcm93c2VyKVxuXHQgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSB3aW5kb3cuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGluIHdlYiB3b3JrZXIgKEJyb3dzZXIpXG5cdCAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gc2VsZi5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSB3b3JrZXJcblx0ICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBnbG9iYWxUaGlzLmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIChleHBlcmltZW50YWwgSUUgMTEpIGNyeXB0byBmcm9tIHdpbmRvdyAoQnJvd3Nlcilcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5tc0NyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHdpbmRvdy5tc0NyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIGdsb2JhbCAoTm9kZUpTKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IGdsb2JhbC5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gaW1wb3J0IHZpYSByZXF1aXJlIChOb2RlSlMpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgIH1cblxuXHQgICAgLypcblx0ICAgICAqIENyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuXHQgICAgICpcblx0ICAgICAqIEFzIE1hdGgucmFuZG9tKCkgaXMgY3J5cHRvZ3JhcGhpY2FsbHkgbm90IHNhZmUgdG8gdXNlXG5cdCAgICAgKi9cblx0ICAgIHZhciBjcnlwdG9TZWN1cmVSYW5kb21JbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKGNyeXB0bykge1xuXHQgICAgICAgICAgICAvLyBVc2UgZ2V0UmFuZG9tVmFsdWVzIG1ldGhvZCAoQnJvd3Nlcilcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF07XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBVc2UgcmFuZG9tQnl0ZXMgbWV0aG9kIChOb2RlSlMpXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbUJ5dGVzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMoNCkucmVhZEludDMyTEUoKTtcblx0ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF0aXZlIGNyeXB0byBtb2R1bGUgY291bGQgbm90IGJlIHVzZWQgdG8gZ2V0IHNlY3VyZSByYW5kb20gbnVtYmVyLicpO1xuXHQgICAgfTtcblxuXHQgICAgLypcblx0ICAgICAqIExvY2FsIHBvbHlmaWxsIG9mIE9iamVjdC5jcmVhdGVcblxuXHQgICAgICovXG5cdCAgICB2YXIgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZ1bmN0aW9uIEYoKSB7fVxuXG5cdCAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcblx0ICAgICAgICAgICAgdmFyIHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBvYmo7XG5cblx0ICAgICAgICAgICAgc3VidHlwZSA9IG5ldyBGKCk7XG5cblx0ICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBudWxsO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBzdWJ0eXBlO1xuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIENyeXB0b0pTIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBMaWJyYXJ5IG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfbGliID0gQy5saWIgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBCYXNlIG9iamVjdCBmb3IgcHJvdG90eXBhbCBpbmhlcml0YW5jZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlID0gKGZ1bmN0aW9uICgpIHtcblxuXG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG92ZXJyaWRlcyBQcm9wZXJ0aWVzIHRvIGNvcHkgaW50byB0aGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgZmllbGQ6ICd2YWx1ZScsXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgfVxuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBleHRlbmQ6IGZ1bmN0aW9uIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNwYXduXG5cdCAgICAgICAgICAgICAgICB2YXIgc3VidHlwZSA9IGNyZWF0ZSh0aGlzKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gQXVnbWVudFxuXHQgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUubWl4SW4ob3ZlcnJpZGVzKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGRlZmF1bHQgaW5pdGlhbGl6ZXJcblx0ICAgICAgICAgICAgICAgIGlmICghc3VidHlwZS5oYXNPd25Qcm9wZXJ0eSgnaW5pdCcpIHx8IHRoaXMuaW5pdCA9PT0gc3VidHlwZS5pbml0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZXIncyBwcm90b3R5cGUgaXMgdGhlIHN1YnR5cGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBzdWJ0eXBlLmluaXQucHJvdG90eXBlID0gc3VidHlwZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIHN1cGVydHlwZVxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIgPSB0aGlzO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gc3VidHlwZTtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRXh0ZW5kcyB0aGlzIG9iamVjdCBhbmQgcnVucyB0aGUgaW5pdCBtZXRob2QuXG5cdCAgICAgICAgICAgICAqIEFyZ3VtZW50cyB0byBjcmVhdGUoKSB3aWxsIGJlIHBhc3NlZCB0byBpbml0KCkuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBpbnN0YW5jZSA9IE15VHlwZS5jcmVhdGUoKTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5leHRlbmQoKTtcblx0ICAgICAgICAgICAgICAgIGluc3RhbmNlLmluaXQuYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICAgICAgICAgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHNvbWUgbG9naWMgd2hlbiB5b3VyIG9iamVjdHMgYXJlIGNyZWF0ZWQuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgTXlUeXBlID0gQ3J5cHRvSlMubGliLkJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgICAgIC8vIC4uLlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBpbnRvIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byBtaXggaW4uXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBNeVR5cGUubWl4SW4oe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnXG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIG1peEluOiBmdW5jdGlvbiAocHJvcGVydGllcykge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIElFIHdvbid0IGNvcHkgdG9TdHJpbmcgdXNpbmcgdGhlIGxvb3AgYWJvdmVcblx0ICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCd0b1N0cmluZycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmluZyA9IHByb3BlcnRpZXMudG9TdHJpbmc7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGluc3RhbmNlLmNsb25lKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdC5wcm90b3R5cGUuZXh0ZW5kKHRoaXMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHdvcmRzIFRoZSBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gc2lnQnl0ZXMgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgKi9cblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXkgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyAoT3B0aW9uYWwpIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2lnQnl0ZXMgKE9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoZSB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKCk7XG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHgwMDAxMDIwMywgMHgwNDA1MDYwN10pO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddLCA2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAod29yZHMsIHNpZ0J5dGVzKSB7XG5cdCAgICAgICAgICAgIHdvcmRzID0gdGhpcy53b3JkcyA9IHdvcmRzIHx8IFtdO1xuXG5cdCAgICAgICAgICAgIGlmIChzaWdCeXRlcyAhPSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlcztcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSB3b3Jkcy5sZW5ndGggKiA0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoaXMgd29yZCBhcnJheSB0byBhIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7RW5jb2Rlcn0gZW5jb2RlciAoT3B0aW9uYWwpIFRoZSBlbmNvZGluZyBzdHJhdGVneSB0byB1c2UuIERlZmF1bHQ6IENyeXB0b0pTLmVuYy5IZXhcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZ2lmaWVkIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkgKyAnJztcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZygpO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5LnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKGVuY29kZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIChlbmNvZGVyIHx8IEhleCkuc3RyaW5naWZ5KHRoaXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25jYXRlbmF0ZXMgYSB3b3JkIGFycmF5IHRvIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHdvcmRBcnJheTEuY29uY2F0KHdvcmRBcnJheTIpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNvbmNhdDogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHRoaXNXb3JkcyA9IHRoaXMud29yZHM7XG5cdCAgICAgICAgICAgIHZhciB0aGF0V29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciB0aGlzU2lnQnl0ZXMgPSB0aGlzLnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIHRoaXMuY2xhbXAoKTtcblxuXHQgICAgICAgICAgICAvLyBDb25jYXRcblx0ICAgICAgICAgICAgaWYgKHRoaXNTaWdCeXRlcyAlIDQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIENvcHkgb25lIGJ5dGUgYXQgYSB0aW1lXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoYXRTaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXRCeXRlID0gKHRoYXRXb3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpc1dvcmRzWyh0aGlzU2lnQnl0ZXMgKyBpKSA+Pj4gMl0gfD0gdGhhdEJ5dGUgPDwgKDI0IC0gKCh0aGlzU2lnQnl0ZXMgKyBpKSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSB3b3JkIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGF0U2lnQnl0ZXM7IGogKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaikgPj4+IDJdID0gdGhhdFdvcmRzW2ogPj4+IDJdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgKz0gdGhhdFNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVtb3ZlcyBpbnNpZ25pZmljYW50IGJpdHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHdvcmRBcnJheS5jbGFtcCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsYW1wOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB0aGlzLnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wXG5cdCAgICAgICAgICAgIHdvcmRzW3NpZ0J5dGVzID4+PiAyXSAmPSAweGZmZmZmZmZmIDw8ICgzMiAtIChzaWdCeXRlcyAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIHdvcmRzLmxlbmd0aCA9IE1hdGguY2VpbChzaWdCeXRlcyAvIDQpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gd29yZEFycmF5LmNsb25lKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gQmFzZS5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS53b3JkcyA9IHRoaXMud29yZHMuc2xpY2UoMCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgd29yZCBhcnJheSBmaWxsZWQgd2l0aCByYW5kb20gYnl0ZXMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbkJ5dGVzIFRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGdlbmVyYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcmFuZG9tIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSgxNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmFuZG9tOiBmdW5jdGlvbiAobkJ5dGVzKSB7XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkJ5dGVzOyBpICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzLnB1c2goY3J5cHRvU2VjdXJlUmFuZG9tSW50KCkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbkJ5dGVzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBFbmNvZGVyIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBIZXggZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBIZXggPSBDX2VuYy5IZXggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoZXggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGV4U3RyaW5nID0gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIGhleENoYXJzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJpdGUgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgaGV4Q2hhcnMucHVzaCgoYml0ZSA+Pj4gNCkudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgJiAweDBmKS50b1N0cmluZygxNikpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhleENoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGhleFN0ciBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGhleFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChoZXhTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhleFN0ckxlbmd0aCA9IGhleFN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXhTdHJMZW5ndGg7IGkgKz0gMikge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gM10gfD0gcGFyc2VJbnQoaGV4U3RyLnN1YnN0cihpLCAyKSwgMTYpIDw8ICgyNCAtIChpICUgOCkgKiA0KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIGhleFN0ckxlbmd0aCAvIDIpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGF0aW4xIGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgTGF0aW4xID0gQ19lbmMuTGF0aW4xID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGxhdGluMVN0cmluZyA9IENyeXB0b0pTLmVuYy5MYXRpbjEuc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBsYXRpbjFDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGxhdGluMUNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShiaXRlKSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbGF0aW4xQ2hhcnMuam9pbignJyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgTGF0aW4xIHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0aW4xU3RyIFRoZSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5MYXRpbjEucGFyc2UobGF0aW4xU3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGxhdGluMVN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xU3RyTGVuZ3RoID0gbGF0aW4xU3RyLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGluMVN0ckxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAyXSB8PSAobGF0aW4xU3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSA8PCAoMjQgLSAoaSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBsYXRpbjFTdHJMZW5ndGgpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogVVRGLTggZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmOCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtOCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgdXRmOFN0cmluZyA9IENyeXB0b0pTLmVuYy5VdGY4LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpKSk7XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWFsZm9ybWVkIFVURi04IGRhdGEnKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi04IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXRmOFN0ciBUaGUgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHV0ZjhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodXRmOFN0cikge1xuXHQgICAgICAgICAgICByZXR1cm4gTGF0aW4xLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh1dGY4U3RyKSkpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYnVmZmVyZWQgYmxvY2sgYWxnb3JpdGhtIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIFRoZSBwcm9wZXJ0eSBibG9ja1NpemUgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IF9taW5CdWZmZXJTaXplIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGtlcHQgdW5wcm9jZXNzZWQgaW4gdGhlIGJ1ZmZlci4gRGVmYXVsdDogMFxuXHQgICAgICovXG5cdCAgICB2YXIgQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IENfbGliLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgZGF0YSBidWZmZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFdvcmRBcnJheS5pbml0KCk7XG5cdCAgICAgICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgPSAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGRzIG5ldyBkYXRhIHRvIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgYnVmZmVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGFwcGVuZC4gU3RyaW5ncyBhcmUgY29udmVydGVkIHRvIGEgV29yZEFycmF5IHVzaW5nIFVURi04LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9hcHBlbmQoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2FwcGVuZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gV29yZEFycmF5LCBlbHNlIGFzc3VtZSBXb3JkQXJyYXkgYWxyZWFkeVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIGRhdGEgPSBVdGY4LnBhcnNlKGRhdGEpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2RhdGEuY29uY2F0KGRhdGEpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzICs9IGRhdGEuc2lnQnl0ZXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFByb2Nlc3NlcyBhdmFpbGFibGUgZGF0YSBibG9ja3MuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIF9kb1Byb2Nlc3NCbG9jayhvZmZzZXQpLCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgc3VidHlwZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9GbHVzaCBXaGV0aGVyIGFsbCBibG9ja3MgYW5kIHBhcnRpYWwgYmxvY2tzIHNob3VsZCBiZSBwcm9jZXNzZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwcm9jZXNzZWQgZGF0YS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHByb2Nlc3NlZERhdGEgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9wcm9jZXNzKCk7XG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcyghISdmbHVzaCcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9wcm9jZXNzOiBmdW5jdGlvbiAoZG9GbHVzaCkge1xuXHQgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkV29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBkYXRhU2lnQnl0ZXMgPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gdGhpcy5ibG9ja1NpemU7XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYmxvY2tzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQmxvY2tzUmVhZHkgPSBkYXRhU2lnQnl0ZXMgLyBibG9ja1NpemVCeXRlcztcblx0ICAgICAgICAgICAgaWYgKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIHVwIHRvIGluY2x1ZGUgcGFydGlhbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGguY2VpbChuQmxvY2tzUmVhZHkpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gUm91bmQgZG93biB0byBpbmNsdWRlIG9ubHkgZnVsbCBibG9ja3MsXG5cdCAgICAgICAgICAgICAgICAvLyBsZXNzIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGJ1ZmZlclxuXHQgICAgICAgICAgICAgICAgbkJsb2Nrc1JlYWR5ID0gTWF0aC5tYXgoKG5CbG9ja3NSZWFkeSB8IDApIC0gdGhpcy5fbWluQnVmZmVyU2l6ZSwgMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb3VudCB3b3JkcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbldvcmRzUmVhZHkgPSBuQmxvY2tzUmVhZHkgKiBibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYnl0ZXMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5CeXRlc1JlYWR5ID0gTWF0aC5taW4obldvcmRzUmVhZHkgKiA0LCBkYXRhU2lnQnl0ZXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2tzXG5cdCAgICAgICAgICAgIGlmIChuV29yZHNSZWFkeSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbldvcmRzUmVhZHk7IG9mZnNldCArPSBibG9ja1NpemUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWFsZ29yaXRobSBsb2dpY1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvUHJvY2Vzc0Jsb2NrKGRhdGFXb3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICAgICAgcHJvY2Vzc2VkV29yZHMgPSBkYXRhV29yZHMuc3BsaWNlKDAsIG5Xb3Jkc1JlYWR5KTtcblx0ICAgICAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gbkJ5dGVzUmVhZHk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gcHJvY2Vzc2VkIHdvcmRzXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQocHJvY2Vzc2VkV29yZHMsIG5CeXRlc1JlYWR5KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2RhdGEgPSB0aGlzLl9kYXRhLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfbWluQnVmZmVyU2l6ZTogMFxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgaGFzaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBoYXNoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDE2ICg1MTIgYml0cylcblx0ICAgICAqL1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlciA9IEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCgpLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGhhc2hlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGFzaGVyID0gQ3J5cHRvSlMuYWxnby5TSEEyNTYuY3JlYXRlKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBoYXNoZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGRhdGEgYnVmZmVyXG5cdCAgICAgICAgICAgIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWhhc2hlciBsb2dpY1xuXHQgICAgICAgICAgICB0aGlzLl9kb1Jlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBoYXNoZXIgd2l0aCBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7SGFzaGVyfSBUaGlzIGhhc2hlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICBoYXNoZXIudXBkYXRlKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fYXBwZW5kKG1lc3NhZ2VVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaGFzaFxuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ2hhaW5hYmxlXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIGhhc2ggY29tcHV0YXRpb24uXG5cdCAgICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSAoT3B0aW9uYWwpIEEgZmluYWwgbWVzc2FnZSB1cGRhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBGaW5hbCBtZXNzYWdlIHVwZGF0ZVxuXHQgICAgICAgICAgICBpZiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kKG1lc3NhZ2VVcGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9kb0ZpbmFsaXplKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogNTEyLzMyLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIGEgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byBjcmVhdGUgYSBoZWxwZXIgZm9yLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBzaG9ydGN1dCBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIFNIQTI1NiA9IENyeXB0b0pTLmxpYi5IYXNoZXIuX2NyZWF0ZUhlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhlbHBlcjogZnVuY3Rpb24gKGhhc2hlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGNmZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBoYXNoZXIuaW5pdChjZmcpLmZpbmFsaXplKG1lc3NhZ2UpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgc2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIHVzZSBpbiB0aGlzIEhNQUMgaGVscGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBzaG9ydGN1dCBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIEhtYWNTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKENyeXB0b0pTLmFsZ28uU0hBMjU2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfY3JlYXRlSG1hY0hlbHBlcjogZnVuY3Rpb24gKGhhc2hlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGtleSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDX2FsZ28uSE1BQy5pbml0KGhhc2hlciwga2V5KS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbGdvcml0aG0gbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvID0ge307XG5cblx0ICAgIHJldHVybiBDO1xuXHR9KE1hdGgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUztcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0cmV0dXJuIENyeXB0b0pTLmVuYy5IZXg7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoTWF0aCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIEluaXRpYWxpemF0aW9uIGFuZCByb3VuZCBjb25zdGFudHMgdGFibGVzXG5cdCAgICB2YXIgSCA9IFtdO1xuXHQgICAgdmFyIEsgPSBbXTtcblxuXHQgICAgLy8gQ29tcHV0ZSBjb25zdGFudHNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZnVuY3Rpb24gaXNQcmltZShuKSB7XG5cdCAgICAgICAgICAgIHZhciBzcXJ0TiA9IE1hdGguc3FydChuKTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgZmFjdG9yID0gMjsgZmFjdG9yIDw9IHNxcnROOyBmYWN0b3IrKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCEobiAlIGZhY3RvcikpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9XG5cblx0ICAgICAgICBmdW5jdGlvbiBnZXRGcmFjdGlvbmFsQml0cyhuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoKG4gLSAobiB8IDApKSAqIDB4MTAwMDAwMDAwKSB8IDA7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgdmFyIG4gPSAyO1xuXHQgICAgICAgIHZhciBuUHJpbWUgPSAwO1xuXHQgICAgICAgIHdoaWxlIChuUHJpbWUgPCA2NCkge1xuXHQgICAgICAgICAgICBpZiAoaXNQcmltZShuKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKG5QcmltZSA8IDgpIHtcblx0ICAgICAgICAgICAgICAgICAgICBIW25QcmltZV0gPSBnZXRGcmFjdGlvbmFsQml0cyhNYXRoLnBvdyhuLCAxIC8gMikpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgS1tuUHJpbWVdID0gZ2V0RnJhY3Rpb25hbEJpdHMoTWF0aC5wb3cobiwgMSAvIDMpKTtcblxuXHQgICAgICAgICAgICAgICAgblByaW1lKys7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBuKys7XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0XG5cdCAgICB2YXIgVyA9IFtdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNIQS0yNTYgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEEyNTYgPSBDX2FsZ28uU0hBMjU2ID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChILnNsaWNlKDApKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlc1xuXHQgICAgICAgICAgICB2YXIgYSA9IEhbMF07XG5cdCAgICAgICAgICAgIHZhciBiID0gSFsxXTtcblx0ICAgICAgICAgICAgdmFyIGMgPSBIWzJdO1xuXHQgICAgICAgICAgICB2YXIgZCA9IEhbM107XG5cdCAgICAgICAgICAgIHZhciBlID0gSFs0XTtcblx0ICAgICAgICAgICAgdmFyIGYgPSBIWzVdO1xuXHQgICAgICAgICAgICB2YXIgZyA9IEhbNl07XG5cdCAgICAgICAgICAgIHZhciBoID0gSFs3XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRhdGlvblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChpIDwgMTYpIHtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gTVtvZmZzZXQgKyBpXSB8IDA7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTB4ID0gV1tpIC0gMTVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTAgID0gKChnYW1tYTB4IDw8IDI1KSB8IChnYW1tYTB4ID4+PiA3KSkgIF5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ2FtbWEweCA8PCAxNCkgfCAoZ2FtbWEweCA+Pj4gMTgpKSBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdhbW1hMHggPj4+IDMpO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMXggPSBXW2kgLSAyXTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWExICA9ICgoZ2FtbWExeCA8PCAxNSkgfCAoZ2FtbWExeCA+Pj4gMTcpKSBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhbW1hMXggPDwgMTMpIHwgKGdhbW1hMXggPj4+IDE5KSkgXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnYW1tYTF4ID4+PiAxMCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gZ2FtbWEwICsgV1tpIC0gN10gKyBnYW1tYTEgKyBXW2kgLSAxNl07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIHZhciBjaCAgPSAoZSAmIGYpIF4gKH5lICYgZyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFqID0gKGEgJiBiKSBeIChhICYgYykgXiAoYiAmIGMpO1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgc2lnbWEwID0gKChhIDw8IDMwKSB8IChhID4+PiAyKSkgXiAoKGEgPDwgMTkpIHwgKGEgPj4+IDEzKSkgXiAoKGEgPDwgMTApIHwgKGEgPj4+IDIyKSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgc2lnbWExID0gKChlIDw8IDI2KSB8IChlID4+PiA2KSkgXiAoKGUgPDwgMjEpIHwgKGUgPj4+IDExKSkgXiAoKGUgPDwgNykgIHwgKGUgPj4+IDI1KSk7XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0MSA9IGggKyBzaWdtYTEgKyBjaCArIEtbaV0gKyBXW2ldO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQyID0gc2lnbWEwICsgbWFqO1xuXG5cdCAgICAgICAgICAgICAgICBoID0gZztcblx0ICAgICAgICAgICAgICAgIGcgPSBmO1xuXHQgICAgICAgICAgICAgICAgZiA9IGU7XG5cdCAgICAgICAgICAgICAgICBlID0gKGQgKyB0MSkgfCAwO1xuXHQgICAgICAgICAgICAgICAgZCA9IGM7XG5cdCAgICAgICAgICAgICAgICBjID0gYjtcblx0ICAgICAgICAgICAgICAgIGIgPSBhO1xuXHQgICAgICAgICAgICAgICAgYSA9ICh0MSArIHQyKSB8IDA7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDtcblx0ICAgICAgICAgICAgSFsyXSA9IChIWzJdICsgYykgfCAwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7XG5cdCAgICAgICAgICAgIEhbNF0gPSAoSFs0XSArIGUpIHwgMDtcblx0ICAgICAgICAgICAgSFs1XSA9IChIWzVdICsgZikgfCAwO1xuXHQgICAgICAgICAgICBIWzZdID0gKEhbNl0gKyBnKSB8IDA7XG5cdCAgICAgICAgICAgIEhbN10gPSAoSFs3XSArIGgpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSBuQml0c1RvdGFsO1xuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzID0gZGF0YVdvcmRzLmxlbmd0aCAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjU2KCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEyNTYod29yZEFycmF5KTtcblx0ICAgICAqL1xuXHQgICAgQy5TSEEyNTYgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEEyNTYpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTI1NihtZXNzYWdlLCBrZXkpO1xuXHQgICAgICovXG5cdCAgICBDLkhtYWNTSEEyNTYgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMjU2KTtcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuU0hBMjU2O1xuXG59KSk7IiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZGVueUxpc3QgPSBuZXcgU2V0KFtcblx0J0VOT1RGT1VORCcsXG5cdCdFTkVUVU5SRUFDSCcsXG5cblx0Ly8gU1NMIGVycm9ycyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2ZjOGUzZTJjZGM1MjE5NzgzNTFkZTI1NzAzMGRiMDA3NmQ3OWUwYWIvc3JjL2NyeXB0by9jcnlwdG9fY29tbW9uLmNjI0wzMDEtTDMyOFxuXHQnVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVCcsXG5cdCdVTkFCTEVfVE9fR0VUX0NSTCcsXG5cdCdVTkFCTEVfVE9fREVDUllQVF9DRVJUX1NJR05BVFVSRScsXG5cdCdVTkFCTEVfVE9fREVDUllQVF9DUkxfU0lHTkFUVVJFJyxcblx0J1VOQUJMRV9UT19ERUNPREVfSVNTVUVSX1BVQkxJQ19LRVknLFxuXHQnQ0VSVF9TSUdOQVRVUkVfRkFJTFVSRScsXG5cdCdDUkxfU0lHTkFUVVJFX0ZBSUxVUkUnLFxuXHQnQ0VSVF9OT1RfWUVUX1ZBTElEJyxcblx0J0NFUlRfSEFTX0VYUElSRUQnLFxuXHQnQ1JMX05PVF9ZRVRfVkFMSUQnLFxuXHQnQ1JMX0hBU19FWFBJUkVEJyxcblx0J0VSUk9SX0lOX0NFUlRfTk9UX0JFRk9SRV9GSUVMRCcsXG5cdCdFUlJPUl9JTl9DRVJUX05PVF9BRlRFUl9GSUVMRCcsXG5cdCdFUlJPUl9JTl9DUkxfTEFTVF9VUERBVEVfRklFTEQnLFxuXHQnRVJST1JfSU5fQ1JMX05FWFRfVVBEQVRFX0ZJRUxEJyxcblx0J09VVF9PRl9NRU0nLFxuXHQnREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUJyxcblx0J1NFTEZfU0lHTkVEX0NFUlRfSU5fQ0hBSU4nLFxuXHQnVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVF9MT0NBTExZJyxcblx0J1VOQUJMRV9UT19WRVJJRllfTEVBRl9TSUdOQVRVUkUnLFxuXHQnQ0VSVF9DSEFJTl9UT09fTE9ORycsXG5cdCdDRVJUX1JFVk9LRUQnLFxuXHQnSU5WQUxJRF9DQScsXG5cdCdQQVRIX0xFTkdUSF9FWENFRURFRCcsXG5cdCdJTlZBTElEX1BVUlBPU0UnLFxuXHQnQ0VSVF9VTlRSVVNURUQnLFxuXHQnQ0VSVF9SRUpFQ1RFRCcsXG5cdCdIT1NUTkFNRV9NSVNNQVRDSCdcbl0pO1xuXG4vLyBUT0RPOiBVc2UgYGVycm9yPy5jb2RlYCB3aGVuIHRhcmdldGluZyBOb2RlLmpzIDE0XG5tb2R1bGUuZXhwb3J0cyA9IGVycm9yID0+ICFkZW55TGlzdC5oYXMoZXJyb3IgJiYgZXJyb3IuY29kZSk7XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEVudW1zXzEgPSByZXF1aXJlKFwiLi9FbnVtc1wiKTtcbnZhciBDb25zdGFudHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29uc3RhbnRzKCkge1xuICAgIH1cbiAgICBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gW1wib3JnVXJsXCIsIFwib3JnSWRcIiwgXCJ3aWRnZXRJZFwiXTtcbiAgICBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnMgPSB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgfTtcbiAgICBDb25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzID0ge1xuICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1zdG9yZSwgbXVzdC1yZXZhbGlkYXRlLCBuby1jYWNoZVwiLFxuICAgICAgICBcIlgtQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCJcbiAgICB9O1xuICAgIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkID0gRW51bXNfMS5DaGFubmVsSWQuTENXO1xuICAgIENvbnN0YW50cy5kZWZhdWx0TG9jYWxlID0gXCJlbi11c1wiO1xuICAgIENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlID0gMjA0O1xuICAgIENvbnN0YW50cy50b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlID0gNDI5O1xuICAgIENvbnN0YW50cy5ub3RGb3VuZFN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgQ29uc3RhbnRzLmJhZFJlcXVlc3RTdGF0dXNDb2RlID0gNDAwO1xuICAgIENvbnN0YW50cy5vdXRPZk9mZmljZUVycm9yQ29kZSA9IDcwNTtcbiAgICBDb25zdGFudHMuc2Vuc2l0aXZlUHJvcGVydGllcyA9IFtcIkF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5cIl07XG4gICAgQ29uc3RhbnRzLnRyYW5zYWN0aW9uaWQgPSBcInRyYW5zYWN0aW9uLWlkXCI7XG4gICAgQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWUgPSBcImN1c3RvbWVyRGlzcGxheU5hbWVcIjtcbiAgICBDb25zdGFudHMuaGlkZGVuQ29udGVudFBsYWNlaG9sZGVyID0gXCIqY29udGVudCBoaWRkZW4qXCI7XG4gICAgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSA9IFwiRUNPTk5BQk9SVEVEXCI7XG4gICAgcmV0dXJuIENvbnN0YW50cztcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBDb25zdGFudHM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU0RLRXJyb3IgPSBleHBvcnRzLkxpdmVDaGF0VmVyc2lvbiA9IGV4cG9ydHMuT0NTREtUZWxlbWV0cnlFdmVudCA9IGV4cG9ydHMuQ2hhbm5lbElkID0gZXhwb3J0cy5PcGVyYXRpbmdTeXN0ZW0gPSBleHBvcnRzLkRldmljZVR5cGUgPSBleHBvcnRzLkJyb3dzZXIgPSBleHBvcnRzLkJyb3dzZXJWZW5kb3IgPSB2b2lkIDA7XG52YXIgQnJvd3NlclZlbmRvcjtcbihmdW5jdGlvbiAoQnJvd3NlclZlbmRvcikge1xuICAgIEJyb3dzZXJWZW5kb3JbXCJJRVwiXSA9IFwiSUVcIjtcbiAgICBCcm93c2VyVmVuZG9yW1wiQ0hST01FXCJdID0gXCJDaHJvbWVcIjtcbiAgICBCcm93c2VyVmVuZG9yW1wiRklSRUZPWFwiXSA9IFwiRmlyZWZveFwiO1xuICAgIEJyb3dzZXJWZW5kb3JbXCJTQUZBUklcIl0gPSBcIlNhZmFyaVwiO1xuICAgIEJyb3dzZXJWZW5kb3JbXCJFREdFXCJdID0gXCJFZGdlXCI7XG4gICAgQnJvd3NlclZlbmRvcltcIkVER0VfQ0hST01JVU1cIl0gPSBcIkVkZ1wiO1xuICAgIEJyb3dzZXJWZW5kb3JbXCJPUEVSQVwiXSA9IFwiT3BlcmFcIjtcbiAgICBCcm93c2VyVmVuZG9yW1wiVU5LTk9XTlwiXSA9IFwiVW5rbm93blwiO1xufSkoQnJvd3NlclZlbmRvciA9IGV4cG9ydHMuQnJvd3NlclZlbmRvciB8fCAoZXhwb3J0cy5Ccm93c2VyVmVuZG9yID0ge30pKTtcbnZhciBCcm93c2VyO1xuKGZ1bmN0aW9uIChCcm93c2VyKSB7XG4gICAgQnJvd3NlcltCcm93c2VyW1wiQ2hyb21lXCJdID0gMF0gPSBcIkNocm9tZVwiO1xuICAgIEJyb3dzZXJbQnJvd3NlcltcIkZpcmVmb3hcIl0gPSAxXSA9IFwiRmlyZWZveFwiO1xuICAgIEJyb3dzZXJbQnJvd3NlcltcIkllXCJdID0gMl0gPSBcIkllXCI7XG4gICAgQnJvd3NlcltCcm93c2VyW1wiRWRnZVwiXSA9IDNdID0gXCJFZGdlXCI7XG4gICAgQnJvd3NlcltCcm93c2VyW1wiU2FmYXJpXCJdID0gNF0gPSBcIlNhZmFyaVwiO1xuICAgIEJyb3dzZXJbQnJvd3NlcltcIk5vbmVcIl0gPSA1XSA9IFwiTm9uZVwiO1xufSkoQnJvd3NlciA9IGV4cG9ydHMuQnJvd3NlciB8fCAoZXhwb3J0cy5Ccm93c2VyID0ge30pKTtcbnZhciBEZXZpY2VUeXBlO1xuKGZ1bmN0aW9uIChEZXZpY2VUeXBlKSB7XG4gICAgRGV2aWNlVHlwZVtcIkRlc2t0b3BcIl0gPSBcIkRlc2t0b3BcIjtcbiAgICBEZXZpY2VUeXBlW1wiTW9iaWxlXCJdID0gXCJNb2JpbGVcIjtcbiAgICBEZXZpY2VUeXBlW1wiVGFibGV0XCJdID0gXCJUYWJsZXRcIjtcbn0pKERldmljZVR5cGUgPSBleHBvcnRzLkRldmljZVR5cGUgfHwgKGV4cG9ydHMuRGV2aWNlVHlwZSA9IHt9KSk7XG52YXIgT3BlcmF0aW5nU3lzdGVtO1xuKGZ1bmN0aW9uIChPcGVyYXRpbmdTeXN0ZW0pIHtcbiAgICBPcGVyYXRpbmdTeXN0ZW1bXCJXSU5ET1dTXCJdID0gXCJXaW5kb3dzXCI7XG4gICAgT3BlcmF0aW5nU3lzdGVtW1wiTUFDT1NYXCJdID0gXCJNYWMgT1MgWFwiO1xuICAgIE9wZXJhdGluZ1N5c3RlbVtcIldJTkRPV1NfUEhPTkVcIl0gPSBcIldpbmRvd3MgUGhvbmVcIjtcbiAgICBPcGVyYXRpbmdTeXN0ZW1bXCJXSU5ET1dTX1JUXCJdID0gXCJXaW5kb3dzIFJUXCI7XG4gICAgT3BlcmF0aW5nU3lzdGVtW1wiSU9TXCJdID0gXCJpT1NcIjtcbiAgICBPcGVyYXRpbmdTeXN0ZW1bXCJBTkRST0lEXCJdID0gXCJBbmRyb2lkXCI7XG4gICAgT3BlcmF0aW5nU3lzdGVtW1wiTElOVVhcIl0gPSBcIkxpbnV4XCI7XG4gICAgT3BlcmF0aW5nU3lzdGVtW1wiVU5LTk9XTlwiXSA9IFwiVW5rbm93blwiO1xufSkoT3BlcmF0aW5nU3lzdGVtID0gZXhwb3J0cy5PcGVyYXRpbmdTeXN0ZW0gfHwgKGV4cG9ydHMuT3BlcmF0aW5nU3lzdGVtID0ge30pKTtcbnZhciBDaGFubmVsSWQ7XG4oZnVuY3Rpb24gKENoYW5uZWxJZCkge1xuICAgIENoYW5uZWxJZFtcIkxDV1wiXSA9IFwibGN3XCI7XG4gICAgQ2hhbm5lbElkW1wiU01TXCJdID0gXCJzbXNcIjtcbiAgICBDaGFubmVsSWRbXCJGQUNFQk9PS1wiXSA9IFwiZmFjZWJvb2tcIjtcbiAgICBDaGFubmVsSWRbXCJXRUNIQVRcIl0gPSBcIndlY2hhdFwiO1xufSkoQ2hhbm5lbElkID0gZXhwb3J0cy5DaGFubmVsSWQgfHwgKGV4cG9ydHMuQ2hhbm5lbElkID0ge30pKTtcbnZhciBPQ1NES1RlbGVtZXRyeUV2ZW50O1xuKGZ1bmN0aW9uIChPQ1NES1RlbGVtZXRyeUV2ZW50KSB7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEXCJdID0gXCJHZXRMY3dGY3NEZXRhaWxzU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRMQ1dGQ1NERVRBSUxTU1VDQ0VFREVEXCJdID0gXCJHZXRMY3dGY3NEZXRhaWxzU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVExDV0ZDU0RFVEFJTFNGQUlMRURcIl0gPSBcIkdldExjd0Zjc0RldGFpbHNGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEXCJdID0gXCJHZXRDaGF0Q29uZmlnXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVENIQVRDT05GSUdTVUNDRUVERURcIl0gPSBcIkdldENoYXRDb25maWdTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQ0hBVENPTkZJR0ZBSUxFRFwiXSA9IFwiR2V0Q2hhdENvbmZpZ0ZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVEFSVEVEXCJdID0gXCJHZXRSZWNvbm5uZWN0YWJsZUNoYXRzU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVUNDRUVERURcIl0gPSBcIkdldFJlY29ubm5lY3RhYmxlQ2hhdHNTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVEXCJdID0gXCJHZXRSZWNvbm5uZWN0YWJsZUNoYXRzRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRFwiXSA9IFwiR2V0UmVjb25ubmVjdGFibGVBdmFpbGFiaWxpdHlTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRFwiXSA9IFwiR2V0UmVjb25ubmVjdGFibGVBdmFpbGFiaWxpdHlTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWUZBSUxFRFwiXSA9IFwiR2V0UmVjb25ubmVjdGFibGVBdmFpbGFiaWxpdHlGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQ0hBVFRPS0VOU1RBUlRFRFwiXSA9IFwiR2V0Q2hhdFRva2VuU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRDSEFUVE9LRU5TVUNDRUVERURcIl0gPSBcIkdldENoYXRUb2tlblN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRDSEFUVE9LRU5GQUlMRURcIl0gPSBcIkdldENoYXRUb2tlbkZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRMV0lTVEFUVVNTVEFSVEVEXCJdID0gXCJHZXRMd2lTdGF0dXNTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVExXSVNUQVRVU1NVQ0NFRURFRFwiXSA9IFwiR2V0THdpU3RhdHVzU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVExXSVNUQVRVU0ZBSUxFRFwiXSA9IFwiR2V0THdpU3RhdHVzRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFU1NJT05JTklUU1RBUlRFRFwiXSA9IFwiU2Vzc2lvbkluaXRTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFU1NJT05JTklUU1VDQ0VFREVEXCJdID0gXCJTZXNzaW9uSW5pdFN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRVNTSU9OSU5JVEZBSUxFRFwiXSA9IFwiU2Vzc2lvbkluaXRGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiQ1JFQVRFU0VTU0lPTlNUQVJURURcIl0gPSBcIkNyZWF0ZVNlc3Npb25TdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkNSRUFURVNFU1NJT05TVUNDRUVERURcIl0gPSBcIkNyZWF0ZVNlc3Npb25TdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiQ1JFQVRFU0VTU0lPTkZBSUxFRFwiXSA9IFwiQ3JlYXRlU2Vzc2lvbkZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRVNTSU9OQ0xPU0VTVEFSVEVEXCJdID0gXCJTZXNzaW9uQ2xvc2VTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFU1NJT05DTE9TRVNVQ0NFRURFRFwiXSA9IFwiU2Vzc2lvbkNsb3NlU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFU1NJT05DTE9TRUZBSUxFRFwiXSA9IFwiU2Vzc2lvbkNsb3NlRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNVQk1JVFBPU1RDSEFUU1RBUlRFRFwiXSA9IFwiU3VibWl0UG9zdENoYXRTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEXCJdID0gXCJTdWJtaXRQb3N0Q2hhdFN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTVUJNSVRQT1NUQ0hBVEZBSUxFRFwiXSA9IFwiU3VibWl0UG9zdENoYXRGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEXCJdID0gXCJHZXRDaGF0VHJhbnNjcmlwdFN0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERURcIl0gPSBcIkdldENoYXRUcmFuc2NyaXB0U3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEXCJdID0gXCJHZXRDaGF0VHJhbnNjcmlwdEZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEXCJdID0gXCJFbWFpbFRyYW5zY3JpcHRTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRFwiXSA9IFwiRW1haWxUcmFuc2NyaXB0U3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkVNQUlMVFJBTlNDUklQVEZBSUxFRFwiXSA9IFwiRW1haWxUcmFuc2NyaXB0RmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEXCJdID0gXCJGZXRjaERhdGFNYXNraW5nU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJGRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVEXCJdID0gXCJGZXRjaERhdGFNYXNraW5nU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkZFVENIREFUQU1BU0tJTkdGQUlMRURcIl0gPSBcIkZldGNoRGF0YU1hc2tpbmdGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURURcIl0gPSBcIlNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERURcIl0gPSBcIlNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRFwiXSA9IFwiU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRFwiXSA9IFwiR2V0U3VydmV5SW52aXRlTGlua1N0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRFwiXSA9IFwiR2V0U3VydmV5SW52aXRlTGlua1N1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVEXCJdID0gXCJHZXRTdXJ2ZXlJbnZpdGVMaW5rRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEXCJdID0gXCJWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEXCJdID0gXCJWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRURcIl0gPSBcIlZhbGlkYXRlQXV0aENoYXRSZWNvcmRGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEXCJdID0gXCJHZXRBZ2VudEF2YWlsYWJpbGl0eVN0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERURcIl0gPSBcIkdldEFnZW50QXZhaWxhYmlsaXR5U3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEXCJdID0gXCJHZXRBZ2VudEF2YWlsYWJpbGl0eUZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEXCJdID0gXCJTZW5kVHlwaW5nSW5kaWNhdG9yRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERURcIl0gPSBcIlNlbmRUeXBpbmdJbmRpY2F0b3JTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1RBUlRFRFwiXSA9IFwiR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5U3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllTVUNDRUVERURcIl0gPSBcIkdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeVN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllGQUlMRURcIl0gPSBcIkdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeUZhaWxlZFwiO1xufSkoT0NTREtUZWxlbWV0cnlFdmVudCA9IGV4cG9ydHMuT0NTREtUZWxlbWV0cnlFdmVudCB8fCAoZXhwb3J0cy5PQ1NES1RlbGVtZXRyeUV2ZW50ID0ge30pKTtcbnZhciBMaXZlQ2hhdFZlcnNpb247XG4oZnVuY3Rpb24gKExpdmVDaGF0VmVyc2lvbikge1xuICAgIC8vIElDMyBsaXZlIGNoYXRcbiAgICBMaXZlQ2hhdFZlcnNpb25bTGl2ZUNoYXRWZXJzaW9uW1wiVjFcIl0gPSAxXSA9IFwiVjFcIjtcbiAgICAvLyBBQ1MgbGl2ZSBjaGF0XG4gICAgTGl2ZUNoYXRWZXJzaW9uW0xpdmVDaGF0VmVyc2lvbltcIlYyXCJdID0gMl0gPSBcIlYyXCI7XG4gICAgTGl2ZUNoYXRWZXJzaW9uW0xpdmVDaGF0VmVyc2lvbltcIlYzXCJdID0gM10gPSBcIlYzXCI7XG59KShMaXZlQ2hhdFZlcnNpb24gPSBleHBvcnRzLkxpdmVDaGF0VmVyc2lvbiB8fCAoZXhwb3J0cy5MaXZlQ2hhdFZlcnNpb24gPSB7fSkpO1xudmFyIFNES0Vycm9yO1xuKGZ1bmN0aW9uIChTREtFcnJvcikge1xuICAgIFNES0Vycm9yW1wiQ2xpZW50SFRUUFRpbWVvdXRFcnJvck5hbWVcIl0gPSBcIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JcIjtcbiAgICBTREtFcnJvcltcIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlXCJdID0gXCJTZXJ2ZXIgdG9vayB0b28gbG9uZyB0byByZXNwb25kXCI7XG59KShTREtFcnJvciA9IGV4cG9ydHMuU0RLRXJyb3IgfHwgKGV4cG9ydHMuU0RLRXJyb3IgPSB7fSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRXZlbnROYW1lcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudE5hbWVzKCkge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnROYW1lcywgXCJPQ1NES0xPQURcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwib2M6c2RrOmxvYWRcIjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBFdmVudE5hbWVzO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50TmFtZXM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBMb2NhbGVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvY2FsZXMoKSB7XG4gICAgfVxuICAgIExvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcyA9IFtcbiAgICAgICAgXCJhci1zYVwiLFxuICAgICAgICBcImJnLWJnXCIsXG4gICAgICAgIFwiY2EtZXNcIixcbiAgICAgICAgXCJjcy1jelwiLFxuICAgICAgICBcImRhLWRrXCIsXG4gICAgICAgIFwiZGUtZGVcIixcbiAgICAgICAgXCJlbC1nclwiLFxuICAgICAgICBcImVuLXVzXCIsXG4gICAgICAgIFwiZXMtZXNcIixcbiAgICAgICAgXCJldC1lZVwiLFxuICAgICAgICBcImV1LWVzXCIsXG4gICAgICAgIFwiZmktZmlcIixcbiAgICAgICAgXCJmci1mclwiLFxuICAgICAgICBcImdsLWVzXCIsXG4gICAgICAgIFwiaGUtaWxcIixcbiAgICAgICAgXCJoaS1pblwiLFxuICAgICAgICBcImhyLWhyXCIsXG4gICAgICAgIFwiaHUtaHVcIixcbiAgICAgICAgXCJpZC1pZFwiLFxuICAgICAgICBcIml0LWl0XCIsXG4gICAgICAgIFwiamEtanBcIixcbiAgICAgICAgXCJray1relwiLFxuICAgICAgICBcImtvLWtyXCIsXG4gICAgICAgIFwibHQtbHRcIixcbiAgICAgICAgXCJsdi1sdlwiLFxuICAgICAgICBcIm1zLW15XCIsXG4gICAgICAgIFwibmItbm9cIixcbiAgICAgICAgXCJubC1ubFwiLFxuICAgICAgICBcInBsLXBsXCIsXG4gICAgICAgIFwicHQtYnJcIixcbiAgICAgICAgXCJwdC1wdFwiLFxuICAgICAgICBcInJvLXJvXCIsXG4gICAgICAgIFwicnUtcnVcIixcbiAgICAgICAgXCJzay1za1wiLFxuICAgICAgICBcInNsLXNpXCIsXG4gICAgICAgIFwic3ItY3lybC1jc1wiLFxuICAgICAgICBcInNyLWxhdG4tY3NcIixcbiAgICAgICAgXCJzdi1zZVwiLFxuICAgICAgICBcInRoLXRoXCIsXG4gICAgICAgIFwidHItdHJcIixcbiAgICAgICAgXCJ1ay11YVwiLFxuICAgICAgICBcInZpLXZuXCIsXG4gICAgICAgIFwiemgtY25cIixcbiAgICAgICAgXCJ6aC1oa1wiLFxuICAgICAgICBcInpoLXR3XCJcbiAgICBdO1xuICAgIHJldHVybiBMb2NhbGVzO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IExvY2FsZXM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBUZWxlbWV0cnlIZWxwZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vVXRpbHMvVGVsZW1ldHJ5SGVscGVyXCIpKTtcbnZhciBPQ1NES0xvZ2dlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPQ1NES0xvZ2dlcihsb2dnZXIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgfVxuICAgIE9DU0RLTG9nZ2VyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAobG9nbGV2ZWwsIHRlbGVtZXRyeUV2ZW50LCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAodGhpcy5pc0xvZ2dpbmdFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHZhciBsb2dEYXRhID0gVGVsZW1ldHJ5SGVscGVyXzEuZGVmYXVsdC5HRVRURUxFTUVUUllFVkVOVERBVEEodGVsZW1ldHJ5RXZlbnQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHRoaXMubG9nRXZlbnQobG9nbGV2ZWwsIGxvZ0RhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPQ1NES0xvZ2dlci5wcm90b3R5cGUubG9nRXZlbnQgPSBmdW5jdGlvbiAobG9nTGV2ZWwsIGxvZ0RhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2dnaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2dDbGllbnRTZGtUZWxlbWV0cnlFdmVudChsb2dMZXZlbCwgbG9nRGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9DU0RLTG9nZ2VyLnByb3RvdHlwZS5pc0xvZ2dpbmdFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5sb2dnZXIpO1xuICAgIH07XG4gICAgT0NTREtMb2dnZXIucHJvdG90eXBlLmlzTnVsbE9yVW5kZWZpbmVkID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCk7XG4gICAgfTtcbiAgICByZXR1cm4gT0NTREtMb2dnZXI7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gT0NTREtMb2dnZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBPbW5pY2hhbm5lbEVuZHBvaW50cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPbW5pY2hhbm5lbEVuZHBvaW50cygpIHtcbiAgICB9XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9vcmdhbml6YXRpb25cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbm5lY3RvckF1dGhQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL29yZ2FuaXphdGlvblwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxjd0Zjc0RldGFpbHNQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci92Mi9sY3dmY3NkZXRhaWxzXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9jb25maWdcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3Ivc2Vzc2lvbmluaXRcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvc2Vzc2lvbmluaXRcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUb2tlblBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2dldGNoYXR0b2tlblwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci92Mi9nZXRjaGF0dG9rZW5cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYzR2V0Q2hhdFRva2VuUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvdjMvZ2V0Y2hhdHRva2VuXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2NEdldENoYXRUb2tlblBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3Y0L2dldGNoYXR0b2tlblwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djRBdXRoR2V0Q2hhdFRva2VuUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvdjQvYXV0aC9nZXRjaGF0dG9rZW5cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL2dldGNoYXR0b2tlblwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRva2VuUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvdjIvYXV0aC9nZXRjaGF0dG9rZW5cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYzQXV0aEdldENoYXRUb2tlblBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3YzL2F1dGgvZ2V0Y2hhdHRva2VuXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9zZXNzaW9uY2xvc2VcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL3Nlc3Npb25jbG9zZVwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoID0gXCJzdXJ2ZXkvc3VibWl0cG9zdGNoYXRcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGggPSBcInN1cnZleS9hdXRoL3N1Ym1pdHBvc3RjaGF0XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvZ2V0c3VydmV5aW52aXRlXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvZ2V0c3VydmV5aW52aXRlXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2dldGNoYXR0cmFuc2NyaXB0c1wiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3YyL2dldGNoYXR0cmFuc2NyaXB0c1wiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvYXV0aC9nZXRjaGF0dHJhbnNjcmlwdHNcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvdjIvYXV0aC9nZXRjaGF0dHJhbnNjcmlwdHNcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9jcmVhdGVlbWFpbHJlcXVlc3RcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvYXV0aC9jcmVhdGVlbWFpbHJlcXVlc3RcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvZmV0Y2hkYXRhbWFza2luZ2luZm9cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3NlY29uZGFyeWNoYW5uZWxldmVudFwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvc2Vjb25kYXJ5Y2hhbm5lbGV2ZW50XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvZ2V0bGl2ZXdvcmtpdGVtZGV0YWlsc1wiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL2dldGxpdmV3b3JraXRlbWRldGFpbHNcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvcmVjb25uZWN0YWJsZWNoYXRzXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9yZWNvbm5lY3RcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL3ZhbGlkYXRlYXV0aGNoYXRtYXByZWNvcmRcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvZ2V0YWdlbnRhdmFpbGFiaWxpdHlcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCA9IFwiaW5ib3VuZC90eXBpbmdpbmRpY2F0b3IvbGl2ZWNoYXQvc2VuZHR5cGluZ2luZGljYXRvclwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeVBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvb3JnYW5pemF0aW9uXCI7XG4gICAgcmV0dXJuIE9tbmljaGFubmVsRW5kcG9pbnRzO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IE9tbmljaGFubmVsRW5kcG9pbnRzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgT21uaWNoYW5uZWxIVFRQSGVhZGVycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzKCkge1xuICAgIH1cbiAgICBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBcIkF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5cIjtcbiAgICBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb24gPSBcIkF1dGhvcml6YXRpb25cIjtcbiAgICBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkID0gXCJPcmdhbml6YXRpb25JZFwiO1xuICAgIE9tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWQgPSBcIndpZGdldEFwcElkXCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWQgPSBcIlJlcXVlc3QtSWRcIjtcbiAgICBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2UgPSBcIkF1dGhDb2RlTm9uY2VcIjtcbiAgICBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkID0gXCJPYy1TZXNzaW9uaWRcIjtcbiAgICBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jVXNlckFnZW50ID0gXCJNcy1PYy1Vc2VyLUFnZW50XCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5jb3JyZWxhdGlvbklkID0gXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5wYWdlVG9rZW4gPSBcIlBhZ2VUb2tlblwiO1xuICAgIHJldHVybiBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IE9tbmljaGFubmVsSFRUUEhlYWRlcnM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTG9nTGV2ZWwgPSB2b2lkIDA7XG52YXIgTG9nTGV2ZWw7XG4oZnVuY3Rpb24gKExvZ0xldmVsKSB7XG4gICAgTG9nTGV2ZWxbXCJJTkZPXCJdID0gXCJJTkZPXCI7XG4gICAgTG9nTGV2ZWxbXCJERUJVR1wiXSA9IFwiREVCVUdcIjtcbiAgICBMb2dMZXZlbFtcIldBUk5cIl0gPSBcIldBUk5cIjtcbiAgICBMb2dMZXZlbFtcIkVSUk9SXCJdID0gXCJFUlJPUlwiO1xufSkoTG9nTGV2ZWwgPSBleHBvcnRzLkxvZ0xldmVsIHx8IChleHBvcnRzLkxvZ0xldmVsID0ge30pKTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEVudW1zXzEgPSByZXF1aXJlKFwiLi9Db21tb24vRW51bXNcIik7XG52YXIgYXhpb3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiYXhpb3NcIikpO1xudmFyIGF4aW9zUmV0cnlIYW5kbGVyXzEgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vVXRpbHMvYXhpb3NSZXRyeUhhbmRsZXJcIikpO1xudmFyIEJyb3dzZXJJbmZvXzEgPSByZXF1aXJlKFwiLi9VdGlscy9Ccm93c2VySW5mb1wiKTtcbnZhciBDb25zdGFudHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9Db21tb24vQ29uc3RhbnRzXCIpKTtcbnZhciBDdXN0b21Db250ZXh0RGF0YV8xID0gcmVxdWlyZShcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIik7XG52YXIgRGV2aWNlSW5mb18xID0gcmVxdWlyZShcIi4vVXRpbHMvRGV2aWNlSW5mb1wiKTtcbnZhciBlbmNfaGV4XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImNyeXB0by1qcy9lbmMtaGV4XCIpKTtcbnZhciBMb2NhbGVzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vQ29tbW9uL0xvY2FsZXNcIikpO1xudmFyIExvZ0xldmVsXzEgPSByZXF1aXJlKFwiLi9Nb2RlbC9Mb2dMZXZlbFwiKTtcbnZhciBMb2dnaW5nU2FuaXRpemVyXzEgPSByZXF1aXJlKFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCIpO1xudmFyIE9TSW5mb18xID0gcmVxdWlyZShcIi4vVXRpbHMvT1NJbmZvXCIpO1xudmFyIE9tbmljaGFubmVsRW5kcG9pbnRzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCIpKTtcbnZhciBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIikpO1xudmFyIHNoYTI1Nl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJjcnlwdG8tanMvc2hhMjU2XCIpKTtcbnZhciBUaW1lcl8xID0gcmVxdWlyZShcIi4vVXRpbHMvVGltZXJcIik7XG52YXIgaHR0cEhlYWRlcnNVdGlsc18xID0gcmVxdWlyZShcIi4vVXRpbHMvaHR0cEhlYWRlcnNVdGlsc1wiKTtcbnZhciBlbmRwb2ludHNDcmVhdG9yc18xID0gcmVxdWlyZShcIi4vVXRpbHMvZW5kcG9pbnRzQ3JlYXRvcnNcIik7XG52YXIgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9VdGlscy9pc0V4cGVjdGVkQXhpb3NFcnJvclwiKSk7XG52YXIgU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9VdGlscy9TZXNzaW9uSW5pdFJldHJ5SGFuZGxlclwiKSk7XG52YXIgdXVpZF8xID0gcmVxdWlyZShcIi4vVXRpbHMvdXVpZFwiKTtcbnZhciB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnc18xID0gcmVxdWlyZShcIi4vVXRpbHMvd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcIik7XG52YXIgU0RLID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNESyhvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24sIGxvZ2dlcikge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbiA9PT0gdm9pZCAwKSB7IGNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247IH1cbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgICAgICB0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlID0gXCJcIi5jb25jYXQoRW51bXNfMS5TREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTmFtZSwgXCI6IFwiKS5jb25jYXQoRW51bXNfMS5TREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTWVzc2FnZSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZSA9IGZ1bmN0aW9uIChoZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGVycyA9PT0gbnVsbCB8fCBoZWFkZXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBoZWFkZXJzLmF1dGhjb2Rlbm9uY2UpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UgPSBoZWFkZXJzID09PSBudWxsIHx8IGhlYWRlcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhlYWRlcnMuYXV0aGNvZGVub25jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIgPSBmdW5jdGlvbiAoc2Vzc2lvbklkLCBoZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vY1Nlc3Npb25JZF0gPSBzZXNzaW9uSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIgPSBmdW5jdGlvbiAoY29ycmVsYXRpb25JZCwgaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmNvcnJlbGF0aW9uSWRdID0gY29ycmVsYXRpb25JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gU2V0cyB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgcGFzc2VkIGNvbmZpZ3VyYXRpb24gaXMgZW1wdHkgb3IgaXMgbm90IGFuIG9iamVjdFxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24pOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9hW19pXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJcIi5jb25jYXQoa2V5KV0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJcIi5jb25jYXQoa2V5KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgICAgIGZvciAodmFyIF9iID0gMCwgX2MgPSBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSk7IF9iIDwgX2MubGVuZ3RoOyBfYisrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gX2NbX2JdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bXCJcIi5jb25jYXQoa2V5KV0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtcIlwiLmNvbmNhdChrZXkpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSBjaGFubmVsSWRcbiAgICAgICAgdmFyIGNoYW5uZWxJZCA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQ7XG4gICAgICAgIGlmICghT2JqZWN0LnZhbHVlcyhFbnVtc18xLkNoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFubmVsSWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgT0MgY29uZmlnXG4gICAgICAgIHZhciBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGZvciAodmFyIF9kID0gMCwgX2UgPSBDb25zdGFudHNfMS5kZWZhdWx0LnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVyczsgX2QgPCBfZS5sZW5ndGg7IF9kKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfZVtfZF07XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nICdcIi5jb25jYXQoa2V5LCBcIicgaW4gT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9jVXNlckFnZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLm9jVXNlckFnZW50O1xuICAgICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IEVudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIExDVyBGQ1MgRGV0YWlscyBvZiB0aGUgT3JnLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0TGN3RmNzRGV0YWlscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVybCwgYXhpb3NJbnN0YW5jZSwgcmVxdWVzdEhlYWRlcnMsIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhLCBlcnJvcl8xLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgc3RhcnRlZFwiLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MY3dGY3NEZXRhaWxzUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBcIkdFVFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBodHRwSGVhZGVyc1V0aWxzXzEuYWRkT2NVc2VyQWdlbnRIZWFkZXIpKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN1Y2NlZWRlZFwiLCBcIlwiLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBmYWlsZWRcIiwgXCJcIiwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8xLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8xO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5nZXRDaGF0Q29uZmlnID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgYnlwYXNzQ2FjaGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoYnlwYXNzQ2FjaGUgPT09IHZvaWQgMCkgeyBieXBhc3NDYWNoZSA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdXJsLCBheGlvc0luc3RhbmNlLCByZXF1ZXN0SGVhZGVycywgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGRhdGEsIGVycm9yXzIsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA9ICgwLCB1dWlkXzEudXVpZHY0KSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0Q29uZmlnUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCI/cmVxdWVzdElkPVwiKS5jb25jYXQocmVxdWVzdElkLCBcIiZjaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gXCJHRVRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgQ29uc3RhbnRzXzEuZGVmYXVsdC5ieXBhc3NDYWNoZUhlYWRlcnMpLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHRkFJTEVELCBcIkdldCBDaGF0IGNvbmZpZyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzIsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlamVjdChlcnJvcl8yKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZldGNoZXMgTFdJIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5nZXRMV0lEZXRhaWxzID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwKSB7IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlY29ubmVjdElkLCByZXF1ZXN0SGVhZGVycywgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSwgcGFyYW1zLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSAoMCwgdXVpZF8xLnV1aWR2NCkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kKShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSxcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0TFdJRGV0YWlscyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlY29ubmVjdElkID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zLnJlY29ubmVjdElkO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggKz0gXCIvXCIuY29uY2F0KHJlY29ubmVjdElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJHRVRcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGRhdGEsIGhlYWRlcnMsIGVycm9yXzMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmRhdGEsIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCwgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8zID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfMywgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzMsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgICAqIEBwYXJhbSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdG9rZW4uXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5nZXRDaGF0VG9rZW4gPSBmdW5jdGlvbiAocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA9PT0gdm9pZCAwKSB7IGN1cnJlbnRSZXRyeUNvdW50ID0gMDsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4sIE1zT2NCb3RBcHBsaWNhdGlvbklkLCBtdWx0aUJvdCwgcmVxdWVzdEhlYWRlcnMsIGVuZHBvaW50LCByZXF1ZXN0UGF0aCwgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSwgcGFyYW1zLCB1cmwsIG1ldGhvZCwgb3B0aW9ucywgYXhpb3NJbnN0YW5jZTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgcmVjb25uZWN0SWQgPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcy5yZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcy5jdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcy5yZWZyZXNoVG9rZW4sIE1zT2NCb3RBcHBsaWNhdGlvbklkID0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMuTXNPY0JvdEFwcGxpY2F0aW9uSWQ7XG4gICAgICAgICAgICAgICAgbXVsdGlCb3QgPSAoTXNPY0JvdEFwcGxpY2F0aW9uSWQgJiYgTXNPY0JvdEFwcGxpY2F0aW9uSWQubGVuZ3RoID4gMCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkID0gKDAsIHV1aWRfMS51dWlkdjQpKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gKDAsIGVuZHBvaW50c0NyZWF0b3JzXzEuY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQpKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgdGhpcy5saXZlQ2hhdFZlcnNpb24sIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPyB0cnVlIDogZmFsc2UsIG11bHRpQm90KTtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KGVuZHBvaW50LCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggKz0gXCIvXCIuY29uY2F0KHJlY29ubmVjdElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoTXNPY0JvdEFwcGxpY2F0aW9uSWQgJiYgTXNPY0JvdEFwcGxpY2F0aW9uSWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNbJ01zLU9jLUJvdC1BcHBsaWNhdGlvbi1JZCddID0gTXNPY0JvdEFwcGxpY2F0aW9uSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnJlZnJlc2hUb2tlbiA9ICd0cnVlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0sXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IChjdXJyZW50UmV0cnlDb3VudCA+IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSkgPyBjdXJyZW50UmV0cnlDb3VudCA6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjksXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhLCBoZWFkZXJzLCBlcnJvcl80LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhLCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0Lm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBkYXRhIGlzIGVtcHR5LCBpZiBzbywgdGhlbiByZWplY3QgdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJFbXB0eSBkYXRhIHJlY2VpdmVkIGZyb20gZ2V0Q2hhdFRva2VuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1VDQ0VFREVELCBcIkdldCBDaGF0IFRva2VuIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHNfMS5kZWZhdWx0Lm5vQ29udGVudFN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl80ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsIFwiR2V0IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl80LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfNCwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5nZXRSZWNvbm5lY3RhYmxlQ2hhdHMgPSBmdW5jdGlvbiAocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQsIHJlcXVlc3RQYXRoLCByZXF1ZXN0SGVhZGVycywgdXJsLCBtZXRob2QsIG9wdGlvbnMsIGF4aW9zSW5zdGFuY2U7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdElkID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zID09PSBudWxsIHx8IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zLnJlcXVlc3RJZDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJHRVRcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0YWJsZUNoYXRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGRhdGEsIGhlYWRlcnMsIGVycm9yXzUsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmRhdGEsIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgU3VjY2VlZGVkIGFuZCBvbGQgc2Vzc2lvbiByZXR1cm5lZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl81ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNGQUlMRUQsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl81LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfNSwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfNSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5ID0gZnVuY3Rpb24gKHJlY29ubmVjdElkLCBvcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChvcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwKSB7IG9wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCByZXF1ZXN0UGF0aCwgcmVxdWVzdEhlYWRlcnMsIHVybCwgbWV0aG9kLCBvcHRpb25zLCBheGlvc0luc3RhbmNlO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlY29ubmVjdElkKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhvcHRpb25hbFBhcmFtcyA9PT0gbnVsbCB8fCBvcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uYWxQYXJhbXMucmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhLCBlcnJvcl82LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCBvcHRpb25hbFBhcmFtcyA9PT0gbnVsbCB8fCBvcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uYWxQYXJhbXMucmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5XQVJOLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IGRpZG4ndCBzZW5kIGFueSB2YWxpZCBkYXRhXCIsIG9wdGlvbmFsUGFyYW1zID09PSBudWxsIHx8IG9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25hbFBhcmFtcy5yZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfNiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCBvcHRpb25hbFBhcmFtcyA9PT0gbnVsbCB8fCBvcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uYWxQYXJhbXMucmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzYsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl82LCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl82KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0QWdlbnRBdmFpbGFiaWxpdHkgPSBmdW5jdGlvbiAocmVxdWVzdElkLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCByZXF1ZXN0UGF0aCwgYXhpb3NJbnN0YW5jZSwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQsIHJlcXVlc3RIZWFkZXJzLCBkYXRhLCBjYWNoT2JqLCB0ZW1wQXJyLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPWxjd1wiKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcy5pbml0Q29udGV4dCwgZ2V0Q29udGV4dCA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMuZ2V0Q29udGV4dDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGRhdGEgPSBpbml0Q29udGV4dCB8fCB7fTtcbiAgICAgICAgICAgICAgICBjYWNoT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBcIm9yZ0lkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgICAgICAgICAgICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnIgPSBDdXN0b21Db250ZXh0RGF0YV8xLkN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9kYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBkYXRhLmNhY2hlS2V5ID0gKDAsIHNoYTI1Nl8xLmRlZmF1bHQpKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS50b1N0cmluZyhlbmNfaGV4XzEuZGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNcIikpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm9fMS5Ccm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm9fMS5EZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5vcyA9IE9TSW5mb18xLk9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzXzEuZGVmYXVsdC5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgbG9jYWxlOiAnXCIuY29uY2F0KGRhdGEubG9jYWxlLCBcIidcIikpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGRhdGFfMSwgaGVhZGVycywgZXJyb3JfNywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhXzEgPSByZXNwb25zZS5kYXRhLCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl83LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfNywgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqJ1xuICAgICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5zZXNzaW9uSW5pdCA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwKSB7IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIGF4aW9zSW5zdGFuY2UsIHJldHJ5T240MjksIHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCwgZGF0YSwgcmVxdWVzdEhlYWRlcnMsIGJhc2VQYXRoLCByZXF1ZXN0UGF0aCwgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSwgcGFyYW1zLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfYjtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0cnlPbjQyOSA9IHRydWU7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUmV0cnk6IGZ1bmN0aW9uIChlcnJvcikgeyByZXR1cm4gKDAsIFNlc3Npb25Jbml0UmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoZXJyb3IsIHJldHJ5T240MjkpOyB9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZWNvbm5lY3RJZCA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMucmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcy5pbml0Q29udGV4dCwgZ2V0Q29udGV4dCA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMuZ2V0Q29udGV4dDtcbiAgICAgICAgICAgICAgICBkYXRhID0gaW5pdENvbnRleHQgfHwge307XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBfX2Fzc2lnbih7fSwgQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICAgICAgICAgICAgICAgID8gT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aFxuICAgICAgICAgICAgICAgICAgICA6IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChiYXNlUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdEhlYWRlcnMsIChfYiA9IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgX2JbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgX2JbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggKz0gXCIvXCIuY29uY2F0KHJlY29ubmVjdElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzXCIpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvXzEuQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvXzEuRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEub3MgPSBPU0luZm9fMS5PU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0TG9jYWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXNfMS5kZWZhdWx0LnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBsb2NhbGU6ICdcIi5jb25jYXQoZGF0YS5sb2NhbGUsIFwiJ1wiKSkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGhlYWRlcnMsIGVycm9yXzgsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIFwiU2Vzc2lvbiBJbml0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIGRhdGEsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfOCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIFwiU2Vzc2lvbiBJbml0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfOCwgZGF0YSwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl84LCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfOCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTREsucHJvdG90eXBlLmNyZWF0ZUNvbnZlcnNhdGlvbiA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwKSB7IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIGF4aW9zSW5zdGFuY2UsIHJldHJ5T240MjksIHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCwgZGF0YSwgcmVxdWVzdEhlYWRlcnMsIGJhc2VQYXRoLCByZXF1ZXN0UGF0aCwgdXJsLCBtZXRob2QsIG9wdGlvbnMsIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhXzIsIGhlYWRlcnMsIGVycm9yXzksIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgdmFyIF9iO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTlNUQVJURUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeU9uNDI5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25Jbml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJldHJ5OiBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuICgwLCBTZXNzaW9uSW5pdFJldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGVycm9yLCByZXRyeU9uNDI5KTsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0SWQgPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zLnJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMuaW5pdENvbnRleHQsIGdldENvbnRleHQgPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zLmdldENvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gaW5pdENvbnRleHQgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IF9fYXNzaWduKHt9LCBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gYXV0aGVudGljYXRlZFVzZXJUb2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdENvbm5lY3RvclBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChiYXNlUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvd2lkZ2V0QXBwL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL2NvbnZlcnNhdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0SGVhZGVycywgKF9iID0ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVjb25uZWN0SWQgPSByZWNvbm5lY3RJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2hhbm5lbElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc1wiKSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mb18xLkJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvXzEuRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm9zID0gT1NJbmZvXzEuT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0TG9jYWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXNfMS5kZWZhdWx0LnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGxvY2FsZTogJ1wiLmNvbmNhdChkYXRhLmxvY2FsZSwgXCInXCIpKSldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV8yID0gcmVzcG9uc2UuZGF0YSwgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0Lm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBkYXRhIGlzIGVtcHR5LCBpZiBzbywgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGFfMikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgZGF0YSByZWNlaXZlZCBmcm9tIGdldENoYXRUb2tlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfMi5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTlNVQ0NFRURFRCwgXCJDcmVhdGUgY292ZXJzYXRpb24gY2FsbCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZGF0YV8yXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfOSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTkZBSUxFRCwgXCJDcmVhdGUgY29udmVyc2F0aW9uIGNhbGwgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl85LCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzksIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yXzk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuc2Vzc2lvbkNsb3NlID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkLCByZXF1ZXN0SGVhZGVycywgZGF0YSwgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0sXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25DbG9zZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQgPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcy5pc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQgPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcy5pc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcy5jaGF0SWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIGRhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQsIFwiP2NoYW5uZWxJZD1cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoICs9IFwiJmlzUmVjb25uZWN0Q2hhdD10cnVlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoICs9IFwiJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgaGVhZGVycywgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZXJyb3JfMTAsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEwID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsIFwiU2Vzc2lvbiBjbG9zZSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzEwLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JfMTAuY29kZSA9PT0gQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl8xMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLnZhbGlkYXRlQXV0aENoYXRSZWNvcmQgPSBmdW5jdGlvbiAocmVxdWVzdElkLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIHJlcXVlc3RIZWFkZXJzLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY2hhdElkID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zLmNoYXRJZDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChjaGF0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0sXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIkdFVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgaGVhZGVycywgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZXJyb3JfMTEsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChfYSA9IHJlc3BvbnNlLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hdXRoQ2hhdEV4aXN0KSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfMTEsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl8xMSwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JfMTEudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfMTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuc3VibWl0UG9zdENoYXRSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIHBvc3RDaGF0UmVzcG9uc2UsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SGVhZGVycywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA9IHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGhlYWRlcnMsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGVycm9yXzEyLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELCBcIlN1Ym1pdCBQb3N0IENoYXQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEyID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfMTIsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl8xMiwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0U3VydmV5SW52aXRlTGluayA9IGZ1bmN0aW9uIChzdXJ2ZXlPd25lcklkLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwKSB7IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMsIHVybCwgbWV0aG9kLCBvcHRpb25zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELCB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHN1cnZleU93bmVySWQpO1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0sXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcy5yZXF1ZXN0SWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdChzdXJ2ZXlPd25lcklkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBkYXRhLCBoZWFkZXJzLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBlcnJvcl8xMywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmRhdGEsIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMTMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzEzLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTMsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzEzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICAgKiBAcGFyYW0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdHJhbnNjcmlwdHMuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5nZXRDaGF0VHJhbnNjcmlwdHMgPSBmdW5jdGlvbiAocmVxdWVzdElkLCBjaGF0SWQsIHRva2VuLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwKSB7IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCByZXF1ZXN0UGF0aCwgYXhpb3NJbnN0YW5jZSwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVxdWVzdEhlYWRlcnMsIHVybCwgbWV0aG9kLCBvcHRpb25zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCwgXCIvXCIpLmNvbmNhdChjaGF0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0sXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMuY3VycmVudExpdmVDaGF0VmVyc2lvbjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IEVudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IEVudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aCwgXCIvXCIpLmNvbmNhdChjaGF0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCwgXCIvXCIpLmNvbmNhdChjaGF0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoLCBcIi9cIikuY29uY2F0KGNoYXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQsIFwiP2NoYW5uZWxJZD1cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZGF0YSwgaGVhZGVycywgZXJyb3JfMTQsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmRhdGEsIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xNCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzE0LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTQsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzE0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeSBmb3IgYXV0aGVudGljYXRlZCB1c2Vycy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgICAqIEBwYXJhbSBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgcGVyc2lzdGVudCBjaGF0IGhpc3RvcnkuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5nZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnkgPSBmdW5jdGlvbiAocmVxdWVzdElkLCBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwKSB7IGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBwYWdlU2l6ZSwgcGFnZVRva2VuLCBlcnJvck1lc3NhZ2UsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCByZXF1ZXN0SGVhZGVycywgcGFyYW1zLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNUQVJURUQsIFwiR2V0IFBlcnNpc3RlbnQgQ2hhdCBIaXN0b3J5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSAoMCwgdXVpZF8xLnV1aWR2NCkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA9IGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHBhZ2VTaXplID0gZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMucGFnZVNpemUsIHBhZ2VUb2tlbiA9IGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zLnBhZ2VUb2tlbjtcbiAgICAgICAgICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gXCJBdXRoZW50aWNhdGVkIHVzZXIgdG9rZW4gaXMgcmVxdWlyZWQgZm9yIHBlcnNpc3RlbnQgY2hhdCBoaXN0b3J5XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZRkFJTEVELCBcIkdldCBQZXJzaXN0ZW50IENoYXQgSGlzdG9yeSBmYWlsZWQgLSBNaXNzaW5nIGF1dGhlbnRpY2F0ZWQgdXNlciB0b2tlblwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0QXV0aEdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeVBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL3dpZGdldGFwcC9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9jb252ZXJzYXRpb24vaGlzdG9yeVwiKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5wYWdlVG9rZW5dID0gcGFnZVRva2VuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChwYWdlU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGFnZVNpemUgPSBwYWdlU2l6ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJHRVRcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZGF0YSwgaGVhZGVycywgZXJyb3JfMTUsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmRhdGEsIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNVQ0NFRURFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3Rvcnkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xNSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZRkFJTEVELCBcIkdldCBQZXJzaXN0ZW50IENoYXQgSGlzdG9yeSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzE1LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTUsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl8xNSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5lbWFpbFRyYW5zY3JpcHQgPSBmdW5jdGlvbiAocmVxdWVzdElkLCB0b2tlbiwgZW1haWxSZXF1ZXN0Qm9keSwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RIZWFkZXJzLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0sXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGhlYWRlcnMsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGVycm9yXzE2LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xNiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8xNiwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzE2LCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl8xNik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS5mZXRjaERhdGFNYXNraW5nSW5mbyA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCByZXF1ZXN0SGVhZGVycywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA9ICgwLCB1dWlkXzEudXVpZHY0KSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQpO1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhLCBlcnJvcl8xNywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzE3ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HRkFJTEVELCBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzE3LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTcsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzE3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QgPSBmdW5jdGlvbiAocmVxdWVzdElkLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RIZWFkZXJzLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggKz0gXCI/Y2hhbm5lbElkPVwiICsgQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0Q2hhbm5lbElkO1xuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgaGVhZGVycywgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZXJyb3JfMTgsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xOCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfMTgsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl8xOCwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfMTgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuc2VuZFR5cGluZ0luZGljYXRvciA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24sIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIGN1c3RvbWVyRGlzcGxheU5hbWUsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCByZXF1ZXN0SGVhZGVycywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICBjdXN0b21lckRpc3BsYXlOYW1lID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zLmN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IEVudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuU2VuZFR5cGluZ0luZGljYXRvclBhdGgsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICAgICAgICAgICAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tDb25zdGFudHNfMS5kZWZhdWx0LmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlbmRUeXBpbmdJbmRpY2F0b3JcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGVycm9yXzE5LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMTkgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfMTksIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl8xOSwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfMTkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBsb2dnaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICAgKiBAcGFyYW0gdGVsZW1ldHJ5RXZlbnRUeXBlIFRlbGVtZXRyeSBldmVudCB0eXBlIGluIHdoaWNoIGV2ZW50IHdpbGwgYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlXG4gICAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUubG9nV2l0aExvZ2dlciA9IGZ1bmN0aW9uIChsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBkZXNjcmlwdGlvbiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHJlcXVlc3RQYXlsb2FkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBpZiAoIXRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyXzEuTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgICAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gX19hc3NpZ24oe30sIHJlcXVlc3RQYXlsb2FkKTtcbiAgICAgICAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXJfMS5Mb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXJfMS5Mb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyXzEuTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBhdXRoVG9rZW5EZXRhaWxzID0gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgaWYgKHJlcXVlc3RIZWFkZXJzKSB7XG4gICAgICAgICAgICBzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyA9IF9fYXNzaWduKHt9LCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyXzEuTG9nZ2luZ1Nhbml0aXplci5zdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyhzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5hdG9iKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0gdG9rZW4uc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB3aW5kb3cuYXRvYihwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqc29uRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbHdpQ29udGV4dHMgPSBqc29uRGF0YVtcImx3aWNvbnRleHRzXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWI6IGpzb25EYXRhW1wic3ViXCJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cDoganNvbkRhdGFbXCJleHBcIl1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobHdpQ29udGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbHdpQ29udGV4dHNEYXRhID0gSlNPTi5wYXJzZShsd2lDb250ZXh0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplcl8xLkxvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhsd2lDb250ZXh0c0RhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbkRldGFpbHMubHdpQ29udGV4dHMgPSBsd2lDb250ZXh0c0RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1c3RvbURhdGEgPSB7XG4gICAgICAgICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgICAgICAgIFJlZ2lvbjogcmVzcG9uc2UgPT09IG51bGwgfHwgcmVzcG9uc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3BvbnNlLmRhdGEuUmVnaW9uLFxuICAgICAgICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIEh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lOiBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSxcbiAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50c18xLmRlZmF1bHQudHJhbnNhY3Rpb25pZF0sXG4gICAgICAgICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoX2EgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXR1cyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yID8gKChfYiA9IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGF0YSkgfHwgZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWQsXG4gICAgICAgICAgICBSZXF1ZXN0SGVhZGVyczogc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICBSZXNwb25zZUVycm9yY29kZTogZXJyb3IgPyAoX2QgPSAoX2MgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmhlYWRlcnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5lcnJvcmNvZGUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBBdXRoVG9rZW5EZXRhaWxzOiBhdXRoVG9rZW5EZXRhaWxzXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gICAgfTtcbiAgICBTREsucHJvdG90eXBlLmFkZERlZmF1bHRIZWFkZXJzID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgKDAsIGh0dHBIZWFkZXJzVXRpbHNfMS5hZGRPY1VzZXJBZ2VudEhlYWRlcikodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICB0aGlzLnNldENvcnJlbGF0aW9uSWRJbkhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB9O1xuICAgIFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgICAgIGdldENoYXRDb25maWc6IDEyMDAwMCxcbiAgICAgICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgICAgIGdldENoYXRUb2tlbjogMTUwMDAsXG4gICAgICAgIHNlc3Npb25Jbml0OiAxNTAwMCxcbiAgICAgICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICAgICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiAxNTAwMCxcbiAgICAgICAgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICAgICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgICAgIGdldFN1cnZleUludml0ZUxpbms6IDE1MDAwLFxuICAgICAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgICAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgICAgIGZldGNoRGF0YU1hc2tpbmdJbmZvOiA1MDAwLFxuICAgICAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogMTUwMDAsXG4gICAgICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICAgICAgc2VuZFR5cGluZ0luZGljYXRvcjogNTAwMCxcbiAgICAgICAgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQ6IDE1MDAwLFxuICAgICAgICBnZXRQZXJzaXN0ZW50Q2hhdEhpc3Rvcnk6IDE1MDAwXG4gICAgfTtcbiAgICBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAgIGF1dGhDb2RlTm9uY2U6ICgwLCB1dWlkXzEudXVpZHY0KSgpLnN1YnN0cmluZygwLCA4KSxcbiAgICAgICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgICAgIGdldENoYXRUb2tlblJldHJ5T240Mjk6IHRydWUsXG4gICAgICAgIG1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlOiA1LFxuICAgICAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVxdWVzdFRpbWVvdXRDb25maWc6IFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWcsXG4gICAgICAgIHVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzXzEud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MsXG4gICAgICAgIG9jVXNlckFnZW50OiBbXVxuICAgIH07XG4gICAgcmV0dXJuIFNESztcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBTREs7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBDb25zdGFudHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9Db21tb24vQ29uc3RhbnRzXCIpKTtcbnZhciBPQ1NES0xvZ2dlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiKSk7XG52YXIgU0RLXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vU0RLXCIpKTtcbnZhciBTREtQcm92aWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTREtQcm92aWRlcigpIHtcbiAgICB9XG4gICAgU0RLUHJvdmlkZXIuZ2V0U0RLID0gZnVuY3Rpb24gKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbiwgbG9nZ2VyKSB7XG4gICAgICAgIHZhciBpbG9nZ2VyID0gbmV3IE9DU0RLTG9nZ2VyXzEuZGVmYXVsdChsb2dnZXIpO1xuICAgICAgICByZXR1cm4gbmV3IFNES18xLmRlZmF1bHQoe1xuICAgICAgICAgICAgY2hhbm5lbElkOiBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkIHx8IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdENoYW5uZWxJZCxcbiAgICAgICAgICAgIG9yZ0lkOiBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICAgICAgICBvcmdVcmw6IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwsXG4gICAgICAgICAgICB3aWRnZXRJZDogb21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgICAgIH0sIGNvbmZpZ3VyYXRpb24gfHwge30sIGlsb2dnZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFNES1Byb3ZpZGVyO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFNES1Byb3ZpZGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJyb3dzZXJJbmZvID0gZXhwb3J0cy5VTktOT1dOX1ZFUlNJT04gPSB2b2lkIDA7XG52YXIgRW51bXNfMSA9IHJlcXVpcmUoXCIuLi9Db21tb24vRW51bXNcIik7XG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2Rldi5henVyZS5jb20vZHluYW1pY3Njcm0vT25lQ1JNL19naXQvQ1JNLk9tbmlDaGFubmVsLkxpdmVDaGF0V2lkZ2V0P3BhdGg9L3NyYy9MaXZlQ2hhdExvYWRlci9VdGlsaXR5L0Jyb3dzZXJJbmZvLnRzXG52YXIgUkVHRVhfVkVSU0lPTiA9IFwiKFtcXFxcZCwuXSspXCI7XG5leHBvcnRzLlVOS05PV05fVkVSU0lPTiA9IFwiVVwiO1xudmFyIEJyb3dzZXJJbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJyb3dzZXJJbmZvKCkge1xuICAgIH1cbiAgICBCcm93c2VySW5mby5nZXRVc2VyQWdlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJBZ2VudCgpO1xuICAgIH07XG4gICAgQnJvd3NlckluZm8udXNlckFnZW50Q29udGFpbnNTdHJpbmcgPSBmdW5jdGlvbiAoc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFVzZXJBZ2VudCgpLmluZGV4T2Yoc2VhcmNoU3RyaW5nKSA+IC0xO1xuICAgIH07XG4gICAgQnJvd3NlckluZm8uaXNDaHJvbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJBZ2VudENvbnRhaW5zU3RyaW5nKEVudW1zXzEuQnJvd3NlclZlbmRvci5DSFJPTUUpICYmXG4gICAgICAgICAgICAhdGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhFbnVtc18xLkJyb3dzZXJWZW5kb3IuRURHRSkgJiZcbiAgICAgICAgICAgICF0aGlzLnVzZXJBZ2VudENvbnRhaW5zU3RyaW5nKEVudW1zXzEuQnJvd3NlclZlbmRvci5FREdFX0NIUk9NSVVNKTtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLmlzSWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJBZ2VudENvbnRhaW5zU3RyaW5nKFwiVHJpZGVudFwiKTtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLmlzRWRnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckFnZW50Q29udGFpbnNTdHJpbmcoRW51bXNfMS5Ccm93c2VyVmVuZG9yLkVER0UpIHx8XG4gICAgICAgICAgICB0aGlzLnVzZXJBZ2VudENvbnRhaW5zU3RyaW5nKEVudW1zXzEuQnJvd3NlclZlbmRvci5FREdFX0NIUk9NSVVNKTtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLmlzT3BlcmEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJBZ2VudENvbnRhaW5zU3RyaW5nKFwiT1BSL1wiKTtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc09wZXJhKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLkJyb3dzZXJWZW5kb3IuT1BFUkE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNFZGdlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLkJyb3dzZXJWZW5kb3IuRURHRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0Nocm9tZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5Ccm93c2VyVmVuZG9yLkNIUk9NRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhFbnVtc18xLkJyb3dzZXJWZW5kb3IuRklSRUZPWCkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLkJyb3dzZXJWZW5kb3IuRklSRUZPWDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhFbnVtc18xLkJyb3dzZXJWZW5kb3IuU0FGQVJJKSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuQnJvd3NlclZlbmRvci5TQUZBUkk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNJZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5Ccm93c2VyVmVuZG9yLklFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFbnVtc18xLkJyb3dzZXJWZW5kb3IuVU5LTk9XTjtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLmdldEJyb3dzZXJWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZ2V0SWVWZXJzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHVzZXJBZ2VudCA9IF90aGlzLmdldFVzZXJBZ2VudCgpO1xuICAgICAgICAgICAgdmFyIGNsYXNzaWNJZVZlcnNpb25NYXRjaGVzID0gdXNlckFnZW50Lm1hdGNoKG5ldyBSZWdFeHAoRW51bXNfMS5Ccm93c2VyVmVuZG9yLklFICsgXCIgXCIgKyBSRUdFWF9WRVJTSU9OKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW5vbi1saXRlcmFsLXJlZ2V4cFxuICAgICAgICAgICAgaWYgKGNsYXNzaWNJZVZlcnNpb25NYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzaWNJZVZlcnNpb25NYXRjaGVzWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGllVmVyc2lvbk1hdGNoZXMgPSB1c2VyQWdlbnQubWF0Y2gobmV3IFJlZ0V4cChcInJ2OlwiICsgUkVHRVhfVkVSU0lPTikpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNlY3VyaXR5L2RldGVjdC1ub24tbGl0ZXJhbC1yZWdleHBcbiAgICAgICAgICAgIGlmIChpZVZlcnNpb25NYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGllVmVyc2lvbk1hdGNoZXNbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0T3RoZXJWZXJzaW9uID0gZnVuY3Rpb24gKGJyb3dzZXJTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChicm93c2VyU3RyaW5nID09PSBFbnVtc18xLkJyb3dzZXJWZW5kb3IuU0FGQVJJKSB7XG4gICAgICAgICAgICAgICAgYnJvd3NlclN0cmluZyA9IFwiVmVyc2lvblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJyb3dzZXJTdHJpbmcgPT09IEVudW1zXzEuQnJvd3NlclZlbmRvci5PUEVSQSkge1xuICAgICAgICAgICAgICAgIGJyb3dzZXJTdHJpbmcgPSBcIk9QUlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJyb3dzZXJTdHJpbmcgPT09IEVudW1zXzEuQnJvd3NlclZlbmRvci5FREdFKSB7XG4gICAgICAgICAgICAgICAgYnJvd3NlclN0cmluZyA9IFwiRWRnZT9cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gX3RoaXMuZ2V0VXNlckFnZW50KCkubWF0Y2gobmV3IFJlZ0V4cChicm93c2VyU3RyaW5nICsgXCIvXCIgKyBSRUdFWF9WRVJTSU9OKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW5vbi1saXRlcmFsLXJlZ2V4cFxuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1sxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlVOS05PV05fVkVSU0lPTjtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuaXNJZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0SWVWZXJzaW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldE90aGVyVmVyc2lvbih0aGlzLmdldEJyb3dzZXJOYW1lKCkpO1xuICAgIH07XG4gICAgQnJvd3NlckluZm8udXNlckFnZW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7IH07XG4gICAgcmV0dXJuIEJyb3dzZXJJbmZvO1xufSgpKTtcbmV4cG9ydHMuQnJvd3NlckluZm8gPSBCcm93c2VySW5mbztcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DdXN0b21Db250ZXh0RGF0YSA9IHZvaWQgMDtcbnZhciBDdXN0b21Db250ZXh0RGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDdXN0b21Db250ZXh0RGF0YSgpIHtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBDdXN0b21Db250ZXh0RGF0YS5zb3J0ID0gZnVuY3Rpb24gKGN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHZhciB0ZW1wQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIE9iamVjdC5rZXlzKGN1c3RvbUNvbnRleHREYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChjdXN0b21Db250ZXh0RGF0YSAmJiBjdXN0b21Db250ZXh0RGF0YVtcIlwiLmNvbmNhdChrZXkpXSkge1xuICAgICAgICAgICAgICAgIHZhciBvYmogPSB7IFwia2V5XCI6IGtleSwgXCJ2YWx1ZVwiOiBjdXN0b21Db250ZXh0RGF0YVtcIlwiLmNvbmNhdChrZXkpXSB9O1xuICAgICAgICAgICAgICAgIHRlbXBBcnIucHVzaChvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgdGVtcEFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICB2YXIga2V5QSA9IGEua2V5LnRvVXBwZXJDYXNlKCk7IC8vIGlnbm9yZSB1cHBlciBhbmQgbG93ZXJjYXNlXG4gICAgICAgICAgICB2YXIga2V5QiA9IGIua2V5LnRvVXBwZXJDYXNlKCk7IC8vIGlnbm9yZSB1cHBlciBhbmQgbG93ZXJjYXNlXG4gICAgICAgICAgICBpZiAoa2V5QSA8IGtleUIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5QSA+IGtleUIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRlbXBBcnI7XG4gICAgfTtcbiAgICByZXR1cm4gQ3VzdG9tQ29udGV4dERhdGE7XG59KCkpO1xuZXhwb3J0cy5DdXN0b21Db250ZXh0RGF0YSA9IEN1c3RvbUNvbnRleHREYXRhO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRldmljZUluZm8gPSB2b2lkIDA7XG52YXIgRW51bXNfMSA9IHJlcXVpcmUoXCIuLi9Db21tb24vRW51bXNcIik7XG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2Rldi5henVyZS5jb20vZHluYW1pY3Njcm0vT25lQ1JNL19naXQvQ1JNLk9tbmlDaGFubmVsLkxpdmVDaGF0V2lkZ2V0P3BhdGg9L3NyYy9MaXZlQ2hhdExvYWRlci9VdGlsaXR5L0RldmljZUluZm8udHMmdmVyc2lvbj1HQnJlbGVhc2VcbnZhciBEZXZpY2VJbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERldmljZUluZm8oKSB7XG4gICAgfVxuICAgIERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1vYmlsZSA9IC8oYW5kcm9pZHxpcG9kfHdpbmRvd3MgcGhvbmV8d3BkZXNrdG9wfHdpbmRvd3MgY2V8YmxhY2tiZXJyeVxcdyp8bWVlZ298d2Vib3N8cGFsbXxzeW1iaWFufHBkYXxcXHcqP21vYmlsZVxcdyo/fFxcdyo/cGhvbmVcXHcqPykvaTtcbiAgICAgICAgdmFyIHRhYmxldCA9IC90YWJsZXR8aXBhZC9pO1xuICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2gobW9iaWxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuRGV2aWNlVHlwZS5Nb2JpbGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHRhYmxldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLkRldmljZVR5cGUuVGFibGV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFbnVtc18xLkRldmljZVR5cGUuRGVza3RvcDtcbiAgICB9O1xuICAgIHJldHVybiBEZXZpY2VJbmZvO1xufSgpKTtcbmV4cG9ydHMuRGV2aWNlSW5mbyA9IERldmljZUluZm87XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcyAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gUG9ydGVkIGZyb20gaHR0cHM6Ly9kZXYuYXp1cmUuY29tL2R5bmFtaWNzY3JtL09uZUNSTS9fZ2l0L0NSTS5PbW5pY2hhbm5lbC5JQzNDbGllbnQ/cGF0aD0vc3JjL0NvbW1vbi9FdmVudE1hbmFnZXIudHMmdmVyc2lvbj1HQm1hc3RlclxudmFyIEV2ZW50TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudE1hbmFnZXIoKSB7XG4gICAgfVxuICAgIEV2ZW50TWFuYWdlci5yYWlzZUN1c3RvbUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgcGF5bG9hZCkge1xuICAgICAgICB2YXIgZXZlbnQgPSBFdmVudE1hbmFnZXIuY3JlYXRlQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCBwYXlsb2FkKTtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGN1c3RvbSBldmVudCBiYXNlZCBvbiB0aGUgZXZlbnROYW1lIGFuZCBwYXlsb2FkXG4gICAgICogVGhlIGN1c3RvbSBldmVudCBpcyBkaXNwYXRjaC1jb21wYXRpYmxlIGFjcm9zcyBicm93c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWU6IE5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7YW55fSBwYXlsb2FkOiBUaGUgZXZlbnQgcGF5bG9hZC5cbiAgICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9OiBDdXN0b21FdmVudCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBFdmVudE1hbmFnZXIuY3JlYXRlQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBwYXlsb2FkKSB7XG4gICAgICAgIHZhciBldmVudERldGFpbHMgPSBwYXlsb2FkID8ge1xuICAgICAgICAgICAgZGV0YWlsOiBwYXlsb2FkXG4gICAgICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBldmVudCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBGb3Igbm9uIElFMTEgc2NlbmFyaW9zLCBjdXN0b21ldmVudCBvYmplY3QgY2FuIGJlIGRpc3BhdGNoZWRcbiAgICAgICAgICAgIGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgZXZlbnREZXRhaWxzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgSUUxMSBzY2VuYXJpbywgd2hlcmUgY3VzdG9tZXZlbnQgb2JqZWN0IGNhbm5vdCBiZSBkaXNwYXRjaGVkXG4gICAgICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gICAgICAgICAgICBldmVudC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBldmVudERldGFpbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuICAgIHJldHVybiBFdmVudE1hbmFnZXI7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnRNYW5hZ2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxvZ2dpbmdTYW5pdGl6ZXIgPSB2b2lkIDA7XG52YXIgQ29uc3RhbnRzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL0NvbW1vbi9Db25zdGFudHNcIikpO1xudmFyIE9tbmljaGFubmVsSFRUUEhlYWRlcnNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIikpO1xudmFyIExvZ2dpbmdTYW5pdGl6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTG9nZ2luZ1Nhbml0aXplcigpIHtcbiAgICB9XG4gICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzID0gZnVuY3Rpb24gKGN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgICAgICAoX2EgPSBPYmplY3Qua2V5cyhjdXN0b21Db250ZXh0RGF0YSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JFYWNoKGZ1bmN0aW9uIChjb250ZXh0S2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICgoX2EgPSBjdXN0b21Db250ZXh0RGF0YVtcIlwiLmNvbmNhdChjb250ZXh0S2V5KV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21Db250ZXh0RGF0YVtcIlwiLmNvbmNhdChjb250ZXh0S2V5KV0udmFsdWUgPSBDb25zdGFudHNfMS5kZWZhdWx0LmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZSA9IGZ1bmN0aW9uIChwcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocHJlQ2hhdFJlc3BvbnNlKS5mb3JFYWNoKGZ1bmN0aW9uIChyZXNwb25zZUtleSkge1xuICAgICAgICAgICAgICAgIGlmIChwcmVDaGF0UmVzcG9uc2VbXCJcIi5jb25jYXQocmVzcG9uc2VLZXkpXSAmJiByZXNwb25zZUtleSAhPT0gJ1R5cGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZUNoYXRSZXNwb25zZVtcIlwiLmNvbmNhdChyZXNwb25zZUtleSldID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkuaW5jbHVkZXMoJ2xvbmdpdHVkZScpKSB7XG4gICAgICAgICAgICAgICAgZGF0YVsnbG9uZ2l0dWRlJ10gPSBDb25zdGFudHNfMS5kZWZhdWx0LmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5pbmNsdWRlcygnbGF0aXR1ZGUnKSkge1xuICAgICAgICAgICAgICAgIGRhdGFbJ2xhdGl0dWRlJ10gPSBDb25zdGFudHNfMS5kZWZhdWx0LmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEF1dGhlbnRpY2F0aW9uVXNlclRva2VuID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzKS5pbmNsdWRlcyhPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuKSkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBDb25zdGFudHNfMS5kZWZhdWx0LmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzKS5pbmNsdWRlcyhPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlKSkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSBDb25zdGFudHNfMS5kZWZhdWx0LmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzKS5pbmNsdWRlcyhPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRob3JpemF0aW9uKSkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aG9yaXphdGlvbl0gPSBDb25zdGFudHNfMS5kZWZhdWx0LmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChoZWFkZXJzKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBBdXRoZW50aWNhdGlvblVzZXJUb2tlbihoZWFkZXJzKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGhlYWRlcnMpLmluY2x1ZGVzKE9tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhvcml6YXRpb24pKSB7XG4gICAgICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhvcml6YXRpb25dID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBSZXF1ZXN0UGF5bG9hZERhdGEgPSBmdW5jdGlvbiAoY29uZmlnT2JqZWN0KSB7XG4gICAgICAgIGlmIChjb25maWdPYmplY3QgPT09IG51bGwgfHwgY29uZmlnT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWdPYmplY3QuZGF0YSkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09iamVjdC5kYXRhID09PSAnc3RyaW5nJykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoY29uZmlnT2JqZWN0LmRhdGEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmluY2x1ZGVzKCdwcmVDaGF0UmVzcG9uc2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKGRhdGEucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmluY2x1ZGVzKCdjdXN0b21Db250ZXh0RGF0YScpKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKGRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdC5kYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IGlzIGJldHRlciB0byBwYXNzIHRoZSBzdHJpbmcgdG8gc2VhcmNoIHZpYSByZWdleCBmb3Igc3BlY2lmaWMgUEkuXG4gICAgICAgICAgICAgICAgY29uZmlnT2JqZWN0LmRhdGEgPSBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRW1haWxEYXRhRnJvbUVycm9yKGNvbmZpZ09iamVjdC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVtYWlsRGF0YUZyb21FcnJvciA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gICAgICAgIHBheWxvYWQgPSBwYXlsb2FkLnJlcGxhY2UodGhpcy5lbWFpbFJlZ2V4LCBDb25zdGFudHNfMS5kZWZhdWx0LmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlcik7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH07XG4gICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEF4aW9zRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGVycm9yT2JqZWN0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaztcbiAgICAgICAgaWYgKGVycm9yT2JqZWN0LmlzQXhpb3NFcnJvcikge1xuICAgICAgICAgICAgaWYgKChfYSA9IGVycm9yT2JqZWN0ID09PSBudWxsIHx8IGVycm9yT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvck9iamVjdC5jb25maWcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEF1dGhlbnRpY2F0aW9uVXNlclRva2VuKChfYiA9IGVycm9yT2JqZWN0ID09PSBudWxsIHx8IGVycm9yT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvck9iamVjdC5jb25maWcpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oZWFkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoX2MgPSBlcnJvck9iamVjdCA9PT0gbnVsbCB8fCBlcnJvck9iamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JPYmplY3QuY29uZmlnKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyaXBSZXF1ZXN0UGF5bG9hZERhdGEoZXJyb3JPYmplY3QgPT09IG51bGwgfHwgZXJyb3JPYmplY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yT2JqZWN0LmNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKF9lID0gKF9kID0gZXJyb3JPYmplY3QgPT09IG51bGwgfHwgZXJyb3JPYmplY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yT2JqZWN0LnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY29uZmlnKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyaXBSZXF1ZXN0UGF5bG9hZERhdGEoKF9mID0gZXJyb3JPYmplY3QgPT09IG51bGwgfHwgZXJyb3JPYmplY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yT2JqZWN0LnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YuY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoX2ggPSAoX2cgPSBlcnJvck9iamVjdCA9PT0gbnVsbCB8fCBlcnJvck9iamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JPYmplY3QucmVzcG9uc2UpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5jb25maWcpID09PSBudWxsIHx8IF9oID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEF1dGhlbnRpY2F0aW9uVXNlclRva2VuKChfayA9IChfaiA9IGVycm9yT2JqZWN0ID09PSBudWxsIHx8IGVycm9yT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvck9iamVjdC5yZXNwb25zZSkgPT09IG51bGwgfHwgX2ogPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9qLmNvbmZpZykgPT09IG51bGwgfHwgX2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9rLmhlYWRlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGVycm9yT2JqZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGVycm9yT2JqZWN0ICYmIHR5cGVvZiBlcnJvck9iamVjdCA9PT0gJ29iamVjdCcgJiYgKChfYSA9IE9iamVjdC5rZXlzKGVycm9yT2JqZWN0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmlwQXhpb3NFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3JPYmplY3QpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBMb2dnaW5nU2FuaXRpemVyLmVtYWlsUmVnZXggPSAvW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0vZztcbiAgICByZXR1cm4gTG9nZ2luZ1Nhbml0aXplcjtcbn0oKSk7XG5leHBvcnRzLkxvZ2dpbmdTYW5pdGl6ZXIgPSBMb2dnaW5nU2FuaXRpemVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk9TSW5mbyA9IHZvaWQgMDtcbnZhciBFbnVtc18xID0gcmVxdWlyZShcIi4uL0NvbW1vbi9FbnVtc1wiKTtcbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZGV2LmF6dXJlLmNvbS9keW5hbWljc2NybS9PbmVDUk0vX2dpdC9DUk0uT21uaUNoYW5uZWwuTGl2ZUNoYXRXaWRnZXQ/cGF0aD0vc3JjL0xpdmVDaGF0TG9hZGVyL1V0aWxpdHkvT1NJbmZvLnRzJnZlcnNpb249R0JyZWxlYXNlXG52YXIgT1NJbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9TSW5mbygpIHtcbiAgICB9XG4gICAgT1NJbmZvLmdldE9zVHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdpbiA9IC8od2luZG93c3x3aW4zMikvaTtcbiAgICAgICAgdmFyIHdpbnJ0ID0gLyBhcm07L2k7XG4gICAgICAgIHZhciB3aW5waG9uZSA9IC93aW5kb3dzXFxzcGhvbmVcXHNcXGQrXFwuXFxkKy9pO1xuICAgICAgICB2YXIgb3N4ID0gLyhtYWNpbnRvc2h8bWFjIG9zIHgpL2k7XG4gICAgICAgIHZhciBpb3MgPSAvKGlQYWR8aVBob25lfGlQb2QpKD89LipsaWtlIE1hYyBPUyBYKS9pO1xuICAgICAgICB2YXIgbGludXggPSAvKGxpbnV4fGpvbGl8W2t4bG5dP3VidW50dXxkZWJpYW58W29wZW5dKnN1c2V8Z2VudG9vfGFyY2h8c2xhY2t3YXJlfGZlZG9yYXxtYW5kcml2YXxjZW50b3N8cGNsaW51eG9zfHJlZGhhdHx6ZW53YWxrfGNyb3MpL2k7XG4gICAgICAgIHZhciBhbmRyb2lkID0gL2FuZHJvaWQvaTtcbiAgICAgICAgdmFyIHVzZXJBZ2VudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OyB9O1xuICAgICAgICBpZiAodXNlckFnZW50KCkubWF0Y2god2lucGhvbmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5PcGVyYXRpbmdTeXN0ZW0uV0lORE9XU19QSE9ORTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckFnZW50KCkubWF0Y2god2lucnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5PcGVyYXRpbmdTeXN0ZW0uV0lORE9XU19SVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckFnZW50KCkubWF0Y2goaW9zKSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuT3BlcmF0aW5nU3lzdGVtLklPUztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckFnZW50KCkubWF0Y2goYW5kcm9pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLk9wZXJhdGluZ1N5c3RlbS5BTkRST0lEO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VyQWdlbnQoKS5tYXRjaChsaW51eCkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLk9wZXJhdGluZ1N5c3RlbS5MSU5VWDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckFnZW50KCkubWF0Y2gob3N4KSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuT3BlcmF0aW5nU3lzdGVtLk1BQ09TWDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckFnZW50KCkubWF0Y2god2luKSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuT3BlcmF0aW5nU3lzdGVtLldJTkRPV1M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVudW1zXzEuT3BlcmF0aW5nU3lzdGVtLlVOS05PV047XG4gICAgfTtcbiAgICByZXR1cm4gT1NJbmZvO1xufSgpKTtcbmV4cG9ydHMuT1NJbmZvID0gT1NJbmZvO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ29uc3RhbnRzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL0NvbW1vbi9Db25zdGFudHNcIikpO1xudmFyIGF4aW9zX3JldHJ5XzEgPSByZXF1aXJlKFwiYXhpb3MtcmV0cnlcIik7XG52YXIgYXhpb3NSZXRyeUhhbmRsZXJfMSA9IHJlcXVpcmUoXCIuLi9VdGlscy9heGlvc1JldHJ5SGFuZGxlclwiKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG52YXIgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgPSBmdW5jdGlvbiAoZXJyb3IsIHJldHJ5T240MjkpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgaWYgKChfYSA9IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXR1cykge1xuICAgICAgICBzd2l0Y2ggKGVycm9yLnJlc3BvbnNlLnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSBDb25zdGFudHNfMS5kZWZhdWx0LnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGU6XG4gICAgICAgICAgICAgICAgaWYgKHJldHJ5T240MjkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENvbnN0YW50c18xLmRlZmF1bHQuYmFkUmVxdWVzdFN0YXR1c0NvZGU6XG4gICAgICAgICAgICAgICAgaWYgKCgoX2MgPSAoX2IgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhlYWRlcnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5lcnJvcmNvZGUpICYmIHBhcnNlSW50KGVycm9yLnJlc3BvbnNlLmhlYWRlcnMuZXJyb3Jjb2RlKSA9PT0gQ29uc3RhbnRzXzEuZGVmYXVsdC5vdXRPZk9mZmljZUVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmlzUmV0cnlhYmxlRXJyb3IpKGVycm9yKSB8fCAoMCwgYXhpb3NfcmV0cnlfMS5pc05ldHdvcmtFcnJvcikoZXJyb3IpIHx8ICgoX2QgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnN0YXR1cykgPT0gMCB8fCAhKChfZSA9IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Uuc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuaXNSZXRyeWFibGVFcnJvcikoZXJyb3IpIHx8ICgwLCBheGlvc19yZXRyeV8xLmlzTmV0d29ya0Vycm9yKShlcnJvcikgfHwgKChfZiA9IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Yuc3RhdHVzKSA9PSAwIHx8ICEoKF9nID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5zdGF0dXMpO1xufTtcbmV4cG9ydHMuZGVmYXVsdCA9IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgVGVsZW1ldHJ5SGVscGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRlbGVtZXRyeUhlbHBlcigpIHtcbiAgICB9XG4gICAgVGVsZW1ldHJ5SGVscGVyLkdFVFRFTEVNRVRSWUVWRU5UREFUQSA9IGZ1bmN0aW9uICh0ZWxlbWV0cnlFdmVudCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgdmFyIGxvZ0RhdGEgPSB7XG4gICAgICAgICAgICBEZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBjdXN0b21EYXRhLkVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBIdHRwUmVxdWVzdFJlc3BvbnNlVGltZTogY3VzdG9tRGF0YS5IdHRwUmVxdWVzdFJlc3BvbnNlVGltZSxcbiAgICAgICAgICAgIEV2ZW50OiB0ZWxlbWV0cnlFdmVudCxcbiAgICAgICAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGN1c3RvbURhdGEuRXhjZXB0aW9uRGV0YWlscyxcbiAgICAgICAgICAgIFJlZ2lvbjogY3VzdG9tRGF0YS5SZWdpb24sXG4gICAgICAgICAgICBSZXF1ZXN0SWQ6IGN1c3RvbURhdGEuUmVxdWVzdElkLFxuICAgICAgICAgICAgVHJhbnNhY3Rpb25JZDogY3VzdG9tRGF0YS5UcmFuc2FjdGlvbklkLFxuICAgICAgICAgICAgUmVxdWVzdEhlYWRlcnM6IGN1c3RvbURhdGEuUmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICBSZXF1ZXN0UGF5bG9hZDogY3VzdG9tRGF0YS5SZXF1ZXN0UGF5bG9hZCxcbiAgICAgICAgICAgIFJlcXVlc3RQYXRoOiBjdXN0b21EYXRhLlJlcXVlc3RQYXRoLFxuICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogY3VzdG9tRGF0YS5SZXF1ZXN0TWV0aG9kLFxuICAgICAgICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiBjdXN0b21EYXRhLlJlc3BvbnNlU3RhdHVzQ29kZSxcbiAgICAgICAgICAgIFJlc3BvbnNlRXJyb3Jjb2RlOiBjdXN0b21EYXRhLlJlc3BvbnNlRXJyb3Jjb2RlLFxuICAgICAgICAgICAgQXV0aFRva2VuRGV0YWlsczogY3VzdG9tRGF0YS5BdXRoVG9rZW5EZXRhaWxzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBsb2dEYXRhO1xuICAgIH07XG4gICAgcmV0dXJuIFRlbGVtZXRyeUhlbHBlcjtcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBUZWxlbWV0cnlIZWxwZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGltZXIgPSB2b2lkIDA7XG52YXIgVGltZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGltZXIoKSB7XG4gICAgfVxuICAgIFRpbWVyLlRJTUVSID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZVN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQgbWlsbGlTZWNvbmRzRWxhcHNlZCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGltZVN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lcjtcbn0oKSk7XG5leHBvcnRzLlRpbWVyID0gVGltZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5heGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCA9IGV4cG9ydHMuaXNSZXRyeWFibGVFcnJvciA9IHZvaWQgMDtcbnZhciBheGlvc19yZXRyeV8xID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJheGlvcy1yZXRyeVwiKSk7XG52YXIgQ29uc3RhbnRzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL0NvbW1vbi9Db25zdGFudHNcIikpO1xuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBlcnJvciBpcyByZXRyeWFibGUuXG4gKlxuICogQHBhcmFtIGVycm9yIFRoZSBBeGlvcyBlcnJvci5cbiAqIEBwYXJhbSByZXRyeU9uNDI5IEZsYWcgdG8gaW5kaWNhdGUgaWYgcmV0cmllcyBzaG91bGQgYmUgYXR0ZW1wdGVkIG9uIDQyOSBzdGF0dXMgY29kZS5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVycm9yIGlzIHJldHJ5YWJsZSwgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG52YXIgc2hvdWxkUmV0cnkgPSBmdW5jdGlvbiAoZXJyb3IsIHJldHJ5T240MjkpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAvLyBEZWZpbmUgZGVmYXVsdCBiZWhhdmlvciBmb3IgNDI5IHJldHJpZXMgaW4gY2FzZSB0aGUgaGFuZGxlciB3YXMgbm90IGluY2x1ZGVkIGJ5IHRoZSBjYWxsZXIuXG4gICAgaWYgKCgoX2EgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXR1cykgPT09IENvbnN0YW50c18xLmRlZmF1bHQudG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSAmJiAhcmV0cnlPbjQyOSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpc1JldHJ5YWJsZUVycm9yKGVycm9yKSB8fCAoMCwgYXhpb3NfcmV0cnlfMS5pc05ldHdvcmtFcnJvcikoZXJyb3IpIHx8ICgoX2IgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnN0YXR1cykgPT09IDAgfHwgISgoX2MgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnN0YXR1cyk7XG59O1xuLyoqXG4gKiBDdXN0b20gaGFuZGxlciBmb3IgSFRUUCBjYWxscyB3aXRoIEF4aW9zLiBIYW5kbGVyIGFsbG93cyByZXRyeWluZyBIVFRQIGNhbGxzIGlmIHRoZXkgZmFpbC5cbiAqXG4gKiBAcGFyYW0gYXhpb3MgQXhpb3MgaW5zdGFuY2UuXG4gKiBAcGFyYW0gYXhpb3NSZXRyeU9wdGlvbnMgT3B0aW9ucyBmb3IgYXhpb3MgcmV0cnkuXG4gKi9cbnZhciBheGlvc1JldHJ5SGFuZGxlciA9IGZ1bmN0aW9uIChheGlvcywgYXhpb3NSZXRyeU9wdGlvbnMpIHtcbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIGlmIChheGlvc1JldHJ5T3B0aW9ucy5yZXRyeU9uNDI5ID09PSB1bmRlZmluZWQgfHwgYXhpb3NSZXRyeU9wdGlvbnMucmV0cnlPbjQyOSA9PT0gbnVsbCkge1xuICAgICAgICBheGlvc1JldHJ5T3B0aW9ucy5yZXRyeU9uNDI5ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXhpb3NSZXRyeU9wdGlvbnMuc2hvdWxkUmV0cnkpIHtcbiAgICAgICAgYXhpb3NSZXRyeU9wdGlvbnMuc2hvdWxkUmV0cnkgPSBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIHNob3VsZFJldHJ5KGVycm9yLCBheGlvc1JldHJ5T3B0aW9ucy5yZXRyeU9uNDI5KTsgfTtcbiAgICB9XG4gICAgLy8gTWV0aG9kIHRvIGludGVyY2VwdCByZXNwb25zZXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgMnh4XG4gICAgKDAsIGF4aW9zX3JldHJ5XzEuZGVmYXVsdCkoYXhpb3MsIHtcbiAgICAgICAgcmV0cmllczogYXhpb3NSZXRyeU9wdGlvbnMucmV0cmllcyxcbiAgICAgICAgcmV0cnlDb25kaXRpb246IGF4aW9zUmV0cnlPcHRpb25zLnNob3VsZFJldHJ5LFxuICAgICAgICBvblJldHJ5OiBmdW5jdGlvbiAocmV0cnlDb3VudCwgZXJyb3IsIHJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IGVycm9yLnJlc3BvbnNlO1xuICAgICAgICAgICAgdmFyIGhlYWRlck92ZXJ3cml0ZXMgPSBheGlvc1JldHJ5T3B0aW9ucy5oZWFkZXJPdmVyd3JpdGVzO1xuICAgICAgICAgICAgaWYgKGhlYWRlck92ZXJ3cml0ZXMgJiYgKHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZS5oZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgaGVhZGVyT3ZlcndyaXRlc18xID0gaGVhZGVyT3ZlcndyaXRlczsgX2kgPCBoZWFkZXJPdmVyd3JpdGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoZWFkZXJOYW1lID0gaGVhZGVyT3ZlcndyaXRlc18xW19pXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlSGVhZGVyID0gcmVzcG9uc2UgPT09IG51bGwgfHwgcmVzcG9uc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlSGVhZGVyICYmIHJlcXVlc3RDb25maWcuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbmZpZy5oZWFkZXJzW2hlYWRlck5hbWVdID0gcmVzcG9uc2VIZWFkZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJldHJ5RGVsYXk6IGZ1bmN0aW9uIChyZXRyeUNvdW50LCBlcnJvcikge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICB2YXIgdGltZUJldHdlZW5SZXRyeSA9IGF4aW9zUmV0cnlPcHRpb25zLndhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzO1xuICAgICAgICAgICAgdmFyIHJldHJ5QWZ0ZXJIZWFkZXIgPSAoX2IgPSAoX2EgPSBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oZWFkZXJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbXCJyZXRyeS1hZnRlclwiXTtcbiAgICAgICAgICAgIHZhciByZXRyeUFmdGVyVGltZSA9IHRpbWVCZXR3ZWVuUmV0cnk7XG4gICAgICAgICAgICBpZiAocmV0cnlBZnRlckhlYWRlcikge1xuICAgICAgICAgICAgICAgIHZhciByZXRyeUFmdGVyVmFsdWUgPSBwYXJzZUludChyZXRyeUFmdGVySGVhZGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHJldHJ5QWZ0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlclRpbWUgPSByZXRyeUFmdGVyVmFsdWUgKiB0aW1lQmV0d2VlblJldHJ5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHJ5QWZ0ZXJEYXRlID0gbmV3IERhdGUocmV0cnlBZnRlckhlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlBZnRlckRhdGUgJiYgcmV0cnlBZnRlckRhdGUgaW5zdGFuY2VvZiBEYXRlICYmIGlzRmluaXRlKHJldHJ5QWZ0ZXJEYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXJUaW1lID0gTWF0aC5tYXgoMCwgcmV0cnlBZnRlckRhdGUuZ2V0VGltZSgpIC0gY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRyeUFmdGVyVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoKF9jID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpID09PSBDb25zdGFudHNfMS5kZWZhdWx0LnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXRyeSBhZnRlciA1IHNlY29uZHMgZm9yIDQyOSBzdGF0dXMgY29kZVxuICAgICAgICAgICAgICAgIHJldHVybiA1MDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIHJldHJ5Q291bnQpICogdGltZUJldHdlZW5SZXRyeTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBpc1JldHJ5YWJsZUVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIChlcnJvci5jb2RlICE9PSAnRUNPTk5BQk9SVEVEJyAmJlxuICAgICAgICAoIWVycm9yLnJlc3BvbnNlIHx8XG4gICAgICAgICAgICBlcnJvci5yZXNwb25zZS5zdGF0dXMgPT09IDQyOSB8fFxuICAgICAgICAgICAgKGVycm9yLnJlc3BvbnNlLnN0YXR1cyA+PSA1MDAgJiYgZXJyb3IucmVzcG9uc2Uuc3RhdHVzIDw9IDU5OSkpKTtcbn1cbmV4cG9ydHMuaXNSZXRyeWFibGVFcnJvciA9IGlzUmV0cnlhYmxlRXJyb3I7XG5mdW5jdGlvbiBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZChheGlvcywgYXhpb3NSZXRyeU9wdGlvbnMpIHtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvcywge1xuICAgICAgICByZXRyaWVzOiBheGlvc1JldHJ5T3B0aW9ucy5yZXRyaWVzLFxuICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogYXhpb3NSZXRyeU9wdGlvbnMud2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXMsXG4gICAgICAgIHNob3VsZFJldHJ5OiBmdW5jdGlvbiAoZXJyb3IpIHsgdmFyIF9hOyByZXR1cm4gc2hvdWxkUmV0cnkoZXJyb3IsIGF4aW9zUmV0cnlPcHRpb25zLnJldHJ5T240MjkpIHx8ICgoX2EgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXR1cykgPT09IENvbnN0YW50c18xLmRlZmF1bHQubm90Rm91bmRTdGF0dXNDb2RlOyB9LFxuICAgIH0pO1xufVxuZXhwb3J0cy5heGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCA9IGF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kO1xuZXhwb3J0cy5kZWZhdWx0ID0gYXhpb3NSZXRyeUhhbmRsZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgPSB2b2lkIDA7XG52YXIgRW51bXNfMSA9IHJlcXVpcmUoXCIuLi9Db21tb24vRW51bXNcIik7XG52YXIgT21uaWNoYW5uZWxFbmRwb2ludHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCIpKTtcbnZhciBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCA9IGZ1bmN0aW9uIChsaXZlQ2hhdFZlcnNpb24sIGF1dGgsIGNvcGlsb3RCb3RQcmVzZW50KSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICB2YXIgZW5kcG9pbnRzTWFwcGluZyA9IChfYSA9IHt9LFxuICAgICAgICBfYVtFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMV0gPSBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoLFxuICAgICAgICBfYVtFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMl0gPSBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgsXG4gICAgICAgIF9hW0VudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYzXSA9IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdHYzR2V0Q2hhdFRva2VuUGF0aCxcbiAgICAgICAgX2EpO1xuICAgIHZhciBhdXRoRW5kcG9pbnRzTWFwcGluZyA9IChfYiA9IHt9LFxuICAgICAgICBfYltFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMV0gPSBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRva2VuUGF0aCxcbiAgICAgICAgX2JbRW51bXNfMS5MaXZlQ2hhdFZlcnNpb24uVjJdID0gT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRva2VuUGF0aCxcbiAgICAgICAgX2JbRW51bXNfMS5MaXZlQ2hhdFZlcnNpb24uVjNdID0gT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0djNBdXRoR2V0Q2hhdFRva2VuUGF0aCxcbiAgICAgICAgX2IpO1xuICAgIGlmIChjb3BpbG90Qm90UHJlc2VudCkge1xuICAgICAgICByZXR1cm4gYXV0aCA/IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdHY0QXV0aEdldENoYXRUb2tlblBhdGggOiBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXR2NEdldENoYXRUb2tlblBhdGg7XG4gICAgfVxuICAgIGlmIChPYmplY3QudmFsdWVzKEVudW1zXzEuTGl2ZUNoYXRWZXJzaW9uKS5pbmNsdWRlcyhsaXZlQ2hhdFZlcnNpb24pKSB7XG4gICAgICAgIHJldHVybiBhdXRoID8gYXV0aEVuZHBvaW50c01hcHBpbmdbbGl2ZUNoYXRWZXJzaW9uXSA6IGVuZHBvaW50c01hcHBpbmdbbGl2ZUNoYXRWZXJzaW9uXTtcbiAgICB9XG4gICAgcmV0dXJuIGF1dGggPyBhdXRoRW5kcG9pbnRzTWFwcGluZ1tFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMl0gOiBlbmRwb2ludHNNYXBwaW5nW0VudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYyXTtcbn07XG5leHBvcnRzLmNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50ID0gY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYWRkT2NVc2VyQWdlbnRIZWFkZXIgPSB2b2lkIDA7XG52YXIgT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiKSk7XG52YXIgYWRkT2NVc2VyQWdlbnRIZWFkZXIgPSBmdW5jdGlvbiAodXNlckFnZW50LCBoZWFkZXJzKSB7XG4gICAgdmFyIHZlcnNpb24gPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICB2YXIgZGVmYXV0VXNlckFnZW50ID0gXCJvY3Nkay9cIi5jb25jYXQodmVyc2lvbik7XG4gICAgaGVhZGVyc1tcIlwiLmNvbmNhdChPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vY1VzZXJBZ2VudCldID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCB1c2VyQWdlbnQsIHRydWUpLCBbZGVmYXV0VXNlckFnZW50XSwgZmFsc2UpLmpvaW4oXCIgXCIpO1xufTtcbmV4cG9ydHMuYWRkT2NVc2VyQWdlbnRIZWFkZXIgPSBhZGRPY1VzZXJBZ2VudEhlYWRlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGF4aW9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImF4aW9zXCIpKTtcbnZhciBpc0V4cGVjdGVkQXhpb3NFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgdmFsaWRhdGlvblJ1bGUpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoYXhpb3NfMS5kZWZhdWx0LmlzQXhpb3NFcnJvcihlcnJvcikgJiYgZXJyb3IuY29kZSA9PSB2YWxpZGF0aW9uUnVsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydHMuZGVmYXVsdCA9IGlzRXhwZWN0ZWRBeGlvc0Vycm9yO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnV1aWR2NCA9IHZvaWQgMDtcbnZhciB1dWlkdjQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09PSBcInhcIiA/IHIgOiAociAmIDB4MyB8IDB4OCk7XG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICB9KTtcbn07XG5leHBvcnRzLnV1aWR2NCA9IHV1aWR2NDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyA9IHZvaWQgMDtcbmV4cG9ydHMud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMTAwMCxcbiAgICBnZXRMV0lEZXRhaWxzOiAzMDAwLFxuICAgIGdldENoYXRUb2tlbjogMTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTAwMCxcbiAgICBzZXNzaW9uQ2xvc2U6IDEwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiAxMDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxMDAwLFxuICAgIGdldFN1cnZleUludml0ZUxpbms6IDEwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAxMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogMTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogMTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogMTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogMTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiAxMDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxMDAwLFxuICAgIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeTogMTAwMFxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gRW50cnkgcG9pbnRcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXVpZHY0ID0gZXhwb3J0cy5TREtQcm92aWRlciA9IHZvaWQgMDtcbnZhciBFdmVudE1hbmFnZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9VdGlscy9FdmVudE1hbmFnZXJcIikpO1xudmFyIEV2ZW50TmFtZXNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9Db21tb24vRXZlbnROYW1lc1wiKSk7XG52YXIgU0RLUHJvdmlkZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9TREtQcm92aWRlclwiKSk7XG5leHBvcnRzLlNES1Byb3ZpZGVyID0gU0RLUHJvdmlkZXJfMS5kZWZhdWx0O1xudmFyIHV1aWRfMSA9IHJlcXVpcmUoXCIuL1V0aWxzL3V1aWRcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1dWlkdjRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV1aWRfMS51dWlkdjQ7IH0gfSk7XG4oZnVuY3Rpb24gKCkge1xuICAgIC8vIERlY2xhcmVzIHdpbmRvdyBvYmplY3QgZm9yIE5vZGVKUyBlbnZpcm9ubWVudFxuICAgIGlmIChnbG9iYWwud2luZG93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgZ2xvYmFsLndpbmRvdyA9IGdsb2JhbDtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwid2luZG93IG9iamVjdCBub3QgZm91bmRcIik7XG4gICAgfVxuICAgIC8vIENoZWNrIGV4aXN0ZW5jZSBvZiBnbG9iYWwgb2JqZWN0cyB0byBhdm9pZCBvdmVyd3JpdGUvY2xhc2hpbmdcbiAgICBpZiAoIShcIk1pY3Jvc29mdFwiIGluIHdpbmRvdykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93Lk1pY3Jvc29mdCA9IHt9O1xuICAgIH1cbiAgICBpZiAoIShcIkNSTVwiIGluIHdpbmRvdy5NaWNyb3NvZnQpKSB7XG4gICAgICAgIHdpbmRvdy5NaWNyb3NvZnQuQ1JNID0ge307XG4gICAgfVxuICAgIGlmICghKFwiT21uaWNoYW5uZWxcIiBpbiB3aW5kb3cuTWljcm9zb2Z0LkNSTSkpIHtcbiAgICAgICAgd2luZG93Lk1pY3Jvc29mdC5DUk0uT21uaWNoYW5uZWwgPSB7fTtcbiAgICB9XG4gICAgaWYgKCEoXCJTREtcIiBpbiB3aW5kb3cuTWljcm9zb2Z0LkNSTS5PbW5pY2hhbm5lbCkpIHtcbiAgICAgICAgd2luZG93Lk1pY3Jvc29mdC5DUk0uT21uaWNoYW5uZWwuU0RLID0ge1xuICAgICAgICAgICAgU0RLUHJvdmlkZXI6IFNES1Byb3ZpZGVyXzEuZGVmYXVsdCxcbiAgICAgICAgICAgIFV0aWw6IHtcbiAgICAgICAgICAgICAgICB1dWlkdjQ6IHV1aWRfMS51dWlkdjRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93LmRvY3VtZW50ICYmIEV2ZW50TWFuYWdlcl8xLmRlZmF1bHQucmFpc2VDdXN0b21FdmVudChFdmVudE5hbWVzXzEuZGVmYXVsdC5PQ1NES0xPQUQpO1xufSkoKTtcbiIsIi8qIChpZ25vcmVkKSAqLyJdLCJzb3VyY2VSb290IjoiIn0=
|
|
9266
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zLXJldHJ5L2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvYWRhcHRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9mZXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvaXNDYW5jZWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0hlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9lbnYvZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbXBvc2VTaWduYWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL251bGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Jlc29sdmVDb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Rocm90dGxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b0Zvcm1EYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90cmFja1N0cmVhbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL0Jsb2IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvRm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2VuYy1oZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9zaGEyNTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzLXJldHJ5LWFsbG93ZWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vQ29uc3RhbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vRW51bXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvbW1vbi9FdmVudE5hbWVzLnRzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vTG9jYWxlcy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL09DU0RLTG9nZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9Nb2RlbC9Mb2dMZXZlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU0RLLnRzIiwid2VicGFjazovLy8uL3NyYy9TREtQcm92aWRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvQnJvd3NlckluZm8udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhLnRzIiwid2VicGFjazovLy8uL3NyYy9VdGlscy9EZXZpY2VJbmZvLnRzIiwid2VicGFjazovLy8uL3NyYy9VdGlscy9FdmVudE1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL09TSW5mby50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL1RlbGVtZXRyeUhlbHBlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvVGltZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL2F4aW9zUmV0cnlIYW5kbGVyLnRzIiwid2VicGFjazovLy8uL3NyYy9VdGlscy9lbmRwb2ludHNDcmVhdG9ycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvaHR0cEhlYWRlcnNVdGlscy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvVXRpbHMvaXNFeHBlY3RlZEF4aW9zRXJyb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL3V1aWQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1V0aWxzL3dhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLnRzIiwid2VicGFjazovLy8uL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly8vY3J5cHRvIChpZ25vcmVkKSJdLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIkVudW1zXzEiLCJyZXF1aXJlIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiZGVmYXVsdEhlYWRlcnMiLCJieXBhc3NDYWNoZUhlYWRlcnMiLCJkZWZhdWx0Q2hhbm5lbElkIiwiQ2hhbm5lbElkIiwiTENXIiwiZGVmYXVsdExvY2FsZSIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwibm90Rm91bmRTdGF0dXNDb2RlIiwiYmFkUmVxdWVzdFN0YXR1c0NvZGUiLCJvdXRPZk9mZmljZUVycm9yQ29kZSIsInNlbnNpdGl2ZVByb3BlcnRpZXMiLCJ0cmFuc2FjdGlvbmlkIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsImhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlciIsImF4aW9zVGltZW91dEVycm9yQ29kZSIsImRlZmF1bHQiLCJTREtFcnJvciIsIkxpdmVDaGF0VmVyc2lvbiIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJPcGVyYXRpbmdTeXN0ZW0iLCJEZXZpY2VUeXBlIiwiQnJvd3NlciIsIkJyb3dzZXJWZW5kb3IiLCJFdmVudE5hbWVzIiwiZ2V0IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiX19pbXBvcnREZWZhdWx0IiwibW9kIiwiX19lc01vZHVsZSIsIlRlbGVtZXRyeUhlbHBlcl8xIiwiT0NTREtMb2dnZXIiLCJsb2dnZXIiLCJwcm90b3R5cGUiLCJsb2ciLCJsb2dsZXZlbCIsInRlbGVtZXRyeUV2ZW50IiwiY3VzdG9tRGF0YSIsImRlc2NyaXB0aW9uIiwiaXNMb2dnaW5nRW5hYmxlZCIsImxvZ0RhdGEiLCJHRVRURUxFTUVUUllFVkVOVERBVEEiLCJsb2dFdmVudCIsImxvZ0xldmVsIiwibG9nQ2xpZW50U2RrVGVsZW1ldHJ5RXZlbnQiLCJpc051bGxPclVuZGVmaW5lZCIsIm9iaiIsInVuZGVmaW5lZCIsIk9tbmljaGFubmVsRW5kcG9pbnRzIiwiTGl2ZUNoYXRDb25uZWN0b3JQYXRoIiwiTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCIsIkxjd0Zjc0RldGFpbHNQYXRoIiwiTGl2ZUNoYXRDb25maWdQYXRoIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyR2V0Q2hhdFRva2VuUGF0aCIsIkxpdmVDaGF0djNHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2NEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHY0QXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2M0F1dGhHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwiTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlQYXRoIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJhdXRob3JpemF0aW9uIiwib3JnYW5pemF0aW9uSWQiLCJ3aWRnZXRBcHBJZCIsInJlcXVlc3RJZCIsImF1dGhDb2RlTm9uY2UiLCJvY1Nlc3Npb25JZCIsIm9jVXNlckFnZW50IiwiY29ycmVsYXRpb25JZCIsInBhZ2VUb2tlbiIsIkxvZ0xldmVsIiwiX19hc3NpZ24iLCJhc3NpZ24iLCJ0IiwicyIsImkiLCJuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwicCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFwcGx5IiwiX19jcmVhdGVCaW5kaW5nIiwiY3JlYXRlIiwibyIsIm0iLCJrIiwiazIiLCJkZXNjIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwid3JpdGFibGUiLCJfX3NldE1vZHVsZURlZmF1bHQiLCJ2IiwiX19pbXBvcnRTdGFyIiwicmVzdWx0IiwiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJyZXNvbHZlIiwiUHJvbWlzZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwiZG9uZSIsInRoZW4iLCJfX2dlbmVyYXRvciIsImJvZHkiLCJfIiwibGFiZWwiLCJzZW50IiwidHJ5cyIsIm9wcyIsImYiLCJ5IiwiZyIsInZlcmIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIm9wIiwiVHlwZUVycm9yIiwicG9wIiwicHVzaCIsImF4aW9zXzEiLCJheGlvc1JldHJ5SGFuZGxlcl8xIiwiQnJvd3NlckluZm9fMSIsIkNvbnN0YW50c18xIiwiQ3VzdG9tQ29udGV4dERhdGFfMSIsIkRldmljZUluZm9fMSIsImVuY19oZXhfMSIsIkxvY2FsZXNfMSIsIkxvZ0xldmVsXzEiLCJMb2dnaW5nU2FuaXRpemVyXzEiLCJPU0luZm9fMSIsIk9tbmljaGFubmVsRW5kcG9pbnRzXzEiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEiLCJzaGEyNTZfMSIsIlRpbWVyXzEiLCJodHRwSGVhZGVyc1V0aWxzXzEiLCJlbmRwb2ludHNDcmVhdG9yc18xIiwiaXNFeHBlY3RlZEF4aW9zRXJyb3JfMSIsIlNlc3Npb25Jbml0UmV0cnlIYW5kbGVyXzEiLCJ1dWlkXzEiLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnc18xIiwiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwiX3RoaXMiLCJIVFRQVGltZU91dEVycm9yTWVzc2FnZSIsImNvbmNhdCIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JOYW1lIiwiQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2UiLCJzZXRBdXRoQ29kZU5vbmNlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJzZXRTZXNzaW9uSWRIZWFkZXIiLCJzZXNzaW9uSWQiLCJzZXRSZXF1ZXN0SWRIZWFkZXIiLCJzZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIiLCJrZXlzIiwiX2kiLCJfYSIsImtleSIsIl9iIiwiX2MiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJpbmNsdWRlcyIsIkVycm9yIiwiY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMiLCJfZCIsIl9lIiwibGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJnZXRMY3dGY3NEZXRhaWxzIiwidGltZXIiLCJyZXF1ZXN0UGF0aCIsIm1ldGhvZCIsInVybCIsImF4aW9zSW5zdGFuY2UiLCJyZXF1ZXN0SGVhZGVycyIsImJhY2tlbmRUaW1lciIsInJlc3BvbnNlIiwiaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwiZGF0YSIsImVycm9yXzEiLCJUaW1lciIsIlRJTUVSIiwibG9nV2l0aExvZ2dlciIsIklORk8iLCJHRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRCIsIm9yZ0lkIiwib3JnVXJsIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwid2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXMiLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnIiwiZ2V0Q2hhdENvbmZpZyIsImFkZE9jVXNlckFnZW50SGVhZGVyIiwidGltZW91dCIsImRlZmF1bHRSZXF1ZXN0VGltZW91dCIsInJlcXVlc3RUaW1lb3V0Q29uZmlnIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsIkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQiLCJFUlJPUiIsIkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQiLCJieXBhc3NDYWNoZSIsImVycm9yXzIiLCJHRVRDSEFUQ09ORklHRlNUQVJURUQiLCJ1dWlkdjQiLCJ3aWRnZXRJZCIsImFkZERlZmF1bHRIZWFkZXJzIiwiR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCIsIkdFVENIQVRDT05GSUdGQUlMRUQiLCJnZXRMV0lEZXRhaWxzIiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwicmVjb25uZWN0SWQiLCJzaG91bGRVc2VTaWdRdWVyeVBhcmFtIiwicGFyYW1zIiwib3B0aW9ucyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCIsImhlYWRlck92ZXJ3cml0ZXMiLCJ1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0iLCJzaWciLCJlcnJvcl8zIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwiZ2V0Q2hhdFRva2VuIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJNc09jQm90QXBwbGljYXRpb25JZCIsIm11bHRpQm90IiwiZW5kcG9pbnQiLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQiLCJyZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSIsImVycm9yXzQiLCJ0b0xvd2VyQ2FzZSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsInJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NUQVJURUQiLCJlcnJvcl81IiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVEIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVEIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5Iiwib3B0aW9uYWxQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVEIiwiZXJyb3JfNiIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIldBUk4iLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwidGVtcEFyciIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsImN1c3RvbUNvbnRleHREYXRhIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJKU09OIiwic3RyaW5naWZ5IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRhdGFfMSIsImVycm9yXzciLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiYmFzZVBhdGgiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzaG91bGRSZXRyeSIsImVycm9yIiwiZXJyb3JfOCIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJjcmVhdGVDb252ZXJzYXRpb24iLCJkYXRhXzIiLCJlcnJvcl85IiwiQ1JFQVRFU0VTU0lPTlNUQVJURUQiLCJDUkVBVEVTRVNTSU9OU1VDQ0VFREVEIiwiQ1JFQVRFU0VTU0lPTkZBSUxFRCIsInNlc3Npb25DbG9zZSIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJlcnJvcl8xMCIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsImNvZGUiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImVycm9yXzExIiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJlcnJvcl8xMiIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJnZXRTdXJ2ZXlJbnZpdGVMaW5rIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiZXJyb3JfMTMiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsImdldENoYXRUcmFuc2NyaXB0cyIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJlcnJvcl8xNCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnkiLCJnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcyIsInBhZ2VTaXplIiwiZXJyb3JNZXNzYWdlIiwiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1RBUlRFRCIsIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCIsImVycm9yXzE1IiwiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1VDQ0VFREVEIiwiZW1haWxUcmFuc2NyaXB0IiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsImVycm9yXzE2IiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiZmV0Y2hEYXRhTWFza2luZ0luZm8iLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsImVycm9yXzE3IiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsImVycm9yXzE4IiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiZXJyb3JfMTkiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsInJlcXVlc3RQYXlsb2FkIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwic2FuaXRpemVkUmVxdWVzdEhlYWRlcnMiLCJhdXRoVG9rZW5EZXRhaWxzIiwic3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMiLCJhdG9iIiwicGF5bG9hZCIsInNwbGl0IiwianNvbkRhdGEiLCJwYXJzZSIsImx3aUNvbnRleHRzIiwic3ViIiwiZXhwIiwibHdpQ29udGV4dHNEYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIkh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwiVHJhbnNhY3Rpb25JZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsIlJlcXVlc3RIZWFkZXJzIiwiUmVzcG9uc2VFcnJvcmNvZGUiLCJlcnJvcmNvZGUiLCJBdXRoVG9rZW5EZXRhaWxzIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIiwic3Vic3RyaW5nIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIiwiT0NTREtMb2dnZXJfMSIsIlNES18xIiwiU0RLUHJvdmlkZXIiLCJnZXRTREsiLCJpbG9nZ2VyIiwiVU5LTk9XTl9WRVJTSU9OIiwiUkVHRVhfVkVSU0lPTiIsImdldFVzZXJBZ2VudCIsInVzZXJBZ2VudCIsInVzZXJBZ2VudENvbnRhaW5zU3RyaW5nIiwic2VhcmNoU3RyaW5nIiwiaW5kZXhPZiIsImlzQ2hyb21lIiwiQ0hST01FIiwiRURHRSIsIkVER0VfQ0hST01JVU0iLCJpc0llIiwiaXNFZGdlIiwiaXNPcGVyYSIsIk9QRVJBIiwiRklSRUZPWCIsIlNBRkFSSSIsIklFIiwiVU5LTk9XTiIsImdldEJyb3dzZXJWZXJzaW9uIiwiZ2V0SWVWZXJzaW9uIiwiY2xhc3NpY0llVmVyc2lvbk1hdGNoZXMiLCJtYXRjaCIsIlJlZ0V4cCIsImllVmVyc2lvbk1hdGNoZXMiLCJnZXRPdGhlclZlcnNpb24iLCJicm93c2VyU3RyaW5nIiwibWF0Y2hlcyIsIm5hdmlnYXRvciIsIkFycmF5IiwiZm9yRWFjaCIsImEiLCJiIiwia2V5QSIsInRvVXBwZXJDYXNlIiwia2V5QiIsIm1vYmlsZSIsInRhYmxldCIsIk1vYmlsZSIsIlRhYmxldCIsIkRlc2t0b3AiLCJFdmVudE1hbmFnZXIiLCJyYWlzZUN1c3RvbUV2ZW50IiwiZXZlbnROYW1lIiwiZXZlbnQiLCJjcmVhdGVDdXN0b21FdmVudCIsImRpc3BhdGNoRXZlbnQiLCJldmVudERldGFpbHMiLCJkZXRhaWwiLCJDdXN0b21FdmVudCIsImNyZWF0ZUV2ZW50IiwiaW5pdEN1c3RvbUV2ZW50IiwiY29udGV4dEtleSIsInJlc3BvbnNlS2V5Iiwic3RyaXBBdXRoZW50aWNhdGlvblVzZXJUb2tlbiIsInN0cmlwUmVxdWVzdFBheWxvYWREYXRhIiwiY29uZmlnT2JqZWN0Iiwic3RyaXBFbWFpbERhdGFGcm9tRXJyb3IiLCJyZXBsYWNlIiwiZW1haWxSZWdleCIsInN0cmlwQXhpb3NFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJlcnJvck9iamVjdCIsIl9mIiwiX2ciLCJfaCIsIl9qIiwiX2siLCJpc0F4aW9zRXJyb3IiLCJjb25maWciLCJ3aW4iLCJ3aW5ydCIsIndpbnBob25lIiwib3N4IiwiaW9zIiwibGludXgiLCJhbmRyb2lkIiwiV0lORE9XU19QSE9ORSIsIldJTkRPV1NfUlQiLCJJT1MiLCJBTkRST0lEIiwiTElOVVgiLCJNQUNPU1giLCJXSU5ET1dTIiwiYXhpb3NfcmV0cnlfMSIsInNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIiwicGFyc2VJbnQiLCJpc1JldHJ5YWJsZUVycm9yIiwiaXNOZXR3b3JrRXJyb3IiLCJUZWxlbWV0cnlIZWxwZXIiLCJEZXNjcmlwdGlvbiIsIkV2ZW50IiwidGltZVN0YXJ0IiwiRGF0ZSIsImdldFRpbWUiLCJheGlvc1JldHJ5SGFuZGxlciIsImF4aW9zIiwiYXhpb3NSZXRyeU9wdGlvbnMiLCJyZXRyeUNvbmRpdGlvbiIsIm9uUmV0cnkiLCJyZXRyeUNvdW50IiwicmVxdWVzdENvbmZpZyIsImhlYWRlck92ZXJ3cml0ZXNfMSIsImhlYWRlck5hbWUiLCJyZXNwb25zZUhlYWRlciIsInRvTG9jYWxlTG93ZXJDYXNlIiwicmV0cnlEZWxheSIsInRpbWVCZXR3ZWVuUmV0cnkiLCJyZXRyeUFmdGVySGVhZGVyIiwicmV0cnlBZnRlclRpbWUiLCJyZXRyeUFmdGVyVmFsdWUiLCJpc05hTiIsInJldHJ5QWZ0ZXJEYXRlIiwiY3VycmVudFRpbWUiLCJpc0Zpbml0ZSIsIk1hdGgiLCJtYXgiLCJwb3ciLCJhdXRoIiwiY29waWxvdEJvdFByZXNlbnQiLCJlbmRwb2ludHNNYXBwaW5nIiwiVjEiLCJWMyIsImF1dGhFbmRwb2ludHNNYXBwaW5nIiwiX19zcHJlYWRBcnJheSIsInRvIiwiZnJvbSIsInBhY2siLCJsIiwiYXIiLCJzbGljZSIsInZlcnNpb24iLCJkZWZhdXRVc2VyQWdlbnQiLCJqb2luIiwiaXNFeHBlY3RlZEF4aW9zRXJyb3IiLCJ2YWxpZGF0aW9uUnVsZSIsImMiLCJyIiwicmFuZG9tIiwiRXZlbnRNYW5hZ2VyXzEiLCJFdmVudE5hbWVzXzEiLCJTREtQcm92aWRlcl8xIiwiZ2xvYmFsIiwiTWljcm9zb2Z0IiwiQ1JNIiwiT21uaWNoYW5uZWwiLCJVdGlsIiwiT0NTREtMT0FEIl0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFD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QUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLE9BQU8sUUFBUTs7QUFFZjtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFD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QUFFL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtREFBbUQ7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsRUFBRTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLHFCQUFxQixlQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsU0FBUztBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RCxPQUFPO0FBQzlEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtB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QUVuQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxXQUFXOztBQUVuQjtBQUNBO0FBQ0EsUUFBUSxVQUFVOztBQUVsQjtBQUNBOzs7Ozs7Ozs7Ozs7O0FDcEZhOztBQUViO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDdENBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixVQUFVOzs7Ozs7Ozs7Ozs7QUN2THRDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0IsRUFBRTtBQUNsRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ3pMRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtB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aUcsYUFBYTFrQixPQUFiLENBQXFCaWxCLFNBQTdELENBQW5CLEVBQ0gsQ0E3QkQsSTs7Ozs7Ozs7Ozs7O0FDYkEsZSIsImZpbGUiOiJTREsuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9pbmRleC50c1wiKTtcbiIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHsgdHJ5IHsgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOyB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOyB9IGNhdGNoIChlcnJvcikgeyByZWplY3QoZXJyb3IpOyByZXR1cm47IH0gaWYgKGluZm8uZG9uZSkgeyByZXNvbHZlKHZhbHVlKTsgfSBlbHNlIHsgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOyB9IH1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgdmFyIHNlbGYgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzOyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7IGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTsgfSBmdW5jdGlvbiBfdGhyb3coZXJyKSB7IGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpOyB9IF9uZXh0KHVuZGVmaW5lZCk7IH0pOyB9OyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHsgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyB9IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuaW1wb3J0IGlzUmV0cnlBbGxvd2VkIGZyb20gJ2lzLXJldHJ5LWFsbG93ZWQnO1xuZXhwb3J0IHZhciBuYW1lc3BhY2UgPSAnYXhpb3MtcmV0cnknO1xuLyoqXG4gKiBAcGFyYW0gIHtFcnJvcn0gIGVycm9yXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc05ldHdvcmtFcnJvcihlcnJvcikge1xuICB2YXIgQ09ERV9FWENMVURFX0xJU1QgPSBbJ0VSUl9DQU5DRUxFRCcsICdFQ09OTkFCT1JURUQnXTtcbiAgcmV0dXJuICFlcnJvci5yZXNwb25zZSAmJiBCb29sZWFuKGVycm9yLmNvZGUpICYmIC8vIFByZXZlbnRzIHJldHJ5aW5nIGNhbmNlbGxlZCByZXF1ZXN0c1xuICAhQ09ERV9FWENMVURFX0xJU1QuaW5jbHVkZXMoZXJyb3IuY29kZSkgJiYgLy8gUHJldmVudHMgcmV0cnlpbmcgdGltZWQgb3V0ICYgY2FuY2VsbGVkIHJlcXVlc3RzXG4gIGlzUmV0cnlBbGxvd2VkKGVycm9yKSAvLyBQcmV2ZW50cyByZXRyeWluZyB1bnNhZmUgZXJyb3JzXG4gIDtcbn1cbnZhciBTQUZFX0hUVFBfTUVUSE9EUyA9IFsnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddO1xudmFyIElERU1QT1RFTlRfSFRUUF9NRVRIT0RTID0gU0FGRV9IVFRQX01FVEhPRFMuY29uY2F0KFsncHV0JywgJ2RlbGV0ZSddKTtcbi8qKlxuICogQHBhcmFtICB7RXJyb3J9ICBlcnJvclxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXRyeWFibGVFcnJvcihlcnJvcikge1xuICByZXR1cm4gZXJyb3IuY29kZSAhPT0gJ0VDT05OQUJPUlRFRCcgJiYgKCFlcnJvci5yZXNwb25zZSB8fCBlcnJvci5yZXNwb25zZS5zdGF0dXMgPj0gNTAwICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA8PSA1OTkpO1xufVxuLyoqXG4gKiBAcGFyYW0gIHtFcnJvcn0gIGVycm9yXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVSZXF1ZXN0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFlcnJvci5jb25maWcpIHtcbiAgICAvLyBDYW5ub3QgZGV0ZXJtaW5lIGlmIHRoZSByZXF1ZXN0IGNhbiBiZSByZXRyaWVkXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzUmV0cnlhYmxlRXJyb3IoZXJyb3IpICYmIFNBRkVfSFRUUF9NRVRIT0RTLmluZGV4T2YoZXJyb3IuY29uZmlnLm1ldGhvZCkgIT09IC0xO1xufVxuLyoqXG4gKiBAcGFyYW0gIHtFcnJvcn0gIGVycm9yXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW1wb3RlbnRSZXF1ZXN0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFlcnJvci5jb25maWcpIHtcbiAgICAvLyBDYW5ub3QgZGV0ZXJtaW5lIGlmIHRoZSByZXF1ZXN0IGNhbiBiZSByZXRyaWVkXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzUmV0cnlhYmxlRXJyb3IoZXJyb3IpICYmIElERU1QT1RFTlRfSFRUUF9NRVRIT0RTLmluZGV4T2YoZXJyb3IuY29uZmlnLm1ldGhvZCkgIT09IC0xO1xufVxuLyoqXG4gKiBAcGFyYW0gIHtFcnJvcn0gIGVycm9yXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc05ldHdvcmtPcklkZW1wb3RlbnRSZXF1ZXN0RXJyb3IoZXJyb3IpIHtcbiAgcmV0dXJuIGlzTmV0d29ya0Vycm9yKGVycm9yKSB8fCBpc0lkZW1wb3RlbnRSZXF1ZXN0RXJyb3IoZXJyb3IpO1xufVxuLyoqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IC0gZGVsYXkgaW4gbWlsbGlzZWNvbmRzLCBhbHdheXMgMFxuICovXG5cbmZ1bmN0aW9uIG5vRGVsYXkoKSB7XG4gIHJldHVybiAwO1xufVxuLyoqXG4gKiBTZXQgZGVsYXlGYWN0b3IgMTAwMCBmb3IgYW4gZXhwb25lbnRpYWwgZGVsYXkgdG8gb2NjdXIgb24gdGhlIG9yZGVyXG4gKiBvZiBzZWNvbmRzXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFtyZXRyeU51bWJlcj0wXVxuICogQHBhcmFtICB7RXJyb3J9ICBlcnJvciAtIHVudXNlZDsgZm9yIGV4aXN0aW5nIEFQSSBvZiByZXRyeURlbGF5IGNhbGxiYWNrXG4gKiBAcGFyYW0gIHtudW1iZXJ9IFtkZWxheUZhY3Rvcj0xMDBdIG1pbGxpc2Vjb25kc1xuICogQHJldHVybiB7bnVtYmVyfSAtIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50aWFsRGVsYXkoKSB7XG4gIHZhciByZXRyeU51bWJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcbiAgdmFyIGVycm9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBkZWxheUZhY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTAwO1xuICB2YXIgZGVsYXkgPSBNYXRoLnBvdygyLCByZXRyeU51bWJlcikgKiBkZWxheUZhY3RvcjtcbiAgdmFyIHJhbmRvbVN1bSA9IGRlbGF5ICogMC4yICogTWF0aC5yYW5kb20oKTsgLy8gMC0yMCUgb2YgdGhlIGRlbGF5XG5cbiAgcmV0dXJuIGRlbGF5ICsgcmFuZG9tU3VtO1xufVxuLyoqIEB0eXBlIHtJQXhpb3NSZXRyeUNvbmZpZ30gKi9cblxuZXhwb3J0IHZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIHJldHJpZXM6IDMsXG4gIHJldHJ5Q29uZGl0aW9uOiBpc05ldHdvcmtPcklkZW1wb3RlbnRSZXF1ZXN0RXJyb3IsXG4gIHJldHJ5RGVsYXk6IG5vRGVsYXksXG4gIHNob3VsZFJlc2V0VGltZW91dDogZmFsc2UsXG4gIG9uUmV0cnk6ICgpID0+IHt9XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBheGlvcy1yZXRyeSBvcHRpb25zIGZvciB0aGUgY3VycmVudCByZXF1ZXN0XG4gKiBAcGFyYW0gIHtBeGlvc1JlcXVlc3RDb25maWd9IGNvbmZpZ1xuICogQHBhcmFtICB7SUF4aW9zUmV0cnlDb25maWd9IGRlZmF1bHRPcHRpb25zXG4gKiBAcmV0dXJuIHtJQXhpb3NSZXRyeUNvbmZpZ0V4dGVuZGVkfVxuICovXG5cbmZ1bmN0aW9uIGdldFJlcXVlc3RPcHRpb25zKGNvbmZpZywgZGVmYXVsdE9wdGlvbnMpIHtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBERUZBVUxUX09QVElPTlMpLCBkZWZhdWx0T3B0aW9ucyksIGNvbmZpZ1tuYW1lc3BhY2VdKTtcbn1cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgdGhlIHJldHJ5IHN0YXRlIGZvciB0aGUgZ2l2ZW4gcmVxdWVzdC9jb25maWdcbiAqIEBwYXJhbSAge0F4aW9zUmVxdWVzdENvbmZpZ30gY29uZmlnXG4gKiBAcGFyYW0gIHtJQXhpb3NSZXRyeUNvbmZpZ30gZGVmYXVsdE9wdGlvbnNcbiAqIEByZXR1cm4ge0lBeGlvc1JldHJ5Q29uZmlnRXh0ZW5kZWR9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDdXJyZW50U3RhdGUoY29uZmlnLCBkZWZhdWx0T3B0aW9ucykge1xuICB2YXIgY3VycmVudFN0YXRlID0gZ2V0UmVxdWVzdE9wdGlvbnMoY29uZmlnLCBkZWZhdWx0T3B0aW9ucyk7XG4gIGN1cnJlbnRTdGF0ZS5yZXRyeUNvdW50ID0gY3VycmVudFN0YXRlLnJldHJ5Q291bnQgfHwgMDtcbiAgY29uZmlnW25hbWVzcGFjZV0gPSBjdXJyZW50U3RhdGU7XG4gIHJldHVybiBjdXJyZW50U3RhdGU7XG59XG4vKipcbiAqIEBwYXJhbSAge0F4aW9zfSBheGlvc1xuICogQHBhcmFtICB7QXhpb3NSZXF1ZXN0Q29uZmlnfSBjb25maWdcbiAqL1xuXG5cbmZ1bmN0aW9uIGZpeENvbmZpZyhheGlvcywgY29uZmlnKSB7XG4gIGlmIChheGlvcy5kZWZhdWx0cy5hZ2VudCA9PT0gY29uZmlnLmFnZW50KSB7XG4gICAgZGVsZXRlIGNvbmZpZy5hZ2VudDtcbiAgfVxuXG4gIGlmIChheGlvcy5kZWZhdWx0cy5odHRwQWdlbnQgPT09IGNvbmZpZy5odHRwQWdlbnQpIHtcbiAgICBkZWxldGUgY29uZmlnLmh0dHBBZ2VudDtcbiAgfVxuXG4gIGlmIChheGlvcy5kZWZhdWx0cy5odHRwc0FnZW50ID09PSBjb25maWcuaHR0cHNBZ2VudCkge1xuICAgIGRlbGV0ZSBjb25maWcuaHR0cHNBZ2VudDtcbiAgfVxufVxuLyoqXG4gKiBDaGVja3MgcmV0cnlDb25kaXRpb24gaWYgcmVxdWVzdCBjYW4gYmUgcmV0cmllZC4gSGFuZGxlcyBpdCdzIHJldHVybmluZyB2YWx1ZSBvciBQcm9taXNlLlxuICogQHBhcmFtICB7SUF4aW9zUmV0cnlDb25maWdFeHRlbmRlZH0gY3VycmVudFN0YXRlXG4gKiBAcGFyYW0gIHtFcnJvcn0gZXJyb3JcbiAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRSZXRyeShfeCwgX3gyKSB7XG4gIHJldHVybiBfc2hvdWxkUmV0cnkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbi8qKlxuICogQWRkcyByZXNwb25zZSBpbnRlcmNlcHRvcnMgdG8gYW4gYXhpb3MgaW5zdGFuY2UgdG8gcmV0cnkgcmVxdWVzdHMgZmFpbGVkIGR1ZSB0byBuZXR3b3JrIGlzc3Vlc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbiAqXG4gKiBheGlvc1JldHJ5KGF4aW9zLCB7IHJldHJpZXM6IDMgfSk7XG4gKlxuICogYXhpb3MuZ2V0KCdodHRwOi8vZXhhbXBsZS5jb20vdGVzdCcpIC8vIFRoZSBmaXJzdCByZXF1ZXN0IGZhaWxzIGFuZCB0aGUgc2Vjb25kIHJldHVybnMgJ29rJ1xuICogICAudGhlbihyZXN1bHQgPT4ge1xuICogICAgIHJlc3VsdC5kYXRhOyAvLyAnb2snXG4gKiAgIH0pO1xuICpcbiAqIC8vIEV4cG9uZW50aWFsIGJhY2stb2ZmIHJldHJ5IGRlbGF5IGJldHdlZW4gcmVxdWVzdHNcbiAqIGF4aW9zUmV0cnkoYXhpb3MsIHsgcmV0cnlEZWxheSA6IGF4aW9zUmV0cnkuZXhwb25lbnRpYWxEZWxheX0pO1xuICpcbiAqIC8vIEN1c3RvbSByZXRyeSBkZWxheVxuICogYXhpb3NSZXRyeShheGlvcywgeyByZXRyeURlbGF5IDogKHJldHJ5Q291bnQpID0+IHtcbiAqICAgcmV0dXJuIHJldHJ5Q291bnQgKiAxMDAwO1xuICogfX0pO1xuICpcbiAqIC8vIEFsc28gd29ya3Mgd2l0aCBjdXN0b20gYXhpb3MgaW5zdGFuY2VzXG4gKiBjb25zdCBjbGllbnQgPSBheGlvcy5jcmVhdGUoeyBiYXNlVVJMOiAnaHR0cDovL2V4YW1wbGUuY29tJyB9KTtcbiAqIGF4aW9zUmV0cnkoY2xpZW50LCB7IHJldHJpZXM6IDMgfSk7XG4gKlxuICogY2xpZW50LmdldCgnL3Rlc3QnKSAvLyBUaGUgZmlyc3QgcmVxdWVzdCBmYWlscyBhbmQgdGhlIHNlY29uZCByZXR1cm5zICdvaydcbiAqICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAqICAgICByZXN1bHQuZGF0YTsgLy8gJ29rJ1xuICogICB9KTtcbiAqXG4gKiAvLyBBbGxvd3MgcmVxdWVzdC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gKiBjbGllbnRcbiAqICAgLmdldCgnL3Rlc3QnLCB7XG4gKiAgICAgJ2F4aW9zLXJldHJ5Jzoge1xuICogICAgICAgcmV0cmllczogMFxuICogICAgIH1cbiAqICAgfSlcbiAqICAgLmNhdGNoKGVycm9yID0+IHsgLy8gVGhlIGZpcnN0IHJlcXVlc3QgZmFpbHNcbiAqICAgICBlcnJvciAhPT0gdW5kZWZpbmVkXG4gKiAgIH0pO1xuICpcbiAqIEBwYXJhbSB7QXhpb3N9IGF4aW9zIEFuIGF4aW9zIGluc3RhbmNlICh0aGUgYXhpb3Mgb2JqZWN0IG9yIG9uZSBjcmVhdGVkIGZyb20gYXhpb3MuY3JlYXRlKVxuICogQHBhcmFtIHtPYmplY3R9IFtkZWZhdWx0T3B0aW9uc11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdE9wdGlvbnMucmV0cmllcz0zXSBOdW1iZXIgb2YgcmV0cmllc1xuICogQHBhcmFtIHtib29sZWFufSBbZGVmYXVsdE9wdGlvbnMuc2hvdWxkUmVzZXRUaW1lb3V0PWZhbHNlXVxuICogICAgICAgIERlZmluZXMgaWYgdGhlIHRpbWVvdXQgc2hvdWxkIGJlIHJlc2V0IGJldHdlZW4gcmV0cmllc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2RlZmF1bHRPcHRpb25zLnJldHJ5Q29uZGl0aW9uPWlzTmV0d29ya09ySWRlbXBvdGVudFJlcXVlc3RFcnJvcl1cbiAqICAgICAgICBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgZXJyb3IgY2FuIGJlIHJldHJpZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtkZWZhdWx0T3B0aW9ucy5yZXRyeURlbGF5PW5vRGVsYXldXG4gKiAgICAgICAgQSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIGRlbGF5IGJldHdlZW4gcmV0cnkgcmVxdWVzdHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtkZWZhdWx0T3B0aW9ucy5vblJldHJ5PSgpPT57fV1cbiAqICAgICAgICBBIGZ1bmN0aW9uIHRvIGdldCBub3RpZmllZCB3aGVuIGEgcmV0cnkgb2NjdXJzXG4gKiBAcmV0dXJuIHt7IHJlcXVlc3RJbnRlcmNlcHRvcklkOiBudW1iZXIsIHJlc3BvbnNlSW50ZXJjZXB0b3JJZDogbnVtYmVyIH19XG4gKiAgICAgICAgVGhlIGlkcyBvZiB0aGUgaW50ZXJjZXB0b3JzIGFkZGVkIHRvIHRoZSByZXF1ZXN0IGFuZCB0byB0aGUgcmVzcG9uc2UgKHNvIHRoZXkgY2FuIGJlIGVqZWN0ZWQgYXQgYSBsYXRlciB0aW1lKVxuICovXG5cblxuZnVuY3Rpb24gX3Nob3VsZFJldHJ5KCkge1xuICBfc2hvdWxkUmV0cnkgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGN1cnJlbnRTdGF0ZSwgZXJyb3IpIHtcbiAgICB2YXIge1xuICAgICAgcmV0cmllcyxcbiAgICAgIHJldHJ5Q29uZGl0aW9uXG4gICAgfSA9IGN1cnJlbnRTdGF0ZTtcbiAgICB2YXIgc2hvdWxkUmV0cnlPclByb21pc2UgPSBjdXJyZW50U3RhdGUucmV0cnlDb3VudCA8IHJldHJpZXMgJiYgcmV0cnlDb25kaXRpb24oZXJyb3IpOyAvLyBUaGlzIGNvdWxkIGJlIGEgcHJvbWlzZVxuXG4gICAgaWYgKHR5cGVvZiBzaG91bGRSZXRyeU9yUHJvbWlzZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBzaG91bGRSZXRyeVByb21pc2VSZXN1bHQgPSB5aWVsZCBzaG91bGRSZXRyeU9yUHJvbWlzZTsgLy8ga2VlcCByZXR1cm4gdHJ1ZSB1bmxlc3Mgc2hvdWxkUmV0cnlQcm9taXNlUmVzdWx0IHJldHVybiBmYWxzZSBmb3IgY29tcGF0aWJpbGl0eVxuXG4gICAgICAgIHJldHVybiBzaG91bGRSZXRyeVByb21pc2VSZXN1bHQgIT09IGZhbHNlO1xuICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNob3VsZFJldHJ5T3JQcm9taXNlO1xuICB9KTtcbiAgcmV0dXJuIF9zaG91bGRSZXRyeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBheGlvc1JldHJ5KGF4aW9zLCBkZWZhdWx0T3B0aW9ucykge1xuICB2YXIgcmVxdWVzdEludGVyY2VwdG9ySWQgPSBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoY29uZmlnID0+IHtcbiAgICB2YXIgY3VycmVudFN0YXRlID0gZ2V0Q3VycmVudFN0YXRlKGNvbmZpZywgZGVmYXVsdE9wdGlvbnMpO1xuICAgIGN1cnJlbnRTdGF0ZS5sYXN0UmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH0pO1xuICB2YXIgcmVzcG9uc2VJbnRlcmNlcHRvcklkID0gYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShudWxsLCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlcnJvcikge1xuICAgICAgdmFyIHtcbiAgICAgICAgY29uZmlnXG4gICAgICB9ID0gZXJyb3I7IC8vIElmIHdlIGhhdmUgbm8gaW5mb3JtYXRpb24gdG8gcmV0cnkgdGhlIHJlcXVlc3RcblxuICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IGdldEN1cnJlbnRTdGF0ZShjb25maWcsIGRlZmF1bHRPcHRpb25zKTtcblxuICAgICAgaWYgKHlpZWxkIHNob3VsZFJldHJ5KGN1cnJlbnRTdGF0ZSwgZXJyb3IpKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0ZS5yZXRyeUNvdW50ICs9IDE7XG4gICAgICAgIHZhciB7XG4gICAgICAgICAgcmV0cnlEZWxheSxcbiAgICAgICAgICBzaG91bGRSZXNldFRpbWVvdXQsXG4gICAgICAgICAgb25SZXRyeVxuICAgICAgICB9ID0gY3VycmVudFN0YXRlO1xuICAgICAgICB2YXIgZGVsYXkgPSByZXRyeURlbGF5KGN1cnJlbnRTdGF0ZS5yZXRyeUNvdW50LCBlcnJvcik7IC8vIEF4aW9zIGZhaWxzIG1lcmdpbmcgdGhpcyBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBpdCBoYXMgYW4gaXNzdWVcbiAgICAgICAgLy8gd2l0aCBjaXJjdWxhciBzdHJ1Y3R1cmVzOiBodHRwczovL2dpdGh1Yi5jb20vbXphYnJpc2tpZS9heGlvcy9pc3N1ZXMvMzcwXG5cbiAgICAgICAgZml4Q29uZmlnKGF4aW9zLCBjb25maWcpO1xuXG4gICAgICAgIGlmICghc2hvdWxkUmVzZXRUaW1lb3V0ICYmIGNvbmZpZy50aW1lb3V0ICYmIGN1cnJlbnRTdGF0ZS5sYXN0UmVxdWVzdFRpbWUpIHtcbiAgICAgICAgICB2YXIgbGFzdFJlcXVlc3REdXJhdGlvbiA9IERhdGUubm93KCkgLSBjdXJyZW50U3RhdGUubGFzdFJlcXVlc3RUaW1lO1xuICAgICAgICAgIHZhciB0aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQgLSBsYXN0UmVxdWVzdER1cmF0aW9uIC0gZGVsYXk7XG5cbiAgICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbmZpZy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0ID0gW2RhdGEgPT4gZGF0YV07XG4gICAgICAgIHlpZWxkIG9uUmV0cnkoY3VycmVudFN0YXRlLnJldHJ5Q291bnQsIGVycm9yLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoYXhpb3MoY29uZmlnKSksIGRlbGF5KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94Mykge1xuICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCkpO1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RJbnRlcmNlcHRvcklkLFxuICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JJZFxuICB9O1xufSAvLyBDb21wYXRpYmlsaXR5IHdpdGggQ29tbW9uSlNcblxuYXhpb3NSZXRyeS5pc05ldHdvcmtFcnJvciA9IGlzTmV0d29ya0Vycm9yO1xuYXhpb3NSZXRyeS5pc1NhZmVSZXF1ZXN0RXJyb3IgPSBpc1NhZmVSZXF1ZXN0RXJyb3I7XG5heGlvc1JldHJ5LmlzSWRlbXBvdGVudFJlcXVlc3RFcnJvciA9IGlzSWRlbXBvdGVudFJlcXVlc3RFcnJvcjtcbmF4aW9zUmV0cnkuaXNOZXR3b3JrT3JJZGVtcG90ZW50UmVxdWVzdEVycm9yID0gaXNOZXR3b3JrT3JJZGVtcG90ZW50UmVxdWVzdEVycm9yO1xuYXhpb3NSZXRyeS5leHBvbmVudGlhbERlbGF5ID0gZXhwb25lbnRpYWxEZWxheTtcbmF4aW9zUmV0cnkuaXNSZXRyeWFibGVFcnJvciA9IGlzUmV0cnlhYmxlRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgYXhpb3MgZnJvbSAnLi9saWIvYXhpb3MuanMnO1xuXG4vLyBUaGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byB1bndyYXAgQXhpb3MgZGVmYXVsdCBleHBvcnQgYXMgbmFtZWQuXG4vLyBLZWVwIHRvcC1sZXZlbCBleHBvcnQgc2FtZSB3aXRoIHN0YXRpYyBwcm9wZXJ0aWVzXG4vLyBzbyB0aGF0IGl0IGNhbiBrZWVwIHNhbWUgd2l0aCBlcyBtb2R1bGUgb3IgY2pzXG5jb25zdCB7XG4gIEF4aW9zLFxuICBBeGlvc0Vycm9yLFxuICBDYW5jZWxlZEVycm9yLFxuICBpc0NhbmNlbCxcbiAgQ2FuY2VsVG9rZW4sXG4gIFZFUlNJT04sXG4gIGFsbCxcbiAgQ2FuY2VsLFxuICBpc0F4aW9zRXJyb3IsXG4gIHNwcmVhZCxcbiAgdG9Gb3JtRGF0YSxcbiAgQXhpb3NIZWFkZXJzLFxuICBIdHRwU3RhdHVzQ29kZSxcbiAgZm9ybVRvSlNPTixcbiAgZ2V0QWRhcHRlcixcbiAgbWVyZ2VDb25maWdcbn0gPSBheGlvcztcblxuZXhwb3J0IHtcbiAgYXhpb3MgYXMgZGVmYXVsdCxcbiAgQXhpb3MsXG4gIEF4aW9zRXJyb3IsXG4gIENhbmNlbGVkRXJyb3IsXG4gIGlzQ2FuY2VsLFxuICBDYW5jZWxUb2tlbixcbiAgVkVSU0lPTixcbiAgYWxsLFxuICBDYW5jZWwsXG4gIGlzQXhpb3NFcnJvcixcbiAgc3ByZWFkLFxuICB0b0Zvcm1EYXRhLFxuICBBeGlvc0hlYWRlcnMsXG4gIEh0dHBTdGF0dXNDb2RlLFxuICBmb3JtVG9KU09OLFxuICBnZXRBZGFwdGVyLFxuICBtZXJnZUNvbmZpZ1xufVxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBodHRwQWRhcHRlciBmcm9tICcuL2h0dHAuanMnO1xuaW1wb3J0IHhockFkYXB0ZXIgZnJvbSAnLi94aHIuanMnO1xuaW1wb3J0ICogYXMgZmV0Y2hBZGFwdGVyIGZyb20gJy4vZmV0Y2guanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBrbm93bkFkYXB0ZXJzID0ge1xuICBodHRwOiBodHRwQWRhcHRlcixcbiAgeGhyOiB4aHJBZGFwdGVyLFxuICBmZXRjaDoge1xuICAgIGdldDogZmV0Y2hBZGFwdGVyLmdldEZldGNoLFxuICB9XG59XG5cbnV0aWxzLmZvckVhY2goa25vd25BZGFwdGVycywgKGZuLCB2YWx1ZSkgPT4ge1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHt2YWx1ZX0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdhZGFwdGVyTmFtZScsIHt2YWx1ZX0pO1xuICB9XG59KTtcblxuY29uc3QgcmVuZGVyUmVhc29uID0gKHJlYXNvbikgPT4gYC0gJHtyZWFzb259YDtcblxuY29uc3QgaXNSZXNvbHZlZEhhbmRsZSA9IChhZGFwdGVyKSA9PiB1dGlscy5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IGFkYXB0ZXIgPT09IG51bGwgfHwgYWRhcHRlciA9PT0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0QWRhcHRlcjogKGFkYXB0ZXJzLCBjb25maWcpID0+IHtcbiAgICBhZGFwdGVycyA9IHV0aWxzLmlzQXJyYXkoYWRhcHRlcnMpID8gYWRhcHRlcnMgOiBbYWRhcHRlcnNdO1xuXG4gICAgY29uc3Qge2xlbmd0aH0gPSBhZGFwdGVycztcbiAgICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgICBsZXQgYWRhcHRlcjtcblxuICAgIGNvbnN0IHJlamVjdGVkUmVhc29ucyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgbGV0IGlkO1xuXG4gICAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGFkYXB0ZXIgPSBrbm93bkFkYXB0ZXJzWyhpZCA9IFN0cmluZyhuYW1lT3JBZGFwdGVyKSkudG9Mb3dlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGFwdGVyICYmICh1dGlscy5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IChhZGFwdGVyID0gYWRhcHRlci5nZXQoY29uZmlnKSkpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuXG4gICAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKVxuICAgICAgICAubWFwKChbaWQsIHN0YXRlXSkgPT4gYGFkYXB0ZXIgJHtpZH0gYCArXG4gICAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICAgICApO1xuXG4gICAgICBsZXQgcyA9IGxlbmd0aCA/XG4gICAgICAgIChyZWFzb25zLmxlbmd0aCA+IDEgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pKSA6XG4gICAgICAgICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCBgICsgcyxcbiAgICAgICAgJ0VSUl9OT1RfU1VQUE9SVCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXI7XG4gIH0sXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzXG59XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSBcIi4uL3BsYXRmb3JtL2luZGV4LmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5pbXBvcnQgY29tcG9zZVNpZ25hbHMgZnJvbSBcIi4uL2hlbHBlcnMvY29tcG9zZVNpZ25hbHMuanNcIjtcbmltcG9ydCB7dHJhY2tTdHJlYW19IGZyb20gXCIuLi9oZWxwZXJzL3RyYWNrU3RyZWFtLmpzXCI7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IHtwcm9ncmVzc0V2ZW50UmVkdWNlciwgcHJvZ3Jlc3NFdmVudERlY29yYXRvciwgYXN5bmNEZWNvcmF0b3J9IGZyb20gXCIuLi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzXCI7XG5pbXBvcnQgcmVzb2x2ZUNvbmZpZyBmcm9tIFwiLi4vaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzXCI7XG5pbXBvcnQgc2V0dGxlIGZyb20gXCIuLi9jb3JlL3NldHRsZS5qc1wiO1xuXG5jb25zdCBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7XG5cbmNvbnN0IHtpc0Z1bmN0aW9ufSA9IHV0aWxzO1xuXG5jb25zdCBnbG9iYWxGZXRjaEFQSSA9ICgoe1JlcXVlc3QsIFJlc3BvbnNlfSkgPT4gKHtcbiAgUmVxdWVzdCwgUmVzcG9uc2Vcbn0pKSh1dGlscy5nbG9iYWwpO1xuXG5jb25zdCB7XG4gIFJlYWRhYmxlU3RyZWFtLCBUZXh0RW5jb2RlclxufSA9IHV0aWxzLmdsb2JhbDtcblxuXG5jb25zdCB0ZXN0ID0gKGZuLCAuLi5hcmdzKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5jb25zdCBmYWN0b3J5ID0gKGVudikgPT4ge1xuICBlbnYgPSB1dGlscy5tZXJnZS5jYWxsKHtcbiAgICBza2lwVW5kZWZpbmVkOiB0cnVlXG4gIH0sIGdsb2JhbEZldGNoQVBJLCBlbnYpO1xuXG4gIGNvbnN0IHtmZXRjaDogZW52RmV0Y2gsIFJlcXVlc3QsIFJlc3BvbnNlfSA9IGVudjtcbiAgY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IGVudkZldGNoID8gaXNGdW5jdGlvbihlbnZGZXRjaCkgOiB0eXBlb2YgZmV0Y2ggPT09ICdmdW5jdGlvbic7XG4gIGNvbnN0IGlzUmVxdWVzdFN1cHBvcnRlZCA9IGlzRnVuY3Rpb24oUmVxdWVzdCk7XG4gIGNvbnN0IGlzUmVzcG9uc2VTdXBwb3J0ZWQgPSBpc0Z1bmN0aW9uKFJlc3BvbnNlKTtcblxuICBpZiAoIWlzRmV0Y2hTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiBpc0Z1bmN0aW9uKFJlYWRhYmxlU3RyZWFtKTtcblxuICBjb25zdCBlbmNvZGVUZXh0ID0gaXNGZXRjaFN1cHBvcnRlZCAmJiAodHlwZW9mIFRleHRFbmNvZGVyID09PSAnZnVuY3Rpb24nID9cbiAgICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICAgIGFzeW5jIChzdHIpID0+IG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXF1ZXN0KHN0cikuYXJyYXlCdWZmZXIoKSlcbiAgKTtcblxuICBjb25zdCBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gPSBpc1JlcXVlc3RTdXBwb3J0ZWQgJiYgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJiB0ZXN0KCgpID0+IHtcbiAgICBsZXQgZHVwbGV4QWNjZXNzZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgICBib2R5OiBuZXcgUmVhZGFibGVTdHJlYW0oKSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgICAgZHVwbGV4QWNjZXNzZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gJ2hhbGYnO1xuICAgICAgfSxcbiAgICB9KS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJyk7XG5cbiAgICByZXR1cm4gZHVwbGV4QWNjZXNzZWQgJiYgIWhhc0NvbnRlbnRUeXBlO1xuICB9KTtcblxuICBjb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZXNwb25zZVN1cHBvcnRlZCAmJiBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmXG4gICAgdGVzdCgoKSA9PiB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKG5ldyBSZXNwb25zZSgnJykuYm9keSkpO1xuXG4gIGNvbnN0IHJlc29sdmVycyA9IHtcbiAgICBzdHJlYW06IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKChyZXMpID0+IHJlcy5ib2R5KVxuICB9O1xuXG4gIGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKCgoKSA9PiB7XG4gICAgWyd0ZXh0JywgJ2FycmF5QnVmZmVyJywgJ2Jsb2InLCAnZm9ybURhdGEnLCAnc3RyZWFtJ10uZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IChyZXMsIGNvbmZpZykgPT4ge1xuICAgICAgICBsZXQgbWV0aG9kID0gcmVzICYmIHJlc1t0eXBlXTtcblxuICAgICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgICAgcmV0dXJuIG1ldGhvZC5jYWxsKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgfSkoKSk7XG5cbiAgY29uc3QgZ2V0Qm9keUxlbmd0aCA9IGFzeW5jIChib2R5KSA9PiB7XG4gICAgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQmxvYihib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkuc2l6ZTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShib2R5KSkge1xuICAgICAgY29uc3QgX3JlcXVlc3QgPSBuZXcgUmVxdWVzdChwbGF0Zm9ybS5vcmlnaW4sIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoYXdhaXQgX3JlcXVlc3QuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMuaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoYm9keSkpIHtcbiAgICAgIGJvZHkgPSBib2R5ICsgJyc7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzU3RyaW5nKGJvZHkpKSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGVuY29kZVRleHQoYm9keSkpLmJ5dGVMZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZUJvZHlMZW5ndGggPSBhc3luYyAoaGVhZGVycywgYm9keSkgPT4ge1xuICAgIGNvbnN0IGxlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICAgIHJldHVybiBsZW5ndGggPT0gbnVsbCA/IGdldEJvZHlMZW5ndGgoYm9keSkgOiBsZW5ndGg7XG4gIH1cblxuICByZXR1cm4gYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgIGxldCB7XG4gICAgICB1cmwsXG4gICAgICBtZXRob2QsXG4gICAgICBkYXRhLFxuICAgICAgc2lnbmFsLFxuICAgICAgY2FuY2VsVG9rZW4sXG4gICAgICB0aW1lb3V0LFxuICAgICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgICAgb25VcGxvYWRQcm9ncmVzcyxcbiAgICAgIHJlc3BvbnNlVHlwZSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHMgPSAnc2FtZS1vcmlnaW4nLFxuICAgICAgZmV0Y2hPcHRpb25zXG4gICAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICAgIGxldCBfZmV0Y2ggPSBlbnZGZXRjaCB8fCBmZXRjaDtcblxuICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSA/IChyZXNwb25zZVR5cGUgKyAnJykudG9Mb3dlckNhc2UoKSA6ICd0ZXh0JztcblxuICAgIGxldCBjb21wb3NlZFNpZ25hbCA9IGNvbXBvc2VTaWduYWxzKFtzaWduYWwsIGNhbmNlbFRva2VuICYmIGNhbmNlbFRva2VuLnRvQWJvcnRTaWduYWwoKV0sIHRpbWVvdXQpO1xuXG4gICAgbGV0IHJlcXVlc3QgPSBudWxsO1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb21wb3NlZFNpZ25hbCAmJiBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSAmJiAoKCkgPT4ge1xuICAgICAgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcblxuICAgIGxldCByZXF1ZXN0Q29udGVudExlbmd0aDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MgJiYgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtICYmIG1ldGhvZCAhPT0gJ2dldCcgJiYgbWV0aG9kICE9PSAnaGVhZCcgJiZcbiAgICAgICAgKHJlcXVlc3RDb250ZW50TGVuZ3RoID0gYXdhaXQgcmVzb2x2ZUJvZHlMZW5ndGgoaGVhZGVycywgZGF0YSkpICE9PSAwXG4gICAgICApIHtcbiAgICAgICAgbGV0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgICBkdXBsZXg6IFwiaGFsZlwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBjb250ZW50VHlwZUhlYWRlcjtcblxuICAgICAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZUhlYWRlcilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9IHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgICAgICByZXF1ZXN0Q29udGVudExlbmd0aCxcbiAgICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uVXBsb2FkUHJvZ3Jlc3MpKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBkYXRhID0gdHJhY2tTdHJlYW0oX3JlcXVlc3QuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCBmbHVzaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1dGlscy5pc1N0cmluZyh3aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICAgIH1cblxuICAgICAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIHRocm93cyB3aGVuIGNyZWRlbnRpYWxzIGFyZSBkZWZpbmVkXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgICBjb25zdCBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID0gaXNSZXF1ZXN0U3VwcG9ydGVkICYmIFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcblxuICAgICAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0ge1xuICAgICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICAgIHNpZ25hbDogY29tcG9zZWRTaWduYWwsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICAgIGJvZHk6IGRhdGEsXG4gICAgICAgIGR1cGxleDogXCJoYWxmXCIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0ID0gaXNSZXF1ZXN0U3VwcG9ydGVkICYmIG5ldyBSZXF1ZXN0KHVybCwgcmVzb2x2ZWRPcHRpb25zKTtcblxuICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgKGlzUmVxdWVzdFN1cHBvcnRlZCA/IF9mZXRjaChyZXF1ZXN0LCBmZXRjaE9wdGlvbnMpIDogX2ZldGNoKHVybCwgcmVzb2x2ZWRPcHRpb25zKSk7XG5cbiAgICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICAgIGlmIChzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChvbkRvd25sb2FkUHJvZ3Jlc3MgfHwgKGlzU3RyZWFtUmVzcG9uc2UgJiYgdW5zdWJzY3JpYmUpKSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICBvcHRpb25zW3Byb3BdID0gcmVzcG9uc2VbcHJvcF07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKTtcblxuICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gb25Eb3dubG9hZFByb2dyZXNzICYmIHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgICAgcmVzcG9uc2VDb250ZW50TGVuZ3RoLFxuICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uRG93bmxvYWRQcm9ncmVzcyksIHRydWUpXG4gICAgICAgICkgfHwgW107XG5cbiAgICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoXG4gICAgICAgICAgdHJhY2tTdHJlYW0ocmVzcG9uc2UuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCAoKSA9PiB7XG4gICAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICAgIGxldCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNvbHZlcnNbdXRpbHMuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICAgIWlzU3RyZWFtUmVzcG9uc2UgJiYgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICBoZWFkZXJzOiBBeGlvc0hlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ1R5cGVFcnJvcicgJiYgL0xvYWQgZmFpbGVkfGZldGNoL2kudGVzdChlcnIubWVzc2FnZSkpIHtcbiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCksXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGVyciwgZXJyICYmIGVyci5jb2RlLCBjb25maWcsIHJlcXVlc3QpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBzZWVkQ2FjaGUgPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRGZXRjaCA9IChjb25maWcpID0+IHtcbiAgbGV0IGVudiA9IGNvbmZpZyA/IGNvbmZpZy5lbnYgOiB7fTtcbiAgY29uc3Qge2ZldGNoLCBSZXF1ZXN0LCBSZXNwb25zZX0gPSBlbnY7XG4gIGNvbnN0IHNlZWRzID0gW1xuICAgIFJlcXVlc3QsIFJlc3BvbnNlLCBmZXRjaFxuICBdO1xuXG4gIGxldCBsZW4gPSBzZWVkcy5sZW5ndGgsIGkgPSBsZW4sXG4gICAgc2VlZCwgdGFyZ2V0LCBtYXAgPSBzZWVkQ2FjaGU7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHNlZWQgPSBzZWVkc1tpXTtcbiAgICB0YXJnZXQgPSBtYXAuZ2V0KHNlZWQpO1xuXG4gICAgdGFyZ2V0ID09PSB1bmRlZmluZWQgJiYgbWFwLnNldChzZWVkLCB0YXJnZXQgPSAoaSA/IG5ldyBNYXAoKSA6IGZhY3RvcnkoZW52KSkpXG5cbiAgICBtYXAgPSB0YXJnZXQ7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuY29uc3QgYWRhcHRlciA9IGdldEZldGNoKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGFkYXB0ZXI7XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgc2V0dGxlIGZyb20gJy4vLi4vY29yZS9zZXR0bGUuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IHBhcnNlUHJvdG9jb2wgZnJvbSAnLi4vaGVscGVycy9wYXJzZVByb3RvY29sLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcbmltcG9ydCB7cHJvZ3Jlc3NFdmVudFJlZHVjZXJ9IGZyb20gJy4uL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMnO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuXG5jb25zdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgZGVmYXVsdCBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oX2NvbmZpZy5oZWFkZXJzKS5ub3JtYWxpemUoKTtcbiAgICBsZXQge3Jlc3BvbnNlVHlwZSwgb25VcGxvYWRQcm9ncmVzcywgb25Eb3dubG9hZFByb2dyZXNzfSA9IF9jb25maWc7XG4gICAgbGV0IG9uQ2FuY2VsZWQ7XG4gICAgbGV0IHVwbG9hZFRocm90dGxlZCwgZG93bmxvYWRUaHJvdHRsZWQ7XG4gICAgbGV0IGZsdXNoVXBsb2FkLCBmbHVzaERvd25sb2FkO1xuXG4gICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgIGZsdXNoVXBsb2FkICYmIGZsdXNoVXBsb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuICAgICAgZmx1c2hEb3dubG9hZCAmJiBmbHVzaERvd25sb2FkKCk7IC8vIGZsdXNoIGV2ZW50c1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUob25DYW5jZWxlZCk7XG5cbiAgICAgIF9jb25maWcuc2lnbmFsICYmIF9jb25maWcuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25DYW5jZWxlZCk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIHJlcXVlc3Qub3BlbihfY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBfY29uZmlnLnVybCwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHJlcXVlc3QgdGltZW91dCBpbiBNU1xuICAgIHJlcXVlc3QudGltZW91dCA9IF9jb25maWcudGltZW91dDtcblxuICAgIGZ1bmN0aW9uIG9ubG9hZGVuZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oXG4gICAgICAgICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9ICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXZlbnQpIHtcbiAgICAgICAvLyBCcm93c2VycyBkZWxpdmVyIGEgUHJvZ3Jlc3NFdmVudCBpbiBYSFIgb25lcnJvclxuICAgICAgIC8vIChtZXNzYWdlIG1heSBiZSBlbXB0eTsgd2hlbiBwcmVzZW50LCBzdXJmYWNlIGl0KVxuICAgICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QvZXJyb3JfZXZlbnRcbiAgICAgICBjb25zdCBtc2cgPSBldmVudCAmJiBldmVudC5tZXNzYWdlID8gZXZlbnQubWVzc2FnZSA6ICdOZXR3b3JrIEVycm9yJztcbiAgICAgICBjb25zdCBlcnIgPSBuZXcgQXhpb3NFcnJvcihtc2csIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICAgLy8gYXR0YWNoIHRoZSB1bmRlcmx5aW5nIGV2ZW50IGZvciBjb25zdW1lcnMgd2hvIHdhbnQgZGV0YWlsc1xuICAgICAgIGVyci5ldmVudCA9IGV2ZW50IHx8IG51bGw7XG4gICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcbiAgICBcbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMudG9KU09OKCksIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKF9jb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIV9jb25maWcud2l0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAocmVzcG9uc2VUeXBlICYmIHJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IF9jb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAoW2Rvd25sb2FkVGhyb3R0bGVkLCBmbHVzaERvd25sb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uRG93bmxvYWRQcm9ncmVzcywgdHJ1ZSkpO1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGRvd25sb2FkVGhyb3R0bGVkKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmIChvblVwbG9hZFByb2dyZXNzICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICAoW3VwbG9hZFRocm90dGxlZCwgZmx1c2hVcGxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25VcGxvYWRQcm9ncmVzcykpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHVwbG9hZFRocm90dGxlZCk7XG5cbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCBmbHVzaFVwbG9hZCk7XG4gICAgfVxuXG4gICAgaWYgKF9jb25maWcuY2FuY2VsVG9rZW4gfHwgX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBvbkNhbmNlbGVkID0gY2FuY2VsID0+IHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCghY2FuY2VsIHx8IGNhbmNlbC50eXBlID8gbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnLCByZXF1ZXN0KSA6IGNhbmNlbCk7XG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgaWYgKF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAgIF9jb25maWcuc2lnbmFsLmFib3J0ZWQgPyBvbkNhbmNlbGVkKCkgOiBfY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VQcm90b2NvbChfY29uZmlnLnVybCk7XG5cbiAgICBpZiAocHJvdG9jb2wgJiYgcGxhdGZvcm0ucHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdVbnN1cHBvcnRlZCBwcm90b2NvbCAnICsgcHJvdG9jb2wgKyAnOicsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBjb25maWcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgYmluZCBmcm9tICcuL2hlbHBlcnMvYmluZC5qcyc7XG5pbXBvcnQgQXhpb3MgZnJvbSAnLi9jb3JlL0F4aW9zLmpzJztcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tICcuL2NvcmUvbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IGZvcm1EYXRhVG9KU09OIGZyb20gJy4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBDYW5jZWxUb2tlbiBmcm9tICcuL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyc7XG5pbXBvcnQgaXNDYW5jZWwgZnJvbSAnLi9jYW5jZWwvaXNDYW5jZWwuanMnO1xuaW1wb3J0IHtWRVJTSU9OfSBmcm9tICcuL2Vudi9kYXRhLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vaGVscGVycy90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBzcHJlYWQgZnJvbSAnLi9oZWxwZXJzL3NwcmVhZC5qcyc7XG5pbXBvcnQgaXNBeGlvc0Vycm9yIGZyb20gJy4vaGVscGVycy9pc0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IGFkYXB0ZXJzIGZyb20gJy4vYWRhcHRlcnMvYWRhcHRlcnMuanMnO1xuaW1wb3J0IEh0dHBTdGF0dXNDb2RlIGZyb20gJy4vaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJucyB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0LCBudWxsLCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsZWRFcnJvciA9IENhbmNlbGVkRXJyb3I7XG5heGlvcy5DYW5jZWxUb2tlbiA9IENhbmNlbFRva2VuO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycztcblxuYXhpb3MuZm9ybVRvSlNPTiA9IHRoaW5nID0+IGZvcm1EYXRhVG9KU09OKHV0aWxzLmlzSFRNTEZvcm0odGhpbmcpID8gbmV3IEZvcm1EYXRhKHRoaW5nKSA6IHRoaW5nKTtcblxuYXhpb3MuZ2V0QWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXI7XG5cbmF4aW9zLkh0dHBTdGF0dXNDb2RlID0gSHR0cFN0YXR1c0NvZGU7XG5cbmF4aW9zLmRlZmF1bHQgPSBheGlvcztcblxuLy8gdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgaGF2ZSBhIGRlZmF1bHQgZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBheGlvc1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuL0NhbmNlbGVkRXJyb3IuanMnO1xuXG4vKipcbiAqIEEgYENhbmNlbFRva2VuYCBpcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxUb2tlbn1cbiAqL1xuY2xhc3MgQ2FuY2VsVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuICAgIGlmICh0eXBlb2YgZXhlY3V0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZVByb21pc2U7XG5cbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICB0aGlzLnByb21pc2UudGhlbihjYW5jZWwgPT4ge1xuICAgICAgaWYgKCF0b2tlbi5fbGlzdGVuZXJzKSByZXR1cm47XG5cbiAgICAgIGxldCBpID0gdG9rZW4uX2xpc3RlbmVycy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgIHRva2VuLl9saXN0ZW5lcnNbaV0oY2FuY2VsKTtcbiAgICAgIH1cbiAgICAgIHRva2VuLl9saXN0ZW5lcnMgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICB0aGlzLnByb21pc2UudGhlbiA9IG9uZnVsZmlsbGVkID0+IHtcbiAgICAgIGxldCBfcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHRva2VuLnN1YnNjcmliZShyZXNvbHZlKTtcbiAgICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgfSkudGhlbihvbmZ1bGZpbGxlZCk7XG5cbiAgICAgIHByb21pc2UuY2FuY2VsID0gZnVuY3Rpb24gcmVqZWN0KCkge1xuICAgICAgICB0b2tlbi51bnN1YnNjcmliZShfcmVzb2x2ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCkge1xuICAgICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpO1xuICAgICAgcmVzb2x2ZVByb21pc2UodG9rZW4ucmVhc29uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAgICovXG4gIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICB0aHJvdyB0aGlzLnJlYXNvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgbGlzdGVuZXIodGhpcy5yZWFzb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW2xpc3RlbmVyXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgZnJvbSB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHRvQWJvcnRTaWduYWwoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGNvbnN0IGFib3J0ID0gKGVycikgPT4ge1xuICAgICAgY29udHJvbGxlci5hYm9ydChlcnIpO1xuICAgIH07XG5cbiAgICB0aGlzLnN1YnNjcmliZShhYm9ydCk7XG5cbiAgICBjb250cm9sbGVyLnNpZ25hbC51bnN1YnNjcmliZSA9ICgpID0+IHRoaXMudW5zdWJzY3JpYmUoYWJvcnQpO1xuXG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBuZXcgYENhbmNlbFRva2VuYCBhbmQgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCxcbiAgICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAgICovXG4gIHN0YXRpYyBzb3VyY2UoKSB7XG4gICAgbGV0IGNhbmNlbDtcbiAgICBjb25zdCB0b2tlbiA9IG5ldyBDYW5jZWxUb2tlbihmdW5jdGlvbiBleGVjdXRvcihjKSB7XG4gICAgICBjYW5jZWwgPSBjO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbixcbiAgICAgIGNhbmNlbFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsVG9rZW47XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3Q9fSByZXF1ZXN0IFRoZSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxlZEVycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIEF4aW9zRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlID09IG51bGwgPyAnY2FuY2VsZWQnIDogbWVzc2FnZSwgQXhpb3NFcnJvci5FUlJfQ0FOQ0VMRUQsIGNvbmZpZywgcmVxdWVzdCk7XG4gIHRoaXMubmFtZSA9ICdDYW5jZWxlZEVycm9yJztcbn1cblxudXRpbHMuaW5oZXJpdHMoQ2FuY2VsZWRFcnJvciwgQXhpb3NFcnJvciwge1xuICBfX0NBTkNFTF9fOiB0cnVlXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2FuY2VsZWRFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSAnLi4vaGVscGVycy9idWlsZFVSTC5qcyc7XG5pbXBvcnQgSW50ZXJjZXB0b3JNYW5hZ2VyIGZyb20gJy4vSW50ZXJjZXB0b3JNYW5hZ2VyLmpzJztcbmltcG9ydCBkaXNwYXRjaFJlcXVlc3QgZnJvbSAnLi9kaXNwYXRjaFJlcXVlc3QuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGJ1aWxkRnVsbFBhdGggZnJvbSAnLi9idWlsZEZ1bGxQYXRoLmpzJztcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnLi4vaGVscGVycy92YWxpZGF0b3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuL0F4aW9zSGVhZGVycy5qcyc7XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuY2xhc3MgQXhpb3Mge1xuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUNvbmZpZykge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgcmVxdWVzdFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IGNvbmZpZ09yVXJsIFRoZSBjb25maWcgc3BlY2lmaWMgZm9yIHRoaXMgcmVxdWVzdCAobWVyZ2VkIHdpdGggdGhpcy5kZWZhdWx0cylcbiAgICogQHBhcmFtIHs/T2JqZWN0fSBjb25maWdcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGxldCBkdW1teSA9IHt9O1xuXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZHVtbXkpIDogKGR1bW15ID0gbmV3IEVycm9yKCkpO1xuXG4gICAgICAgIC8vIHNsaWNlIG9mZiB0aGUgRXJyb3I6IC4uLiBsaW5lXG4gICAgICAgIGNvbnN0IHN0YWNrID0gZHVtbXkuc3RhY2sgPyBkdW1teS5zdGFjay5yZXBsYWNlKC9eLitcXG4vLCAnJykgOiAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIWVyci5zdGFjaykge1xuICAgICAgICAgICAgZXJyLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAvLyBtYXRjaCB3aXRob3V0IHRoZSAyIHRvcCBzdGFjayBsaW5lc1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2sgJiYgIVN0cmluZyhlcnIuc3RhY2spLmVuZHNXaXRoKHN0YWNrLnJlcGxhY2UoL14uK1xcbi4rXFxuLywgJycpKSkge1xuICAgICAgICAgICAgZXJyLnN0YWNrICs9ICdcXG4nICsgc3RhY2tcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhlIGNhc2Ugd2hlcmUgXCJzdGFja1wiIGlzIGFuIHVuLXdyaXRhYmxlIHByb3BlcnR5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIF9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24ocGFyYW1zU2VyaWFsaXplcikpIHtcbiAgICAgICAgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIgPSB7XG4gICAgICAgICAgc2VyaWFsaXplOiBwYXJhbXNTZXJpYWxpemVyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHBhcmFtc1NlcmlhbGl6ZXIsIHtcbiAgICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHNcbiAgICBpZiAoY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzID0gdGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyhjb25maWcsIHtcbiAgICAgIGJhc2VVcmw6IHZhbGlkYXRvcnMuc3BlbGxpbmcoJ2Jhc2VVUkwnKSxcbiAgICAgIHdpdGhYc3JmVG9rZW46IHZhbGlkYXRvcnMuc3BlbGxpbmcoJ3dpdGhYU1JGVG9rZW4nKVxuICAgIH0sIHRydWUpO1xuXG4gICAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgICBjb25maWcubWV0aG9kID0gKGNvbmZpZy5tZXRob2QgfHwgdGhpcy5kZWZhdWx0cy5tZXRob2QgfHwgJ2dldCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgICBsZXQgY29udGV4dEhlYWRlcnMgPSBoZWFkZXJzICYmIHV0aWxzLm1lcmdlKFxuICAgICAgaGVhZGVycy5jb21tb24sXG4gICAgICBoZWFkZXJzW2NvbmZpZy5tZXRob2RdXG4gICAgKTtcblxuICAgIGhlYWRlcnMgJiYgdXRpbHMuZm9yRWFjaChcbiAgICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5jb25jYXQoY29udGV4dEhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICAgIGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgbGV0IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGxldCBwcm9taXNlO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuO1xuXG4gICAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdC5iaW5kKHRoaXMpLCB1bmRlZmluZWRdO1xuICAgICAgY2hhaW4udW5zaGlmdCguLi5yZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoKC4uLnJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBsZW4gPSBjaGFpbi5sZW5ndGg7XG5cbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbltpKytdLCBjaGFpbltpKytdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgbGVuID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwsIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29uZmlnXSBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBBeGlvc0Vycm9yKG1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgRXJyb3IuY2FsbCh0aGlzKTtcblxuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMubmFtZSA9ICdBeGlvc0Vycm9yJztcbiAgY29kZSAmJiAodGhpcy5jb2RlID0gY29kZSk7XG4gIGNvbmZpZyAmJiAodGhpcy5jb25maWcgPSBjb25maWcpO1xuICByZXF1ZXN0ICYmICh0aGlzLnJlcXVlc3QgPSByZXF1ZXN0KTtcbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzID8gcmVzcG9uc2Uuc3RhdHVzIDogbnVsbDtcbiAgfVxufVxuXG51dGlscy5pbmhlcml0cyhBeGlvc0Vycm9yLCBFcnJvciwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB1dGlscy50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1c1xuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc0Vycm9yLnByb3RvdHlwZTtcbmNvbnN0IGRlc2NyaXB0b3JzID0ge307XG5cbltcbiAgJ0VSUl9CQURfT1BUSU9OX1ZBTFVFJyxcbiAgJ0VSUl9CQURfT1BUSU9OJyxcbiAgJ0VDT05OQUJPUlRFRCcsXG4gICdFVElNRURPVVQnLFxuICAnRVJSX05FVFdPUksnLFxuICAnRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUycsXG4gICdFUlJfREVQUkVDQVRFRCcsXG4gICdFUlJfQkFEX1JFU1BPTlNFJyxcbiAgJ0VSUl9CQURfUkVRVUVTVCcsXG4gICdFUlJfQ0FOQ0VMRUQnLFxuICAnRVJSX05PVF9TVVBQT1JUJyxcbiAgJ0VSUl9JTlZBTElEX1VSTCdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5dLmZvckVhY2goY29kZSA9PiB7XG4gIGRlc2NyaXB0b3JzW2NvZGVdID0ge3ZhbHVlOiBjb2RlfTtcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhBeGlvc0Vycm9yLCBkZXNjcmlwdG9ycyk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG5cbiAgdXRpbHMudG9GbGF0T2JqZWN0KGVycm9yLCBheGlvc0Vycm9yLCBmdW5jdGlvbiBmaWx0ZXIob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAhPT0gRXJyb3IucHJvdG90eXBlO1xuICB9LCBwcm9wID0+IHtcbiAgICByZXR1cm4gcHJvcCAhPT0gJ2lzQXhpb3NFcnJvcic7XG4gIH0pO1xuXG4gIGNvbnN0IG1zZyA9IGVycm9yICYmIGVycm9yLm1lc3NhZ2UgPyBlcnJvci5tZXNzYWdlIDogJ0Vycm9yJztcblxuICAvLyBQcmVmZXIgZXhwbGljaXQgY29kZTsgb3RoZXJ3aXNlIGNvcHkgdGhlIGxvdy1sZXZlbCBlcnJvcidzIGNvZGUgKGUuZy4gRUNPTk5SRUZVU0VEKVxuICBjb25zdCBlcnJDb2RlID0gY29kZSA9PSBudWxsICYmIGVycm9yID8gZXJyb3IuY29kZSA6IGNvZGU7XG4gIEF4aW9zRXJyb3IuY2FsbChheGlvc0Vycm9yLCBtc2csIGVyckNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gIC8vIENoYWluIHRoZSBvcmlnaW5hbCBlcnJvciBvbiB0aGUgc3RhbmRhcmQgZmllbGQ7IG5vbi1lbnVtZXJhYmxlIHRvIGF2b2lkIEpTT04gbm9pc2VcbiAgaWYgKGVycm9yICYmIGF4aW9zRXJyb3IuY2F1c2UgPT0gbnVsbCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShheGlvc0Vycm9yLCAnY2F1c2UnLCB7IHZhbHVlOiBlcnJvciwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICB9XG5cbiAgYXhpb3NFcnJvci5uYW1lID0gKGVycm9yICYmIGVycm9yLm5hbWUpIHx8ICdFcnJvcic7XG5cbiAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG5cbiAgcmV0dXJuIGF4aW9zRXJyb3I7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0Vycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBhcnNlSGVhZGVycyBmcm9tICcuLi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyc7XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgICB2YWx1ZSA9IGhlYWRlcjtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscy50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpXG4gICAgfSBlbHNlIGlmKHV0aWxzLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdChoZWFkZXIpICYmIHV0aWxzLmlzSXRlcmFibGUoaGVhZGVyKSkge1xuICAgICAgbGV0IG9iaiA9IHt9LCBkZXN0LCBrZXk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGhlYWRlcikge1xuICAgICAgICBpZiAoIXV0aWxzLmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdPYmplY3QgaXRlcmF0b3IgbXVzdCByZXR1cm4gYSBrZXktdmFsdWUgcGFpcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqW2tleSA9IGVudHJ5WzBdXSA9IChkZXN0ID0gb2JqW2tleV0pID9cbiAgICAgICAgICAodXRpbHMuaXNBcnJheShkZXN0KSA/IFsuLi5kZXN0LCBlbnRyeVsxXV0gOiBbZGVzdCwgZW50cnlbMV1dKSA6IGVudHJ5WzFdO1xuICAgICAgfVxuXG4gICAgICBzZXRIZWFkZXJzKG9iaiwgdmFsdWVPclJld3JpdGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0U2V0Q29va2llKCkge1xuICAgIHJldHVybiB0aGlzLmdldChcInNldC1jb29raWVcIikgfHwgW107XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBeGlvc0hlYWRlcnMnO1xuICB9XG5cbiAgc3RhdGljIGZyb20odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiB0aGlzID8gdGhpbmcgOiBuZXcgdGhpcyh0aGluZyk7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGZpcnN0LCAuLi50YXJnZXRzKSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBuZXcgdGhpcyhmaXJzdCk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gY29tcHV0ZWQuc2V0KHRhcmdldCkpO1xuXG4gICAgcmV0dXJuIGNvbXB1dGVkO1xuICB9XG5cbiAgc3RhdGljIGFjY2Vzc29yKGhlYWRlcikge1xuICAgIGNvbnN0IGludGVybmFscyA9IHRoaXNbJGludGVybmFsc10gPSAodGhpc1skaW50ZXJuYWxzXSA9IHtcbiAgICAgIGFjY2Vzc29yczoge31cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IGludGVybmFscy5hY2Nlc3NvcnM7XG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVBY2Nlc3NvcihfaGVhZGVyKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWFjY2Vzc29yc1tsSGVhZGVyXSkge1xuICAgICAgICBidWlsZEFjY2Vzc29ycyhwcm90b3R5cGUsIF9oZWFkZXIpO1xuICAgICAgICBhY2Nlc3NvcnNbbEhlYWRlcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzLmlzQXJyYXkoaGVhZGVyKSA/IGhlYWRlci5mb3JFYWNoKGRlZmluZUFjY2Vzc29yKSA6IGRlZmluZUFjY2Vzc29yKGhlYWRlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5BeGlvc0hlYWRlcnMuYWNjZXNzb3IoWydDb250ZW50LVR5cGUnLCAnQ29udGVudC1MZW5ndGgnLCAnQWNjZXB0JywgJ0FjY2VwdC1FbmNvZGluZycsICdVc2VyLUFnZW50JywgJ0F1dGhvcml6YXRpb24nXSk7XG5cbi8vIHJlc2VydmVkIG5hbWVzIGhvdGZpeFxudXRpbHMucmVkdWNlRGVzY3JpcHRvcnMoQXhpb3NIZWFkZXJzLnByb3RvdHlwZSwgKHt2YWx1ZX0sIGtleSkgPT4ge1xuICBsZXQgbWFwcGVkID0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7IC8vIG1hcCBgc2V0YCA9PiBgU2V0YFxuICByZXR1cm4ge1xuICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgc2V0KGhlYWRlclZhbHVlKSB7XG4gICAgICB0aGlzW21hcHBlZF0gPSBoZWFkZXJWYWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG51dGlscy5mcmVlemVNZXRob2RzKEF4aW9zSGVhZGVycyk7XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zSGVhZGVycztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG5jbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICovXG4gIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgc3luY2hyb25vdXM6IG9wdGlvbnMgPyBvcHRpb25zLnN5bmNocm9ub3VzIDogZmFsc2UsXG4gICAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW50ZXJjZXB0b3Igd2FzIHJlbW92ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBlamVjdChpZCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAgICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChmbikge1xuICAgIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgICAgZm4oaCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJjZXB0b3JNYW5hZ2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgaXNBYnNvbHV0ZVVSTCBmcm9tICcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMnO1xuaW1wb3J0IGNvbWJpbmVVUkxzIGZyb20gJy4uL2hlbHBlcnMvY29tYmluZVVSTHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwsIGFsbG93QWJzb2x1dGVVcmxzKSB7XG4gIGxldCBpc1JlbGF0aXZlVXJsID0gIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKTtcbiAgaWYgKGJhc2VVUkwgJiYgKGlzUmVsYXRpdmVVcmwgfHwgYWxsb3dBYnNvbHV0ZVVybHMgPT0gZmFsc2UpKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCk7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3RlZFVSTDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHRyYW5zZm9ybURhdGEgZnJvbSAnLi90cmFuc2Zvcm1EYXRhLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuLi9jYW5jZWwvaXNDYW5jZWwuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL2luZGV4LmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi4vY29yZS9BeGlvc0hlYWRlcnMuanMnO1xuaW1wb3J0IGFkYXB0ZXJzIGZyb20gXCIuLi9hZGFwdGVycy9hZGFwdGVycy5qc1wiO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zaWduYWwgJiYgY29uZmlnLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29uZmlnLmhlYWRlcnMpO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgaWYgKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpICE9PSAtMSkge1xuICAgIGNvbmZpZy5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcihjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyLCBjb25maWcpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICApO1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL0F4aW9zSGVhZGVycy5qc1wiO1xuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzID8geyAuLi50aGluZyB9IDogdGhpbmc7XG5cbi8qKlxuICogQ29uZmlnLXNwZWNpZmljIG1lcmdlLWZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29uZmlnLW9iamVjdFxuICogYnkgbWVyZ2luZyB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcxXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnMSwgY29uZmlnMikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgY29uZmlnMiA9IGNvbmZpZzIgfHwge307XG4gIGNvbnN0IGNvbmZpZyA9IHt9O1xuXG4gIGZ1bmN0aW9uIGdldE1lcmdlZFZhbHVlKHRhcmdldCwgc291cmNlLCBwcm9wLCBjYXNlbGVzcykge1xuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2UuY2FsbCh7Y2FzZWxlc3N9LCB0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMoYSwgYiwgcHJvcCAsIGNhc2VsZXNzKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIsIHByb3AgLCBjYXNlbGVzcyk7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIHByb3AgLCBjYXNlbGVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBkZWZhdWx0VG9Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIgLCBwcm9wKSA9PiBtZXJnZURlZXBQcm9wZXJ0aWVzKGhlYWRlcnNUb09iamVjdChhKSwgaGVhZGVyc1RvT2JqZWN0KGIpLHByb3AsIHRydWUpXG4gIH07XG5cbiAgdXRpbHMuZm9yRWFjaChPYmplY3Qua2V5cyh7Li4uY29uZmlnMSwgLi4uY29uZmlnMn0pLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscy5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9BeGlvc0Vycm9yLmpzJztcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IHZhbGlkYXRlU3RhdHVzID0gcmVzcG9uc2UuY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICBbQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihyZXNwb25zZS5zdGF0dXMgLyAxMDApIC0gNF0sXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7P09iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShmbnMsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHRoaXMgfHwgZGVmYXVsdHM7XG4gIGNvbnN0IGNvbnRleHQgPSByZXNwb25zZSB8fCBjb25maWc7XG4gIGNvbnN0IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb250ZXh0LmhlYWRlcnMpO1xuICBsZXQgZGF0YSA9IGNvbnRleHQuZGF0YTtcblxuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29uZmlnLCBkYXRhLCBoZWFkZXJzLm5vcm1hbGl6ZSgpLCByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGhlYWRlcnMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4vdHJhbnNpdGlvbmFsLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4uL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgdG9VUkxFbmNvZGVkRm9ybSBmcm9tICcuLi9oZWxwZXJzL3RvVVJMRW5jb2RlZEZvcm0uanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBmb3JtRGF0YVRvSlNPTiBmcm9tICcuLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZywgdHJpZXMgdG8gcGFyc2UgaXQsIGFuZCBpZiBpdCBmYWlscywgaXQgcmV0dXJucyB0aGUgc3RyaW5naWZpZWQgdmVyc2lvblxuICogb2YgdGhlIGlucHV0XG4gKlxuICogQHBhcmFtIHthbnl9IHJhd1ZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHN0cmluZ2lmaWVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIC0gQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBhIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgYSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSByYXdWYWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2FmZWx5KHJhd1ZhbHVlLCBwYXJzZXIsIGVuY29kZXIpIHtcbiAgaWYgKHV0aWxzLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICAocGFyc2VyIHx8IEpTT04ucGFyc2UpKHJhd1ZhbHVlKTtcbiAgICAgIHJldHVybiB1dGlscy50cmltKHJhd1ZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lICE9PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChlbmNvZGVyIHx8IEpTT04uc3RyaW5naWZ5KShyYXdWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCcsICdmZXRjaCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSB8fCAnJztcbiAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscy5pc09iamVjdChkYXRhKTtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgJiYgdXRpbHMuaXNIVE1MRm9ybShkYXRhKSkge1xuICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zvcm1EYXRhID0gdXRpbHMuaXNGb3JtRGF0YShkYXRhKTtcblxuICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04JywgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBsZXQgaXNGaWxlTGlzdDtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaXNGaWxlTGlzdCA9IHV0aWxzLmlzRmlsZUxpc3QoZGF0YSkpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgIGlzRmlsZUxpc3QgPyB7J2ZpbGVzW10nOiBkYXRhfSA6IGRhdGEsXG4gICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICB0aGlzLmZvcm1TZXJpYWxpemVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCB8fCBoYXNKU09OQ29udGVudFR5cGUgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmICh1dGlscy5pc1Jlc3BvbnNlKGRhdGEpIHx8IHV0aWxzLmlzUmVhZGFibGVTdHJlYW0oZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIHV0aWxzLmlzU3RyaW5nKGRhdGEpICYmICgoZm9yY2VkSlNPTlBhcnNpbmcgJiYgIXRoaXMucmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKSkge1xuICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSwgdGhpcy5wYXJzZVJldml2ZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZSwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLCB0aGlzLCBudWxsLCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgZW52OiB7XG4gICAgRm9ybURhdGE6IHBsYXRmb3JtLmNsYXNzZXMuRm9ybURhdGEsXG4gICAgQmxvYjogcGxhdGZvcm0uY2xhc3Nlcy5CbG9iXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkXG4gICAgfVxuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcbiIsImV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIxLjEyLjJcIjsiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gIGNvbnN0IGNoYXJNYXAgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICBcIidcIjogJyUyNycsXG4gICAgJygnOiAnJTI4JyxcbiAgICAnKSc6ICclMjknLFxuICAgICd+JzogJyU3RScsXG4gICAgJyUyMCc6ICcrJyxcbiAgICAnJTAwJzogJ1xceDAwJ1xuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csIGZ1bmN0aW9uIHJlcGxhY2VyKG1hdGNoKSB7XG4gICAgcmV0dXJuIGNoYXJNYXBbbWF0Y2hdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhcmFtcyBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBGb3JtRGF0YSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBBeGlvcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKSB7XG4gIHRoaXMuX3BhaXJzID0gW107XG5cbiAgcGFyYW1zICYmIHRvRm9ybURhdGEocGFyYW1zLCB0aGlzLCBvcHRpb25zKTtcbn1cblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xuXG5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMuX3BhaXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG59O1xuXG5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhlbmNvZGVyKSB7XG4gIGNvbnN0IF9lbmNvZGUgPSBlbmNvZGVyID8gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUpO1xuICB9IDogZW5jb2RlO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCJjb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSHR0cFN0YXR1c0NvZGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi4vaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyc7XG5cbi8qKlxuICogSXQgcmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY2hhcmFjdGVycyBgOmAsIGAkYCwgYCxgLCBgK2AsIGBbYCwgYW5kIGBdYCB3aXRoIHRoZWlyXG4gKiBVUkkgZW5jb2RlZCBjb3VudGVycGFydHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEBwYXJhbSB7PyhvYmplY3R8RnVuY3Rpb24pfSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGlmICh1dGlscy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIHNlcmlhbGl6ZTogb3B0aW9uc1xuICAgIH07XG4gIH0gXG5cbiAgY29uc3Qgc2VyaWFsaXplRm4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplO1xuXG4gIGxldCBzZXJpYWxpemVkUGFyYW1zO1xuXG4gIGlmIChzZXJpYWxpemVGbikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBzZXJpYWxpemVGbihwYXJhbXMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSB1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpID9cbiAgICAgIHBhcmFtcy50b1N0cmluZygpIDpcbiAgICAgIG5ldyBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpLnRvU3RyaW5nKF9lbmNvZGUpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICBjb25zdCBoYXNobWFya0luZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuXG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8/XFwvJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufVxuIiwiaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSBcIi4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG5jb25zdCBjb21wb3NlU2lnbmFscyA9IChzaWduYWxzLCB0aW1lb3V0KSA9PiB7XG4gIGNvbnN0IHtsZW5ndGh9ID0gKHNpZ25hbHMgPSBzaWduYWxzID8gc2lnbmFscy5maWx0ZXIoQm9vbGVhbikgOiBbXSk7XG5cbiAgaWYgKHRpbWVvdXQgfHwgbGVuZ3RoKSB7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBsZXQgYWJvcnRlZDtcblxuICAgIGNvbnN0IG9uYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBpZiAoIWFib3J0ZWQpIHtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNvbnN0IGVyciA9IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uIDogdGhpcy5yZWFzb247XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyIGluc3RhbmNlb2YgQXhpb3NFcnJvciA/IGVyciA6IG5ldyBDYW5jZWxlZEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKVxuICAgIH0sIHRpbWVvdXQpXG5cbiAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgIGlmIChzaWduYWxzKSB7XG4gICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgc2lnbmFscy5mb3JFYWNoKHNpZ25hbCA9PiB7XG4gICAgICAgICAgc2lnbmFsLnVuc3Vic2NyaWJlID8gc2lnbmFsLnVuc3Vic2NyaWJlKG9uYWJvcnQpIDogc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzaWduYWxzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gICAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gICAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMuYXNhcCh1bnN1YnNjcmliZSk7XG5cbiAgICByZXR1cm4gc2lnbmFsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VTaWduYWxzO1xuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAge1xuICAgIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgY29uc3QgY29va2llID0gW25hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpXTtcblxuICAgICAgdXRpbHMuaXNOdW1iZXIoZXhwaXJlcykgJiYgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuXG4gICAgICB1dGlscy5pc1N0cmluZyhwYXRoKSAmJiBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG5cbiAgICAgIHV0aWxzLmlzU3RyaW5nKGRvbWFpbikgJiYgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcblxuICAgICAgc2VjdXJlID09PSB0cnVlICYmIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcblxuICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgfSxcblxuICAgIHJlYWQobmFtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlKG5hbWUpIHtcbiAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgfVxuICB9XG5cbiAgOlxuXG4gIC8vIE5vbi1zdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAge1xuICAgIHdyaXRlKCkge30sXG4gICAgcmVhZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKCkge31cbiAgfTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscy5tYXRjaEFsbCgvXFx3K3xcXFsoXFx3KildL2csIG5hbWUpLm1hcChtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoWzBdID09PSAnW10nID8gJycgOiBtYXRjaFsxXSB8fCBtYXRjaFswXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY29udmVydCB0byBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnIpIHtcbiAgY29uc3Qgb2JqID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuICBsZXQgaTtcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gIGxldCBrZXk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgb2JqW2tleV0gPSBhcnJba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgRm9ybURhdGEgb2JqZWN0IGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgVGhlIEZvcm1EYXRhIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT4gfCBudWxsfSBUaGUgY29udmVydGVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZm9ybURhdGFUb0pTT04oZm9ybURhdGEpIHtcbiAgZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXQsIGluZGV4KSB7XG4gICAgbGV0IG5hbWUgPSBwYXRoW2luZGV4KytdO1xuXG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGlzTnVtZXJpY0tleSA9IE51bWJlci5pc0Zpbml0ZSgrbmFtZSk7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPj0gcGF0aC5sZW5ndGg7XG4gICAgbmFtZSA9ICFuYW1lICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5sZW5ndGggOiBuYW1lO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgaWYgKHV0aWxzLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzLmlzT2JqZWN0KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0W25hbWVdLCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzLmlzRnVuY3Rpb24oZm9ybURhdGEuZW50cmllcykpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1EYXRhVG9KU09OO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzLmlzT2JqZWN0KHBheWxvYWQpICYmIChwYXlsb2FkLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZSk7XG59XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgPyAoKG9yaWdpbiwgaXNNU0lFKSA9PiAodXJsKSA9PiB7XG4gIHVybCA9IG5ldyBVUkwodXJsLCBwbGF0Zm9ybS5vcmlnaW4pO1xuXG4gIHJldHVybiAoXG4gICAgb3JpZ2luLnByb3RvY29sID09PSB1cmwucHJvdG9jb2wgJiZcbiAgICBvcmlnaW4uaG9zdCA9PT0gdXJsLmhvc3QgJiZcbiAgICAoaXNNU0lFIHx8IG9yaWdpbi5wb3J0ID09PSB1cmwucG9ydClcbiAgKTtcbn0pKFxuICBuZXcgVVJMKHBsYXRmb3JtLm9yaWdpbiksXG4gIHBsYXRmb3JtLm5hdmlnYXRvciAmJiAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KHBsYXRmb3JtLm5hdmlnYXRvci51c2VyQWdlbnQpXG4pIDogKCkgPT4gdHJ1ZTtcbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHJpY3RcbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscy50b09iamVjdFNldChbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5leHBvcnQgZGVmYXVsdCByYXdIZWFkZXJzID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiYgcmF3SGVhZGVycy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgcGFyc2VkW2tleV0ucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZVByb3RvY29sKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9eKFstK1xcd117MSwyNX0pKDo/XFwvXFwvfDopLy5leGVjKHVybCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbn1cbiIsImltcG9ydCBzcGVlZG9tZXRlciBmcm9tIFwiLi9zcGVlZG9tZXRlci5qc1wiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCIuL3Rocm90dGxlLmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBwcm9ncmVzc0V2ZW50UmVkdWNlciA9IChsaXN0ZW5lciwgaXNEb3dubG9hZFN0cmVhbSwgZnJlcSA9IDMpID0+IHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gdGhyb3R0bGUoZSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBsb2FkZWQgLSBieXRlc05vdGlmaWVkO1xuICAgIGNvbnN0IHJhdGUgPSBfc3BlZWRvbWV0ZXIocHJvZ3Jlc3NCeXRlcyk7XG4gICAgY29uc3QgaW5SYW5nZSA9IGxvYWRlZCA8PSB0b3RhbDtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBsb2FkZWQ7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyAobG9hZGVkIC8gdG90YWwpIDogdW5kZWZpbmVkLFxuICAgICAgYnl0ZXM6IHByb2dyZXNzQnl0ZXMsXG4gICAgICByYXRlOiByYXRlID8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVzdGltYXRlZDogcmF0ZSAmJiB0b3RhbCAmJiBpblJhbmdlID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZSxcbiAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRvdGFsICE9IG51bGwsXG4gICAgICBbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ106IHRydWVcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufVxuXG5leHBvcnQgY29uc3QgcHJvZ3Jlc3NFdmVudERlY29yYXRvciA9ICh0b3RhbCwgdGhyb3R0bGVkKSA9PiB7XG4gIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPSBudWxsO1xuXG4gIHJldHVybiBbKGxvYWRlZCkgPT4gdGhyb3R0bGVkWzBdKHtcbiAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgIHRvdGFsLFxuICAgIGxvYWRlZFxuICB9KSwgdGhyb3R0bGVkWzFdXTtcbn1cblxuZXhwb3J0IGNvbnN0IGFzeW5jRGVjb3JhdG9yID0gKGZuKSA9PiAoLi4uYXJncykgPT4gdXRpbHMuYXNhcCgoKSA9PiBmbiguLi5hcmdzKSk7XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSBcIi4uL3BsYXRmb3JtL2luZGV4LmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgaXNVUkxTYW1lT3JpZ2luIGZyb20gXCIuL2lzVVJMU2FtZU9yaWdpbi5qc1wiO1xuaW1wb3J0IGNvb2tpZXMgZnJvbSBcIi4vY29va2llcy5qc1wiO1xuaW1wb3J0IGJ1aWxkRnVsbFBhdGggZnJvbSBcIi4uL2NvcmUvYnVpbGRGdWxsUGF0aC5qc1wiO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gXCIuLi9jb3JlL21lcmdlQ29uZmlnLmpzXCI7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IGJ1aWxkVVJMIGZyb20gXCIuL2J1aWxkVVJMLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChjb25maWcpID0+IHtcbiAgY29uc3QgbmV3Q29uZmlnID0gbWVyZ2VDb25maWcoe30sIGNvbmZpZyk7XG5cbiAgbGV0IHsgZGF0YSwgd2l0aFhTUkZUb2tlbiwgeHNyZkhlYWRlck5hbWUsIHhzcmZDb29raWVOYW1lLCBoZWFkZXJzLCBhdXRoIH0gPSBuZXdDb25maWc7XG5cbiAgbmV3Q29uZmlnLmhlYWRlcnMgPSBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oaGVhZGVycyk7XG5cbiAgbmV3Q29uZmlnLnVybCA9IGJ1aWxkVVJMKGJ1aWxkRnVsbFBhdGgobmV3Q29uZmlnLmJhc2VVUkwsIG5ld0NvbmZpZy51cmwsIG5ld0NvbmZpZy5hbGxvd0Fic29sdXRlVXJscyksIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcblxuICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gIGlmIChhdXRoKSB7XG4gICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArXG4gICAgICBidG9hKChhdXRoLnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChhdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgucGFzc3dvcmQpKSA6ICcnKSlcbiAgICApO1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52IHx8IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudikge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSh1bmRlZmluZWQpOyAvLyBicm93c2VyIGhhbmRsZXMgaXRcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzRnVuY3Rpb24oZGF0YS5nZXRIZWFkZXJzKSkge1xuICAgICAgLy8gTm9kZS5qcyBGb3JtRGF0YSAobGlrZSBmb3JtLWRhdGEgcGFja2FnZSlcbiAgICAgIGNvbnN0IGZvcm1IZWFkZXJzID0gZGF0YS5nZXRIZWFkZXJzKCk7XG4gICAgICAvLyBPbmx5IHNldCBzYWZlIGhlYWRlcnMgdG8gYXZvaWQgb3ZlcndyaXRpbmcgc2VjdXJpdHkgaGVhZGVyc1xuICAgICAgY29uc3QgYWxsb3dlZEhlYWRlcnMgPSBbJ2NvbnRlbnQtdHlwZScsICdjb250ZW50LWxlbmd0aCddO1xuICAgICAgT2JqZWN0LmVudHJpZXMoZm9ybUhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGFsbG93ZWRIZWFkZXJzLmluY2x1ZGVzKGtleS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgIGhlYWRlcnMuc2V0KGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9ICBcblxuICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG5cbiAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudikge1xuICAgIHdpdGhYU1JGVG9rZW4gJiYgdXRpbHMuaXNGdW5jdGlvbih3aXRoWFNSRlRva2VuKSAmJiAod2l0aFhTUkZUb2tlbiA9IHdpdGhYU1JGVG9rZW4obmV3Q29uZmlnKSk7XG5cbiAgICBpZiAod2l0aFhTUkZUb2tlbiB8fCAod2l0aFhTUkZUb2tlbiAhPT0gZmFsc2UgJiYgaXNVUkxTYW1lT3JpZ2luKG5ld0NvbmZpZy51cmwpKSkge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICBjb25zdCB4c3JmVmFsdWUgPSB4c3JmSGVhZGVyTmFtZSAmJiB4c3JmQ29va2llTmFtZSAmJiBjb29raWVzLnJlYWQoeHNyZkNvb2tpZU5hbWUpO1xuXG4gICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KHhzcmZIZWFkZXJOYW1lLCB4c3JmVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdDb25maWc7XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGF0YSBtYXhSYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3NhbXBsZXNDb3VudD0gMTBdXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbj0gMTAwMF1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3BlZWRvbWV0ZXIoc2FtcGxlc0NvdW50LCBtaW4pIHtcbiAgc2FtcGxlc0NvdW50ID0gc2FtcGxlc0NvdW50IHx8IDEwO1xuICBjb25zdCBieXRlcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBjb25zdCB0aW1lc3RhbXBzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGxldCBoZWFkID0gMDtcbiAgbGV0IHRhaWwgPSAwO1xuICBsZXQgZmlyc3RTYW1wbGVUUztcblxuICBtaW4gPSBtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IDEwMDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1c2goY2h1bmtMZW5ndGgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gdGltZXN0YW1wc1t0YWlsXTtcblxuICAgIGlmICghZmlyc3RTYW1wbGVUUykge1xuICAgICAgZmlyc3RTYW1wbGVUUyA9IG5vdztcbiAgICB9XG5cbiAgICBieXRlc1toZWFkXSA9IGNodW5rTGVuZ3RoO1xuICAgIHRpbWVzdGFtcHNbaGVhZF0gPSBub3c7XG5cbiAgICBsZXQgaSA9IHRhaWw7XG4gICAgbGV0IGJ5dGVzQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgIT09IGhlYWQpIHtcbiAgICAgIGJ5dGVzQ291bnQgKz0gYnl0ZXNbaSsrXTtcbiAgICAgIGkgPSBpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGhlYWQgPSAoaGVhZCArIDEpICUgc2FtcGxlc0NvdW50O1xuXG4gICAgaWYgKGhlYWQgPT09IHRhaWwpIHtcbiAgICAgIHRhaWwgPSAodGFpbCArIDEpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChub3cgLSBmaXJzdFNhbXBsZVRTIDwgbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc2VkID0gc3RhcnRlZEF0ICYmIG5vdyAtIHN0YXJ0ZWRBdDtcblxuICAgIHJldHVybiBwYXNzZWQgPyBNYXRoLnJvdW5kKGJ5dGVzQ291bnQgKiAxMDAwIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3BlZWRvbWV0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuIiwiLyoqXG4gKiBUaHJvdHRsZSBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gZnJlcVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCBmcmVxKSB7XG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBsZXQgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCBsYXN0QXJncztcbiAgbGV0IHRpbWVyO1xuXG4gIGNvbnN0IGludm9rZSA9IChhcmdzLCBub3cgPSBEYXRlLm5vdygpKSA9PiB7XG4gICAgdGltZXN0YW1wID0gbm93O1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZuKC4uLmFyZ3MpO1xuICB9XG5cbiAgY29uc3QgdGhyb3R0bGVkID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBhc3NlZCA9IG5vdyAtIHRpbWVzdGFtcDtcbiAgICBpZiAoIHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncylcbiAgICAgICAgfSwgdGhyZXNob2xkIC0gcGFzc2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBmbHVzaCA9ICgpID0+IGxhc3RBcmdzICYmIGludm9rZShsYXN0QXJncyk7XG5cbiAgcmV0dXJuIFt0aHJvdHRsZWQsIGZsdXNoXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGhyb3R0bGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuLy8gdGVtcG9yYXJ5IGhvdGZpeCB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzIHVudGlsIEF4aW9zVVJMU2VhcmNoUGFyYW1zIGlzIHJlZmFjdG9yZWRcbmltcG9ydCBQbGF0Zm9ybUZvcm1EYXRhIGZyb20gJy4uL3BsYXRmb3JtL25vZGUvY2xhc3Nlcy9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdGhpbmcgaXMgYSBhcnJheSBvciBqcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRoaW5nIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSB2aXNpdGVkLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1Zpc2l0YWJsZSh0aGluZykge1xuICByZXR1cm4gdXRpbHMuaXNQbGFpbk9iamVjdCh0aGluZykgfHwgdXRpbHMuaXNBcnJheSh0aGluZyk7XG59XG5cbi8qKlxuICogSXQgcmVtb3ZlcyB0aGUgYnJhY2tldHMgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IHdpdGhvdXQgdGhlIGJyYWNrZXRzLlxuICovXG5mdW5jdGlvbiByZW1vdmVCcmFja2V0cyhrZXkpIHtcbiAgcmV0dXJuIHV0aWxzLmVuZHNXaXRoKGtleSwgJ1tdJykgPyBrZXkuc2xpY2UoMCwgLTIpIDoga2V5O1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGF0aCwgYSBrZXksIGFuZCBhIGJvb2xlYW4sIGFuZCByZXR1cm5zIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgY3VycmVudCBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgb3Zlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkb3RzIC0gSWYgdHJ1ZSwgdGhlIGtleSB3aWxsIGJlIHJlbmRlcmVkIHdpdGggZG90cyBpbnN0ZWFkIG9mIGJyYWNrZXRzLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cykge1xuICBpZiAoIXBhdGgpIHJldHVybiBrZXk7XG4gIHJldHVybiBwYXRoLmNvbmNhdChrZXkpLm1hcChmdW5jdGlvbiBlYWNoKHRva2VuLCBpKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgdG9rZW4gPSByZW1vdmVCcmFja2V0cyh0b2tlbik7XG4gICAgcmV0dXJuICFkb3RzICYmIGkgPyAnWycgKyB0b2tlbiArICddJyA6IHRva2VuO1xuICB9KS5qb2luKGRvdHMgPyAnLicgOiAnJyk7XG59XG5cbi8qKlxuICogSWYgdGhlIGFycmF5IGlzIGFuIGFycmF5IGFuZCBub25lIG9mIGl0cyBlbGVtZW50cyBhcmUgdmlzaXRhYmxlLCB0aGVuIGl0J3MgYSBmbGF0IGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRmxhdEFycmF5KGFycikge1xuICByZXR1cm4gdXRpbHMuaXNBcnJheShhcnIpICYmICFhcnIuc29tZShpc1Zpc2l0YWJsZSk7XG59XG5cbmNvbnN0IHByZWRpY2F0ZXMgPSB1dGlscy50b0ZsYXRPYmplY3QodXRpbHMsIHt9LCBudWxsLCBmdW5jdGlvbiBmaWx0ZXIocHJvcCkge1xuICByZXR1cm4gL15pc1tBLVpdLy50ZXN0KHByb3ApO1xufSk7XG5cbi8qKlxuICogQ29udmVydCBhIGRhdGEgb2JqZWN0IHRvIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHs/T2JqZWN0fSBbZm9ybURhdGFdXG4gKiBAcGFyYW0gez9PYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMudmlzaXRvcl1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWV0YVRva2VucyA9IHRydWVdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRvdHMgPSBmYWxzZV1cbiAqIEBwYXJhbSB7P0Jvb2xlYW59IFtvcHRpb25zLmluZGV4ZXMgPSBmYWxzZV1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICoqL1xuXG4vKipcbiAqIEl0IGNvbnZlcnRzIGFuIG9iamVjdCBpbnRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gZm9ybSBkYXRhLlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIC0gVGhlIEZvcm1EYXRhIG9iamVjdCB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiB0b0Zvcm1EYXRhKG9iaiwgZm9ybURhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZm9ybURhdGEgPSBmb3JtRGF0YSB8fCBuZXcgKFBsYXRmb3JtRm9ybURhdGEgfHwgRm9ybURhdGEpKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIG9wdGlvbnMgPSB1dGlscy50b0ZsYXRPYmplY3Qob3B0aW9ucywge1xuICAgIG1ldGFUb2tlbnM6IHRydWUsXG4gICAgZG90czogZmFsc2UsXG4gICAgaW5kZXhlczogZmFsc2VcbiAgfSwgZmFsc2UsIGZ1bmN0aW9uIGRlZmluZWQob3B0aW9uLCBzb3VyY2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHNvdXJjZVtvcHRpb25dKTtcbiAgfSk7XG5cbiAgY29uc3QgbWV0YVRva2VucyA9IG9wdGlvbnMubWV0YVRva2VucztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGNvbnN0IHZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3IgfHwgZGVmYXVsdFZpc2l0b3I7XG4gIGNvbnN0IGRvdHMgPSBvcHRpb25zLmRvdHM7XG4gIGNvbnN0IGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXM7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucy5CbG9iIHx8IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBCbG9iO1xuICBjb25zdCB1c2VCbG9iID0gX0Jsb2IgJiYgdXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShmb3JtRGF0YSk7XG5cbiAgaWYgKCF1dGlscy5pc0Z1bmN0aW9uKHZpc2l0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzLmlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0Jvb2xlYW4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZUJsb2IgJiYgdXRpbHMuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIodmFsdWUpIHx8IHV0aWxzLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1c2VCbG9iICYmIHR5cGVvZiBCbG9iID09PSAnZnVuY3Rpb24nID8gbmV3IEJsb2IoW3ZhbHVlXSkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmlzaXRvci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGtleVxuICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gICAqIEB0aGlzIHtGb3JtRGF0YX1cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBlYWNoIHByb3Agb2YgdGhlIHZhbHVlIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBmdW5jdGlvbiBkZWZhdWx0VmlzaXRvcih2YWx1ZSwga2V5LCBwYXRoKSB7XG4gICAgbGV0IGFyciA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmICFwYXRoICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh1dGlscy5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzLmlzQXJyYXkodmFsdWUpICYmIGlzRmxhdEFycmF5KHZhbHVlKSkgfHxcbiAgICAgICAgKCh1dGlscy5pc0ZpbGVMaXN0KHZhbHVlKSB8fCB1dGlscy5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMudG9BcnJheSh2YWx1ZSkpXG4gICAgICAgICkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IHJlbW92ZUJyYWNrZXRzKGtleSk7XG5cbiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gZWFjaChlbCwgaW5kZXgpIHtcbiAgICAgICAgICAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5XG4gICAgICAgICAgICBpbmRleGVzID09PSB0cnVlID8gcmVuZGVyS2V5KFtrZXldLCBpbmRleCwgZG90cykgOiAoaW5kZXhlcyA9PT0gbnVsbCA/IGtleSA6IGtleSArICdbXScpLFxuICAgICAgICAgICAgY29udmVydFZhbHVlKGVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmlzaXRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpLCBjb252ZXJ0VmFsdWUodmFsdWUpKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrID0gW107XG5cbiAgY29uc3QgZXhwb3NlZEhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHByZWRpY2F0ZXMsIHtcbiAgICBkZWZhdWx0VmlzaXRvcixcbiAgICBjb252ZXJ0VmFsdWUsXG4gICAgaXNWaXNpdGFibGVcbiAgfSk7XG5cbiAgZnVuY3Rpb24gYnVpbGQodmFsdWUsIHBhdGgpIHtcbiAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICcgKyBwYXRoLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cbiAgICB1dGlscy5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiBlYWNoKGVsLCBrZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9ICEodXRpbHMuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiB2aXNpdG9yLmNhbGwoXG4gICAgICAgIGZvcm1EYXRhLCBlbCwgdXRpbHMuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGJ1aWxkKGVsLCBwYXRoID8gcGF0aC5jb25jYXQoa2V5KSA6IFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGF0YSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgYnVpbGQob2JqKTtcblxuICByZXR1cm4gZm9ybURhdGE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvRm9ybURhdGE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b0Zvcm1EYXRhKGRhdGEsIG5ldyBwbGF0Zm9ybS5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcygpLCB7XG4gICAgdmlzaXRvcjogZnVuY3Rpb24odmFsdWUsIGtleSwgcGF0aCwgaGVscGVycykge1xuICAgICAgaWYgKHBsYXRmb3JtLmlzTm9kZSAmJiB1dGlscy5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xufVxuIiwiXG5leHBvcnQgY29uc3Qgc3RyZWFtQ2h1bmsgPSBmdW5jdGlvbiogKGNodW5rLCBjaHVua1NpemUpIHtcbiAgbGV0IGxlbiA9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgaWYgKCFjaHVua1NpemUgfHwgbGVuIDwgY2h1bmtTaXplKSB7XG4gICAgeWllbGQgY2h1bms7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHBvcyA9IDA7XG4gIGxldCBlbmQ7XG5cbiAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgIGVuZCA9IHBvcyArIGNodW5rU2l6ZTtcbiAgICB5aWVsZCBjaHVuay5zbGljZShwb3MsIGVuZCk7XG4gICAgcG9zID0gZW5kO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZWFkQnl0ZXMgPSBhc3luYyBmdW5jdGlvbiogKGl0ZXJhYmxlLCBjaHVua1NpemUpIHtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiByZWFkU3RyZWFtKGl0ZXJhYmxlKSkge1xuICAgIHlpZWxkKiBzdHJlYW1DaHVuayhjaHVuaywgY2h1bmtTaXplKTtcbiAgfVxufVxuXG5jb25zdCByZWFkU3RyZWFtID0gYXN5bmMgZnVuY3Rpb24qIChzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHtcbiAgICB5aWVsZCogc3RyZWFtO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgdHJ5IHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCB7ZG9uZSwgdmFsdWV9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgeWllbGQgdmFsdWU7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHJhY2tTdHJlYW0gPSAoc3RyZWFtLCBjaHVua1NpemUsIG9uUHJvZ3Jlc3MsIG9uRmluaXNoKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gcmVhZEJ5dGVzKHN0cmVhbSwgY2h1bmtTaXplKTtcblxuICBsZXQgYnl0ZXMgPSAwO1xuICBsZXQgZG9uZTtcbiAgbGV0IF9vbkZpbmlzaCA9IChlKSA9PiB7XG4gICAgaWYgKCFkb25lKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4uL2Vudi9kYXRhLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnNbdHlwZV0gPSBmdW5jdGlvbiB2YWxpZGF0b3IodGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSB0eXBlIHx8ICdhJyArIChpIDwgMSA/ICduICcgOiAnICcpICsgdHlwZTtcbiAgfTtcbn0pO1xuXG5jb25zdCBkZXByZWNhdGVkV2FybmluZ3MgPSB7fTtcblxuLyoqXG4gKiBUcmFuc2l0aW9uYWwgb3B0aW9uIHZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb258Ym9vbGVhbj99IHZhbGlkYXRvciAtIHNldCB0byBmYWxzZSBpZiB0aGUgdHJhbnNpdGlvbmFsIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkXG4gKiBAcGFyYW0ge3N0cmluZz99IHZlcnNpb24gLSBkZXByZWNhdGVkIHZlcnNpb24gLyByZW1vdmVkIHNpbmNlIHZlcnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nP30gbWVzc2FnZSAtIHNvbWUgbWVzc2FnZSB3aXRoIGFkZGl0aW9uYWwgaW5mb1xuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAqL1xudmFsaWRhdG9ycy50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuICdbQXhpb3MgdicgKyBWRVJTSU9OICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiAodmFsdWUsIG9wdCwgb3B0cykgPT4ge1xuICAgIGlmICh2YWxpZGF0b3IgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShvcHQsICcgaGFzIGJlZW4gcmVtb3ZlZCcgKyAodmVyc2lvbiA/ICcgaW4gJyArIHZlcnNpb24gOiAnJykpLFxuICAgICAgICBBeGlvc0Vycm9yLkVSUl9ERVBSRUNBVEVEXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG52YWxpZGF0b3JzLnNwZWxsaW5nID0gZnVuY3Rpb24gc3BlbGxpbmcoY29ycmVjdFNwZWxsaW5nKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGAke29wdH0gaXMgbGlrZWx5IGEgbWlzc3BlbGxpbmcgb2YgJHtjb3JyZWN0U3BlbGxpbmd9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzXG59O1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiBudWxsXG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBGb3JtRGF0YSA6IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzJztcbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnID8gVVJMU2VhcmNoUGFyYW1zIDogQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCJpbXBvcnQgVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4vY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanMnXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnLi9jbGFzc2VzL0Zvcm1EYXRhLmpzJ1xuaW1wb3J0IEJsb2IgZnJvbSAnLi9jbGFzc2VzL0Jsb2IuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zLFxuICAgIEZvcm1EYXRhLFxuICAgIEJsb2JcbiAgfSxcbiAgcHJvdG9jb2xzOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdibG9iJywgJ3VybCcsICdkYXRhJ11cbn07XG4iLCJjb25zdCBoYXNCcm93c2VyRW52ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuY29uc3QgX25hdmlnYXRvciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICdvYmplY3QnICYmIG5hdmlnYXRvciB8fCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50XG4gKlxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cbiAqIEJvdGggZW52aXJvbm1lbnRzIHN1cHBvcnQgWE1MSHR0cFJlcXVlc3QsIGJ1dCBub3QgZnVsbHkgc3RhbmRhcmQgZ2xvYmFscy5cbiAqXG4gKiB3ZWIgd29ya2VyczpcbiAqICB0eXBlb2Ygd2luZG93IC0+IHVuZGVmaW5lZFxuICogIHR5cGVvZiBkb2N1bWVudCAtPiB1bmRlZmluZWRcbiAqXG4gKiByZWFjdC1uYXRpdmU6XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ1JlYWN0TmF0aXZlJ1xuICogbmF0aXZlc2NyaXB0XG4gKiAgbmF2aWdhdG9yLnByb2R1Y3QgLT4gJ05hdGl2ZVNjcmlwdCcgb3IgJ05TJ1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJFbnYgPSBoYXNCcm93c2VyRW52ICYmXG4gICghX25hdmlnYXRvciB8fCBbJ1JlYWN0TmF0aXZlJywgJ05hdGl2ZVNjcmlwdCcsICdOUyddLmluZGV4T2YoX25hdmlnYXRvci5wcm9kdWN0KSA8IDApO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciB3ZWJXb3JrZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBBbHRob3VnaCB0aGUgYGlzU3RhbmRhcmRCcm93c2VyRW52YCBtZXRob2QgaW5kaWNhdGVzIHRoYXRcbiAqIGBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlcmAsIHRoZSBXZWJXb3JrZXIgd2lsbCBzdGlsbCBiZVxuICogZmlsdGVyZWQgb3V0IGR1ZSB0byBpdHMganVkZ21lbnQgc3RhbmRhcmRcbiAqIGB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnYC5cbiAqIFRoaXMgbGVhZHMgdG8gYSBwcm9ibGVtIHdoZW4gYXhpb3MgcG9zdCBgRm9ybURhdGFgIGluIHdlYldvcmtlclxuICovXG5jb25zdCBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYgPSAoKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiZcbiAgICB0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzID09PSAnZnVuY3Rpb24nXG4gICk7XG59KSgpO1xuXG5jb25zdCBvcmlnaW4gPSBoYXNCcm93c2VyRW52ICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmIHx8ICdodHRwOi8vbG9jYWxob3N0JztcblxuZXhwb3J0IHtcbiAgaGFzQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIF9uYXZpZ2F0b3IgYXMgbmF2aWdhdG9yLFxuICBvcmlnaW5cbn1cbiIsImltcG9ydCBwbGF0Zm9ybSBmcm9tICcuL25vZGUvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9jb21tb24vdXRpbHMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgYmluZCBmcm9tICcuL2hlbHBlcnMvYmluZC5qcyc7XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHt0b1N0cmluZ30gPSBPYmplY3QucHJvdG90eXBlO1xuY29uc3Qge2dldFByb3RvdHlwZU9mfSA9IE9iamVjdDtcbmNvbnN0IHtpdGVyYXRvciwgdG9TdHJpbmdUYWd9ID0gU3ltYm9sO1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufVxuXG5jb25zdCB0eXBlT2ZUZXN0ID0gdHlwZSA9PiB0aGluZyA9PiB0eXBlb2YgdGhpbmcgPT09IHR5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCB7aXNBcnJheX0gPSBBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VuZGVmaW5lZCA9IHR5cGVPZlRlc3QoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIGlzRnVuY3Rpb24odmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIGxldCByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKGlzQXJyYXlCdWZmZXIodmFsLmJ1ZmZlcikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJpbmcgPSB0eXBlT2ZUZXN0KCdzdHJpbmcnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Z1bmN0aW9uID0gdHlwZU9mVGVzdCgnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc051bWJlciA9IHR5cGVPZlRlc3QoJ251bWJlcicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJvb2xlYW4sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jvb2xlYW4gPSB0aGluZyA9PiB0aGluZyA9PT0gdHJ1ZSB8fCB0aGluZyA9PT0gZmFsc2U7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWwpID0+IHtcbiAgaWYgKGtpbmRPZih2YWwpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgISh0b1N0cmluZ1RhZyBpbiB2YWwpICYmICEoaXRlcmF0b3IgaW4gdmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBlbXB0eSBvYmplY3QgKHNhZmVseSBoYW5kbGVzIEJ1ZmZlcnMpXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBlbXB0eSBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0VtcHR5T2JqZWN0ID0gKHZhbCkgPT4ge1xuICAvLyBFYXJseSByZXR1cm4gZm9yIG5vbi1vYmplY3RzIG9yIEJ1ZmZlcnMgdG8gcHJldmVudCBSYW5nZUVycm9yXG4gIGlmICghaXNPYmplY3QodmFsKSB8fCBpc0J1ZmZlcih2YWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFsKS5sZW5ndGggPT09IDAgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBGYWxsYmFjayBmb3IgYW55IG90aGVyIG9iamVjdHMgdGhhdCBtaWdodCBjYXVzZSBSYW5nZUVycm9yIHdpdGggT2JqZWN0LmtleXMoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbmNvbnN0IFtpc1JlYWRhYmxlU3RyZWFtLCBpc1JlcXVlc3QsIGlzUmVzcG9uc2UsIGlzSGVhZGVyc10gPSBbJ1JlYWRhYmxlU3RyZWFtJywgJ1JlcXVlc3QnLCAnUmVzcG9uc2UnLCAnSGVhZGVycyddLm1hcChraW5kT2ZUZXN0KTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuY29uc3QgdHJpbSA9IChzdHIpID0+IHN0ci50cmltID9cbiAgc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywgJycpO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7YWxsT3duS2V5cyA9IGZhbHNlfSA9IHt9KSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGk7XG4gIGxldCBsO1xuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yIChpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBCdWZmZXIgY2hlY2tcbiAgICBpZiAoaXNCdWZmZXIob2JqKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGNvbnN0IGtleXMgPSBhbGxPd25LZXlzID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKSA6IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGtleTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmosIGtleSkge1xuICBpZiAoaXNCdWZmZXIob2JqKSl7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIGxldCBfa2V5O1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIF9rZXkgPSBrZXlzW2ldO1xuICAgIGlmIChrZXkgPT09IF9rZXkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIF9rZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBfZ2xvYmFsID0gKCgpID0+IHtcbiAgLyplc2xpbnQgbm8tdW5kZWY6MCovXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbFRoaXM7XG4gIHJldHVybiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpXG59KSgpO1xuXG5jb25zdCBpc0NvbnRleHREZWZpbmVkID0gKGNvbnRleHQpID0+ICFpc1VuZGVmaW5lZChjb250ZXh0KSAmJiBjb250ZXh0ICE9PSBfZ2xvYmFsO1xuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIGNvbnN0IHtjYXNlbGVzcywgc2tpcFVuZGVmaW5lZH0gPSBpc0NvbnRleHREZWZpbmVkKHRoaXMpICYmIHRoaXMgfHwge307XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBhc3NpZ25WYWx1ZSA9ICh2YWwsIGtleSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldEtleSA9IGNhc2VsZXNzICYmIGZpbmRLZXkocmVzdWx0LCBrZXkpIHx8IGtleTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZXN1bHRbdGFyZ2V0S2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKHJlc3VsdFt0YXJnZXRLZXldLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IHZhbC5zbGljZSgpO1xuICAgIH0gZWxzZSBpZiAoIXNraXBVbmRlZmluZWQgfHwgIWlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGFyZ3VtZW50c1tpXSAmJiBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywge2FsbE93bktleXN9PSB7fSkgPT4ge1xuICBmb3JFYWNoKGIsICh2YWwsIGtleSkgPT4ge1xuICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9LCB7YWxsT3duS2V5c30pO1xuICByZXR1cm4gYTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCB3aXRoIEJPTVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgdmFsdWUgd2l0aG91dCBCT01cbiAqL1xuY29uc3Qgc3RyaXBCT00gPSAoY29udGVudCkgPT4ge1xuICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgd2l0aCB0aGUgY2hhcmFjdGVycyBvZiBhIHNwZWNpZmllZCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VhcmNoU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uPSAwXVxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBlbmRzV2l0aCA9IChzdHIsIHNlYXJjaFN0cmluZywgcG9zaXRpb24pID0+IHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uID4gc3RyLmxlbmd0aCkge1xuICAgIHBvc2l0aW9uID0gc3RyLmxlbmd0aDtcbiAgfVxuICBwb3NpdGlvbiAtPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICBjb25zdCBsYXN0SW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKTtcbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gLTEgJiYgbGFzdEluZGV4ID09PSBwb3NpdGlvbjtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLyoqXG4gKiBDaGVja2luZyBpZiB0aGUgVWludDhBcnJheSBleGlzdHMgYW5kIGlmIGl0IGRvZXMsIGl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGVcbiAqIHRoaW5nIHBhc3NlZCBpbiBpcyBhbiBpbnN0YW5jZSBvZiBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIHtUeXBlZEFycmF5fVxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbmNvbnN0IGlzVHlwZWRBcnJheSA9IChUeXBlZEFycmF5ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIHRoaW5nID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbaXRlcmF0b3JdO1xuXG4gIGNvbnN0IF9pdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IF9pdGVyYXRvci5uZXh0KCkpICYmICFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IHBhaXIgPSByZXN1bHQudmFsdWU7XG4gICAgZm4uY2FsbChvYmosIHBhaXJbMF0sIHBhaXJbMV0pO1xuICB9XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGEgc3RyaW5nLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1hdGNoZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxib29sZWFuPn1cbiAqL1xuY29uc3QgbWF0Y2hBbGwgPSAocmVnRXhwLCBzdHIpID0+IHtcbiAgbGV0IG1hdGNoZXM7XG4gIGNvbnN0IGFyciA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2hlcyA9IHJlZ0V4cC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2gobWF0Y2hlcyk7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG4vKiBDaGVja2luZyBpZiB0aGUga2luZE9mVGVzdCBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBwYXNzZWQgYW4gSFRNTEZvcm1FbGVtZW50LiAqL1xuY29uc3QgaXNIVE1MRm9ybSA9IGtpbmRPZlRlc3QoJ0hUTUxGb3JtRWxlbWVudCcpO1xuXG5jb25zdCB0b0NhbWVsQ2FzZSA9IHN0ciA9PiB7XG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9cXHNdKFthLXpcXGRdKShcXHcqKS9nLFxuICAgIGZ1bmN0aW9uIHJlcGxhY2VyKG0sIHAxLCBwMikge1xuICAgICAgcmV0dXJuIHAxLnRvVXBwZXJDYXNlKCkgKyBwMjtcbiAgICB9XG4gICk7XG59O1xuXG4vKiBDcmVhdGluZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjaGVjayBpZiBhbiBvYmplY3QgaGFzIGEgcHJvcGVydHkuICovXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9ICgoe2hhc093blByb3BlcnR5fSkgPT4gKG9iaiwgcHJvcCkgPT4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKShPYmplY3QucHJvdG90eXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUmVnRXhwID0ga2luZE9mVGVzdCgnUmVnRXhwJyk7XG5cbmNvbnN0IHJlZHVjZURlc2NyaXB0b3JzID0gKG9iaiwgcmVkdWNlcikgPT4ge1xuICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iaik7XG4gIGNvbnN0IHJlZHVjZWREZXNjcmlwdG9ycyA9IHt9O1xuXG4gIGZvckVhY2goZGVzY3JpcHRvcnMsIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgbGV0IHJldDtcbiAgICBpZiAoKHJldCA9IHJlZHVjZXIoZGVzY3JpcHRvciwgbmFtZSwgb2JqKSkgIT09IGZhbHNlKSB7XG4gICAgICByZWR1Y2VkRGVzY3JpcHRvcnNbbmFtZV0gPSByZXQgfHwgZGVzY3JpcHRvcjtcbiAgICB9XG4gIH0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwgcmVkdWNlZERlc2NyaXB0b3JzKTtcbn1cblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSAmJiBbJ2FyZ3VtZW50cycsICdjYWxsZXInLCAnY2FsbGVlJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXFwnJyArIG5hbWUgKyAnXFwnJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHRvT2JqZWN0U2V0ID0gKGFycmF5T3JTdHJpbmcsIGRlbGltaXRlcikgPT4ge1xuICBjb25zdCBvYmogPSB7fTtcblxuICBjb25zdCBkZWZpbmUgPSAoYXJyKSA9PiB7XG4gICAgYXJyLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgb2JqW3ZhbHVlXSA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBpc0FycmF5KGFycmF5T3JTdHJpbmcpID8gZGVmaW5lKGFycmF5T3JTdHJpbmcpIDogZGVmaW5lKFN0cmluZyhhcnJheU9yU3RyaW5nKS5zcGxpdChkZWxpbWl0ZXIpKTtcblxuICByZXR1cm4gb2JqO1xufVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuY29uc3QgdG9GaW5pdGVOdW1iZXIgPSAodmFsdWUsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUgPSArdmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59XG5cblxuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW3RvU3RyaW5nVGFnXSA9PT0gJ0Zvcm1EYXRhJyAmJiB0aGluZ1tpdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvL0J1ZmZlciBjaGVja1xuICAgICAgaWYgKGlzQnVmZmVyKHNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgaWYoISgndG9KU09OJyBpbiBzb3VyY2UpKSB7XG4gICAgICAgIHN0YWNrW2ldID0gc291cmNlO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpc0FycmF5KHNvdXJjZSkgPyBbXSA6IHt9O1xuXG4gICAgICAgIGZvckVhY2goc291cmNlLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlZHVjZWRWYWx1ZSA9IHZpc2l0KHZhbHVlLCBpICsgMSk7XG4gICAgICAgICAgIWlzVW5kZWZpbmVkKHJlZHVjZWRWYWx1ZSkgJiYgKHRhcmdldFtrZXldID0gcmVkdWNlZFZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhY2tbaV0gPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgcmV0dXJuIHZpc2l0KG9iaiwgMCk7XG59XG5cbmNvbnN0IGlzQXN5bmNGbiA9IGtpbmRPZlRlc3QoJ0FzeW5jRnVuY3Rpb24nKTtcblxuY29uc3QgaXNUaGVuYWJsZSA9ICh0aGluZykgPT5cbiAgdGhpbmcgJiYgKGlzT2JqZWN0KHRoaW5nKSB8fCBpc0Z1bmN0aW9uKHRoaW5nKSkgJiYgaXNGdW5jdGlvbih0aGluZy50aGVuKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLmNhdGNoKTtcblxuLy8gb3JpZ2luYWwgY29kZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RpZ2l0YWxCcmFpbkpTL0F4aW9zUHJvbWlzZS9ibG9iLzE2ZGVhYjEzNzEwZWMwOTc3OTkyMjEzMWYzZmE1OTU0MzIwZjgzYWIvbGliL3V0aWxzLmpzI0wxMS1MMzRcblxuY29uc3QgX3NldEltbWVkaWF0ZSA9ICgoc2V0SW1tZWRpYXRlU3VwcG9ydGVkLCBwb3N0TWVzc2FnZVN1cHBvcnRlZCkgPT4ge1xuICBpZiAoc2V0SW1tZWRpYXRlU3VwcG9ydGVkKSB7XG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbiAgfVxuXG4gIHJldHVybiBwb3N0TWVzc2FnZVN1cHBvcnRlZCA/ICgodG9rZW4sIGNhbGxiYWNrcykgPT4ge1xuICAgIF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHtzb3VyY2UsIGRhdGF9KSA9PiB7XG4gICAgICBpZiAoc291cmNlID09PSBfZ2xvYmFsICYmIGRhdGEgPT09IHRva2VuKSB7XG4gICAgICAgIGNhbGxiYWNrcy5sZW5ndGggJiYgY2FsbGJhY2tzLnNoaWZ0KCkoKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICByZXR1cm4gKGNiKSA9PiB7XG4gICAgICBjYWxsYmFja3MucHVzaChjYik7XG4gICAgICBfZ2xvYmFsLnBvc3RNZXNzYWdlKHRva2VuLCBcIipcIik7XG4gICAgfVxuICB9KShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsIFtdKSA6IChjYikgPT4gc2V0VGltZW91dChjYik7XG59KShcbiAgdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyxcbiAgaXNGdW5jdGlvbihfZ2xvYmFsLnBvc3RNZXNzYWdlKVxuKTtcblxuY29uc3QgYXNhcCA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayAhPT0gJ3VuZGVmaW5lZCcgP1xuICBxdWV1ZU1pY3JvdGFzay5iaW5kKF9nbG9iYWwpIDogKCB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5uZXh0VGljayB8fCBfc2V0SW1tZWRpYXRlKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqXG5cblxuY29uc3QgaXNJdGVyYWJsZSA9ICh0aGluZykgPT4gdGhpbmcgIT0gbnVsbCAmJiBpc0Z1bmN0aW9uKHRoaW5nW2l0ZXJhdG9yXSk7XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNCb29sZWFuLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNFbXB0eU9iamVjdCxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZXF1ZXN0LFxuICBpc1Jlc3BvbnNlLFxuICBpc0hlYWRlcnMsXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RhdGUsXG4gIGlzRmlsZSxcbiAgaXNCbG9iLFxuICBpc1JlZ0V4cCxcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1R5cGVkQXJyYXksXG4gIGlzRmlsZUxpc3QsXG4gIGZvckVhY2gsXG4gIG1lcmdlLFxuICBleHRlbmQsXG4gIHRyaW0sXG4gIHN0cmlwQk9NLFxuICBpbmhlcml0cyxcbiAgdG9GbGF0T2JqZWN0LFxuICBraW5kT2YsXG4gIGtpbmRPZlRlc3QsXG4gIGVuZHNXaXRoLFxuICB0b0FycmF5LFxuICBmb3JFYWNoRW50cnksXG4gIG1hdGNoQWxsLFxuICBpc0hUTUxGb3JtLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaGFzT3duUHJvcDogaGFzT3duUHJvcGVydHksIC8vIGFuIGFsaWFzIHRvIGF2b2lkIEVTTGludCBuby1wcm90b3R5cGUtYnVpbHRpbnMgZGV0ZWN0aW9uXG4gIHJlZHVjZURlc2NyaXB0b3JzLFxuICBmcmVlemVNZXRob2RzLFxuICB0b09iamVjdFNldCxcbiAgdG9DYW1lbENhc2UsXG4gIG5vb3AsXG4gIHRvRmluaXRlTnVtYmVyLFxuICBmaW5kS2V5LFxuICBnbG9iYWw6IF9nbG9iYWwsXG4gIGlzQ29udGV4dERlZmluZWQsXG4gIGlzU3BlY0NvbXBsaWFudEZvcm0sXG4gIHRvSlNPTk9iamVjdCxcbiAgaXNBc3luY0ZuLFxuICBpc1RoZW5hYmxlLFxuICBzZXRJbW1lZGlhdGU6IF9zZXRJbW1lZGlhdGUsXG4gIGFzYXAsXG4gIGlzSXRlcmFibGVcbn07XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeSgpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0cm9vdC5DcnlwdG9KUyA9IGZhY3RvcnkoKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cblx0LypnbG9iYWxzIHdpbmRvdywgZ2xvYmFsLCByZXF1aXJlKi9cblxuXHQvKipcblx0ICogQ3J5cHRvSlMgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0dmFyIENyeXB0b0pTID0gQ3J5cHRvSlMgfHwgKGZ1bmN0aW9uIChNYXRoLCB1bmRlZmluZWQpIHtcblxuXHQgICAgdmFyIGNyeXB0bztcblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIHdpbmRvdyAoQnJvd3Nlcilcblx0ICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gd2luZG93LmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBpbiB3ZWIgd29ya2VyIChCcm93c2VyKVxuXHQgICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHNlbGYuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd29ya2VyXG5cdCAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gZ2xvYmFsVGhpcy5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSAoZXhwZXJpbWVudGFsIElFIDExKSBjcnlwdG8gZnJvbSB3aW5kb3cgKEJyb3dzZXIpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubXNDcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSB3aW5kb3cubXNDcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSBnbG9iYWwgKE5vZGVKUylcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbC5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGltcG9ydCB2aWEgcmVxdWlyZSAoTm9kZUpTKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblx0ICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICB9XG5cblx0ICAgIC8qXG5cdCAgICAgKiBDcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcHNldWRvcmFuZG9tIG51bWJlciBnZW5lcmF0b3Jcblx0ICAgICAqXG5cdCAgICAgKiBBcyBNYXRoLnJhbmRvbSgpIGlzIGNyeXB0b2dyYXBoaWNhbGx5IG5vdCBzYWZlIHRvIHVzZVxuXHQgICAgICovXG5cdCAgICB2YXIgY3J5cHRvU2VjdXJlUmFuZG9tSW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmIChjcnlwdG8pIHtcblx0ICAgICAgICAgICAgLy8gVXNlIGdldFJhbmRvbVZhbHVlcyBtZXRob2QgKEJyb3dzZXIpXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gVXNlIHJhbmRvbUJ5dGVzIG1ldGhvZCAoTm9kZUpTKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0by5yYW5kb21CeXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLnJlYWRJbnQzMkxFKCk7XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdGl2ZSBjcnlwdG8gbW9kdWxlIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGdldCBzZWN1cmUgcmFuZG9tIG51bWJlci4nKTtcblx0ICAgIH07XG5cblx0ICAgIC8qXG5cdCAgICAgKiBMb2NhbCBwb2x5ZmlsbCBvZiBPYmplY3QuY3JlYXRlXG5cblx0ICAgICAqL1xuXHQgICAgdmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmdW5jdGlvbiBGKCkge31cblxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgICAgICAgICAgIHZhciBzdWJ0eXBlO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gb2JqO1xuXG5cdCAgICAgICAgICAgIHN1YnR5cGUgPSBuZXcgRigpO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gbnVsbDtcblxuXHQgICAgICAgICAgICByZXR1cm4gc3VidHlwZTtcblx0ICAgICAgICB9O1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDcnlwdG9KUyBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGlicmFyeSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2xpYiA9IEMubGliID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQmFzZSBvYmplY3QgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZSA9IChmdW5jdGlvbiAoKSB7XG5cblxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdmVycmlkZXMgUHJvcGVydGllcyB0byBjb3B5IGludG8gdGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgZXh0ZW5kOiBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTcGF3blxuXHQgICAgICAgICAgICAgICAgdmFyIHN1YnR5cGUgPSBjcmVhdGUodGhpcyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEF1Z21lbnRcblx0ICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLm1peEluKG92ZXJyaWRlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBkZWZhdWx0IGluaXRpYWxpemVyXG5cdCAgICAgICAgICAgICAgICBpZiAoIXN1YnR5cGUuaGFzT3duUHJvcGVydHkoJ2luaXQnKSB8fCB0aGlzLmluaXQgPT09IHN1YnR5cGUuaW5pdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVyJ3MgcHJvdG90eXBlIGlzIHRoZSBzdWJ0eXBlIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0LnByb3RvdHlwZSA9IHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBzdXBlcnR5cGVcblx0ICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyID0gdGhpcztcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEV4dGVuZHMgdGhpcyBvYmplY3QgYW5kIHJ1bnMgdGhlIGluaXQgbWV0aG9kLlxuXHQgICAgICAgICAgICAgKiBBcmd1bWVudHMgdG8gY3JlYXRlKCkgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgaW5zdGFuY2UgPSBNeVR5cGUuY3JlYXRlKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZXh0ZW5kKCk7XG5cdCAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0LmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAgICAgICAgICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBzb21lIGxvZ2ljIHdoZW4geW91ciBvYmplY3RzIGFyZSBjcmVhdGVkLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgICAgICAvLyAuLi5cblx0ICAgICAgICAgICAgICogICAgICAgICB9XG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ29waWVzIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gbWl4IGluLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgTXlUeXBlLm1peEluKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBmaWVsZDogJ3ZhbHVlJ1xuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBtaXhJbjogZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJRSB3b24ndCBjb3B5IHRvU3RyaW5nIHVzaW5nIHRoZSBsb29wIGFib3ZlXG5cdCAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgndG9TdHJpbmcnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJpbmcgPSBwcm9wZXJ0aWVzLnRvU3RyaW5nO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSBpbnN0YW5jZS5jbG9uZSgpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge0FycmF5fSB3b3JkcyBUaGUgYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICovXG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5ID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ0J5dGVzIChPcHRpb25hbCkgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGUgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSwgNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykge1xuXHQgICAgICAgICAgICB3b3JkcyA9IHRoaXMud29yZHMgPSB3b3JkcyB8fCBbXTtcblxuXHQgICAgICAgICAgICBpZiAoc2lnQnl0ZXMgIT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gd29yZHMubGVuZ3RoICogNDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIHdvcmQgYXJyYXkgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0VuY29kZXJ9IGVuY29kZXIgKE9wdGlvbmFsKSBUaGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBDcnlwdG9KUy5lbmMuSGV4XG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5ICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChlbmNvZGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZW5jb2RlciB8fCBIZXgpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uY2F0ZW5hdGVzIGEgd29yZCBhcnJheSB0byB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5IHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkxLmNvbmNhdCh3b3JkQXJyYXkyKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25jYXQ6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB0aGlzV29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhpc1NpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIHRoYXRTaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICB0aGlzLmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29uY2F0XG5cdCAgICAgICAgICAgIGlmICh0aGlzU2lnQnl0ZXMgJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSBieXRlIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0U2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0Qnl0ZSA9ICh0aGF0V29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaSkgPj4+IDJdIHw9IHRoYXRCeXRlIDw8ICgyNCAtICgodGhpc1NpZ0J5dGVzICsgaSkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgd29yZCBhdCBhIHRpbWVcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhhdFNpZ0J5dGVzOyBqICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGopID4+PiAyXSA9IHRoYXRXb3Jkc1tqID4+PiAyXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzICs9IHRoYXRTaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlbW92ZXMgaW5zaWduaWZpY2FudCBiaXRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkuY2xhbXAoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbGFtcDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcFxuXHQgICAgICAgICAgICB3b3Jkc1tzaWdCeXRlcyA+Pj4gMl0gJj0gMHhmZmZmZmZmZiA8PCAoMzIgLSAoc2lnQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB3b3Jkcy5sZW5ndGggPSBNYXRoLmNlaWwoc2lnQnl0ZXMgLyA0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IHdvcmRBcnJheS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUud29yZHMgPSB0aGlzLndvcmRzLnNsaWNlKDApO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHdvcmQgYXJyYXkgZmlsbGVkIHdpdGggcmFuZG9tIGJ5dGVzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG5CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHJhbmRvbSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oMTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJhbmRvbTogZnVuY3Rpb24gKG5CeXRlcykge1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5CeXRlczsgaSArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKGNyeXB0b1NlY3VyZVJhbmRvbUludCgpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIG5CeXRlcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRW5jb2RlciBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogSGV4IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgSGV4ID0gQ19lbmMuSGV4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBoZXhDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgPj4+IDQpLnRvU3RyaW5nKDE2KSk7XG5cdCAgICAgICAgICAgICAgICBoZXhDaGFycy5wdXNoKChiaXRlICYgMHgwZikudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBoZXhDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgVGhlIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShoZXhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoaGV4U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoZXhTdHJMZW5ndGggPSBoZXhTdHIubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGV4U3RyTGVuZ3RoOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDNdIHw9IHBhcnNlSW50KGhleFN0ci5zdWJzdHIoaSwgMiksIDE2KSA8PCAoMjQgLSAoaSAlIDgpICogNCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBoZXhTdHJMZW5ndGggLyAyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExhdGluMSBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIExhdGluMSA9IENfZW5jLkxhdGluMSA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBsYXRpbjFTdHJpbmcgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xQ2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0ZSA9ICh3b3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICBsYXRpbjFDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYml0ZSkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGxhdGluMUNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIExhdGluMSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGluMVN0ciBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnBhcnNlKGxhdGluMVN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChsYXRpbjFTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGxhdGluMVN0ckxlbmd0aCA9IGxhdGluMVN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXRpbjFTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gKGxhdGluMVN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZikgPDwgKDI0IC0gKGkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbGF0aW4xU3RyTGVuZ3RoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFVURi04IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0ZjggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHV0ZjhTdHJpbmcgPSBDcnlwdG9KUy5lbmMuVXRmOC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKExhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KSkpO1xuXHQgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBVVEYtOCBkYXRhJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBVVEYtOCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjhTdHIgVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh1dGY4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjhTdHIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIExhdGluMS5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodXRmOFN0cikpKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJ1ZmZlcmVkIGJsb2NrIGFsZ29yaXRobSB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBUaGUgcHJvcGVydHkgYmxvY2tTaXplIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBjb25jcmV0ZSBzdWJ0eXBlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfbWluQnVmZmVyU2l6ZSBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBrZXB0IHVucHJvY2Vzc2VkIGluIHRoZSBidWZmZXIuIERlZmF1bHQ6IDBcblx0ICAgICAqL1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGRhdGEgYnVmZmVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5fZGF0YSA9IG5ldyBXb3JkQXJyYXkuaW5pdCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzID0gMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBuZXcgZGF0YSB0byB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGJ1ZmZlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBhcHBlbmQuIFN0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byBhIFdvcmRBcnJheSB1c2luZyBVVEYtOC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9hcHBlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBkYXRhID0gVXRmOC5wYXJzZShkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9kYXRhLmNvbmNhdChkYXRhKTtcblx0ICAgICAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyArPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBQcm9jZXNzZXMgYXZhaWxhYmxlIGRhdGEgYmxvY2tzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBfZG9Qcm9jZXNzQmxvY2sob2Zmc2V0KSwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRvRmx1c2ggV2hldGhlciBhbGwgYmxvY2tzIGFuZCBwYXJ0aWFsIGJsb2NrcyBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcHJvY2Vzc2VkIGRhdGEuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcygpO1xuXHQgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoISEnZmx1c2gnKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcHJvY2VzczogZnVuY3Rpb24gKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgdmFyIHByb2Nlc3NlZFdvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVNpZ0J5dGVzID0gZGF0YS5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IHRoaXMuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbkJsb2Nrc1JlYWR5ID0gZGF0YVNpZ0J5dGVzIC8gYmxvY2tTaXplQnl0ZXM7XG5cdCAgICAgICAgICAgIGlmIChkb0ZsdXNoKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSb3VuZCB1cCB0byBpbmNsdWRlIHBhcnRpYWwgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICBuQmxvY2tzUmVhZHkgPSBNYXRoLmNlaWwobkJsb2Nrc1JlYWR5KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIGRvd24gdG8gaW5jbHVkZSBvbmx5IGZ1bGwgYmxvY2tzLFxuXHQgICAgICAgICAgICAgICAgLy8gbGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IG11c3QgcmVtYWluIGluIHRoZSBidWZmZXJcblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGgubWF4KChuQmxvY2tzUmVhZHkgfCAwKSAtIHRoaXMuX21pbkJ1ZmZlclNpemUsIDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgd29yZHMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5Xb3Jkc1JlYWR5ID0gbkJsb2Nrc1JlYWR5ICogYmxvY2tTaXplO1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJ5dGVzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQnl0ZXNSZWFkeSA9IE1hdGgubWluKG5Xb3Jkc1JlYWR5ICogNCwgZGF0YVNpZ0J5dGVzKTtcblxuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIGJsb2Nrc1xuXHQgICAgICAgICAgICBpZiAobldvcmRzUmVhZHkpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IG5Xb3Jkc1JlYWR5OyBvZmZzZXQgKz0gYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1hbGdvcml0aG0gbG9naWNcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb1Byb2Nlc3NCbG9jayhkYXRhV29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwcm9jZXNzZWQgd29yZHNcblx0ICAgICAgICAgICAgICAgIHByb2Nlc3NlZFdvcmRzID0gZGF0YVdvcmRzLnNwbGljZSgwLCBuV29yZHNSZWFkeSk7XG5cdCAgICAgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5CeXRlc1JlYWR5O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHByb2Nlc3NlZFdvcmRzLCBuQnl0ZXNSZWFkeSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9kYXRhID0gdGhpcy5fZGF0YS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21pbkJ1ZmZlclNpemU6IDBcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGhhc2hlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgaGFzaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxNiAoNTEyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXIgPSBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoKSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgaGFzaCBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2hlciA9IENyeXB0b0pTLmFsZ28uU0hBMjU2LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgaGFzaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVcGRhdGVzIHRoaXMgaGFzaGVyIHdpdGggYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIFRoZSBtZXNzYWdlIHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0hhc2hlcn0gVGhpcyBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci51cGRhdGUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGhhc2hcblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgbWVzc2FnZSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5fZG9GaW5hbGl6ZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDUxMi8zMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byBhIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaGFzaGVyLmluaXQoY2ZnKS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byB1c2UgaW4gdGhpcyBITUFDIGhlbHBlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBIbWFjU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhtYWNIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBrZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ19hbGdvLkhNQUMuaW5pdChoYXNoZXIsIGtleSkuZmluYWxpemUobWVzc2FnZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWxnb3JpdGhtIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbyA9IHt9O1xuXG5cdCAgICByZXR1cm4gQztcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlM7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdHJldHVybiBDcnlwdG9KUy5lbmMuSGV4O1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKE1hdGgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBJbml0aWFsaXphdGlvbiBhbmQgcm91bmQgY29uc3RhbnRzIHRhYmxlc1xuXHQgICAgdmFyIEggPSBbXTtcblx0ICAgIHZhciBLID0gW107XG5cblx0ICAgIC8vIENvbXB1dGUgY29uc3RhbnRzXG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZ1bmN0aW9uIGlzUHJpbWUobikge1xuXHQgICAgICAgICAgICB2YXIgc3FydE4gPSBNYXRoLnNxcnQobik7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGZhY3RvciA9IDI7IGZhY3RvciA8PSBzcXJ0TjsgZmFjdG9yKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmICghKG4gJSBmYWN0b3IpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgZnVuY3Rpb24gZ2V0RnJhY3Rpb25hbEJpdHMobikge1xuXHQgICAgICAgICAgICByZXR1cm4gKChuIC0gKG4gfCAwKSkgKiAweDEwMDAwMDAwMCkgfCAwO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHZhciBuID0gMjtcblx0ICAgICAgICB2YXIgblByaW1lID0gMDtcblx0ICAgICAgICB3aGlsZSAoblByaW1lIDwgNjQpIHtcblx0ICAgICAgICAgICAgaWYgKGlzUHJpbWUobikpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChuUHJpbWUgPCA4KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgSFtuUHJpbWVdID0gZ2V0RnJhY3Rpb25hbEJpdHMoTWF0aC5wb3cobiwgMSAvIDIpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIEtbblByaW1lXSA9IGdldEZyYWN0aW9uYWxCaXRzKE1hdGgucG93KG4sIDEgLyAzKSk7XG5cblx0ICAgICAgICAgICAgICAgIG5QcmltZSsrO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgbisrO1xuXHQgICAgICAgIH1cblx0ICAgIH0oKSk7XG5cblx0ICAgIC8vIFJldXNhYmxlIG9iamVjdFxuXHQgICAgdmFyIFcgPSBbXTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTSEEtMjU2IGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgU0hBMjU2ID0gQ19hbGdvLlNIQTI1NiA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoSC5zbGljZSgwKSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXHQgICAgICAgICAgICB2YXIgZSA9IEhbNF07XG5cdCAgICAgICAgICAgIHZhciBmID0gSFs1XTtcblx0ICAgICAgICAgICAgdmFyIGcgPSBIWzZdO1xuXHQgICAgICAgICAgICB2YXIgaCA9IEhbN107XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0YXRpb25cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDE2KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IE1bb2Zmc2V0ICsgaV0gfCAwO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEweCA9IFdbaSAtIDE1XTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZ2FtbWEwICA9ICgoZ2FtbWEweCA8PCAyNSkgfCAoZ2FtbWEweCA+Pj4gNykpICBeXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhbW1hMHggPDwgMTQpIHwgKGdhbW1hMHggPj4+IDE4KSkgXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnYW1tYTB4ID4+PiAzKTtcblxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBnYW1tYTF4ID0gV1tpIC0gMl07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGdhbW1hMSAgPSAoKGdhbW1hMXggPDwgMTUpIHwgKGdhbW1hMXggPj4+IDE3KSkgXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChnYW1tYTF4IDw8IDEzKSB8IChnYW1tYTF4ID4+PiAxOSkpIF5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2FtbWExeCA+Pj4gMTApO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IGdhbW1hMCArIFdbaSAtIDddICsgZ2FtbWExICsgV1tpIC0gMTZdO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB2YXIgY2ggID0gKGUgJiBmKSBeICh+ZSAmIGcpO1xuXHQgICAgICAgICAgICAgICAgdmFyIG1haiA9IChhICYgYikgXiAoYSAmIGMpIF4gKGIgJiBjKTtcblxuXHQgICAgICAgICAgICAgICAgdmFyIHNpZ21hMCA9ICgoYSA8PCAzMCkgfCAoYSA+Pj4gMikpIF4gKChhIDw8IDE5KSB8IChhID4+PiAxMykpIF4gKChhIDw8IDEwKSB8IChhID4+PiAyMikpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHNpZ21hMSA9ICgoZSA8PCAyNikgfCAoZSA+Pj4gNikpIF4gKChlIDw8IDIxKSB8IChlID4+PiAxMSkpIF4gKChlIDw8IDcpICB8IChlID4+PiAyNSkpO1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgdDEgPSBoICsgc2lnbWExICsgY2ggKyBLW2ldICsgV1tpXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MiA9IHNpZ21hMCArIG1hajtcblxuXHQgICAgICAgICAgICAgICAgaCA9IGc7XG5cdCAgICAgICAgICAgICAgICBnID0gZjtcblx0ICAgICAgICAgICAgICAgIGYgPSBlO1xuXHQgICAgICAgICAgICAgICAgZSA9IChkICsgdDEpIHwgMDtcblx0ICAgICAgICAgICAgICAgIGQgPSBjO1xuXHQgICAgICAgICAgICAgICAgYyA9IGI7XG5cdCAgICAgICAgICAgICAgICBiID0gYTtcblx0ICAgICAgICAgICAgICAgIGEgPSAodDEgKyB0MikgfCAwO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWVcblx0ICAgICAgICAgICAgSFswXSA9IChIWzBdICsgYSkgfCAwO1xuXHQgICAgICAgICAgICBIWzFdID0gKEhbMV0gKyBiKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMl0gPSAoSFsyXSArIGMpIHwgMDtcblx0ICAgICAgICAgICAgSFszXSA9IChIWzNdICsgZCkgfCAwO1xuXHQgICAgICAgICAgICBIWzRdID0gKEhbNF0gKyBlKSB8IDA7XG5cdCAgICAgICAgICAgIEhbNV0gPSAoSFs1XSArIGYpIHwgMDtcblx0ICAgICAgICAgICAgSFs2XSA9IChIWzZdICsgZykgfCAwO1xuXHQgICAgICAgICAgICBIWzddID0gKEhbN10gKyBoKSB8IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTVdID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTI1NignbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMjU2KHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuU0hBMjU2ID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBMjU2KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEEyNTYobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjU0hBMjU2ID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTI1Nik7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLlNIQTI1NjtcblxufSkpOyIsIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGRlbnlMaXN0ID0gbmV3IFNldChbXG5cdCdFTk9URk9VTkQnLFxuXHQnRU5FVFVOUkVBQ0gnLFxuXG5cdC8vIFNTTCBlcnJvcnMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9mYzhlM2UyY2RjNTIxOTc4MzUxZGUyNTcwMzBkYjAwNzZkNzllMGFiL3NyYy9jcnlwdG8vY3J5cHRvX2NvbW1vbi5jYyNMMzAxLUwzMjhcblx0J1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQnLFxuXHQnVU5BQkxFX1RPX0dFVF9DUkwnLFxuXHQnVU5BQkxFX1RPX0RFQ1JZUFRfQ0VSVF9TSUdOQVRVUkUnLFxuXHQnVU5BQkxFX1RPX0RFQ1JZUFRfQ1JMX1NJR05BVFVSRScsXG5cdCdVTkFCTEVfVE9fREVDT0RFX0lTU1VFUl9QVUJMSUNfS0VZJyxcblx0J0NFUlRfU0lHTkFUVVJFX0ZBSUxVUkUnLFxuXHQnQ1JMX1NJR05BVFVSRV9GQUlMVVJFJyxcblx0J0NFUlRfTk9UX1lFVF9WQUxJRCcsXG5cdCdDRVJUX0hBU19FWFBJUkVEJyxcblx0J0NSTF9OT1RfWUVUX1ZBTElEJyxcblx0J0NSTF9IQVNfRVhQSVJFRCcsXG5cdCdFUlJPUl9JTl9DRVJUX05PVF9CRUZPUkVfRklFTEQnLFxuXHQnRVJST1JfSU5fQ0VSVF9OT1RfQUZURVJfRklFTEQnLFxuXHQnRVJST1JfSU5fQ1JMX0xBU1RfVVBEQVRFX0ZJRUxEJyxcblx0J0VSUk9SX0lOX0NSTF9ORVhUX1VQREFURV9GSUVMRCcsXG5cdCdPVVRfT0ZfTUVNJyxcblx0J0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVCcsXG5cdCdTRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOJyxcblx0J1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlRfTE9DQUxMWScsXG5cdCdVTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFJyxcblx0J0NFUlRfQ0hBSU5fVE9PX0xPTkcnLFxuXHQnQ0VSVF9SRVZPS0VEJyxcblx0J0lOVkFMSURfQ0EnLFxuXHQnUEFUSF9MRU5HVEhfRVhDRUVERUQnLFxuXHQnSU5WQUxJRF9QVVJQT1NFJyxcblx0J0NFUlRfVU5UUlVTVEVEJyxcblx0J0NFUlRfUkVKRUNURUQnLFxuXHQnSE9TVE5BTUVfTUlTTUFUQ0gnXG5dKTtcblxuLy8gVE9ETzogVXNlIGBlcnJvcj8uY29kZWAgd2hlbiB0YXJnZXRpbmcgTm9kZS5qcyAxNFxubW9kdWxlLmV4cG9ydHMgPSBlcnJvciA9PiAhZGVueUxpc3QuaGFzKGVycm9yICYmIGVycm9yLmNvZGUpO1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgcmVnaXN0ZXJJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAgICAgIC8vIENhbGxiYWNrIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbmV3IEZ1bmN0aW9uKFwiXCIgKyBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICAvLyBDb3B5IGZ1bmN0aW9uIGFyZ3VtZW50c1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBhbmQgcmVnaXN0ZXIgdGhlIHRhc2tcbiAgICAgIHZhciB0YXNrID0geyBjYWxsYmFjazogY2FsbGJhY2ssIGFyZ3M6IGFyZ3MgfTtcbiAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSB0YXNrO1xuICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUobmV4dEhhbmRsZSk7XG4gICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bih0YXNrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gICAgICAgIHZhciBhcmdzID0gdGFzay5hcmdzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKHRhc2spO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJ1bklmUHJlc2VudChoYW5kbGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufSh0eXBlb2Ygc2VsZiA9PT0gXCJ1bmRlZmluZWRcIiA/IHR5cGVvZiBnbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzIDogZ2xvYmFsIDogc2VsZikpO1xuIiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBFbnVtc18xID0gcmVxdWlyZShcIi4vRW51bXNcIik7XG52YXIgQ29uc3RhbnRzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnN0YW50cygpIHtcbiAgICB9XG4gICAgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IFtcIm9yZ1VybFwiLCBcIm9yZ0lkXCIsIFwid2lkZ2V0SWRcIl07XG4gICAgQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzID0ge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgIH07XG4gICAgQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycyA9IHtcbiAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZSwgbm8tY2FjaGVcIixcbiAgICAgICAgXCJYLUNhY2hlLUNvbnRyb2xcIjogXCJuby1zdG9yZVwiXG4gICAgfTtcbiAgICBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZCA9IEVudW1zXzEuQ2hhbm5lbElkLkxDVztcbiAgICBDb25zdGFudHMuZGVmYXVsdExvY2FsZSA9IFwiZW4tdXNcIjtcbiAgICBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSA9IDIwNDtcbiAgICBDb25zdGFudHMudG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSA9IDQyOTtcbiAgICBDb25zdGFudHMubm90Rm91bmRTdGF0dXNDb2RlID0gNDA0O1xuICAgIENvbnN0YW50cy5iYWRSZXF1ZXN0U3RhdHVzQ29kZSA9IDQwMDtcbiAgICBDb25zdGFudHMub3V0T2ZPZmZpY2VFcnJvckNvZGUgPSA3MDU7XG4gICAgQ29uc3RhbnRzLnNlbnNpdGl2ZVByb3BlcnRpZXMgPSBbXCJBdXRoZW50aWNhdGVkVXNlclRva2VuXCJdO1xuICAgIENvbnN0YW50cy50cmFuc2FjdGlvbmlkID0gXCJ0cmFuc2FjdGlvbi1pZFwiO1xuICAgIENvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lID0gXCJjdXN0b21lckRpc3BsYXlOYW1lXCI7XG4gICAgQ29uc3RhbnRzLmhpZGRlbkNvbnRlbnRQbGFjZWhvbGRlciA9IFwiKmNvbnRlbnQgaGlkZGVuKlwiO1xuICAgIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUgPSBcIkVDT05OQUJPUlRFRFwiO1xuICAgIHJldHVybiBDb25zdGFudHM7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gQ29uc3RhbnRzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNES0Vycm9yID0gZXhwb3J0cy5MaXZlQ2hhdFZlcnNpb24gPSBleHBvcnRzLk9DU0RLVGVsZW1ldHJ5RXZlbnQgPSBleHBvcnRzLkNoYW5uZWxJZCA9IGV4cG9ydHMuT3BlcmF0aW5nU3lzdGVtID0gZXhwb3J0cy5EZXZpY2VUeXBlID0gZXhwb3J0cy5Ccm93c2VyID0gZXhwb3J0cy5Ccm93c2VyVmVuZG9yID0gdm9pZCAwO1xudmFyIEJyb3dzZXJWZW5kb3I7XG4oZnVuY3Rpb24gKEJyb3dzZXJWZW5kb3IpIHtcbiAgICBCcm93c2VyVmVuZG9yW1wiSUVcIl0gPSBcIklFXCI7XG4gICAgQnJvd3NlclZlbmRvcltcIkNIUk9NRVwiXSA9IFwiQ2hyb21lXCI7XG4gICAgQnJvd3NlclZlbmRvcltcIkZJUkVGT1hcIl0gPSBcIkZpcmVmb3hcIjtcbiAgICBCcm93c2VyVmVuZG9yW1wiU0FGQVJJXCJdID0gXCJTYWZhcmlcIjtcbiAgICBCcm93c2VyVmVuZG9yW1wiRURHRVwiXSA9IFwiRWRnZVwiO1xuICAgIEJyb3dzZXJWZW5kb3JbXCJFREdFX0NIUk9NSVVNXCJdID0gXCJFZGdcIjtcbiAgICBCcm93c2VyVmVuZG9yW1wiT1BFUkFcIl0gPSBcIk9wZXJhXCI7XG4gICAgQnJvd3NlclZlbmRvcltcIlVOS05PV05cIl0gPSBcIlVua25vd25cIjtcbn0pKEJyb3dzZXJWZW5kb3IgPSBleHBvcnRzLkJyb3dzZXJWZW5kb3IgfHwgKGV4cG9ydHMuQnJvd3NlclZlbmRvciA9IHt9KSk7XG52YXIgQnJvd3NlcjtcbihmdW5jdGlvbiAoQnJvd3Nlcikge1xuICAgIEJyb3dzZXJbQnJvd3NlcltcIkNocm9tZVwiXSA9IDBdID0gXCJDaHJvbWVcIjtcbiAgICBCcm93c2VyW0Jyb3dzZXJbXCJGaXJlZm94XCJdID0gMV0gPSBcIkZpcmVmb3hcIjtcbiAgICBCcm93c2VyW0Jyb3dzZXJbXCJJZVwiXSA9IDJdID0gXCJJZVwiO1xuICAgIEJyb3dzZXJbQnJvd3NlcltcIkVkZ2VcIl0gPSAzXSA9IFwiRWRnZVwiO1xuICAgIEJyb3dzZXJbQnJvd3NlcltcIlNhZmFyaVwiXSA9IDRdID0gXCJTYWZhcmlcIjtcbiAgICBCcm93c2VyW0Jyb3dzZXJbXCJOb25lXCJdID0gNV0gPSBcIk5vbmVcIjtcbn0pKEJyb3dzZXIgPSBleHBvcnRzLkJyb3dzZXIgfHwgKGV4cG9ydHMuQnJvd3NlciA9IHt9KSk7XG52YXIgRGV2aWNlVHlwZTtcbihmdW5jdGlvbiAoRGV2aWNlVHlwZSkge1xuICAgIERldmljZVR5cGVbXCJEZXNrdG9wXCJdID0gXCJEZXNrdG9wXCI7XG4gICAgRGV2aWNlVHlwZVtcIk1vYmlsZVwiXSA9IFwiTW9iaWxlXCI7XG4gICAgRGV2aWNlVHlwZVtcIlRhYmxldFwiXSA9IFwiVGFibGV0XCI7XG59KShEZXZpY2VUeXBlID0gZXhwb3J0cy5EZXZpY2VUeXBlIHx8IChleHBvcnRzLkRldmljZVR5cGUgPSB7fSkpO1xudmFyIE9wZXJhdGluZ1N5c3RlbTtcbihmdW5jdGlvbiAoT3BlcmF0aW5nU3lzdGVtKSB7XG4gICAgT3BlcmF0aW5nU3lzdGVtW1wiV0lORE9XU1wiXSA9IFwiV2luZG93c1wiO1xuICAgIE9wZXJhdGluZ1N5c3RlbVtcIk1BQ09TWFwiXSA9IFwiTWFjIE9TIFhcIjtcbiAgICBPcGVyYXRpbmdTeXN0ZW1bXCJXSU5ET1dTX1BIT05FXCJdID0gXCJXaW5kb3dzIFBob25lXCI7XG4gICAgT3BlcmF0aW5nU3lzdGVtW1wiV0lORE9XU19SVFwiXSA9IFwiV2luZG93cyBSVFwiO1xuICAgIE9wZXJhdGluZ1N5c3RlbVtcIklPU1wiXSA9IFwiaU9TXCI7XG4gICAgT3BlcmF0aW5nU3lzdGVtW1wiQU5EUk9JRFwiXSA9IFwiQW5kcm9pZFwiO1xuICAgIE9wZXJhdGluZ1N5c3RlbVtcIkxJTlVYXCJdID0gXCJMaW51eFwiO1xuICAgIE9wZXJhdGluZ1N5c3RlbVtcIlVOS05PV05cIl0gPSBcIlVua25vd25cIjtcbn0pKE9wZXJhdGluZ1N5c3RlbSA9IGV4cG9ydHMuT3BlcmF0aW5nU3lzdGVtIHx8IChleHBvcnRzLk9wZXJhdGluZ1N5c3RlbSA9IHt9KSk7XG52YXIgQ2hhbm5lbElkO1xuKGZ1bmN0aW9uIChDaGFubmVsSWQpIHtcbiAgICBDaGFubmVsSWRbXCJMQ1dcIl0gPSBcImxjd1wiO1xuICAgIENoYW5uZWxJZFtcIlNNU1wiXSA9IFwic21zXCI7XG4gICAgQ2hhbm5lbElkW1wiRkFDRUJPT0tcIl0gPSBcImZhY2Vib29rXCI7XG4gICAgQ2hhbm5lbElkW1wiV0VDSEFUXCJdID0gXCJ3ZWNoYXRcIjtcbn0pKENoYW5uZWxJZCA9IGV4cG9ydHMuQ2hhbm5lbElkIHx8IChleHBvcnRzLkNoYW5uZWxJZCA9IHt9KSk7XG52YXIgT0NTREtUZWxlbWV0cnlFdmVudDtcbihmdW5jdGlvbiAoT0NTREtUZWxlbWV0cnlFdmVudCkge1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRFwiXSA9IFwiR2V0TGN3RmNzRGV0YWlsc1N0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRFwiXSA9IFwiR2V0TGN3RmNzRGV0YWlsc1N1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRMQ1dGQ1NERVRBSUxTRkFJTEVEXCJdID0gXCJHZXRMY3dGY3NEZXRhaWxzRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVENIQVRDT05GSUdGU1RBUlRFRFwiXSA9IFwiR2V0Q2hhdENvbmZpZ1wiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRDSEFUQ09ORklHU1VDQ0VFREVEXCJdID0gXCJHZXRDaGF0Q29uZmlnU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVENIQVRDT05GSUdGQUlMRURcIl0gPSBcIkdldENoYXRDb25maWdGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRFwiXSA9IFwiR2V0UmVjb25ubmVjdGFibGVDaGF0c1N0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVEXCJdID0gXCJHZXRSZWNvbm5uZWN0YWJsZUNoYXRzU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVFJFQ09OTkVDVEFCTEVDSEFUU0ZBSUxFRFwiXSA9IFwiR2V0UmVjb25ubmVjdGFibGVDaGF0c0ZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERURcIl0gPSBcIkdldFJlY29ubm5lY3RhYmxlQXZhaWxhYmlsaXR5U3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNUQVJURURcIl0gPSBcIkdldFJlY29ubm5lY3RhYmxlQXZhaWxhYmlsaXR5U3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRURcIl0gPSBcIkdldFJlY29ubm5lY3RhYmxlQXZhaWxhYmlsaXR5RmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVENIQVRUT0tFTlNUQVJURURcIl0gPSBcIkdldENoYXRUb2tlblN0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEXCJdID0gXCJHZXRDaGF0VG9rZW5TdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUQ0hBVFRPS0VORkFJTEVEXCJdID0gXCJHZXRDaGF0VG9rZW5GYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUTFdJU1RBVFVTU1RBUlRFRFwiXSA9IFwiR2V0THdpU3RhdHVzU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRMV0lTVEFUVVNTVUNDRUVERURcIl0gPSBcIkdldEx3aVN0YXR1c1N1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRMV0lTVEFUVVNGQUlMRURcIl0gPSBcIkdldEx3aVN0YXR1c0ZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRVNTSU9OSU5JVFNUQVJURURcIl0gPSBcIlNlc3Npb25Jbml0U3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRVNTSU9OSU5JVFNVQ0NFRURFRFwiXSA9IFwiU2Vzc2lvbkluaXRTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiU0VTU0lPTklOSVRGQUlMRURcIl0gPSBcIlNlc3Npb25Jbml0RmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkNSRUFURVNFU1NJT05TVEFSVEVEXCJdID0gXCJDcmVhdGVTZXNzaW9uU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJDUkVBVEVTRVNTSU9OU1VDQ0VFREVEXCJdID0gXCJDcmVhdGVTZXNzaW9uU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkNSRUFURVNFU1NJT05GQUlMRURcIl0gPSBcIkNyZWF0ZVNlc3Npb25GYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiU0VTU0lPTkNMT1NFU1RBUlRFRFwiXSA9IFwiU2Vzc2lvbkNsb3NlU3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRVNTSU9OQ0xPU0VTVUNDRUVERURcIl0gPSBcIlNlc3Npb25DbG9zZVN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRVNTSU9OQ0xPU0VGQUlMRURcIl0gPSBcIlNlc3Npb25DbG9zZUZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTVUJNSVRQT1NUQ0hBVFNUQVJURURcIl0gPSBcIlN1Ym1pdFBvc3RDaGF0U3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRFwiXSA9IFwiU3VibWl0UG9zdENoYXRTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiU1VCTUlUUE9TVENIQVRGQUlMRURcIl0gPSBcIlN1Ym1pdFBvc3RDaGF0RmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRFwiXSA9IFwiR2V0Q2hhdFRyYW5zY3JpcHRTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEXCJdID0gXCJHZXRDaGF0VHJhbnNjcmlwdFN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRDSEFUVFJBTlNDUklQVEZBSUxFRFwiXSA9IFwiR2V0Q2hhdFRyYW5zY3JpcHRGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRFwiXSA9IFwiRW1haWxUcmFuc2NyaXB0U3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJFTUFJTFRSQU5TQ1JJUFRTVUNDRUVERURcIl0gPSBcIkVtYWlsVHJhbnNjcmlwdFN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJFTUFJTFRSQU5TQ1JJUFRGQUlMRURcIl0gPSBcIkVtYWlsVHJhbnNjcmlwdEZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRFwiXSA9IFwiRmV0Y2hEYXRhTWFza2luZ1N0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRFwiXSA9IFwiRmV0Y2hEYXRhTWFza2luZ1N1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEXCJdID0gXCJGZXRjaERhdGFNYXNraW5nRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEXCJdID0gXCJTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0U3RhcnRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEXCJdID0gXCJTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0U3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRURcIl0gPSBcIlNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURURcIl0gPSBcIkdldFN1cnZleUludml0ZUxpbmtTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERURcIl0gPSBcIkdldFN1cnZleUludml0ZUxpbmtTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRFwiXSA9IFwiR2V0U3VydmV5SW52aXRlTGlua0ZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRFwiXSA9IFwiVmFsaWRhdGVBdXRoQ2hhdFJlY29yZFN0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRFwiXSA9IFwiVmFsaWRhdGVBdXRoQ2hhdFJlY29yZFN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEXCJdID0gXCJWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkRmFpbGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRFwiXSA9IFwiR2V0QWdlbnRBdmFpbGFiaWxpdHlTdGFydGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEXCJdID0gXCJHZXRBZ2VudEF2YWlsYWJpbGl0eVN1Y2NlZWRlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRFwiXSA9IFwiR2V0QWdlbnRBdmFpbGFiaWxpdHlGYWlsZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRFwiXSA9IFwiU2VuZFR5cGluZ0luZGljYXRvckZhaWxlZFwiO1xuICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnRbXCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEXCJdID0gXCJTZW5kVHlwaW5nSW5kaWNhdG9yU3VjY2VlZGVkXCI7XG4gICAgT0NTREtUZWxlbWV0cnlFdmVudFtcIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNUQVJURURcIl0gPSBcIkdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeVN0YXJ0ZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1VDQ0VFREVEXCJdID0gXCJHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlTdWNjZWVkZWRcIjtcbiAgICBPQ1NES1RlbGVtZXRyeUV2ZW50W1wiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZRkFJTEVEXCJdID0gXCJHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlGYWlsZWRcIjtcbn0pKE9DU0RLVGVsZW1ldHJ5RXZlbnQgPSBleHBvcnRzLk9DU0RLVGVsZW1ldHJ5RXZlbnQgfHwgKGV4cG9ydHMuT0NTREtUZWxlbWV0cnlFdmVudCA9IHt9KSk7XG52YXIgTGl2ZUNoYXRWZXJzaW9uO1xuKGZ1bmN0aW9uIChMaXZlQ2hhdFZlcnNpb24pIHtcbiAgICAvLyBJQzMgbGl2ZSBjaGF0XG4gICAgTGl2ZUNoYXRWZXJzaW9uW0xpdmVDaGF0VmVyc2lvbltcIlYxXCJdID0gMV0gPSBcIlYxXCI7XG4gICAgLy8gQUNTIGxpdmUgY2hhdFxuICAgIExpdmVDaGF0VmVyc2lvbltMaXZlQ2hhdFZlcnNpb25bXCJWMlwiXSA9IDJdID0gXCJWMlwiO1xuICAgIExpdmVDaGF0VmVyc2lvbltMaXZlQ2hhdFZlcnNpb25bXCJWM1wiXSA9IDNdID0gXCJWM1wiO1xufSkoTGl2ZUNoYXRWZXJzaW9uID0gZXhwb3J0cy5MaXZlQ2hhdFZlcnNpb24gfHwgKGV4cG9ydHMuTGl2ZUNoYXRWZXJzaW9uID0ge30pKTtcbnZhciBTREtFcnJvcjtcbihmdW5jdGlvbiAoU0RLRXJyb3IpIHtcbiAgICBTREtFcnJvcltcIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JOYW1lXCJdID0gXCJDbGllbnRIVFRQVGltZW91dEVycm9yXCI7XG4gICAgU0RLRXJyb3JbXCJDbGllbnRIVFRQVGltZW91dEVycm9yTWVzc2FnZVwiXSA9IFwiU2VydmVyIHRvb2sgdG9vIGxvbmcgdG8gcmVzcG9uZFwiO1xufSkoU0RLRXJyb3IgPSBleHBvcnRzLlNES0Vycm9yIHx8IChleHBvcnRzLlNES0Vycm9yID0ge30pKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEV2ZW50TmFtZXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnROYW1lcygpIHtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50TmFtZXMsIFwiT0NTREtMT0FEXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBcIm9jOnNkazpsb2FkXCI7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gRXZlbnROYW1lcztcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBFdmVudE5hbWVzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgTG9jYWxlcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMb2NhbGVzKCkge1xuICAgIH1cbiAgICBMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMgPSBbXG4gICAgICAgIFwiYXItc2FcIixcbiAgICAgICAgXCJiZy1iZ1wiLFxuICAgICAgICBcImNhLWVzXCIsXG4gICAgICAgIFwiY3MtY3pcIixcbiAgICAgICAgXCJkYS1ka1wiLFxuICAgICAgICBcImRlLWRlXCIsXG4gICAgICAgIFwiZWwtZ3JcIixcbiAgICAgICAgXCJlbi11c1wiLFxuICAgICAgICBcImVzLWVzXCIsXG4gICAgICAgIFwiZXQtZWVcIixcbiAgICAgICAgXCJldS1lc1wiLFxuICAgICAgICBcImZpLWZpXCIsXG4gICAgICAgIFwiZnItZnJcIixcbiAgICAgICAgXCJnbC1lc1wiLFxuICAgICAgICBcImhlLWlsXCIsXG4gICAgICAgIFwiaGktaW5cIixcbiAgICAgICAgXCJoci1oclwiLFxuICAgICAgICBcImh1LWh1XCIsXG4gICAgICAgIFwiaWQtaWRcIixcbiAgICAgICAgXCJpdC1pdFwiLFxuICAgICAgICBcImphLWpwXCIsXG4gICAgICAgIFwia2sta3pcIixcbiAgICAgICAgXCJrby1rclwiLFxuICAgICAgICBcImx0LWx0XCIsXG4gICAgICAgIFwibHYtbHZcIixcbiAgICAgICAgXCJtcy1teVwiLFxuICAgICAgICBcIm5iLW5vXCIsXG4gICAgICAgIFwibmwtbmxcIixcbiAgICAgICAgXCJwbC1wbFwiLFxuICAgICAgICBcInB0LWJyXCIsXG4gICAgICAgIFwicHQtcHRcIixcbiAgICAgICAgXCJyby1yb1wiLFxuICAgICAgICBcInJ1LXJ1XCIsXG4gICAgICAgIFwic2stc2tcIixcbiAgICAgICAgXCJzbC1zaVwiLFxuICAgICAgICBcInNyLWN5cmwtY3NcIixcbiAgICAgICAgXCJzci1sYXRuLWNzXCIsXG4gICAgICAgIFwic3Ytc2VcIixcbiAgICAgICAgXCJ0aC10aFwiLFxuICAgICAgICBcInRyLXRyXCIsXG4gICAgICAgIFwidWstdWFcIixcbiAgICAgICAgXCJ2aS12blwiLFxuICAgICAgICBcInpoLWNuXCIsXG4gICAgICAgIFwiemgtaGtcIixcbiAgICAgICAgXCJ6aC10d1wiXG4gICAgXTtcbiAgICByZXR1cm4gTG9jYWxlcztcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBMb2NhbGVzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgVGVsZW1ldHJ5SGVscGVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL1V0aWxzL1RlbGVtZXRyeUhlbHBlclwiKSk7XG52YXIgT0NTREtMb2dnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT0NTREtMb2dnZXIobG9nZ2VyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgIH1cbiAgICBPQ1NES0xvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGxvZ2xldmVsLCB0ZWxlbWV0cnlFdmVudCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2dnaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICB2YXIgbG9nRGF0YSA9IFRlbGVtZXRyeUhlbHBlcl8xLmRlZmF1bHQuR0VUVEVMRU1FVFJZRVZFTlREQVRBKHRlbGVtZXRyeUV2ZW50LCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICB0aGlzLmxvZ0V2ZW50KGxvZ2xldmVsLCBsb2dEYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT0NTREtMb2dnZXIucHJvdG90eXBlLmxvZ0V2ZW50ID0gZnVuY3Rpb24gKGxvZ0xldmVsLCBsb2dEYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9nZ2luZ0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nQ2xpZW50U2RrVGVsZW1ldHJ5RXZlbnQobG9nTGV2ZWwsIGxvZ0RhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPQ1NES0xvZ2dlci5wcm90b3R5cGUuaXNMb2dnaW5nRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMubG9nZ2VyKTtcbiAgICB9O1xuICAgIE9DU0RLTG9nZ2VyLnByb3RvdHlwZS5pc051bGxPclVuZGVmaW5lZCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgcmV0dXJuIE9DU0RLTG9nZ2VyO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IE9DU0RLTG9nZ2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgT21uaWNoYW5uZWxFbmRwb2ludHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT21uaWNoYW5uZWxFbmRwb2ludHMoKSB7XG4gICAgfVxuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29ubmVjdG9yUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3Ivb3JnYW5pemF0aW9uXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvYXV0aC9vcmdhbml6YXRpb25cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MY3dGY3NEZXRhaWxzUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvdjIvbGN3ZmNzZGV0YWlsc1wiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvY29uZmlnXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3Nlc3Npb25pbml0XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL3Nlc3Npb25pbml0XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9nZXRjaGF0dG9rZW5cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRva2VuUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvdjIvZ2V0Y2hhdHRva2VuXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2M0dldENoYXRUb2tlblBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3YzL2dldGNoYXR0b2tlblwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djRHZXRDaGF0VG9rZW5QYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci92NC9nZXRjaGF0dG9rZW5cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHY0QXV0aEdldENoYXRUb2tlblBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3Y0L2F1dGgvZ2V0Y2hhdHRva2VuXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRva2VuUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvYXV0aC9nZXRjaGF0dG9rZW5cIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3YyL2F1dGgvZ2V0Y2hhdHRva2VuXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2M0F1dGhHZXRDaGF0VG9rZW5QYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci92My9hdXRoL2dldGNoYXR0b2tlblwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3Ivc2Vzc2lvbmNsb3NlXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvYXV0aC9zZXNzaW9uY2xvc2VcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCA9IFwic3VydmV5L3N1Ym1pdHBvc3RjaGF0XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoID0gXCJzdXJ2ZXkvYXV0aC9zdWJtaXRwb3N0Y2hhdFwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2dldHN1cnZleWludml0ZVwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL2dldHN1cnZleWludml0ZVwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9nZXRjaGF0dHJhbnNjcmlwdHNcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci92Mi9nZXRjaGF0dHJhbnNjcmlwdHNcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvZ2V0Y2hhdHRyYW5zY3JpcHRzXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL3YyL2F1dGgvZ2V0Y2hhdHRyYW5zY3JpcHRzXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvY3JlYXRlZW1haWxyZXF1ZXN0XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2F1dGgvY3JlYXRlZW1haWxyZXF1ZXN0XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2ZldGNoZGF0YW1hc2tpbmdpbmZvXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9zZWNvbmRhcnljaGFubmVsZXZlbnRcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL3NlY29uZGFyeWNoYW5uZWxldmVudFwiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGggPSBcImxpdmVjaGF0Y29ubmVjdG9yL2dldGxpdmV3b3JraXRlbWRldGFpbHNcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvYXV0aC9nZXRsaXZld29ya2l0ZW1kZXRhaWxzXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL3JlY29ubmVjdGFibGVjaGF0c1wiO1xuICAgIE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvcmVjb25uZWN0XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCA9IFwibGl2ZWNoYXRjb25uZWN0b3IvYXV0aC92YWxpZGF0ZWF1dGhjaGF0bWFwcmVjb3JkXCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL2dldGFnZW50YXZhaWxhYmlsaXR5XCI7XG4gICAgT21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGggPSBcImluYm91bmQvdHlwaW5naW5kaWNhdG9yL2xpdmVjaGF0L3NlbmR0eXBpbmdpbmRpY2F0b3JcIjtcbiAgICBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlQYXRoID0gXCJsaXZlY2hhdGNvbm5lY3Rvci9hdXRoL29yZ2FuaXphdGlvblwiO1xuICAgIHJldHVybiBPbW5pY2hhbm5lbEVuZHBvaW50cztcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBPbW5pY2hhbm5lbEVuZHBvaW50cztcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIE9tbmljaGFubmVsSFRUUEhlYWRlcnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT21uaWNoYW5uZWxIVFRQSGVhZGVycygpIHtcbiAgICB9XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuID0gXCJBdXRoZW50aWNhdGVkVXNlclRva2VuXCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uID0gXCJBdXRob3JpemF0aW9uXCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZCA9IFwiT3JnYW5pemF0aW9uSWRcIjtcbiAgICBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkID0gXCJ3aWRnZXRBcHBJZFwiO1xuICAgIE9tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkID0gXCJSZXF1ZXN0LUlkXCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlID0gXCJBdXRoQ29kZU5vbmNlXCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZCA9IFwiT2MtU2Vzc2lvbmlkXCI7XG4gICAgT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1VzZXJBZ2VudCA9IFwiTXMtT2MtVXNlci1BZ2VudFwiO1xuICAgIE9tbmljaGFubmVsSFRUUEhlYWRlcnMuY29ycmVsYXRpb25JZCA9IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiO1xuICAgIE9tbmljaGFubmVsSFRUUEhlYWRlcnMucGFnZVRva2VuID0gXCJQYWdlVG9rZW5cIjtcbiAgICByZXR1cm4gT21uaWNoYW5uZWxIVFRQSGVhZGVycztcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxvZ0xldmVsID0gdm9pZCAwO1xudmFyIExvZ0xldmVsO1xuKGZ1bmN0aW9uIChMb2dMZXZlbCkge1xuICAgIExvZ0xldmVsW1wiSU5GT1wiXSA9IFwiSU5GT1wiO1xuICAgIExvZ0xldmVsW1wiREVCVUdcIl0gPSBcIkRFQlVHXCI7XG4gICAgTG9nTGV2ZWxbXCJXQVJOXCJdID0gXCJXQVJOXCI7XG4gICAgTG9nTGV2ZWxbXCJFUlJPUlwiXSA9IFwiRVJST1JcIjtcbn0pKExvZ0xldmVsID0gZXhwb3J0cy5Mb2dMZXZlbCB8fCAoZXhwb3J0cy5Mb2dMZXZlbCA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBFbnVtc18xID0gcmVxdWlyZShcIi4vQ29tbW9uL0VudW1zXCIpO1xudmFyIGF4aW9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImF4aW9zXCIpKTtcbnZhciBheGlvc1JldHJ5SGFuZGxlcl8xID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL1V0aWxzL2F4aW9zUmV0cnlIYW5kbGVyXCIpKTtcbnZhciBCcm93c2VySW5mb18xID0gcmVxdWlyZShcIi4vVXRpbHMvQnJvd3NlckluZm9cIik7XG52YXIgQ29uc3RhbnRzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vQ29tbW9uL0NvbnN0YW50c1wiKSk7XG52YXIgQ3VzdG9tQ29udGV4dERhdGFfMSA9IHJlcXVpcmUoXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCIpO1xudmFyIERldmljZUluZm9fMSA9IHJlcXVpcmUoXCIuL1V0aWxzL0RldmljZUluZm9cIik7XG52YXIgZW5jX2hleF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJjcnlwdG8tanMvZW5jLWhleFwiKSk7XG52YXIgTG9jYWxlc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL0NvbW1vbi9Mb2NhbGVzXCIpKTtcbnZhciBMb2dMZXZlbF8xID0gcmVxdWlyZShcIi4vTW9kZWwvTG9nTGV2ZWxcIik7XG52YXIgTG9nZ2luZ1Nhbml0aXplcl8xID0gcmVxdWlyZShcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiKTtcbnZhciBPU0luZm9fMSA9IHJlcXVpcmUoXCIuL1V0aWxzL09TSW5mb1wiKTtcbnZhciBPbW5pY2hhbm5lbEVuZHBvaW50c18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiKSk7XG52YXIgT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCIpKTtcbnZhciBzaGEyNTZfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiY3J5cHRvLWpzL3NoYTI1NlwiKSk7XG52YXIgVGltZXJfMSA9IHJlcXVpcmUoXCIuL1V0aWxzL1RpbWVyXCIpO1xudmFyIGh0dHBIZWFkZXJzVXRpbHNfMSA9IHJlcXVpcmUoXCIuL1V0aWxzL2h0dHBIZWFkZXJzVXRpbHNcIik7XG52YXIgZW5kcG9pbnRzQ3JlYXRvcnNfMSA9IHJlcXVpcmUoXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCIpO1xudmFyIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vVXRpbHMvaXNFeHBlY3RlZEF4aW9zRXJyb3JcIikpO1xudmFyIFNlc3Npb25Jbml0UmV0cnlIYW5kbGVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIikpO1xudmFyIHV1aWRfMSA9IHJlcXVpcmUoXCIuL1V0aWxzL3V1aWRcIik7XG52YXIgd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NfMSA9IHJlcXVpcmUoXCIuL1V0aWxzL3dhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzXCIpO1xudmFyIFNESyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTREsob21uaWNoYW5uZWxDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uLCBsb2dnZXIpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24gPT09IHZvaWQgMCkgeyBjb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uID0gb21uaWNoYW5uZWxDb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICAgICAgdGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSA9IFwiXCIuY29uY2F0KEVudW1zXzEuU0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck5hbWUsIFwiOiBcIikuY29uY2F0KEVudW1zXzEuU0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKGhlYWRlcnMgPT09IG51bGwgfHwgaGVhZGVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogaGVhZGVycy5hdXRoY29kZW5vbmNlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlID0gaGVhZGVycyA9PT0gbnVsbCB8fCBoZWFkZXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBoZWFkZXJzLmF1dGhjb2Rlbm9uY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyID0gZnVuY3Rpb24gKHNlc3Npb25JZCwgaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub2NTZXNzaW9uSWRdID0gc2Vzc2lvbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlciA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0Q29ycmVsYXRpb25JZEluSGVhZGVyID0gZnVuY3Rpb24gKGNvcnJlbGF0aW9uSWQsIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5jb3JyZWxhdGlvbklkXSA9IGNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfYVtfaV07XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wiXCIuY29uY2F0KGtleSldID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wiXCIuY29uY2F0KGtleSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIGluZGl2aWR1YWwgZW5kcG9pbnRUaW1lb3V0IGNvbmZpZ1xuICAgICAgICBmb3IgKHZhciBfYiA9IDAsIF9jID0gT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9jW19iXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdW1wiXCIuY29uY2F0KGtleSldID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bXCJcIi5jb25jYXQoa2V5KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgICAgIHZhciBjaGFubmVsSWQgPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkO1xuICAgICAgICBpZiAoIU9iamVjdC52YWx1ZXMoRW51bXNfMS5DaGFubmVsSWQpLmluY2x1ZGVzKGNoYW5uZWxJZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhbm5lbElkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgICAgICB2YXIgY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24pO1xuICAgICAgICBmb3IgKHZhciBfZCA9IDAsIF9lID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5yZXF1aXJlZE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnM7IF9kIDwgX2UubGVuZ3RoOyBfZCsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gX2VbX2RdO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAnXCIuY29uY2F0KGtleSwgXCInIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vY1VzZXJBZ2VudCA9IHRoaXMuY29uZmlndXJhdGlvbi5vY1VzZXJBZ2VudDtcbiAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBMQ1cgRkNTIERldGFpbHMgb2YgdGhlIE9yZy5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLmdldExjd0Zjc0RldGFpbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1cmwsIGF4aW9zSW5zdGFuY2UsIHJlcXVlc3RIZWFkZXJzLCBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZGF0YSwgZXJyb3JfMSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN0YXJ0ZWRcIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGN3RmNzRGV0YWlsc1BhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gXCJHRVRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgaHR0cEhlYWRlcnNVdGlsc18xLmFkZE9jVXNlckFnZW50SGVhZGVyKSh0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdWNjZWVkZWRcIiwgXCJcIiwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTRkFJTEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgZmFpbGVkXCIsIFwiXCIsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfMSwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0Q2hhdENvbmZpZyA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIGJ5cGFzc0NhY2hlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGJ5cGFzc0NhY2hlID09PSB2b2lkIDApIHsgYnlwYXNzQ2FjaGUgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVybCwgYXhpb3NJbnN0YW5jZSwgcmVxdWVzdEhlYWRlcnMsIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhLCBlcnJvcl8yLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGU1RBUlRFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSAoMCwgdXVpZF8xLnV1aWR2NCkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdENvbmZpZ1BhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiP3JlcXVlc3RJZD1cIikuY29uY2F0KHJlcXVlc3RJZCwgXCImY2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGF4aW9zUmV0cnlIYW5kbGVyXzEuZGVmYXVsdCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIENvbnN0YW50c18xLmRlZmF1bHQuYnlwYXNzQ2FjaGVIZWFkZXJzKSwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZS5nZXQodXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gZGF0YS5MaXZlQ2hhdFZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRUVERUQsIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMiA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QoZXJyb3JfMildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0TFdJRGV0YWlscyA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCwgcmVxdWVzdEhlYWRlcnMsIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0sIHBhcmFtcywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELCBcIkdldCBMV0kgRGV0YWlscyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkID0gKDAsIHV1aWRfMS51dWlkdjQpKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5heGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0sXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldExXSURldGFpbHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcy5yZWNvbm5lY3RJZDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlZCBhdXRoIGVuZHBvaW50IGZvciBhdXRoZW50aWNhdGVkIGNoYXRzIGFuZCBhZGQgYXV0aCB0b2tlbiBpbiBoZWFkZXJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoICs9IFwiL1wiLmNvbmNhdChyZWNvbm5lY3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhLCBoZWFkZXJzLCBlcnJvcl8zLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhLCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzMsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl8zLCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl8zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZldGNoZXMgdGhlIGNoYXQgdG9rZW4gZnJvbSBPbW5pY2hhbm5lbCB0byBqb2luIFQxIHRocmVhZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0Q2hhdFRva2VuID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMsIGN1cnJlbnRSZXRyeUNvdW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDApIHsgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPT09IHZvaWQgMCkgeyBjdXJyZW50UmV0cnlDb3VudCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVmcmVzaFRva2VuLCBNc09jQm90QXBwbGljYXRpb25JZCwgbXVsdGlCb3QsIHJlcXVlc3RIZWFkZXJzLCBlbmRwb2ludCwgcmVxdWVzdFBhdGgsIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0sIHBhcmFtcywgdXJsLCBtZXRob2QsIG9wdGlvbnMsIGF4aW9zSW5zdGFuY2U7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHJlY29ubmVjdElkID0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMucmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMuY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVmcmVzaFRva2VuID0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMucmVmcmVzaFRva2VuLCBNc09jQm90QXBwbGljYXRpb25JZCA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLk1zT2NCb3RBcHBsaWNhdGlvbklkO1xuICAgICAgICAgICAgICAgIG11bHRpQm90ID0gKE1zT2NCb3RBcHBsaWNhdGlvbklkICYmIE1zT2NCb3RBcHBsaWNhdGlvbklkLmxlbmd0aCA+IDApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY3VycmVudFJldHJ5Q291bnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA9ICgwLCB1dWlkXzEudXVpZHY0KSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICBlbmRwb2ludCA9ICgwLCBlbmRwb2ludHNDcmVhdG9yc18xLmNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50KShjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IHRoaXMubGl2ZUNoYXRWZXJzaW9uLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID8gdHJ1ZSA6IGZhbHNlLCBtdWx0aUJvdCk7XG4gICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChlbmRwb2ludCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoICs9IFwiL1wiLmNvbmNhdChyZWNvbm5lY3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKE1zT2NCb3RBcHBsaWNhdGlvbklkICYmIE1zT2NCb3RBcHBsaWNhdGlvbklkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zWydNcy1PYy1Cb3QtQXBwbGljYXRpb24tSWQnXSA9IE1zT2NCb3RBcHBsaWNhdGlvbklkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5yZWZyZXNoVG9rZW4gPSAndHJ1ZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIkdFVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiAoY3VycmVudFJldHJ5Q291bnQgPiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUpID8gY3VycmVudFJldHJ5Q291bnQgOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHJldHJ5T240Mjk6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5LFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZGF0YSwgaGVhZGVycywgZXJyb3JfNCwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YSwgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0Lm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiRW1wdHkgZGF0YSByZWNlaXZlZCBmcm9tIGdldENoYXRUb2tlblwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzXzEuZGVmYXVsdC5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfNCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfNCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzQsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0UmVjb25uZWN0YWJsZUNoYXRzID0gZnVuY3Rpb24gKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkLCByZXF1ZXN0UGF0aCwgcmVxdWVzdEhlYWRlcnMsIHVybCwgbWV0aG9kLCBvcHRpb25zLCBheGlvc0luc3RhbmNlO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NUQVJURUQsIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyA9PT0gbnVsbCB8fCByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcy5yZXF1ZXN0SWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQsIFwiP2NoYW5uZWxJZD1cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZCk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdGFibGVDaGF0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhLCBoZWFkZXJzLCBlcnJvcl81LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhLCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfNSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfNSwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzUsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgICBTREsucHJvdG90eXBlLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eSA9IGZ1bmN0aW9uIChyZWNvbm5lY3RJZCwgb3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAob3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBvcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIHJlcXVlc3RIZWFkZXJzLCB1cmwsIG1ldGhvZCwgb3B0aW9ucywgYXhpb3NJbnN0YW5jZTtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZWNvbm5lY3RJZCk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMob3B0aW9uYWxQYXJhbXMgPT09IG51bGwgfHwgb3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbmFsUGFyYW1zLnJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIkdFVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF4aW9zSW5zdGFuY2UgPSBheGlvc18xLmRlZmF1bHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZGF0YSwgZXJyb3JfNiwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgb3B0aW9uYWxQYXJhbXMgPT09IG51bGwgfHwgb3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbmFsUGFyYW1zLnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuV0FSTiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCBvcHRpb25hbFBhcmFtcyA9PT0gbnVsbCB8fCBvcHRpb25hbFBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9uYWxQYXJhbXMucmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgUmVjb25uZWN0IEF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgb3B0aW9uYWxQYXJhbXMgPT09IG51bGwgfHwgb3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbmFsUGFyYW1zLnJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl82LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfNiwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfNik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLmdldEFnZW50QXZhaWxhYmlsaXR5ID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDApIHsgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0LCByZXF1ZXN0SGVhZGVycywgZGF0YSwgY2FjaE9iaiwgdGVtcEFyciwgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQsIFwiP2NoYW5uZWxJZD1sY3dcIik7XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSxcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMuaW5pdENvbnRleHQsIGdldENvbnRleHQgPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zLmdldENvbnRleHQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICBkYXRhID0gaW5pdENvbnRleHQgfHwge307XG4gICAgICAgICAgICAgICAgY2FjaE9iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgICAgICAgICAgICAgICAgXCJ3aWRnZXRJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGFfMS5DdXN0b21Db250ZXh0RGF0YS5zb3J0KGRhdGEuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgZGF0YS5jYWNoZUtleSA9ICgwLCBzaGEyNTZfMS5kZWZhdWx0KShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkudG9TdHJpbmcoZW5jX2hleF8xLmRlZmF1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzXCIpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvXzEuQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvXzEuRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEub3MgPSBPU0luZm9fMS5PU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRMb2NhbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlc18xLmRlZmF1bHQuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGxvY2FsZTogJ1wiLmNvbmNhdChkYXRhLmxvY2FsZSwgXCInXCIpKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBkYXRhXzEsIGhlYWRlcnMsIGVycm9yXzcsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV8xID0gcmVzcG9uc2UuZGF0YSwgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YV8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YV8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl83ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfNywgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzcsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl83KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKidcbiAgICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuc2Vzc2lvbkluaXQgPSBmdW5jdGlvbiAocmVxdWVzdElkLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCBheGlvc0luc3RhbmNlLCByZXRyeU9uNDI5LCByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQsIGRhdGEsIHJlcXVlc3RIZWFkZXJzLCBiYXNlUGF0aCwgcmVxdWVzdFBhdGgsIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0sIHBhcmFtcywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX2I7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsIFwiU2Vzc2lvbiBJbml0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHJ5T240MjkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkluaXQsXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFJldHJ5OiBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuICgwLCBTZXNzaW9uSW5pdFJldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGVycm9yLCByZXRyeU9uNDI5KTsgfSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVjb25uZWN0SWQgPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zLnJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMuaW5pdENvbnRleHQsIGdldENvbnRleHQgPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zLmdldENvbnRleHQ7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gX19hc3NpZ24oe30sIENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gYXV0aGVudGljYXRlZFVzZXJUb2tlblxuICAgICAgICAgICAgICAgICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGhcbiAgICAgICAgICAgICAgICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGg7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoYmFzZVBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCAoX2IgPSB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBfYikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoICs9IFwiL1wiLmNvbmNhdChyZWNvbm5lY3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc1wiKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mb18xLkJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mb18xLkRldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLm9zID0gT1NJbmZvXzEuT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzXzEuZGVmYXVsdC5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgbG9jYWxlOiAnXCIuY29uY2F0KGRhdGEubG9jYWxlLCBcIidcIikpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKF9hID0gdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBoZWFkZXJzLCBlcnJvcl84LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELCBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzggPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzgsIGRhdGEsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfOCwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU0RLLnByb3RvdHlwZS5jcmVhdGVDb252ZXJzYXRpb24gPSBmdW5jdGlvbiAocmVxdWVzdElkLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCBheGlvc0luc3RhbmNlLCByZXRyeU9uNDI5LCByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQsIGRhdGEsIHJlcXVlc3RIZWFkZXJzLCBiYXNlUGF0aCwgcmVxdWVzdFBhdGgsIHVybCwgbWV0aG9kLCBvcHRpb25zLCBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZGF0YV8yLCBoZWFkZXJzLCBlcnJvcl85LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIHZhciBfYjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVEFSVEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlPbjQyOSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZXRyeTogZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiAoMCwgU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShlcnJvciwgcmV0cnlPbjQyOSk7IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29ubmVjdElkID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcy5yZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQgPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zLmluaXRDb250ZXh0LCBnZXRDb250ZXh0ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcy5nZXRDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBfX2Fzc2lnbih7fSwgQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdENvbm5lY3RvckF1dGhQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRDb25uZWN0b3JQYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoYmFzZVBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL3dpZGdldEFwcC9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9jb252ZXJzYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdEhlYWRlcnMsIChfYiA9IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYltPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnJlY29ubmVjdElkID0gcmVjb25uZWN0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNoYW5uZWxJZCA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNcIikpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm9fMS5Ccm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mb18xLkRldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5vcyA9IE9TSW5mb18xLk9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdExvY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzXzEuZGVmYXVsdC5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBsb2NhbGU6ICdcIi5jb25jYXQoZGF0YS5sb2NhbGUsIFwiJ1wiKSkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfMiA9IHJlc3BvbnNlLmRhdGEsIGhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhXzIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhXzIucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVUNDRUVERUQsIFwiQ3JlYXRlIGNvdmVyc2F0aW9uIGNhbGwgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFfMl07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzkgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05GQUlMRUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfOSwgZGF0YSwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl85LCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl85O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLnNlc3Npb25DbG9zZSA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDApIHsgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZCwgcmVxdWVzdEhlYWRlcnMsIGRhdGEsIHVybCwgbWV0aG9kLCBvcHRpb25zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCwgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMuaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMuaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMuY2hhdElkO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICBkYXRhID0ge307XG4gICAgICAgICAgICAgICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG4gICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCArPSBcIiZpc1JlY29ubmVjdENoYXQ9dHJ1ZVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCArPSBcIiZpc1BlcnNpc3RlbnRDaGF0PXRydWVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGhlYWRlcnMsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGVycm9yXzEwLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCwgXCJTZXNzaW9uIENsb3NlIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xMCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8xMCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yXzEwLmNvZGUgPT09IENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAgICovXG4gICAgU0RLLnByb3RvdHlwZS52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCByZXF1ZXN0SGVhZGVycywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcy5jaGF0SWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQsIFwiL1wiKS5jb25jYXQoY2hhdElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJHRVRcIjtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGhlYWRlcnMsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGVycm9yXzExLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoX2EgPSByZXNwb25zZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXV0aENoYXRFeGlzdCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMTEgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzExLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTEsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yXzExLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UgPSBmdW5jdGlvbiAocmVxdWVzdElkLCBwb3N0Q2hhdFJlc3BvbnNlLCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDApIHsgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCByZXF1ZXN0UGF0aCwgYXhpb3NJbnN0YW5jZSwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdEhlYWRlcnMsIHVybCwgbWV0aG9kLCBvcHRpb25zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQsIFwiP2NoYW5uZWxJZD1cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZCk7XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSxcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBoZWFkZXJzLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBlcnJvcl8xMiwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xMiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzEyLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTIsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLmdldFN1cnZleUludml0ZUxpbmsgPSBmdW5jdGlvbiAoc3VydmV5T3duZXJJZCwgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHksIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCwgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdChzdXJ2ZXlPd25lcklkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMucmVxdWVzdElkO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgsIFwiL1wiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsIFwiL1wiKS5jb25jYXQoc3VydmV5T3duZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZGF0YSwgaGVhZGVycywgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZXJyb3JfMTMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhLCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8xMywgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzEzLCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl8xMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAgICogQHBhcmFtIGNoYXRJZCBDaGF0IHRocmVhZCBJZC5cbiAgICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0Q2hhdFRyYW5zY3JpcHRzID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgY2hhdElkLCB0b2tlbiwgZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgcmVxdWVzdFBhdGgsIGF4aW9zSW5zdGFuY2UsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24sIHJlcXVlc3RIZWFkZXJzLCB1cmwsIG1ldGhvZCwgb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgsIFwiL1wiKS5jb25jYXQoY2hhdElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zLmN1cnJlbnRMaXZlQ2hhdFZlcnNpb247XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0Lm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhvcml6YXRpb25dID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgsIFwiL1wiKS5jb25jYXQoY2hhdElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgsIFwiL1wiKS5jb25jYXQoY2hhdElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCwgXCIvXCIpLmNvbmNhdChjaGF0SWQsIFwiL1wiKS5jb25jYXQocmVxdWVzdElkLCBcIj9jaGFubmVsSWQ9XCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIkdFVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGRhdGEsIGhlYWRlcnMsIGVycm9yXzE0LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhLCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMTQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8xNCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzE0LCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl8xNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgcGVyc2lzdGVudCBjaGF0IGhpc3RvcnkgZm9yIGF1dGhlbnRpY2F0ZWQgdXNlcnMuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICAgKiBAcGFyYW0gZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IHBlcnNpc3RlbnQgY2hhdCBoaXN0b3J5LlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5ID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMgPT09IHZvaWQgMCkgeyBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcGFnZVNpemUsIHBhZ2VUb2tlbiwgZXJyb3JNZXNzYWdlLCByZXF1ZXN0UGF0aCwgYXhpb3NJbnN0YW5jZSwgcmVxdWVzdEhlYWRlcnMsIHBhcmFtcywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllTVEFSVEVELCBcIkdldCBQZXJzaXN0ZW50IENoYXQgSGlzdG9yeSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkID0gKDAsIHV1aWRfMS51dWlkdjQpKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPSBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcy5hdXRoZW50aWNhdGVkVXNlclRva2VuLCBwYWdlU2l6ZSA9IGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zLnBhZ2VTaXplLCBwYWdlVG9rZW4gPSBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcy5wYWdlVG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKCFhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFwiQXV0aGVudGljYXRlZCB1c2VyIHRva2VuIGlzIHJlcXVpcmVkIGZvciBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeVwiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3RvcnkgZmFpbGVkIC0gTWlzc2luZyBhdXRoZW50aWNhdGVkIHVzZXIgdG9rZW5cIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEF1dGhHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi93aWRnZXRhcHAvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvY29udmVyc2F0aW9uL2hpc3RvcnlcIik7XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSxcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgIGlmIChwYWdlVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQucGFnZVRva2VuXSA9IHBhZ2VUb2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2VTaXplID0gcGFnZVNpemUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGRhdGEsIGhlYWRlcnMsIGVycm9yXzE1LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZS5kYXRhLCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5HRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllTVUNDRUVERUQsIFwiR2V0IFBlcnNpc3RlbnQgQ2hhdCBIaXN0b3J5IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMTUgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3RvcnkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8xNSwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzE1LCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfMTUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZW1haWxUcmFuc2NyaXB0ID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgdG9rZW4sIGVtYWlsUmVxdWVzdEJvZHksIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDApIHsgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SGVhZGVycywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCwgXCI/Y2hhbm5lbElkPVwiKS5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdLFxuICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICAgICAgICAgICAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gXCIvXCIuY29uY2F0KE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQsIFwiP2NoYW5uZWxJZD1cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBoZWFkZXJzLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBlcnJvcl8xNiwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiRW1haWwgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMTYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3JfMTYsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaXNFeHBlY3RlZEF4aW9zRXJyb3JfMS5kZWZhdWx0KShlcnJvcl8xNiwgQ29uc3RhbnRzXzEuZGVmYXVsdC5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JfMTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmV0Y2ggZGF0YSBtYXNraW5nIGluZm8gb2YgdGhlIG9yZy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgICAqL1xuICAgIFNESy5wcm90b3R5cGUuZmV0Y2hEYXRhTWFza2luZ0luZm8gPSBmdW5jdGlvbiAocmVxdWVzdElkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCByZXF1ZXN0UGF0aCwgYXhpb3NJbnN0YW5jZSwgcmVxdWVzdEhlYWRlcnMsIHVybCwgbWV0aG9kLCBvcHRpb25zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSAoMCwgdXVpZF8xLnV1aWR2NCkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkKTtcbiAgICAgICAgICAgICAgICBheGlvc0luc3RhbmNlID0gYXhpb3NfMS5kZWZhdWx0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmRlZmF1bHQpKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHVybCA9IFwiXCIuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybCkuY29uY2F0KHJlcXVlc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcIkdFVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYWNrZW5kVGltZXIsIHJlc3BvbnNlLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgZGF0YSwgZXJyb3JfMTcsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZFRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgYXhpb3NJbnN0YW5jZShvcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xNyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLkVSUk9SLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcl8xNywgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpc0V4cGVjdGVkQXhpb3NFcnJvcl8xLmRlZmF1bHQpKGVycm9yXzE3LCBDb25zdGFudHNfMS5kZWZhdWx0LmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcl8xNyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0ID0gZnVuY3Rpb24gKHJlcXVlc3RJZCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHksIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDApIHsgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGltZXIsIHJlcXVlc3RQYXRoLCBheGlvc0luc3RhbmNlLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SGVhZGVycywgdXJsLCBtZXRob2QsIG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHRpbWVyID0gVGltZXJfMS5UaW1lci5USU1FUigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbF8xLkxvZ0xldmVsLklORk8sIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLCBcIi9cIikuY29uY2F0KHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5kZWZhdWx0KShheGlvc0luc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSxcbiAgICAgICAgICAgICAgICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkVXNlclRva2VuID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMuYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IFwiL1wiLmNvbmNhdChPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCwgXCIvXCIpLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZCwgXCIvXCIpLmNvbmNhdChyZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdENoYW5uZWxJZDtcbiAgICAgICAgICAgICAgICB1cmwgPSBcIlwiLmNvbmNhdCh0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmwpLmNvbmNhdChyZXF1ZXN0UGF0aCk7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAoX2EgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFja2VuZFRpbWVyLCByZXNwb25zZSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGhlYWRlcnMsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIGVycm9yXzE4LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmRUaW1lciA9IFRpbWVyXzEuVGltZXIuVElNRVIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGF4aW9zSW5zdGFuY2Uob3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuSU5GTywgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMTggPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5FUlJPUiwgRW51bXNfMS5PQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzE4LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTgsIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzE4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLnNlbmRUeXBpbmdJbmRpY2F0b3IgPSBmdW5jdGlvbiAocmVxdWVzdElkLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID09PSB2b2lkIDApIHsgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRpbWVyLCBjdXN0b21lckRpc3BsYXlOYW1lLCByZXF1ZXN0UGF0aCwgYXhpb3NJbnN0YW5jZSwgcmVxdWVzdEhlYWRlcnMsIHVybCwgbWV0aG9kLCBvcHRpb25zO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gRW51bXNfMS5MaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZSgpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgY3VzdG9tZXJEaXNwbGF5TmFtZSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcy5jdXN0b21lckRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBcIi9cIi5jb25jYXQoT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoLCBcIi9cIikuY29uY2F0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgYXhpb3NJbnN0YW5jZSA9IGF4aW9zXzEuZGVmYXVsdC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVycyA9IENvbnN0YW50c18xLmRlZmF1bHQuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgICAgICAgICAgICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnNbQ29uc3RhbnRzXzEuZGVmYXVsdC5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgdXJsID0gXCJcIi5jb25jYXQodGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsKS5jb25jYXQocmVxdWVzdFBhdGgpO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IChfYSA9IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJhY2tlbmRUaW1lciwgcmVzcG9uc2UsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBlcnJvcl8xOSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kVGltZXIgPSBUaW1lcl8xLlRpbWVyLlRJTUVSKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBheGlvc0luc3RhbmNlKG9wdGlvbnMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWxfMS5Mb2dMZXZlbC5JTkZPLCBFbnVtc18xLk9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzE5ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsXzEuTG9nTGV2ZWwuRVJST1IsIEVudW1zXzEuT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yXzE5LCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGlzRXhwZWN0ZWRBeGlvc0Vycm9yXzEuZGVmYXVsdCkoZXJyb3JfMTksIENvbnN0YW50c18xLmRlZmF1bHQuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yXzE5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgICAqIEBwYXJhbSBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIEVsYXBzZWQgdGltZSBpbiBtc1xuICAgICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgICAqIEBwYXJhbSBlcnJvciBFcnJvclxuICAgICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICAgKi9cbiAgICBTREsucHJvdG90eXBlLmxvZ1dpdGhMb2dnZXIgPSBmdW5jdGlvbiAobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgZGVzY3JpcHRpb24sIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCByZXF1ZXN0UGF5bG9hZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplcl8xLkxvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICAgICAgICBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IF9fYXNzaWduKHt9LCByZXF1ZXN0UGF5bG9hZCk7XG4gICAgICAgICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyXzEuTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyXzEuTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplcl8xLkxvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNhbml0aXplZFJlcXVlc3RIZWFkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgYXV0aFRva2VuRGV0YWlscyA9IHVuZGVmaW5lZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmIChyZXF1ZXN0SGVhZGVycykge1xuICAgICAgICAgICAgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSBfX2Fzc2lnbih7fSwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplcl8xLkxvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMoc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuYXRvYikge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbl07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IHRva2VuLnNwbGl0KFwiLlwiKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gd2luZG93LmF0b2IocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIganNvbkRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGx3aUNvbnRleHRzID0ganNvbkRhdGFbXCJsd2ljb250ZXh0c1wiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbkRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViOiBqc29uRGF0YVtcInN1YlwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHA6IGpzb25EYXRhW1wiZXhwXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGx3aUNvbnRleHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGx3aUNvbnRleHRzRGF0YSA9IEpTT04ucGFyc2UobHdpQ29udGV4dHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXJfMS5Mb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMobHdpQ29udGV4dHNEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW5EZXRhaWxzLmx3aUNvbnRleHRzID0gbHdpQ29udGV4dHNEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjdXN0b21EYXRhID0ge1xuICAgICAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgICBSZWdpb246IHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZS5kYXRhLlJlZ2lvbixcbiAgICAgICAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBIdHRwUmVxdWVzdFJlc3BvbnNlVGltZTogaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsXG4gICAgICAgICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHNfMS5kZWZhdWx0LnRyYW5zYWN0aW9uaWRdLFxuICAgICAgICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgICAgICAgUmVxdWVzdE1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IGVycm9yID8gKF9hID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGF0dXMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciA/ICgoX2IgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRhdGEpIHx8IGVycm9yIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLFxuICAgICAgICAgICAgUmVxdWVzdEhlYWRlcnM6IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgUmVzcG9uc2VFcnJvcmNvZGU6IGVycm9yID8gKF9kID0gKF9jID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5oZWFkZXJzKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZXJyb3Jjb2RlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgQXV0aFRva2VuRGV0YWlsczogYXV0aFRva2VuRGV0YWlsc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICAgIH07XG4gICAgU0RLLnByb3RvdHlwZS5hZGREZWZhdWx0SGVhZGVycyA9IGZ1bmN0aW9uIChyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKSB7XG4gICAgICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICgwLCBodHRwSGVhZGVyc1V0aWxzXzEuYWRkT2NVc2VyQWdlbnRIZWFkZXIpKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgdGhpcy5zZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgfTtcbiAgICBTREsuZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnID0ge1xuICAgICAgICBnZXRDaGF0Q29uZmlnOiAxMjAwMDAsXG4gICAgICAgIGdldExXSURldGFpbHM6IDE1MDAwLFxuICAgICAgICBnZXRDaGF0VG9rZW46IDE1MDAwLFxuICAgICAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgICAgIHNlc3Npb25DbG9zZTogMTUwMDAsXG4gICAgICAgIGdldFJlY29ubmVjdGFibGVDaGF0czogMTUwMDAsXG4gICAgICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgICAgIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2U6IDE1MDAwLFxuICAgICAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxNTAwMCxcbiAgICAgICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICAgICAgZW1haWxUcmFuc2NyaXB0OiA1MDAwLFxuICAgICAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogNTAwMCxcbiAgICAgICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgICAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgICAgIHNlbmRUeXBpbmdJbmRpY2F0b3I6IDUwMDAsXG4gICAgICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMCxcbiAgICAgICAgZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5OiAxNTAwMFxuICAgIH07XG4gICAgU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uID0ge1xuICAgICAgICBhdXRoQ29kZU5vbmNlOiAoMCwgdXVpZF8xLnV1aWR2NCkoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgICAgICBnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmU6IDEwMDAwLFxuICAgICAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiB0cnVlLFxuICAgICAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogNSxcbiAgICAgICAgZGVmYXVsdFJlcXVlc3RUaW1lb3V0OiB1bmRlZmluZWQsXG4gICAgICAgIHJlcXVlc3RUaW1lb3V0Q29uZmlnOiBTREsuZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnLFxuICAgICAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgICB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnOiB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnc18xLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLFxuICAgICAgICBvY1VzZXJBZ2VudDogW11cbiAgICB9O1xuICAgIHJldHVybiBTREs7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gU0RLO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ29uc3RhbnRzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vQ29tbW9uL0NvbnN0YW50c1wiKSk7XG52YXIgT0NTREtMb2dnZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9Db21tb24vT0NTREtMb2dnZXJcIikpO1xudmFyIFNES18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL1NES1wiKSk7XG52YXIgU0RLUHJvdmlkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU0RLUHJvdmlkZXIoKSB7XG4gICAgfVxuICAgIFNES1Byb3ZpZGVyLmdldFNESyA9IGZ1bmN0aW9uIChvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24sIGxvZ2dlcikge1xuICAgICAgICB2YXIgaWxvZ2dlciA9IG5ldyBPQ1NES0xvZ2dlcl8xLmRlZmF1bHQobG9nZ2VyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTREtfMS5kZWZhdWx0KHtcbiAgICAgICAgICAgIGNoYW5uZWxJZDogb21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZCB8fCBDb25zdGFudHNfMS5kZWZhdWx0LmRlZmF1bHRDaGFubmVsSWQsXG4gICAgICAgICAgICBvcmdJZDogb21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgICAgICAgb3JnVXJsOiBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsLFxuICAgICAgICAgICAgd2lkZ2V0SWQ6IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgICAgICB9LCBjb25maWd1cmF0aW9uIHx8IHt9LCBpbG9nZ2VyKTtcbiAgICB9O1xuICAgIHJldHVybiBTREtQcm92aWRlcjtcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBTREtQcm92aWRlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Ccm93c2VySW5mbyA9IGV4cG9ydHMuVU5LTk9XTl9WRVJTSU9OID0gdm9pZCAwO1xudmFyIEVudW1zXzEgPSByZXF1aXJlKFwiLi4vQ29tbW9uL0VudW1zXCIpO1xuLy8gUG9ydGVkIGZyb20gaHR0cHM6Ly9kZXYuYXp1cmUuY29tL2R5bmFtaWNzY3JtL09uZUNSTS9fZ2l0L0NSTS5PbW5pQ2hhbm5lbC5MaXZlQ2hhdFdpZGdldD9wYXRoPS9zcmMvTGl2ZUNoYXRMb2FkZXIvVXRpbGl0eS9Ccm93c2VySW5mby50c1xudmFyIFJFR0VYX1ZFUlNJT04gPSBcIihbXFxcXGQsLl0rKVwiO1xuZXhwb3J0cy5VTktOT1dOX1ZFUlNJT04gPSBcIlVcIjtcbnZhciBCcm93c2VySW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCcm93c2VySW5mbygpIHtcbiAgICB9XG4gICAgQnJvd3NlckluZm8uZ2V0VXNlckFnZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VyQWdlbnQoKTtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLnVzZXJBZ2VudENvbnRhaW5zU3RyaW5nID0gZnVuY3Rpb24gKHNlYXJjaFN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRVc2VyQWdlbnQoKS5pbmRleE9mKHNlYXJjaFN0cmluZykgPiAtMTtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLmlzQ2hyb21lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhFbnVtc18xLkJyb3dzZXJWZW5kb3IuQ0hST01FKSAmJlxuICAgICAgICAgICAgIXRoaXMudXNlckFnZW50Q29udGFpbnNTdHJpbmcoRW51bXNfMS5Ccm93c2VyVmVuZG9yLkVER0UpICYmXG4gICAgICAgICAgICAhdGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhFbnVtc18xLkJyb3dzZXJWZW5kb3IuRURHRV9DSFJPTUlVTSk7XG4gICAgfTtcbiAgICBCcm93c2VySW5mby5pc0llID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhcIlRyaWRlbnRcIik7XG4gICAgfTtcbiAgICBCcm93c2VySW5mby5pc0VkZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJBZ2VudENvbnRhaW5zU3RyaW5nKEVudW1zXzEuQnJvd3NlclZlbmRvci5FREdFKSB8fFxuICAgICAgICAgICAgdGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhFbnVtc18xLkJyb3dzZXJWZW5kb3IuRURHRV9DSFJPTUlVTSk7XG4gICAgfTtcbiAgICBCcm93c2VySW5mby5pc09wZXJhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VyQWdlbnRDb250YWluc1N0cmluZyhcIk9QUi9cIik7XG4gICAgfTtcbiAgICBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVyYSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5Ccm93c2VyVmVuZG9yLk9QRVJBO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRWRnZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5Ccm93c2VyVmVuZG9yLkVER0U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNDaHJvbWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuQnJvd3NlclZlbmRvci5DSFJPTUU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXNlckFnZW50Q29udGFpbnNTdHJpbmcoRW51bXNfMS5Ccm93c2VyVmVuZG9yLkZJUkVGT1gpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5Ccm93c2VyVmVuZG9yLkZJUkVGT1g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXNlckFnZW50Q29udGFpbnNTdHJpbmcoRW51bXNfMS5Ccm93c2VyVmVuZG9yLlNBRkFSSSkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLkJyb3dzZXJWZW5kb3IuU0FGQVJJO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzSWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuQnJvd3NlclZlbmRvci5JRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRW51bXNfMS5Ccm93c2VyVmVuZG9yLlVOS05PV047XG4gICAgfTtcbiAgICBCcm93c2VySW5mby5nZXRCcm93c2VyVmVyc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGdldEllVmVyc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1c2VyQWdlbnQgPSBfdGhpcy5nZXRVc2VyQWdlbnQoKTtcbiAgICAgICAgICAgIHZhciBjbGFzc2ljSWVWZXJzaW9uTWF0Y2hlcyA9IHVzZXJBZ2VudC5tYXRjaChuZXcgUmVnRXhwKEVudW1zXzEuQnJvd3NlclZlbmRvci5JRSArIFwiIFwiICsgUkVHRVhfVkVSU0lPTikpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNlY3VyaXR5L2RldGVjdC1ub24tbGl0ZXJhbC1yZWdleHBcbiAgICAgICAgICAgIGlmIChjbGFzc2ljSWVWZXJzaW9uTWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2ljSWVWZXJzaW9uTWF0Y2hlc1sxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZVZlcnNpb25NYXRjaGVzID0gdXNlckFnZW50Lm1hdGNoKG5ldyBSZWdFeHAoXCJydjpcIiArIFJFR0VYX1ZFUlNJT04pKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBzZWN1cml0eS9kZXRlY3Qtbm9uLWxpdGVyYWwtcmVnZXhwXG4gICAgICAgICAgICBpZiAoaWVWZXJzaW9uTWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZVZlcnNpb25NYXRjaGVzWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGdldE90aGVyVmVyc2lvbiA9IGZ1bmN0aW9uIChicm93c2VyU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoYnJvd3NlclN0cmluZyA9PT0gRW51bXNfMS5Ccm93c2VyVmVuZG9yLlNBRkFSSSkge1xuICAgICAgICAgICAgICAgIGJyb3dzZXJTdHJpbmcgPSBcIlZlcnNpb25cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChicm93c2VyU3RyaW5nID09PSBFbnVtc18xLkJyb3dzZXJWZW5kb3IuT1BFUkEpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyU3RyaW5nID0gXCJPUFJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChicm93c2VyU3RyaW5nID09PSBFbnVtc18xLkJyb3dzZXJWZW5kb3IuRURHRSkge1xuICAgICAgICAgICAgICAgIGJyb3dzZXJTdHJpbmcgPSBcIkVkZ2U/XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IF90aGlzLmdldFVzZXJBZ2VudCgpLm1hdGNoKG5ldyBSZWdFeHAoYnJvd3NlclN0cmluZyArIFwiL1wiICsgUkVHRVhfVkVSU0lPTikpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNlY3VyaXR5L2RldGVjdC1ub24tbGl0ZXJhbC1yZWdleHBcbiAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5VTktOT1dOX1ZFUlNJT047XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmlzSWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEllVmVyc2lvbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRPdGhlclZlcnNpb24odGhpcy5nZXRCcm93c2VyTmFtZSgpKTtcbiAgICB9O1xuICAgIEJyb3dzZXJJbmZvLnVzZXJBZ2VudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OyB9O1xuICAgIHJldHVybiBCcm93c2VySW5mbztcbn0oKSk7XG5leHBvcnRzLkJyb3dzZXJJbmZvID0gQnJvd3NlckluZm87XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ3VzdG9tQ29udGV4dERhdGEgPSB2b2lkIDA7XG52YXIgQ3VzdG9tQ29udGV4dERhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ3VzdG9tQ29udGV4dERhdGEoKSB7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgQ3VzdG9tQ29udGV4dERhdGEuc29ydCA9IGZ1bmN0aW9uIChjdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB2YXIgdGVtcEFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBPYmplY3Qua2V5cyhjdXN0b21Db250ZXh0RGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoY3VzdG9tQ29udGV4dERhdGEgJiYgY3VzdG9tQ29udGV4dERhdGFbXCJcIi5jb25jYXQoa2V5KV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0geyBcImtleVwiOiBrZXksIFwidmFsdWVcIjogY3VzdG9tQ29udGV4dERhdGFbXCJcIi5jb25jYXQoa2V5KV0gfTtcbiAgICAgICAgICAgICAgICB0ZW1wQXJyLnB1c2gob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHRlbXBBcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgdmFyIGtleUEgPSBhLmtleS50b1VwcGVyQ2FzZSgpOyAvLyBpZ25vcmUgdXBwZXIgYW5kIGxvd2VyY2FzZVxuICAgICAgICAgICAgdmFyIGtleUIgPSBiLmtleS50b1VwcGVyQ2FzZSgpOyAvLyBpZ25vcmUgdXBwZXIgYW5kIGxvd2VyY2FzZVxuICAgICAgICAgICAgaWYgKGtleUEgPCBrZXlCKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleUEgPiBrZXlCKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0ZW1wQXJyO1xuICAgIH07XG4gICAgcmV0dXJuIEN1c3RvbUNvbnRleHREYXRhO1xufSgpKTtcbmV4cG9ydHMuQ3VzdG9tQ29udGV4dERhdGEgPSBDdXN0b21Db250ZXh0RGF0YTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EZXZpY2VJbmZvID0gdm9pZCAwO1xudmFyIEVudW1zXzEgPSByZXF1aXJlKFwiLi4vQ29tbW9uL0VudW1zXCIpO1xuLy8gUG9ydGVkIGZyb20gaHR0cHM6Ly9kZXYuYXp1cmUuY29tL2R5bmFtaWNzY3JtL09uZUNSTS9fZ2l0L0NSTS5PbW5pQ2hhbm5lbC5MaXZlQ2hhdFdpZGdldD9wYXRoPS9zcmMvTGl2ZUNoYXRMb2FkZXIvVXRpbGl0eS9EZXZpY2VJbmZvLnRzJnZlcnNpb249R0JyZWxlYXNlXG52YXIgRGV2aWNlSW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZXZpY2VJbmZvKCkge1xuICAgIH1cbiAgICBEZXZpY2VJbmZvLmdldERldmljZVR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtb2JpbGUgPSAvKGFuZHJvaWR8aXBvZHx3aW5kb3dzIHBob25lfHdwZGVza3RvcHx3aW5kb3dzIGNlfGJsYWNrYmVycnlcXHcqfG1lZWdvfHdlYm9zfHBhbG18c3ltYmlhbnxwZGF8XFx3Kj9tb2JpbGVcXHcqP3xcXHcqP3Bob25lXFx3Kj8pL2k7XG4gICAgICAgIHZhciB0YWJsZXQgPSAvdGFibGV0fGlwYWQvaTtcbiAgICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKG1vYmlsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLkRldmljZVR5cGUuTW9iaWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCh0YWJsZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5EZXZpY2VUeXBlLlRhYmxldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRW51bXNfMS5EZXZpY2VUeXBlLkRlc2t0b3A7XG4gICAgfTtcbiAgICByZXR1cm4gRGV2aWNlSW5mbztcbn0oKSk7XG5leHBvcnRzLkRldmljZUluZm8gPSBEZXZpY2VJbmZvO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55Ki9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMgKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZGV2LmF6dXJlLmNvbS9keW5hbWljc2NybS9PbmVDUk0vX2dpdC9DUk0uT21uaWNoYW5uZWwuSUMzQ2xpZW50P3BhdGg9L3NyYy9Db21tb24vRXZlbnRNYW5hZ2VyLnRzJnZlcnNpb249R0JtYXN0ZXJcbnZhciBFdmVudE1hbmFnZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKCkge1xuICAgIH1cbiAgICBFdmVudE1hbmFnZXIucmFpc2VDdXN0b21FdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIHBheWxvYWQpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gRXZlbnRNYW5hZ2VyLmNyZWF0ZUN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgcGF5bG9hZCk7XG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjdXN0b20gZXZlbnQgYmFzZWQgb24gdGhlIGV2ZW50TmFtZSBhbmQgcGF5bG9hZFxuICAgICAqIFRoZSBjdXN0b20gZXZlbnQgaXMgZGlzcGF0Y2gtY29tcGF0aWJsZSBhY3Jvc3MgYnJvd3NlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lOiBOYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge2FueX0gcGF5bG9hZDogVGhlIGV2ZW50IHBheWxvYWQuXG4gICAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fTogQ3VzdG9tRXZlbnQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgRXZlbnRNYW5hZ2VyLmNyZWF0ZUN1c3RvbUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgcGF5bG9hZCkge1xuICAgICAgICB2YXIgZXZlbnREZXRhaWxzID0gcGF5bG9hZCA/IHtcbiAgICAgICAgICAgIGRldGFpbDogcGF5bG9hZFxuICAgICAgICB9IDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZXZlbnQgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRm9yIG5vbiBJRTExIHNjZW5hcmlvcywgY3VzdG9tZXZlbnQgb2JqZWN0IGNhbiBiZSBkaXNwYXRjaGVkXG4gICAgICAgICAgICBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIGV2ZW50RGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIElFMTEgc2NlbmFyaW8sIHdoZXJlIGN1c3RvbWV2ZW50IG9iamVjdCBjYW5ub3QgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpO1xuICAgICAgICAgICAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZXZlbnREZXRhaWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRNYW5hZ2VyO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50TWFuYWdlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Mb2dnaW5nU2FuaXRpemVyID0gdm9pZCAwO1xudmFyIENvbnN0YW50c18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9Db21tb24vQ29uc3RhbnRzXCIpKTtcbnZhciBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCIpKTtcbnZhciBMb2dnaW5nU2FuaXRpemVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvZ2dpbmdTYW5pdGl6ZXIoKSB7XG4gICAgfVxuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyA9IGZ1bmN0aW9uIChjdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChjdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICAgICAgKF9hID0gT2JqZWN0LmtleXMoY3VzdG9tQ29udGV4dERhdGEpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yRWFjaChmdW5jdGlvbiAoY29udGV4dEtleSkge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAoKF9hID0gY3VzdG9tQ29udGV4dERhdGFbXCJcIi5jb25jYXQoY29udGV4dEtleSldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ29udGV4dERhdGFbXCJcIi5jb25jYXQoY29udGV4dEtleSldLnZhbHVlID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2UgPSBmdW5jdGlvbiAocHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChwcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHByZUNoYXRSZXNwb25zZSkuZm9yRWFjaChmdW5jdGlvbiAocmVzcG9uc2VLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlQ2hhdFJlc3BvbnNlW1wiXCIuY29uY2F0KHJlc3BvbnNlS2V5KV0gJiYgcmVzcG9uc2VLZXkgIT09ICdUeXBlJykge1xuICAgICAgICAgICAgICAgICAgICBwcmVDaGF0UmVzcG9uc2VbXCJcIi5jb25jYXQocmVzcG9uc2VLZXkpXSA9IENvbnN0YW50c18xLmRlZmF1bHQuaGlkZGVuQ29udGVudFBsYWNlaG9sZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmluY2x1ZGVzKCdsb25naXR1ZGUnKSkge1xuICAgICAgICAgICAgICAgIGRhdGFbJ2xvbmdpdHVkZSddID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkuaW5jbHVkZXMoJ2xhdGl0dWRlJykpIHtcbiAgICAgICAgICAgICAgICBkYXRhWydsYXRpdHVkZSddID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBBdXRoZW50aWNhdGlvblVzZXJUb2tlbiA9IGZ1bmN0aW9uIChoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykuaW5jbHVkZXMoT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aGVudGljYXRlZFVzZXJUb2tlbikpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykuaW5jbHVkZXMoT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aENvZGVOb25jZSkpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhDb2RlTm9uY2VdID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykuaW5jbHVkZXMoT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQuYXV0aG9yaXphdGlvbikpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnNfMS5kZWZhdWx0LmF1dGhvcml6YXRpb25dID0gQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQXV0aGVudGljYXRpb25Vc2VyVG9rZW4oaGVhZGVycyk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhoZWFkZXJzKS5pbmNsdWRlcyhPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRob3JpemF0aW9uKSkge1xuICAgICAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzXzEuZGVmYXVsdC5hdXRob3JpemF0aW9uXSA9IENvbnN0YW50c18xLmRlZmF1bHQuaGlkZGVuQ29udGVudFBsYWNlaG9sZGVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUmVxdWVzdFBheWxvYWREYXRhID0gZnVuY3Rpb24gKGNvbmZpZ09iamVjdCkge1xuICAgICAgICBpZiAoY29uZmlnT2JqZWN0ID09PSBudWxsIHx8IGNvbmZpZ09iamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnT2JqZWN0LmRhdGEpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdPYmplY3QuZGF0YSA9PT0gJ3N0cmluZycpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGNvbmZpZ09iamVjdC5kYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5pbmNsdWRlcygncHJlQ2hhdFJlc3BvbnNlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShkYXRhLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5pbmNsdWRlcygnY3VzdG9tQ29udGV4dERhdGEnKSkge1xuICAgICAgICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBjb25maWdPYmplY3QuZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCBpcyBiZXR0ZXIgdG8gcGFzcyB0aGUgc3RyaW5nIHRvIHNlYXJjaCB2aWEgcmVnZXggZm9yIHNwZWNpZmljIFBJLlxuICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdC5kYXRhID0gTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVtYWlsRGF0YUZyb21FcnJvcihjb25maWdPYmplY3QuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFbWFpbERhdGFGcm9tRXJyb3IgPSBmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgICBwYXlsb2FkID0gcGF5bG9hZC5yZXBsYWNlKHRoaXMuZW1haWxSZWdleCwgQ29uc3RhbnRzXzEuZGVmYXVsdC5oaWRkZW5Db250ZW50UGxhY2Vob2xkZXIpO1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9O1xuICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBBeGlvc0Vycm9yU2Vuc2l0aXZlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChlcnJvck9iamVjdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2s7XG4gICAgICAgIGlmIChlcnJvck9iamVjdC5pc0F4aW9zRXJyb3IpIHtcbiAgICAgICAgICAgIGlmICgoX2EgPSBlcnJvck9iamVjdCA9PT0gbnVsbCB8fCBlcnJvck9iamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JPYmplY3QuY29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVhZGVycykge1xuICAgICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBBdXRoZW50aWNhdGlvblVzZXJUb2tlbigoX2IgPSBlcnJvck9iamVjdCA9PT0gbnVsbCB8fCBlcnJvck9iamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JPYmplY3QuY29uZmlnKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGVhZGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKF9jID0gZXJyb3JPYmplY3QgPT09IG51bGwgfHwgZXJyb3JPYmplY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yT2JqZWN0LmNvbmZpZykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmlwUmVxdWVzdFBheWxvYWREYXRhKGVycm9yT2JqZWN0ID09PSBudWxsIHx8IGVycm9yT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvck9iamVjdC5jb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChfZSA9IChfZCA9IGVycm9yT2JqZWN0ID09PSBudWxsIHx8IGVycm9yT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvck9iamVjdC5yZXNwb25zZSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmNvbmZpZykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLmRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmlwUmVxdWVzdFBheWxvYWREYXRhKChfZiA9IGVycm9yT2JqZWN0ID09PSBudWxsIHx8IGVycm9yT2JqZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvck9iamVjdC5yZXNwb25zZSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLmNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKF9oID0gKF9nID0gZXJyb3JPYmplY3QgPT09IG51bGwgfHwgZXJyb3JPYmplY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yT2JqZWN0LnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cuY29uZmlnKSA9PT0gbnVsbCB8fCBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2guaGVhZGVycykge1xuICAgICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBBdXRoZW50aWNhdGlvblVzZXJUb2tlbigoX2sgPSAoX2ogPSBlcnJvck9iamVjdCA9PT0gbnVsbCB8fCBlcnJvck9iamVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3JPYmplY3QucmVzcG9uc2UpID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5jb25maWcpID09PSBudWxsIHx8IF9rID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfay5oZWFkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChlcnJvck9iamVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChlcnJvck9iamVjdCAmJiB0eXBlb2YgZXJyb3JPYmplY3QgPT09ICdvYmplY3QnICYmICgoX2EgPSBPYmplY3Qua2V5cyhlcnJvck9iamVjdCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zdHJpcEF4aW9zRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yT2JqZWN0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9nZ2luZ1Nhbml0aXplci5lbWFpbFJlZ2V4ID0gL1thLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9L2c7XG4gICAgcmV0dXJuIExvZ2dpbmdTYW5pdGl6ZXI7XG59KCkpO1xuZXhwb3J0cy5Mb2dnaW5nU2FuaXRpemVyID0gTG9nZ2luZ1Nhbml0aXplcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PU0luZm8gPSB2b2lkIDA7XG52YXIgRW51bXNfMSA9IHJlcXVpcmUoXCIuLi9Db21tb24vRW51bXNcIik7XG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2Rldi5henVyZS5jb20vZHluYW1pY3Njcm0vT25lQ1JNL19naXQvQ1JNLk9tbmlDaGFubmVsLkxpdmVDaGF0V2lkZ2V0P3BhdGg9L3NyYy9MaXZlQ2hhdExvYWRlci9VdGlsaXR5L09TSW5mby50cyZ2ZXJzaW9uPUdCcmVsZWFzZVxudmFyIE9TSW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPU0luZm8oKSB7XG4gICAgfVxuICAgIE9TSW5mby5nZXRPc1R5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3aW4gPSAvKHdpbmRvd3N8d2luMzIpL2k7XG4gICAgICAgIHZhciB3aW5ydCA9IC8gYXJtOy9pO1xuICAgICAgICB2YXIgd2lucGhvbmUgPSAvd2luZG93c1xcc3Bob25lXFxzXFxkK1xcLlxcZCsvaTtcbiAgICAgICAgdmFyIG9zeCA9IC8obWFjaW50b3NofG1hYyBvcyB4KS9pO1xuICAgICAgICB2YXIgaW9zID0gLyhpUGFkfGlQaG9uZXxpUG9kKSg/PS4qbGlrZSBNYWMgT1MgWCkvaTtcbiAgICAgICAgdmFyIGxpbnV4ID0gLyhsaW51eHxqb2xpfFtreGxuXT91YnVudHV8ZGViaWFufFtvcGVuXSpzdXNlfGdlbnRvb3xhcmNofHNsYWNrd2FyZXxmZWRvcmF8bWFuZHJpdmF8Y2VudG9zfHBjbGludXhvc3xyZWRoYXR8emVud2Fsa3xjcm9zKS9pO1xuICAgICAgICB2YXIgYW5kcm9pZCA9IC9hbmRyb2lkL2k7XG4gICAgICAgIHZhciB1c2VyQWdlbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsgfTtcbiAgICAgICAgaWYgKHVzZXJBZ2VudCgpLm1hdGNoKHdpbnBob25lKSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuT3BlcmF0aW5nU3lzdGVtLldJTkRPV1NfUEhPTkU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJBZ2VudCgpLm1hdGNoKHdpbnJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIEVudW1zXzEuT3BlcmF0aW5nU3lzdGVtLldJTkRPV1NfUlQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJBZ2VudCgpLm1hdGNoKGlvcykpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLk9wZXJhdGluZ1N5c3RlbS5JT1M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJBZ2VudCgpLm1hdGNoKGFuZHJvaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5PcGVyYXRpbmdTeXN0ZW0uQU5EUk9JRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckFnZW50KCkubWF0Y2gobGludXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gRW51bXNfMS5PcGVyYXRpbmdTeXN0ZW0uTElOVVg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJBZ2VudCgpLm1hdGNoKG9zeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLk9wZXJhdGluZ1N5c3RlbS5NQUNPU1g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJBZ2VudCgpLm1hdGNoKHdpbikpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnVtc18xLk9wZXJhdGluZ1N5c3RlbS5XSU5ET1dTO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFbnVtc18xLk9wZXJhdGluZ1N5c3RlbS5VTktOT1dOO1xuICAgIH07XG4gICAgcmV0dXJuIE9TSW5mbztcbn0oKSk7XG5leHBvcnRzLk9TSW5mbyA9IE9TSW5mbztcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENvbnN0YW50c18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9Db21tb24vQ29uc3RhbnRzXCIpKTtcbnZhciBheGlvc19yZXRyeV8xID0gcmVxdWlyZShcImF4aW9zLXJldHJ5XCIpO1xudmFyIGF4aW9zUmV0cnlIYW5kbGVyXzEgPSByZXF1aXJlKFwiLi4vVXRpbHMvYXhpb3NSZXRyeUhhbmRsZXJcIik7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xudmFyIHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyID0gZnVuY3Rpb24gKGVycm9yLCByZXRyeU9uNDI5KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgIGlmICgoX2EgPSBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGF0dXMpIHtcbiAgICAgICAgc3dpdGNoIChlcnJvci5yZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzXzEuZGVmYXVsdC50b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlOlxuICAgICAgICAgICAgICAgIGlmIChyZXRyeU9uNDI5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDb25zdGFudHNfMS5kZWZhdWx0LmJhZFJlcXVlc3RTdGF0dXNDb2RlOlxuICAgICAgICAgICAgICAgIGlmICgoKF9jID0gKF9iID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oZWFkZXJzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZXJyb3Jjb2RlKSAmJiBwYXJzZUludChlcnJvci5yZXNwb25zZS5oZWFkZXJzLmVycm9yY29kZSkgPT09IENvbnN0YW50c18xLmRlZmF1bHQub3V0T2ZPZmZpY2VFcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAoMCwgYXhpb3NSZXRyeUhhbmRsZXJfMS5pc1JldHJ5YWJsZUVycm9yKShlcnJvcikgfHwgKDAsIGF4aW9zX3JldHJ5XzEuaXNOZXR3b3JrRXJyb3IpKGVycm9yKSB8fCAoKF9kID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5zdGF0dXMpID09IDAgfHwgISgoX2UgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICgwLCBheGlvc1JldHJ5SGFuZGxlcl8xLmlzUmV0cnlhYmxlRXJyb3IpKGVycm9yKSB8fCAoMCwgYXhpb3NfcmV0cnlfMS5pc05ldHdvcmtFcnJvcikoZXJyb3IpIHx8ICgoX2YgPSBlcnJvci5yZXNwb25zZSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnN0YXR1cykgPT0gMCB8fCAhKChfZyA9IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cuc3RhdHVzKTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcyAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFRlbGVtZXRyeUhlbHBlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZWxlbWV0cnlIZWxwZXIoKSB7XG4gICAgfVxuICAgIFRlbGVtZXRyeUhlbHBlci5HRVRURUxFTUVUUllFVkVOVERBVEEgPSBmdW5jdGlvbiAodGVsZW1ldHJ5RXZlbnQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHZhciBsb2dEYXRhID0ge1xuICAgICAgICAgICAgRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogY3VzdG9tRGF0YS5FbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgSHR0cFJlcXVlc3RSZXNwb25zZVRpbWU6IGN1c3RvbURhdGEuSHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsXG4gICAgICAgICAgICBFdmVudDogdGVsZW1ldHJ5RXZlbnQsXG4gICAgICAgICAgICBFeGNlcHRpb25EZXRhaWxzOiBjdXN0b21EYXRhLkV4Y2VwdGlvbkRldGFpbHMsXG4gICAgICAgICAgICBSZWdpb246IGN1c3RvbURhdGEuUmVnaW9uLFxuICAgICAgICAgICAgUmVxdWVzdElkOiBjdXN0b21EYXRhLlJlcXVlc3RJZCxcbiAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQ6IGN1c3RvbURhdGEuVHJhbnNhY3Rpb25JZCxcbiAgICAgICAgICAgIFJlcXVlc3RIZWFkZXJzOiBjdXN0b21EYXRhLlJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgUmVxdWVzdFBheWxvYWQ6IGN1c3RvbURhdGEuUmVxdWVzdFBheWxvYWQsXG4gICAgICAgICAgICBSZXF1ZXN0UGF0aDogY3VzdG9tRGF0YS5SZXF1ZXN0UGF0aCxcbiAgICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IGN1c3RvbURhdGEuUmVxdWVzdE1ldGhvZCxcbiAgICAgICAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogY3VzdG9tRGF0YS5SZXNwb25zZVN0YXR1c0NvZGUsXG4gICAgICAgICAgICBSZXNwb25zZUVycm9yY29kZTogY3VzdG9tRGF0YS5SZXNwb25zZUVycm9yY29kZSxcbiAgICAgICAgICAgIEF1dGhUb2tlbkRldGFpbHM6IGN1c3RvbURhdGEuQXV0aFRva2VuRGV0YWlsc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbG9nRGF0YTtcbiAgICB9O1xuICAgIHJldHVybiBUZWxlbWV0cnlIZWxwZXI7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gVGVsZW1ldHJ5SGVscGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRpbWVyID0gdm9pZCAwO1xudmFyIFRpbWVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbWVyKCkge1xuICAgIH1cbiAgICBUaW1lci5USU1FUiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpbWVTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0IG1pbGxpU2Vjb25kc0VsYXBzZWQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRpbWVTdGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gVGltZXI7XG59KCkpO1xuZXhwb3J0cy5UaW1lciA9IFRpbWVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYXhpb3NSZXRyeUhhbmRsZXJXaXRoTm90Rm91bmQgPSBleHBvcnRzLmlzUmV0cnlhYmxlRXJyb3IgPSB2b2lkIDA7XG52YXIgYXhpb3NfcmV0cnlfMSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiYXhpb3MtcmV0cnlcIikpO1xudmFyIENvbnN0YW50c18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9Db21tb24vQ29uc3RhbnRzXCIpKTtcbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZXJyb3IgaXMgcmV0cnlhYmxlLlxuICpcbiAqIEBwYXJhbSBlcnJvciBUaGUgQXhpb3MgZXJyb3IuXG4gKiBAcGFyYW0gcmV0cnlPbjQyOSBGbGFnIHRvIGluZGljYXRlIGlmIHJldHJpZXMgc2hvdWxkIGJlIGF0dGVtcHRlZCBvbiA0Mjkgc3RhdHVzIGNvZGUuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlcnJvciBpcyByZXRyeWFibGUsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xudmFyIHNob3VsZFJldHJ5ID0gZnVuY3Rpb24gKGVycm9yLCByZXRyeU9uNDI5KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgLy8gRGVmaW5lIGRlZmF1bHQgYmVoYXZpb3IgZm9yIDQyOSByZXRyaWVzIGluIGNhc2UgdGhlIGhhbmRsZXIgd2FzIG5vdCBpbmNsdWRlZCBieSB0aGUgY2FsbGVyLlxuICAgIGlmICgoKF9hID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGF0dXMpID09PSBDb25zdGFudHNfMS5kZWZhdWx0LnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUgJiYgIXJldHJ5T240MjkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNSZXRyeWFibGVFcnJvcihlcnJvcikgfHwgKDAsIGF4aW9zX3JldHJ5XzEuaXNOZXR3b3JrRXJyb3IpKGVycm9yKSB8fCAoKF9iID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zdGF0dXMpID09PSAwIHx8ICEoKF9jID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5zdGF0dXMpO1xufTtcbi8qKlxuICogQ3VzdG9tIGhhbmRsZXIgZm9yIEhUVFAgY2FsbHMgd2l0aCBBeGlvcy4gSGFuZGxlciBhbGxvd3MgcmV0cnlpbmcgSFRUUCBjYWxscyBpZiB0aGV5IGZhaWwuXG4gKlxuICogQHBhcmFtIGF4aW9zIEF4aW9zIGluc3RhbmNlLlxuICogQHBhcmFtIGF4aW9zUmV0cnlPcHRpb25zIE9wdGlvbnMgZm9yIGF4aW9zIHJldHJ5LlxuICovXG52YXIgYXhpb3NSZXRyeUhhbmRsZXIgPSBmdW5jdGlvbiAoYXhpb3MsIGF4aW9zUmV0cnlPcHRpb25zKSB7XG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcbiAgICBpZiAoYXhpb3NSZXRyeU9wdGlvbnMucmV0cnlPbjQyOSA9PT0gdW5kZWZpbmVkIHx8IGF4aW9zUmV0cnlPcHRpb25zLnJldHJ5T240MjkgPT09IG51bGwpIHtcbiAgICAgICAgYXhpb3NSZXRyeU9wdGlvbnMucmV0cnlPbjQyOSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWF4aW9zUmV0cnlPcHRpb25zLnNob3VsZFJldHJ5KSB7XG4gICAgICAgIGF4aW9zUmV0cnlPcHRpb25zLnNob3VsZFJldHJ5ID0gZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiBzaG91bGRSZXRyeShlcnJvciwgYXhpb3NSZXRyeU9wdGlvbnMucmV0cnlPbjQyOSk7IH07XG4gICAgfVxuICAgIC8vIE1ldGhvZCB0byBpbnRlcmNlcHQgcmVzcG9uc2VzIG91dHNpZGUgdGhlIHJhbmdlIG9mIDJ4eFxuICAgICgwLCBheGlvc19yZXRyeV8xLmRlZmF1bHQpKGF4aW9zLCB7XG4gICAgICAgIHJldHJpZXM6IGF4aW9zUmV0cnlPcHRpb25zLnJldHJpZXMsXG4gICAgICAgIHJldHJ5Q29uZGl0aW9uOiBheGlvc1JldHJ5T3B0aW9ucy5zaG91bGRSZXRyeSxcbiAgICAgICAgb25SZXRyeTogZnVuY3Rpb24gKHJldHJ5Q291bnQsIGVycm9yLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBlcnJvci5yZXNwb25zZTtcbiAgICAgICAgICAgIHZhciBoZWFkZXJPdmVyd3JpdGVzID0gYXhpb3NSZXRyeU9wdGlvbnMuaGVhZGVyT3ZlcndyaXRlcztcbiAgICAgICAgICAgIGlmIChoZWFkZXJPdmVyd3JpdGVzICYmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzcG9uc2UuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGhlYWRlck92ZXJ3cml0ZXNfMSA9IGhlYWRlck92ZXJ3cml0ZXM7IF9pIDwgaGVhZGVyT3ZlcndyaXRlc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVyTmFtZSA9IGhlYWRlck92ZXJ3cml0ZXNfMVtfaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZUhlYWRlciA9IHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZS5oZWFkZXJzW2hlYWRlck5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUhlYWRlciAmJiByZXF1ZXN0Q29uZmlnLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcuaGVhZGVyc1toZWFkZXJOYW1lXSA9IHJlc3BvbnNlSGVhZGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZXRyeURlbGF5OiBmdW5jdGlvbiAocmV0cnlDb3VudCwgZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICAgICAgdmFyIHRpbWVCZXR3ZWVuUmV0cnkgPSBheGlvc1JldHJ5T3B0aW9ucy53YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcztcbiAgICAgICAgICAgIHZhciByZXRyeUFmdGVySGVhZGVyID0gKF9iID0gKF9hID0gZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVhZGVycykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW1wicmV0cnktYWZ0ZXJcIl07XG4gICAgICAgICAgICB2YXIgcmV0cnlBZnRlclRpbWUgPSB0aW1lQmV0d2VlblJldHJ5O1xuICAgICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmV0cnlBZnRlclZhbHVlID0gcGFyc2VJbnQocmV0cnlBZnRlckhlYWRlcik7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihyZXRyeUFmdGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXJUaW1lID0gcmV0cnlBZnRlclZhbHVlICogdGltZUJldHdlZW5SZXRyeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXRyeUFmdGVyRGF0ZSA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXJIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJEYXRlICYmIHJldHJ5QWZ0ZXJEYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiBpc0Zpbml0ZShyZXRyeUFmdGVyRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyVGltZSA9IE1hdGgubWF4KDAsIHJldHJ5QWZ0ZXJEYXRlLmdldFRpbWUoKSAtIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0cnlBZnRlclRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKChfYyA9IGVycm9yLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc3RhdHVzKSA9PT0gQ29uc3RhbnRzXzEuZGVmYXVsdC50b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gUmV0cnkgYWZ0ZXIgNSBzZWNvbmRzIGZvciA0Mjkgc3RhdHVzIGNvZGVcbiAgICAgICAgICAgICAgICByZXR1cm4gNTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygyLCByZXRyeUNvdW50KSAqIHRpbWVCZXR3ZWVuUmV0cnk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gaXNSZXRyeWFibGVFcnJvcihlcnJvcikge1xuICAgIHJldHVybiAoZXJyb3IuY29kZSAhPT0gJ0VDT05OQUJPUlRFRCcgJiZcbiAgICAgICAgKCFlcnJvci5yZXNwb25zZSB8fFxuICAgICAgICAgICAgZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MjkgfHxcbiAgICAgICAgICAgIChlcnJvci5yZXNwb25zZS5zdGF0dXMgPj0gNTAwICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA8PSA1OTkpKSk7XG59XG5leHBvcnRzLmlzUmV0cnlhYmxlRXJyb3IgPSBpc1JldHJ5YWJsZUVycm9yO1xuZnVuY3Rpb24gYXhpb3NSZXRyeUhhbmRsZXJXaXRoTm90Rm91bmQoYXhpb3MsIGF4aW9zUmV0cnlPcHRpb25zKSB7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3MsIHtcbiAgICAgICAgcmV0cmllczogYXhpb3NSZXRyeU9wdGlvbnMucmV0cmllcyxcbiAgICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IGF4aW9zUmV0cnlPcHRpb25zLndhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzLFxuICAgICAgICBzaG91bGRSZXRyeTogZnVuY3Rpb24gKGVycm9yKSB7IHZhciBfYTsgcmV0dXJuIHNob3VsZFJldHJ5KGVycm9yLCBheGlvc1JldHJ5T3B0aW9ucy5yZXRyeU9uNDI5KSB8fCAoKF9hID0gZXJyb3IucmVzcG9uc2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGF0dXMpID09PSBDb25zdGFudHNfMS5kZWZhdWx0Lm5vdEZvdW5kU3RhdHVzQ29kZTsgfSxcbiAgICB9KTtcbn1cbmV4cG9ydHMuYXhpb3NSZXRyeUhhbmRsZXJXaXRoTm90Rm91bmQgPSBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZDtcbmV4cG9ydHMuZGVmYXVsdCA9IGF4aW9zUmV0cnlIYW5kbGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50ID0gdm9pZCAwO1xudmFyIEVudW1zXzEgPSByZXF1aXJlKFwiLi4vQ29tbW9uL0VudW1zXCIpO1xudmFyIE9tbmljaGFubmVsRW5kcG9pbnRzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiKSk7XG52YXIgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgPSBmdW5jdGlvbiAobGl2ZUNoYXRWZXJzaW9uLCBhdXRoLCBjb3BpbG90Qm90UHJlc2VudCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGVuZHBvaW50c01hcHBpbmcgPSAoX2EgPSB7fSxcbiAgICAgICAgX2FbRW51bXNfMS5MaXZlQ2hhdFZlcnNpb24uVjFdID0gT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aCxcbiAgICAgICAgX2FbRW51bXNfMS5MaXZlQ2hhdFZlcnNpb24uVjJdID0gT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRoLFxuICAgICAgICBfYVtFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WM10gPSBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXR2M0dldENoYXRUb2tlblBhdGgsXG4gICAgICAgIF9hKTtcbiAgICB2YXIgYXV0aEVuZHBvaW50c01hcHBpbmcgPSAoX2IgPSB7fSxcbiAgICAgICAgX2JbRW51bXNfMS5MaXZlQ2hhdFZlcnNpb24uVjFdID0gT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0QXV0aEdldENoYXRUb2tlblBhdGgsXG4gICAgICAgIF9iW0VudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYyXSA9IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgsXG4gICAgICAgIF9iW0VudW1zXzEuTGl2ZUNoYXRWZXJzaW9uLlYzXSA9IE9tbmljaGFubmVsRW5kcG9pbnRzXzEuZGVmYXVsdC5MaXZlQ2hhdHYzQXV0aEdldENoYXRUb2tlblBhdGgsXG4gICAgICAgIF9iKTtcbiAgICBpZiAoY29waWxvdEJvdFByZXNlbnQpIHtcbiAgICAgICAgcmV0dXJuIGF1dGggPyBPbW5pY2hhbm5lbEVuZHBvaW50c18xLmRlZmF1bHQuTGl2ZUNoYXR2NEF1dGhHZXRDaGF0VG9rZW5QYXRoIDogT21uaWNoYW5uZWxFbmRwb2ludHNfMS5kZWZhdWx0LkxpdmVDaGF0djRHZXRDaGF0VG9rZW5QYXRoO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnZhbHVlcyhFbnVtc18xLkxpdmVDaGF0VmVyc2lvbikuaW5jbHVkZXMobGl2ZUNoYXRWZXJzaW9uKSkge1xuICAgICAgICByZXR1cm4gYXV0aCA/IGF1dGhFbmRwb2ludHNNYXBwaW5nW2xpdmVDaGF0VmVyc2lvbl0gOiBlbmRwb2ludHNNYXBwaW5nW2xpdmVDaGF0VmVyc2lvbl07XG4gICAgfVxuICAgIHJldHVybiBhdXRoID8gYXV0aEVuZHBvaW50c01hcHBpbmdbRW51bXNfMS5MaXZlQ2hhdFZlcnNpb24uVjJdIDogZW5kcG9pbnRzTWFwcGluZ1tFbnVtc18xLkxpdmVDaGF0VmVyc2lvbi5WMl07XG59O1xuZXhwb3J0cy5jcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCA9IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFkZE9jVXNlckFnZW50SGVhZGVyID0gdm9pZCAwO1xudmFyIE9tbmljaGFubmVsSFRUUEhlYWRlcnNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIikpO1xudmFyIGFkZE9jVXNlckFnZW50SGVhZGVyID0gZnVuY3Rpb24gKHVzZXJBZ2VudCwgaGVhZGVycykge1xuICAgIHZhciB2ZXJzaW9uID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgdmFyIGRlZmF1dFVzZXJBZ2VudCA9IFwib2NzZGsvXCIuY29uY2F0KHZlcnNpb24pO1xuICAgIGhlYWRlcnNbXCJcIi5jb25jYXQoT21uaWNoYW5uZWxIVFRQSGVhZGVyc18xLmRlZmF1bHQub2NVc2VyQWdlbnQpXSA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgdXNlckFnZW50LCB0cnVlKSwgW2RlZmF1dFVzZXJBZ2VudF0sIGZhbHNlKS5qb2luKFwiIFwiKTtcbn07XG5leHBvcnRzLmFkZE9jVXNlckFnZW50SGVhZGVyID0gYWRkT2NVc2VyQWdlbnRIZWFkZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBheGlvc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJheGlvc1wiKSk7XG52YXIgaXNFeHBlY3RlZEF4aW9zRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IsIHZhbGlkYXRpb25SdWxlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGF4aW9zXzEuZGVmYXVsdC5pc0F4aW9zRXJyb3IoZXJyb3IpICYmIGVycm9yLmNvZGUgPT0gdmFsaWRhdGlvblJ1bGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBpc0V4cGVjdGVkQXhpb3NFcnJvcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51dWlkdjQgPSB2b2lkIDA7XG52YXIgdXVpZHY0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBcInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eFwiLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PT0gXCJ4XCIgPyByIDogKHIgJiAweDMgfCAweDgpO1xuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gICAgfSk7XG59O1xuZXhwb3J0cy51dWlkdjQgPSB1dWlkdjQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MgPSB2b2lkIDA7XG5leHBvcnRzLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzID0ge1xuICAgIGdldENoYXRDb25maWc6IDEwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMzAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDEwMDAsXG4gICAgc2Vzc2lvbkluaXQ6IDEwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxMDAwLFxuICAgIGdldFJlY29ubmVjdGFibGVDaGF0czogMTAwMCxcbiAgICBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHk6IDEwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxMDAwLFxuICAgIGdldENoYXRUcmFuc2NyaXB0czogMTAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDEwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDEwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDEwMDAsXG4gICAgZ2V0QWdlbnRBdmFpbGFiaWxpdHk6IDEwMDAsXG4gICAgc2VuZFR5cGluZ0luZGljYXRvcjogMTAwMCxcbiAgICB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dDogMTAwMCxcbiAgICBnZXRQZXJzaXN0ZW50Q2hhdEhpc3Rvcnk6IDEwMDBcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIEVudHJ5IHBvaW50XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnV1aWR2NCA9IGV4cG9ydHMuU0RLUHJvdmlkZXIgPSB2b2lkIDA7XG52YXIgRXZlbnRNYW5hZ2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vVXRpbHMvRXZlbnRNYW5hZ2VyXCIpKTtcbnZhciBFdmVudE5hbWVzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vQ29tbW9uL0V2ZW50TmFtZXNcIikpO1xudmFyIFNES1Byb3ZpZGVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vU0RLUHJvdmlkZXJcIikpO1xuZXhwb3J0cy5TREtQcm92aWRlciA9IFNES1Byb3ZpZGVyXzEuZGVmYXVsdDtcbnZhciB1dWlkXzEgPSByZXF1aXJlKFwiLi9VdGlscy91dWlkXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidXVpZHY0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1dWlkXzEudXVpZHY0OyB9IH0pO1xuKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBEZWNsYXJlcyB3aW5kb3cgb2JqZWN0IGZvciBOb2RlSlMgZW52aXJvbm1lbnRcbiAgICBpZiAoZ2xvYmFsLndpbmRvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGdsb2JhbC53aW5kb3cgPSBnbG9iYWw7XG4gICAgfVxuICAgIGlmICghd2luZG93KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIndpbmRvdyBvYmplY3Qgbm90IGZvdW5kXCIpO1xuICAgIH1cbiAgICAvLyBDaGVjayBleGlzdGVuY2Ugb2YgZ2xvYmFsIG9iamVjdHMgdG8gYXZvaWQgb3ZlcndyaXRlL2NsYXNoaW5nXG4gICAgaWYgKCEoXCJNaWNyb3NvZnRcIiBpbiB3aW5kb3cpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5NaWNyb3NvZnQgPSB7fTtcbiAgICB9XG4gICAgaWYgKCEoXCJDUk1cIiBpbiB3aW5kb3cuTWljcm9zb2Z0KSkge1xuICAgICAgICB3aW5kb3cuTWljcm9zb2Z0LkNSTSA9IHt9O1xuICAgIH1cbiAgICBpZiAoIShcIk9tbmljaGFubmVsXCIgaW4gd2luZG93Lk1pY3Jvc29mdC5DUk0pKSB7XG4gICAgICAgIHdpbmRvdy5NaWNyb3NvZnQuQ1JNLk9tbmljaGFubmVsID0ge307XG4gICAgfVxuICAgIGlmICghKFwiU0RLXCIgaW4gd2luZG93Lk1pY3Jvc29mdC5DUk0uT21uaWNoYW5uZWwpKSB7XG4gICAgICAgIHdpbmRvdy5NaWNyb3NvZnQuQ1JNLk9tbmljaGFubmVsLlNESyA9IHtcbiAgICAgICAgICAgIFNES1Byb3ZpZGVyOiBTREtQcm92aWRlcl8xLmRlZmF1bHQsXG4gICAgICAgICAgICBVdGlsOiB7XG4gICAgICAgICAgICAgICAgdXVpZHY0OiB1dWlkXzEudXVpZHY0XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5kb2N1bWVudCAmJiBFdmVudE1hbmFnZXJfMS5kZWZhdWx0LnJhaXNlQ3VzdG9tRXZlbnQoRXZlbnROYW1lc18xLmRlZmF1bHQuT0NTREtMT0FEKTtcbn0pKCk7XG4iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9
|