breeze-client 2.1.5 → 2.1.6
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/adapter-data-service-odata/adapter-data-service-odata.d.ts +0 -1
- package/breeze-client.metadata.json +1 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +4 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +1 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +1 -1
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +1 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +8 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +1 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +1 -1
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +1 -1
- package/bundles/breeze-client.umd.js +103 -20
- package/bundles/breeze-client.umd.js.map +1 -1
- package/bundles/breeze-client.umd.min.js +1 -1
- package/bundles/breeze-client.umd.min.js.map +1 -1
- package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +5 -1
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +9 -2
- package/esm2015/src/abstract-data-service-adapter.js +1 -1
- package/esm2015/src/core.js +14 -9
- package/esm2015/src/data-type.js +60 -1
- package/esm2015/src/entity-action.js +1 -1
- package/esm2015/src/entity-aspect.js +6 -8
- package/esm2015/src/entity-manager.js +1 -1
- package/esm2015/src/entity-metadata.js +1 -1
- package/esm2015/src/entity-query.js +1 -1
- package/esm2015/src/entity-state.js +9 -1
- package/esm2015/src/enum.js +1 -1
- package/esm2015/src/key-generator.js +1 -1
- package/esm2015/src/mapping-context.js +9 -3
- package/esm2015/src/predicate.js +12 -5
- package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +5 -1
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +9 -2
- package/esm5/src/abstract-data-service-adapter.js +1 -1
- package/esm5/src/core.js +13 -8
- package/esm5/src/data-type.js +60 -1
- package/esm5/src/entity-action.js +1 -1
- package/esm5/src/entity-aspect.js +6 -8
- package/esm5/src/entity-manager.js +1 -1
- package/esm5/src/entity-metadata.js +1 -1
- package/esm5/src/entity-query.js +1 -1
- package/esm5/src/entity-state.js +9 -1
- package/esm5/src/enum.js +1 -1
- package/esm5/src/key-generator.js +1 -1
- package/esm5/src/mapping-context.js +9 -3
- package/esm5/src/predicate.js +12 -5
- package/fesm2015/breeze-client-adapter-data-service-odata.js +4 -0
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +1 -1
- package/fesm2015/breeze-client-adapter-data-service-webapi.js +9 -2
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +1 -1
- package/fesm2015/breeze-client.js +104 -21
- package/fesm2015/breeze-client.js.map +1 -1
- package/fesm5/breeze-client-adapter-data-service-odata.js +4 -0
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +1 -1
- package/fesm5/breeze-client-adapter-data-service-webapi.js +9 -2
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +1 -1
- package/fesm5/breeze-client.js +103 -20
- package/fesm5/breeze-client.js.map +1 -1
- package/package.json +1 -1
- package/src/abstract-data-service-adapter.d.ts +0 -1
- package/src/data-type.d.ts +5 -0
- package/src/entity-aspect.d.ts +5 -5
- package/src/entity-manager.d.ts +4 -4
- package/src/entity-metadata.d.ts +37 -27
- package/src/entity-state.d.ts +4 -0
- package/src/mapping-context.d.ts +1 -1
- package/src/predicate.d.ts +4 -7
package/esm2015/src/core.js
CHANGED
|
@@ -499,20 +499,23 @@ function memoize(fn) {
|
|
|
499
499
|
fn.memoize[hash] = fn.apply(this, args);
|
|
500
500
|
};
|
|
501
501
|
}
|
|
502
|
+
const uuidrex = /[xy]/g;
|
|
502
503
|
function getUuid() {
|
|
503
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
|
|
504
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(uuidrex, function (c) {
|
|
504
505
|
// tslint:disable-next-line
|
|
505
506
|
let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
|
506
507
|
return v.toString(16);
|
|
507
508
|
});
|
|
508
509
|
}
|
|
510
|
+
const durationrex = /^P((\d+Y)?(\d+M)?(\d+D)?)?(T(\d+H)?(\d+M)?(\d+S)?)?$/;
|
|
511
|
+
const lettersrex = /[A-Za-z]+/g;
|
|
509
512
|
function durationToSeconds(duration) {
|
|
510
513
|
// basic algorithm from https://github.com/nezasa/iso8601-js-period
|
|
511
514
|
if (typeof duration !== "string")
|
|
512
515
|
throw new Error("Invalid ISO8601 duration '" + duration + "'");
|
|
513
516
|
// regex splits as follows - grp0, grp1, y, m, d, grp2, h, m, s
|
|
514
517
|
// 0 1 2 3 4 5 6 7 8
|
|
515
|
-
let struct =
|
|
518
|
+
let struct = durationrex.exec(duration);
|
|
516
519
|
if (!struct)
|
|
517
520
|
throw new Error("Invalid ISO8601 duration '" + duration + "'");
|
|
518
521
|
let ymdhmsIndexes = [2, 3, 4, 6, 7, 8]; // -> grp1,y,m,d,grp2,h,m,s
|
|
@@ -526,7 +529,7 @@ function durationToSeconds(duration) {
|
|
|
526
529
|
for (let i = 0; i < 6; i++) {
|
|
527
530
|
let digit = struct[ymdhmsIndexes[i]];
|
|
528
531
|
// remove letters, replace by 0 if not defined
|
|
529
|
-
digit = (digit ? +digit.replace(
|
|
532
|
+
digit = (digit ? +digit.replace(lettersrex, '') : 0);
|
|
530
533
|
seconds += digit * factors[i];
|
|
531
534
|
}
|
|
532
535
|
return seconds;
|
|
@@ -550,10 +553,10 @@ function classof(o) {
|
|
|
550
553
|
function isDate(o) {
|
|
551
554
|
return classof(o) === "date" && !isNaN(o.getTime());
|
|
552
555
|
}
|
|
556
|
+
const isdaterex = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/;
|
|
553
557
|
function isDateString(s) {
|
|
554
558
|
// let rx = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/;
|
|
555
|
-
|
|
556
|
-
return (typeof s === "string") && rx.test(s);
|
|
559
|
+
return (typeof s === "string") && isdaterex.test(s);
|
|
557
560
|
}
|
|
558
561
|
function isFunction(o) {
|
|
559
562
|
return classof(o) === "function";
|
|
@@ -564,11 +567,13 @@ function isFunction(o) {
|
|
|
564
567
|
// function isObject(o: any) {
|
|
565
568
|
// return (typeof o === "object");
|
|
566
569
|
// }
|
|
570
|
+
const isguidrex = /^[a-fA-F\d]{8}-(?:[a-fA-F\d]{4}-){3}[a-fA-F\d]{12}$/;
|
|
567
571
|
function isGuid(value) {
|
|
568
|
-
return (typeof value === "string") &&
|
|
572
|
+
return (typeof value === "string") && isguidrex.test(value);
|
|
569
573
|
}
|
|
574
|
+
const isdurationrex = /^(-|)?P[T]?[\d\.,\-]+[YMDTHS]/;
|
|
570
575
|
function isDuration(value) {
|
|
571
|
-
return (typeof value === "string") &&
|
|
576
|
+
return (typeof value === "string") && isdurationrex.test(value);
|
|
572
577
|
}
|
|
573
578
|
function isEmpty(obj) {
|
|
574
579
|
if (obj === null || obj === undefined) {
|
|
@@ -613,7 +618,7 @@ function formatString(str, ...params) {
|
|
|
613
618
|
}
|
|
614
619
|
// See http://stackoverflow.com/questions/7225407/convert-camelcasetext-to-camel-case-text
|
|
615
620
|
/** Change text to title case with spaces, e.g. 'myPropertyName12' to 'My Property Name 12' */
|
|
616
|
-
|
|
621
|
+
const camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
|
|
617
622
|
function titleCaseSpace(text) {
|
|
618
623
|
text = text.replace(camelEdges, '$1 ');
|
|
619
624
|
text = text.charAt(0).toUpperCase() + text.slice(1);
|
|
@@ -706,4 +711,4 @@ function isPrimitive(obj: any) {
|
|
|
706
711
|
}
|
|
707
712
|
|
|
708
713
|
*/
|
|
709
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrREFBa0Q7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQWVwQyxJQUFJLGNBQWMsR0FBMEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckcsSUFBSSxVQUFVLEdBQXVELE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1dBQ3RFO0lBQzFCLElBQUk7UUFDQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDMUU7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNSLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0FBQ0wsQ0FBQztBQU5ELElBQUksY0FBYyxHQUFZLElBTTFCLENBQUM7QUFFTCxzQkFBc0I7QUFDdEIsU0FBUyxhQUFhLENBQUMsR0FBVyxFQUFFLElBQW9DO0lBQ3BFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ2pCLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0o7QUFDTCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVyxFQUFFLElBQXFDO0lBQ2pFLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNqQixJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxD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QUs7SUFDWixhQUFhLEVBQUUsYUFBYTtJQUU1QixPQUFPLEVBQUUsT0FBTztJQUNoQixPQUFPLEVBQUUsT0FBTztJQUNoQixpQkFBaUIsRUFBRSxpQkFBaUI7SUFFcEMsVUFBVSxFQUFFLFVBQVU7SUFFdEIsTUFBTSxFQUFFLE1BQU07SUFDZCxZQUFZLEVBQUUsWUFBWTtJQUMxQixNQUFNLEVBQUUsTUFBTTtJQUNkLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFNBQVMsRUFBRSxTQUFTO0lBRXBCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLElBQUksRUFBRSxJQUFJO0lBRVYsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLGNBQWMsRUFBRSxjQUFjO0lBQzlCLFlBQVksRUFBRSxZQUFZO0lBQzFCLFNBQVMsRUFBRSxjQUFjO0lBRXpCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLFVBQVU7SUFDdEIsa0JBQWtCLEVBQUUsa0JBQWtCO0lBRXRDLE9BQU8sRUFBRSxPQUFPO0NBQ25CLENBQUM7O0FBT0YsU0FBUztBQUNUOzs7Ozs7Ozs7O0VBVUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2VlIGlmIHRoaXMgY29tbWVudCB3aWxsIG1ha2UgaXQgaW50byAuZC50cyAqL1xyXG5pbXBvcnQgeyBCcmVlemVFbnVtIH0gZnJvbSAnLi9lbnVtJztcclxuZGVjbGFyZSB2YXIgZ2xvYmFsOiBhbnk7XHJcbmRlY2xhcmUgdmFyIHdpbmRvdzogYW55O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNhbGxiYWNrIHtcclxuICAgIChlcnJvcjogRXJyb3IpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhbGxiYWNrIHtcclxuICAgIChkYXRhOiBhbnkpOiB2b2lkO1xyXG59XHJcblxyXG4vLyB0eXBlIFByZWRpY2F0ZSA9IChpOiBhbnkpID0+IGJvb2xlYW47XHJcbnR5cGUgUHJlZGljYXRlPFQ+ID0gKGk6IFQpID0+IGJvb2xlYW47XHJcblxyXG5sZXQgaGFzT3duUHJvcGVydHk6IChvYmo6IE9iamVjdCwga2V5OiBzdHJpbmcpID0+IGJvb2xlYW4gPSB1bmN1cnJ5KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xyXG5sZXQgYXJyYXlTbGljZTogKGFyOiBhbnlbXSwgc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcikgPT4gYW55W10gPSB1bmN1cnJ5KEFycmF5LnByb3RvdHlwZS5zbGljZSk7XHJcbmxldCBpc0VTNVN1cHBvcnRlZDogYm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuICEhKE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd4Jywge30pKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn0gKCk7XHJcblxyXG4vLyBpdGVyYXRlIG92ZXIgb2JqZWN0XHJcbmZ1bmN0aW9uIG9iamVjdEZvckVhY2gob2JqOiBPYmplY3QsIGt2Rm46IChrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IGFueSkge1xyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAga3ZGbihrZXksIG9ialtrZXldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9iamVjdE1hcChvYmo6IE9iamVjdCwga3ZGbj86IChrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IGFueSk6IGFueVtdIHtcclxuICAgIGxldCByZXN1bHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGt2Rm4gPyBrdkZuKGtleSwgb2JqW2tleV0pIDogb2JqW2tleV07XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxufVxyXG5cclxuZnVuY3Rpb24gb2JqZWN0Rmlyc3Qob2JqOiBPYmplY3QsIGt2UHJlZGljYXRlOiAoa2V5OiBzdHJpbmcsIHZhbDogYW55KSA9PiBib29sZWFuKTogeyBrZXk6IHN0cmluZywgdmFsdWU6IGFueSB9IHwgbnVsbCB7XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpba2V5XTtcclxuICAgICAgICAgICAgaWYgKGt2UHJlZGljYXRlKGtleSwgdmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlGbGF0TWFwPFQsIFU+KGFycjogVFtdLCBtYXBGbjogKGFyZzogVCkgPT4gVVtdKSB7XHJcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgYXJyLm1hcChtYXBGbikpIGFzIFVbXTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNTZXR0YWJsZShvYmo6IE9iamVjdCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBwZCA9IGdldFByb3BEZXNjcmlwdG9yKG9iaiwgcHJvcGVydHlOYW1lKTtcclxuICAgIGlmIChwZCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiAhIShwZC53cml0YWJsZSB8fCBwZC5zZXQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRQcm9wRGVzY3JpcHRvcihvYmo6IE9iamVjdCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCFpc0VTNVN1cHBvcnRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3BlcnR5TmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBuZXh0T2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XHJcbiAgICAgICAgaWYgKG5leHRPYmogPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICByZXR1cm4gZ2V0UHJvcERlc2NyaXB0b3IobmV4dE9iaiwgcHJvcGVydHlOYW1lKTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gRnVuY3Rpb25hbCBleHRlbnNpb25zXHJcblxyXG4vKiogY2FuIGJlIHVzZWQgbGlrZTogcGVyc29ucy5maWx0ZXIocHJvcEVxKFwiZmlyc3ROYW1lXCIsIFwiSm9oblwiKSkgKi9cclxuZnVuY3Rpb24gcHJvcEVxKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogKG9iajogT2JqZWN0KSA9PiBib29sZWFuIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gb2JqW3Byb3BlcnR5TmFtZV0gPT09IHZhbHVlO1xyXG4gICAgfTtcclxufVxyXG5cclxuLyoqIGNhbiBiZSB1c2VkIGxpa2U6IHBlcnNvbnMuZmlsdGVyKHByb3BFcShcImZpcnN0TmFtZVwiLCBcIkZpcnN0TmFtZVwiLCBcIkpvaG5cIikpICovXHJcbmZ1bmN0aW9uIHByb3BzRXEocHJvcGVydHkxTmFtZTogc3RyaW5nLCBwcm9wZXJ0eTJOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiAob2JqOiBPYmplY3QpID0+IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBvYmpbcHJvcGVydHkxTmFtZV0gPT09IHZhbHVlIHx8IG9ialtwcm9wZXJ0eTJOYW1lXSA9PT0gdmFsdWU7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogY2FuIGJlIHVzZWQgbGlrZSBwZXJzb25zLm1hcChwbHVjayhcImZpcnN0TmFtZVwiKSkgKi9cclxuZnVuY3Rpb24gcGx1Y2socHJvcGVydHlOYW1lOiBhbnkpOiAob2JqOiBPYmplY3QpID0+IGFueSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialtwcm9wZXJ0eU5hbWVdO1xyXG4gICAgfTtcclxufVxyXG5cclxuLy8gZW5kIGZ1bmN0aW9uYWwgZXh0ZW5zaW9uc1xyXG5cclxuLyoqIFJldHVybiBhbiBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBzb3VyY2UgKi9cclxuZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlWYWx1ZXMoc291cmNlOiBPYmplY3QpOiBhbnlbXSB7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgbmFtZSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBuYW1lKSkge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChzb3VyY2VbbmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKiBDb3B5IHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0LiBSZXR1cm5zIHRhcmdldC4gKi9cclxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldDogT2JqZWN0LCBzb3VyY2U6IE9iamVjdCwgcHJvcE5hbWVzPzogc3RyaW5nW10pOiBPYmplY3Qge1xyXG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiB0YXJnZXQ7XHJcbiAgICBpZiAocHJvcE5hbWVzKSB7XHJcbiAgICAgICAgcHJvcE5hbWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBzb3VyY2UpIHtcclxuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5KHNvdXJjZSwgcHJvcE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcE5hbWVdID0gc291cmNlW3Byb3BOYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKiBDb3B5IHByb3BlcnRpZXMgZnJvbSBkZWZhdWx0cyBpZmYgdW5kZWZpbmVkIG9uIHRhcmdldC4gIFJldHVybnMgdGFyZ2V0LiAqL1xyXG5mdW5jdGlvbiB1cGRhdGVXaXRoRGVmYXVsdHModGFyZ2V0OiBPYmplY3QsIGRlZmF1bHRzOiBPYmplY3QpOiBhbnkge1xyXG4gICAgZm9yIChsZXQgbmFtZSBpbiBkZWZhdWx0cykge1xyXG4gICAgICAgIGlmICh0YXJnZXRbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogU2V0IGN0b3IuZGVmYXVsdEluc3RhbmNlIHRvIGFuIGluc3RhbmNlIG9mIGN0b3Igd2l0aCBwcm9wZXJ0aWVzIGZyb20gdGFyZ2V0LlxyXG4gICAgV2Ugd2FudCB0byBpbnN1cmUgdGhhdCB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGN0b3IuZGVmYXVsdEluc3RhbmNlIGlzIGFsd2F5cyBpbW11dGFibGVcclxuICAgIFVzZSAndGFyZ2V0JyBhcyB0aGUgcHJpbWFyeSB0ZW1wbGF0ZSBmb3IgdGhlIGN0b3IuZGVmYXVsdEluc3RhbmNlO1xyXG4gICAgVXNlIGN1cnJlbnQgJ2N0b3IuZGVmYXVsdEluc3RhbmNlJyBhcyB0aGUgdGVtcGxhdGUgZm9yIGFueSBtaXNzaW5nIHByb3BlcnRpZXNcclxuICAgIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZm9yIGN0b3IuZGVmYXVsdEluc3RhbmNlXHJcbiAgICByZXR1cm5zIHRhcmdldCB1bmNoYW5nZWQgKi9cclxuZnVuY3Rpb24gc2V0QXNEZWZhdWx0KHRhcmdldDogT2JqZWN0LCBjdG9yOiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnksIGRlZmF1bHRJbnN0YW5jZT86IGFueSB9KTogYW55IHtcclxuICAgIGN0b3IuZGVmYXVsdEluc3RhbmNlID0gdXBkYXRlV2l0aERlZmF1bHRzKG5ldyBjdG9yKHRhcmdldCksIGN0b3IuZGVmYXVsdEluc3RhbmNlKTtcclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gICAgJ3NvdXJjZScgaXMgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSB0cmFuc2Zvcm1lZCBpbnRvIGFub3RoZXJcclxuICAgICd0ZW1wbGF0ZScgaXMgYSBtYXAgd2hlcmUgdGhlXHJcbiAgICAgICBrZXlzOiBhcmUgdGhlIGtleXMgdG8gcmV0dXJuXHJcbiAgICAgICAgIGlmIGEga2V5IGNvbnRhaW5zICcsJ3MgdGhlbiB0aGUga2V5IGlzIHRyZWF0ZWQgYXMgYSBkZWxpbWl0ZWQgc3RyaW5nIHdpdGggZmlyc3Qgb2YgdGhlXHJcbiAgICAgICAgIGtleXMgYmVpbmcgdGhlIGtleSB0byByZXR1cm4gYW5kIHRoZSBvdGhlcnMgYWxsIHZhbGlkIGFsaWFzZXMgZm9yIHRoaXMga2V5XHJcbiAgICAgICAndmFsdWVzJyBhcmUgZWl0aGVyXHJcbiAgICAgICAgICAgMSkgdGhlICdkZWZhdWx0JyB2YWx1ZSBvZiB0aGUga2V5XHJcbiAgICAgICAgICAgMikgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGluIHRoZSBzb3VyY2UgdmFsdWUgYW5kIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRvIHNldFxyXG4gICAgICAgICBUaGUgdmFsdWUgZnJvbSB0aGUgc291cmNlIGlzIHRoZW4gc2V0IG9uIHRoZSB0YXJnZXQsXHJcbiAgICAgICAgIGFmdGVyIGZpcnN0IHBhc3NpbmcgdGhydSB0aGUgZm4sIGlmIHByb3ZpZGVkLCBVTkxFU1M6XHJcbiAgICAgICAgICAgMSkgaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICAgICAyKSBpdCBpcyB1bmRlZmluZWQgKCBudWxscyBXSUxMIGJlIHNldClcclxuICAgICd0YXJnZXQnIGlzIG9wdGlvbmFsXHJcbiAgICAgICAtIGlmIGl0IGV4aXN0cyB0aGVuIHByb3BlcnRpZXMgb2YgdGhlIHRhcmdldCB3aWxsIGJlIHNldCAoIG92ZXJ3cml0dGVuIGlmIHRoZSBleGlzdClcclxuICAgICAgIC0gaWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBhIG5ldyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIGFzIGZpbGxlZC5cclxuICAgICd0YXJnZXQgaXMgcmV0dXJuZWQuXHJcbiovXHJcbmZ1bmN0aW9uIHRvSnNvbihzb3VyY2U6IE9iamVjdCwgdGVtcGxhdGU6IE9iamVjdCwgdGFyZ2V0OiBPYmplY3QgPSB7fSk6IE9iamVjdCB7XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIHRlbXBsYXRlKSB7XHJcbiAgICAgICAgbGV0IGFsaWFzZXMgPSBrZXkuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSB0ZW1wbGF0ZVtrZXldO1xyXG4gICAgICAgIC8vIHVzaW5nIHNvbWUgYXMgYSBmb3JFYWNoIHdpdGggYSAnYnJlYWsnXHJcbiAgICAgICAgYWxpYXNlcy5zb21lKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xyXG4gICAgICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiBzb3VyY2UpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtwcm9wTmFtZV07XHJcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgZnVuY3Rpb25hbCBwcm9wZXJ0eSBkZWZpbmVkIHdpdGggdGhpcyBhbGlhcyAoIG5vdCB3aGF0IHdlIHdhbnQgdG8gcmVwbGFjZSkuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgLy8gJz09JyBpcyBkZWxpYmVyYXRlIGhlcmUgLSBpZGVhIGlzIHRoYXQgbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIHdpbGwgbmV2ZXIgZ2V0IHNlcmlhbGl6ZWRcclxuICAgICAgICAgICAgLy8gaWYgZGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gbnVsbC5cclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBkZWZhdWx0VmFsdWUpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZGVmYXVsdFZhbHVlKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJyZWV6ZUVudW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB0YXJnZXRbYWxpYXNlc1swXV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogUmVwbGFjZXIgZnVuY3Rpb24gZm9yIHRvSlNPTlNhZmUsIHdoZW4gc2VyaWFsaXppbmcgZW50aXRpZXMuICBFeGNsdWRlcyBlbnRpdHlBc3BlY3QgYW5kIG90aGVyIGludGVybmFsIHByb3BlcnRpZXMuICovXHJcbmZ1bmN0aW9uIHRvSlNPTlNhZmVSZXBsYWNlcihwcm9wOiBzdHJpbmcsIHZhbDogYW55KSB7XHJcbiAgICBpZiAocHJvcCA9PT0gXCJlbnRpdHlBc3BlY3RcIiB8fCBwcm9wID09PSBcImNvbXBsZXhBc3BlY3RcIiB8fCBwcm9wID09PSBcImVudGl0eVR5cGVcIiB8fCBwcm9wID09PSBcImNvbXBsZXhUeXBlXCJcclxuICAgICAgICB8fCBwcm9wID09PSBcImdldFByb3BlcnR5XCIgfHwgcHJvcCA9PT0gXCJzZXRQcm9wZXJ0eVwiXHJcbiAgICAgICAgfHwgcHJvcCA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IHByb3AuY2hhckF0KDApID09PSAnXycgfHwgcHJvcC5jaGFyQXQoMCkgPT09ICckJykgcmV0dXJuO1xyXG4gICAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuLyoqIFNhZmVseSBwZXJmb3JtIHRvSlNPTiBsb2dpYyBvbiBvYmplY3RzIHdpdGggY3ljbGVzLiAqL1xyXG5mdW5jdGlvbiB0b0pTT05TYWZlKG9iajogYW55LCByZXBsYWNlcj86IChwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSk6IGFueSB7XHJcbiAgICBpZiAob2JqICE9PSBPYmplY3Qob2JqKSkgcmV0dXJuIG9iajsgLy8gcHJpbWl0aXZlIHZhbHVlXHJcbiAgICBpZiAob2JqLl8kdmlzaXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGlmIChvYmoudG9KU09OKSB7XHJcbiAgICAgICAgbGV0IG5ld09iaiA9IG9iai50b0pTT04oKTtcclxuICAgICAgICBpZiAobmV3T2JqICE9PSBPYmplY3QobmV3T2JqKSkgcmV0dXJuIG5ld09iajsgLy8gcHJpbWl0aXZlIHZhbHVlXHJcbiAgICAgICAgaWYgKG5ld09iaiAhPT0gb2JqKSByZXR1cm4gdG9KU09OU2FmZShuZXdPYmosIHJlcGxhY2VyKTtcclxuICAgICAgICAvLyB0b0pTT04gcmV0dXJuZWQgdGhlIG9iamVjdCB1bmNoYW5nZWQuXHJcbiAgICAgICAgb2JqID0gbmV3T2JqO1xyXG4gICAgfVxyXG4gICAgb2JqLl8kdmlzaXRlZCA9IHRydWU7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnk7XHJcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICByZXN1bHQgPSBvYmoubWFwKGZ1bmN0aW9uIChvOiBhbnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRvSlNPTlNhZmUobywgcmVwbGFjZXIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgKG9iaikgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBvYmopIHtcclxuICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiXyR2aXNpdGVkXCIpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdO1xyXG4gICAgICAgICAgICBpZiAocmVwbGFjZXIpIHtcclxuICAgICAgICAgICAgICAgIHZhbCA9IHJlcGxhY2VyKHByb3AsIHZhbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhbCA9IHRvSlNPTlNhZmUodmFsLCByZXBsYWNlcik7XHJcbiAgICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgY29udGludWU7XHJcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWxldGUgb2JqLl8kdmlzaXRlZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbi8qKiBSZXNvbHZlcyB0aGUgdmFsdWVzIG9mIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGJ5IGNoZWNraW5nIGVhY2ggcHJvcGVydHkgaW4gbXVsdGlwbGUgc291cmNlcyB1bnRpbCBhIHZhbHVlIGlzIGZvdW5kLiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlUHJvcGVydGllcyhzb3VyY2VzOiBPYmplY3RbXSwgcHJvcGVydHlOYW1lczogc3RyaW5nW10pOiBhbnkge1xyXG4gICAgbGV0IHIgPSB7fTtcclxuICAgIGxldCBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcclxuICAgIHByb3BlcnR5TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocG4pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBzcmMgPSBzb3VyY2VzW2ldO1xyXG4gICAgICAgICAgICBpZiAoc3JjKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gc3JjW3BuXTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJbcG5dID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuXHJcbi8vIGFycmF5IGZ1bmN0aW9uc1xyXG5cclxuZnVuY3Rpb24gdG9BcnJheShpdGVtOiBhbnkpOiBhbnlbXSB7XHJcbiAgICBpZiAoaXRlbSA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBbaXRlbV07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBhIHZlcnNpb24gb2YgQXJyYXkubWFwIHRoYXQgZG9lc24ndCByZXF1aXJlIGFuIGFycmF5LCBpLmUuIHdvcmtzIG9uIGFycmF5cyBhbmQgc2NhbGFycy4gKi9cclxuLy8gZnVuY3Rpb24gbWFwPFQsIFU+KGl0ZW1zOiBUIHwgVFtdLCBmbjogKHY6IFQsIGl4PzogbnVtYmVyKSA9PiBVLCBpbmNsdWRlTnVsbD86IGJvb2xlYW4pOiBVIHwgVVtdIHtcclxuIGZ1bmN0aW9uIG1hcDxUPihpdGVtczogVCB8IFRbXSwgZm46ICh2OiBULCBpeD86IG51bWJlcikgPT4gYW55LCBpbmNsdWRlTnVsbD86IGJvb2xlYW4pOiBhbnkgfCBhbnlbXSB7XHJcbiAgICAvLyB3aGV0aGVyIHRvIHJldHVybiBudWxscyBpbiBhcnJheSBvZiByZXN1bHRzOyBkZWZhdWx0ID0gdHJ1ZTtcclxuICAgIGluY2x1ZGVOdWxsID0gaW5jbHVkZU51bGwgPT0gbnVsbCA/IHRydWUgOiBpbmNsdWRlTnVsbDtcclxuICAgIGlmIChpdGVtcyA9PSBudWxsKSByZXR1cm4gaXRlbXM7XHJcbiAgICAvLyBsZXQgcmVzdWx0OiBVW107XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKHY6IGFueSwgaXg6IG51bWJlcikge1xyXG4gICAgICAgICAgICBsZXQgciA9IGZuKHYsIGl4KTtcclxuICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCB8fCBpbmNsdWRlTnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2l4XSA9IHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZm4oaXRlbXMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4vKiogUmV0dXJuIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgcHJlZGljYXRlICovXHJcbmZ1bmN0aW9uIGFycmF5Rmlyc3Q8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiBQcmVkaWNhdGU8YW55Pik6IFQ7XHJcbmZ1bmN0aW9uIGFycmF5Rmlyc3Q8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiBQcmVkaWNhdGU8VD4pIHtcclxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5W2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcblxyXG4vKiogUmV0dXJuIGluZGV4IG9mIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgcHJlZGljYXRlICovXHJcbmZ1bmN0aW9uIGFycmF5SW5kZXhPZjxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxhbnk+KTogbnVtYmVyO1xyXG5mdW5jdGlvbiBhcnJheUluZGV4T2Y8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiBQcmVkaWNhdGU8VD4pOiBudW1iZXIge1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2ldKSkgcmV0dXJuIGk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuXHJcbi8qKiBBZGQgaXRlbSBpZiBub3QgYWxyZWFkeSBpbiBhcnJheSAqL1xyXG5mdW5jdGlvbiBhcnJheUFkZEl0ZW1VbmlxdWU8VD4oYXJyYXk6IFRbXSwgaXRlbTogVCkge1xyXG4gICAgbGV0IGl4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcclxuICAgIGlmIChpeCA9PT0gLTEpIGFycmF5LnB1c2goaXRlbSk7XHJcbn1cclxuXHJcbi8qKiBSZW1vdmUgaXRlbXMgZnJvbSB0aGUgYXJyYXlcclxuICogQHBhcmFtIGFycmF5XHJcbiAqIEBwYXJhbSBwcmVkaWNhdGVPckl0ZW0gLSBpdGVtIHRvIHJlbW92ZSwgb3IgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIG1hdGNoaW5nIGl0ZW1cclxuICogQHBhcmFtIHNob3VsZFJlbW92ZU11bHRpcGxlIC0gdHJ1ZSB0byBrZWVwIHJlbW92aW5nIGFmdGVyIGZpcnN0IG1hdGNoLCBmYWxzZSBvdGhlcndpc2VcclxuICovXHJcbmZ1bmN0aW9uIGFycmF5UmVtb3ZlSXRlbTxUPihhcnJheTogVFtdLCBwcmVkaWNhdGVPckl0ZW06IFQgfCBQcmVkaWNhdGU8VD4gLCBzaG91bGRSZW1vdmVNdWx0aXBsZT86IGJvb2xlYW4pIHtcclxuICAgIGxldCBwcmVkaWNhdGUgPSAoaXNGdW5jdGlvbihwcmVkaWNhdGVPckl0ZW0pID8gcHJlZGljYXRlT3JJdGVtIDogdW5kZWZpbmVkKSBhcyBQcmVkaWNhdGU8VD47XHJcbiAgICBsZXQgbGFzdEl4ID0gYXJyYXkubGVuZ3RoIC0gMTtcclxuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gbGFzdEl4OyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGlmIChwcmVkaWNhdGUgPyBwcmVkaWNhdGUoYXJyYXlbaV0pIDogKGFycmF5W2ldID09PSBwcmVkaWNhdGVPckl0ZW0pKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkUmVtb3ZlTXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlbW92ZWQ7XHJcbn1cclxuXHJcbi8qKiBDb21iaW5lIGFycmF5IGVsZW1lbnRzIHVzaW5nIHRoZSBjYWxsYmFjay4gIFJldHVybnMgYXJyYXkgd2l0aCBsZW5ndGggPT0gbWluKGExLmxlbmd0aCwgYTIubGVuZ3RoKSAqL1xyXG5mdW5jdGlvbiBhcnJheVppcChhMTogYW55W10sIGEyOiBhbnlbXSwgY2FsbGJhY2s6ICh4MTogYW55LCB4MjogYW55KSA9PiBhbnkpOiBhbnlbXSB7XHJcbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IG4gPSBNYXRoLm1pbihhMS5sZW5ndGgsIGEyLmxlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKGExW2ldLCBhMltpXSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLy9mdW5jdGlvbiBhcnJheURpc3RpbmN0KGFycmF5KSB7XHJcbi8vICAgIGFycmF5ID0gYXJyYXkgfHwgW107XHJcbi8vICAgIGxldCByZXN1bHQgPSBbXTtcclxuLy8gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuLy8gICAgICAgIGlmIChyZXN1bHQuaW5kZXhPZihhcnJheVtpXSkgPCAwKVxyXG4vLyAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFycmF5W2ldKTtcclxuLy8gICAgfVxyXG4vLyAgICByZXR1cm4gcmVzdWx0O1xyXG4vL31cclxuXHJcbi8vIE5vdCB5ZXQgbmVlZGVkXHJcbi8vLy8gbXVjaCBmYXN0ZXIgYnV0IG9ubHkgd29ya3Mgb24gYXJyYXkgaXRlbXMgd2l0aCBhIHRvU3RyaW5nIG1ldGhvZCB0aGF0XHJcbi8vLy8gcmV0dXJucyBkaXN0aW5jdCBzdHJpbmcgZm9yIGRpc3RpbmN0IG9iamVjdHMuICBTbyB0aGlzIGlzIHNhZmUgZm9yIGFycmF5cyB3aXRoIHByaW1pdGl2ZVxyXG4vLy8vIHR5cGVzIGJ1dCBub3QgZm9yIGFycmF5cyB3aXRoIG9iamVjdCB0eXBlcywgdW5sZXNzIHRvU3RyaW5nKCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQuXHJcbi8vZnVuY3Rpb24gYXJyYXlEaXN0aW5jdFVuc2FmZShhcnJheSkge1xyXG4vLyAgICBsZXQgbyA9IHt9LCBpLCBsID0gYXJyYXkubGVuZ3RoLCByID0gW107XHJcbi8vICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpICs9IDEpIHtcclxuLy8gICAgICAgIGxldCB2ID0gYXJyYXlbaV07XHJcbi8vICAgICAgICBvW3ZdID0gdjtcclxuLy8gICAgfVxyXG4vLyAgICBmb3IgKGkgaW4gbykgci5wdXNoKG9baV0pO1xyXG4vLyAgICByZXR1cm4gcjtcclxuLy99XHJcblxyXG5mdW5jdGlvbiBhcnJheUVxdWFscyhhMTogYW55W10sIGEyOiBhbnlbXSwgZXF1YWxzRm4/OiAoeDE6IGFueSwgeDI6IGFueSkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgLy9DaGVjayBpZiB0aGUgYXJyYXlzIGFyZSB1bmRlZmluZWQvbnVsbFxyXG4gICAgaWYgKCFhMSB8fCAhYTIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoYTEubGVuZ3RoICE9PSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvL2dvIHRocnUgYWxsIHRoZSB2YXJzXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy9pZiB0aGUgbGV0IGlzIGFuIGFycmF5LCB3ZSBuZWVkIHRvIG1ha2UgYSByZWN1cnNpdmUgY2hlY2tcclxuICAgICAgICAvL290aGVyd2lzZSB3ZSdsbCBqdXN0IGNvbXBhcmUgdGhlIHZhbHVlc1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFycmF5RXF1YWxzKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZXF1YWxzRm4pIHtcclxuICAgICAgICAgICAgICAgIGlmICghZXF1YWxzRm4oYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGExW2ldICE9PSBhMltpXSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8vIGVuZCBvZiBhcnJheSBmdW5jdGlvbnNcclxuXHJcbi8qKiBSZXR1cm5zIGFuIGFycmF5IGZvciBhIHNvdXJjZSBhbmQgYSBwcm9wLCBhbmQgY3JlYXRlcyB0aGUgcHJvcCBpZiBuZWVkZWQuICovXHJcbmZ1bmN0aW9uIGdldEFycmF5KHNvdXJjZTogT2JqZWN0LCBwcm9wTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG4gICAgbGV0IGFyciA9IHNvdXJjZVtwcm9wTmFtZV07XHJcbiAgICBpZiAoIWFycikge1xyXG4gICAgICAgIGFyciA9IFtdO1xyXG4gICAgICAgIHNvdXJjZVtwcm9wTmFtZV0gPSBhcnI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJyO1xyXG59XHJcblxyXG4vKiogQ2FsbHMgcmVxdWlyZUxpYkNvcmUgb24gc2VtaWNvbG9uLXNlcGFyYXRlZCBsaWJOYW1lcyAqL1xyXG5mdW5jdGlvbiByZXF1aXJlTGliKGxpYk5hbWVzOiBzdHJpbmcsIGVyck1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgIGxldCBhcnJOYW1lcyA9IGxpYk5hbWVzLnNwbGl0KFwiO1wiKTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gYXJyTmFtZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGxpYiA9IHJlcXVpcmVMaWJDb3JlKGFyck5hbWVzW2ldKTtcclxuICAgICAgICBpZiAobGliKSByZXR1cm4gbGliO1xyXG4gICAgfVxyXG4gICAgaWYgKGVyck1lc3NhZ2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBcIiArIGxpYk5hbWVzICsgXCIuICBcIiArIGVyck1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcbi8qKiBSZXR1cm5zIHRoZSAnbGliTmFtZScgbW9kdWxlIGlmIGxvYWRlZCBvciBlbHNlIHJldHVybnMgdW5kZWZpbmVkICovXHJcbmZ1bmN0aW9uIHJlcXVpcmVMaWJDb3JlKGxpYk5hbWU6IHN0cmluZykge1xyXG4gICAgbGV0IHdpbiA9IHdpbmRvdyB8fCAoZ2xvYmFsID8gZ2xvYmFsLndpbmRvdyA6IHVuZGVmaW5lZCk7XHJcbiAgICBpZiAoIXdpbikgcmV0dXJuOyAvLyBNdXN0IHJ1biBpbiBhIGJyb3dzZXIuIFRvZG86IGFkZCBjb21tb25qcyBzdXBwb3J0XHJcblxyXG4gICAgLy8gZ2V0IGxpYnJhcnkgZnJvbSBicm93c2VyIGdsb2JhbHMgaWYgd2UgY2FuXHJcbiAgICBsZXQgbGliID0gd2luW2xpYk5hbWVdO1xyXG4gICAgaWYgKGxpYikgcmV0dXJuIGxpYjtcclxuXHJcbiAgICAvLyBpZiByZXF1aXJlIGV4aXN0cywgbWF5YmUgcmVxdWlyZSBjYW4gZ2V0IGl0LlxyXG4gICAgLy8gVGhpcyBtZXRob2QgaXMgc3luY2hyb25vdXMgc28gaXQgY2FuJ3QgbG9hZCBtb2R1bGVzIHdpdGggQU1ELlxyXG4gICAgLy8gSXQgY2FuIG9ubHkgb2J0YWluIG1vZHVsZXMgZnJvbSByZXF1aXJlIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9hZGVkLlxyXG4gICAgLy8gRGV2ZWxvcGVyIHNob3VsZCBib290c3RyYXAgc3VjaCB0aGF0IHRoZSBicmVlemUgbW9kdWxlXHJcbiAgICAvLyBsb2FkcyBhZnRlciBhbGwgb3RoZXIgbGlicmFyaWVzIHRoYXQgYnJlZXplIHNob3VsZCBmaW5kIHdpdGggdGhpcyBtZXRob2RcclxuICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uXHJcbiAgICBsZXQgciA9IHdpbi5yZXF1aXJlO1xyXG4gICAgaWYgKHIpIHsgLy8gaWYgcmVxdWlyZSBleGlzdHNcclxuICAgICAgICBpZiAoci5kZWZpbmVkKSB7IC8vIHJlcXVpcmUuZGVmaW5lZCBpcyBub3Qgc3RhbmRhcmQgYW5kIG1heSBub3QgZXhpc3RcclxuICAgICAgICAgICAgLy8gcmVxdWlyZS5kZWZpbmVkIHJldHVybnMgdHJ1ZSBpZiBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkXHJcbiAgICAgICAgICAgIHJldHVybiByLmRlZmluZWQobGliTmFtZSkgPyByKGxpYk5hbWUpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHJlcXVpcmUuZGVmaW5lZCBkb2VzIG5vdCBleGlzdCBzbyB3ZSBoYXZlIHRvIGNhbGwgcmVxdWlyZSgnbGliTmFtZScpIGRpcmVjdGx5LlxyXG4gICAgICAgICAgICAvLyBUaGUgcmVxdWlyZSgnbGliTmFtZScpIG92ZXJsb2FkIGlzIHN5bmNocm9ub3VzIGFuZCBkb2VzIG5vdCBsb2FkIG1vZHVsZXMuXHJcbiAgICAgICAgICAgIC8vIEl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIG1vZHVsZSBpc24ndCBhbHJlYWR5IGxvYWRlZC5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByKGxpYk5hbWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyByZXF1aXJlKCdsaWJOYW1lJykgdGhyZXcgYmVjYXVzZSBtb2R1bGUgbm90IGxvYWRlZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogRXhlY3V0ZSBmbiB3aGlsZSBvYmogaGFzIHRlbXBWYWx1ZSBmb3IgcHJvcGVydHkgKi9cclxuZnVuY3Rpb24gdXNpbmcob2JqOiBPYmplY3QsIHByb3BlcnR5OiBzdHJpbmcsIHRlbXBWYWx1ZTogYW55LCBmbjogKCkgPT4gYW55KSB7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAgIHJldHVybiBmbigpO1xyXG4gICAgfVxyXG4gICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvYmpbcHJvcGVydHldO1xyXG4gICAgaWYgKHRlbXBWYWx1ZSA9PT0gb3JpZ2luYWxWYWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBmbigpO1xyXG4gICAgfVxyXG4gICAgb2JqW3Byb3BlcnR5XSA9IHRlbXBWYWx1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIGZuKCk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGlmIChvcmlnaW5hbFZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9ialtwcm9wZXJ0eV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb2JqW3Byb3BlcnR5XSA9IG9yaWdpbmFsVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQ2FsbCBzdGF0ZSA9IHN0YXJ0Rm4oKSwgY2FsbCBmbigpLCBjYWxsIGVuZEZuKHN0YXRlKSAqL1xyXG5mdW5jdGlvbiB3cmFwRXhlY3V0aW9uKHN0YXJ0Rm46ICgpID0+IGFueSwgZW5kRm46IChzdGF0ZTogYW55KSA9PiBhbnksIGZuOiAoKSA9PiBhbnkpIHtcclxuICAgIGxldCBzdGF0ZTogYW55O1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBzdGF0ZSA9IHN0YXJ0Rm4oKTtcclxuICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIChzdGF0ZSkgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHN0YXRlLmVycm9yID0gZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgZW5kRm4oc3RhdGUpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogUmVtZW1iZXIgJiByZXR1cm4gdGhlIHZhbHVlIG9mIGZuKCkgd2hlbiBpdCB3YXMgY2FsbGVkIHdpdGggaXRzIGN1cnJlbnQgYXJncyAqL1xyXG5mdW5jdGlvbiBtZW1vaXplKGZuOiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgYXJncyA9IGFycmF5U2xpY2UoPGFueT5hcmd1bWVudHMpLFxyXG4gICAgICAgICAgICBoYXNoID0gXCJcIixcclxuICAgICAgICAgICAgaSA9IGFyZ3MubGVuZ3RoLFxyXG4gICAgICAgICAgICBjdXJyZW50QXJnOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAgICAgY3VycmVudEFyZyA9IGFyZ3NbaV07XHJcbiAgICAgICAgICAgIGhhc2ggKz0gKGN1cnJlbnRBcmcgPT09IE9iamVjdChjdXJyZW50QXJnKSkgPyBKU09OLnN0cmluZ2lmeShjdXJyZW50QXJnKSA6IGN1cnJlbnRBcmc7XHJcbiAgICAgICAgICAgIGZuLm1lbW9pemUgfHwgKGZuLm1lbW9pemUgPSB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoaGFzaCBpbiBmbi5tZW1vaXplKSA/XHJcbiAgICAgICAgICAgIGZuLm1lbW9pemVbaGFzaF0gOlxyXG4gICAgICAgICAgICBmbi5tZW1vaXplW2hhc2hdID0gZm4uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRVdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgIGxldCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZHVyYXRpb25Ub1NlY29uZHMoZHVyYXRpb246IHN0cmluZykge1xyXG4gICAgLy8gYmFzaWMgYWxnb3JpdGhtIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL25lemFzYS9pc284NjAxLWpzLXBlcmlvZFxyXG4gICAgaWYgKHR5cGVvZiBkdXJhdGlvbiAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBJU084NjAxIGR1cmF0aW9uICdcIiArIGR1cmF0aW9uICsgXCInXCIpO1xyXG5cclxuICAgIC8vIHJlZ2V4IHNwbGl0cyBhcyBmb2xsb3dzIC0gZ3JwMCwgZ3JwMSwgeSwgbSwgZCwgZ3JwMiwgaCwgbSwgc1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAxICAgICAyICAzICA0ICA1ICAgICA2ICA3ICA4XHJcbiAgICBsZXQgc3RydWN0ID0gL15QKChcXGQrWSk/KFxcZCtNKT8oXFxkK0QpPyk/KFQoXFxkK0gpPyhcXGQrTSk/KFxcZCtTKT8pPyQvLmV4ZWMoZHVyYXRpb24pO1xyXG4gICAgaWYgKCFzdHJ1Y3QpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSVNPODYwMSBkdXJhdGlvbiAnXCIgKyBkdXJhdGlvbiArIFwiJ1wiKTtcclxuXHJcbiAgICBsZXQgeW1kaG1zSW5kZXhlcyA9IFsyLCAzLCA0LCA2LCA3LCA4XTsgLy8gLT4gZ3JwMSx5LG0sZCxncnAyLGgsbSxzXHJcbiAgICBsZXQgZmFjdG9ycyA9IFszMTEwNDAwMCwgLy8geWVhciAoMzYwKjI0KjYwKjYwKVxyXG4gICAgICAgIDI1OTIwMDAsICAgICAgICAgICAgIC8vIG1vbnRoICgzMCoyNCo2MCo2MClcclxuICAgICAgICA4NjQwMCwgICAgICAgICAgICAgICAvLyBkYXkgKDI0KjYwKjYwKVxyXG4gICAgICAgIDM2MDAsICAgICAgICAgICAgICAgIC8vIGhvdXIgKDYwKjYwKVxyXG4gICAgICAgIDYwLCAgICAgICAgICAgICAgICAgIC8vIG1pbnV0ZSAoNjApXHJcbiAgICAgICAgMV07ICAgICAgICAgICAgICAgICAgLy8gc2Vjb25kICgxKVxyXG5cclxuICAgIGxldCBzZWNvbmRzID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGRpZ2l0ID0gc3RydWN0W3ltZGhtc0luZGV4ZXNbaV1dO1xyXG4gICAgICAgIC8vIHJlbW92ZSBsZXR0ZXJzLCByZXBsYWNlIGJ5IDAgaWYgbm90IGRlZmluZWRcclxuICAgICAgICBkaWdpdCA9IDxhbnk+KGRpZ2l0ID8gK2RpZ2l0LnJlcGxhY2UoL1tBLVphLXpdKy9nLCAnJykgOiAwKTtcclxuICAgICAgICBzZWNvbmRzICs9IDxhbnk+ZGlnaXQgKiBmYWN0b3JzW2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlY29uZHM7XHJcblxyXG59XHJcblxyXG4vLyBpcyBmdW5jdGlvbnNcclxuXHJcbmZ1bmN0aW9uIG5vb3AoKSB7XHJcbiAgICAvLyBkb2VzIG5vdGhpbmdcclxufVxyXG5cclxuZnVuY3Rpb24gaWRlbnRpdHkoeDogYW55KTogYW55IHtcclxuICAgIHJldHVybiB4O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbGFzc29mKG86IGFueSkge1xyXG4gICAgaWYgKG8gPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gXCJudWxsXCI7XHJcbiAgICB9XHJcbiAgICBpZiAobyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0RhdGUobzogYW55KSB7XHJcbiAgICByZXR1cm4gY2xhc3NvZihvKSA9PT0gXCJkYXRlXCIgJiYgIWlzTmFOKG8uZ2V0VGltZSgpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEYXRlU3RyaW5nKHM6IHN0cmluZykge1xyXG4gICAgLy8gbGV0IHJ4ID0gL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLztcclxuICAgIGxldCByeCA9IC9eKChcXGR7NH0tWzAxXVxcZC1bMC0zXVxcZFRbMC0yXVxcZDpbMC01XVxcZDpbMC01XVxcZFxcLlxcZCsoWystXVswLTJdXFxkOlswLTVdXFxkfFopKXwoXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGQoWystXVswLTJdXFxkOlswLTVdXFxkfFopKXwoXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQoWystXVswLTJdXFxkOlswLTVdXFxkfFopKSkkLztcclxuICAgIHJldHVybiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIpICYmIHJ4LnRlc3Qocyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRnVuY3Rpb24obzogYW55KSB7XHJcbiAgICByZXR1cm4gY2xhc3NvZihvKSA9PT0gXCJmdW5jdGlvblwiO1xyXG59XHJcblxyXG4vLyBmdW5jdGlvbiBpc1N0cmluZyhvOiBhbnkpIHtcclxuLy8gICAgIHJldHVybiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpO1xyXG4vLyB9XHJcblxyXG4vLyBmdW5jdGlvbiBpc09iamVjdChvOiBhbnkpIHtcclxuLy8gICAgIHJldHVybiAodHlwZW9mIG8gPT09IFwib2JqZWN0XCIpO1xyXG4vLyB9XHJcblxyXG5mdW5jdGlvbiBpc0d1aWQodmFsdWU6IGFueSkge1xyXG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpICYmIC9bYS1mQS1GXFxkXXs4fS0oPzpbYS1mQS1GXFxkXXs0fS0pezN9W2EtZkEtRlxcZF17MTJ9Ly50ZXN0KHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEdXJhdGlvbih2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgJiYgL14oLXwpP1BbVF0/W1xcZFxcLixcXC1dK1tZTURUSFNdLy50ZXN0KHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNFbXB0eShvYmo6IGFueSkge1xyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc051bWVyaWMobjogYW55KSB7XHJcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xyXG59XHJcblxyXG5cclxuXHJcbi8vIGVuZCBvZiBpcyBGdW5jdGlvbnNcclxuXHJcbi8vIHN0cmluZyBmdW5jdGlvbnNcclxuXHJcbmZ1bmN0aW9uIHN0cmluZ1N0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XHJcbiAgICAvLyByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZyBvciBudWxsIHByZWZpeFxyXG4gICAgaWYgKCghc3RyKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHByZWZpeCA9PT0gXCJcIiB8fCBwcmVmaXggPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gc3RyLmluZGV4T2YocHJlZml4LCAwKSA9PT0gMDtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RyaW5nRW5kc1dpdGgoc3RyOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSB7XHJcbiAgICAvLyByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZyBvciBudWxsIHN1ZmZpeFxyXG4gICAgaWYgKCghc3RyKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHN1ZmZpeCA9PT0gXCJcIiB8fCBzdWZmaXggPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gc3RyLmluZGV4T2Yoc3VmZml4LCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xyXG59XHJcblxyXG4vLyBCYXNlZCBvbiBmcmFnbWVudCBmcm9tIERlYW4gRWR3YXJkcycgQmFzZSAyIGxpYnJhcnlcclxuLyoqIGZvcm1hdChcImEgJTEgYW5kIGEgJTJcIiwgXCJjYXRcIiwgXCJkb2dcIikgLT4gXCJhIGNhdCBhbmQgYSBkb2dcIiAqL1xyXG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoc3RyOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pIHtcclxuICAgIGxldCBhcmdzID0gYXJndW1lbnRzO1xyXG4gICAgbGV0IHBhdHRlcm4gPSBSZWdFeHAoXCIlKFsxLVwiICsgKGFyZ3VtZW50cy5sZW5ndGggLSAxKSArIFwiXSlcIiwgXCJnXCIpO1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHBhdHRlcm4sIGZ1bmN0aW9uIChtYXRjaCwgaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gYXJnc1tpbmRleF07XHJcbiAgICB9KTtcclxufVxyXG5cclxuLy8gU2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzIyNTQwNy9jb252ZXJ0LWNhbWVsY2FzZXRleHQtdG8tY2FtZWwtY2FzZS10ZXh0XHJcbi8qKiBDaGFuZ2UgdGV4dCB0byB0aXRsZSBjYXNlIHdpdGggc3BhY2VzLCBlLmcuICdteVByb3BlcnR5TmFtZTEyJyB0byAnTXkgUHJvcGVydHkgTmFtZSAxMicgKi9cclxubGV0IGNhbWVsRWRnZXMgPSAvKFtBLVpdKD89W0EtWl1bYS16XSl8W15BLVpdKD89W0EtWl0pfFthLXpBLVpdKD89W15hLXpBLVpdKSkvZztcclxuZnVuY3Rpb24gdGl0bGVDYXNlU3BhY2UodGV4dDogc3RyaW5nKSB7XHJcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGNhbWVsRWRnZXMsICckMSAnKTtcclxuICAgIHRleHQgPSB0ZXh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4dC5zbGljZSgxKTtcclxuICAgIHJldHVybiB0ZXh0O1xyXG59XHJcblxyXG4vLyBlbmQgb2Ygc3RyaW5nIGZ1bmN0aW9uc1xyXG5cclxuLy8gU2VlIE1hcmsgTWlsbGVy4oCZcyBleHBsYW5hdGlvbiBvZiB3aGF0IHRoaXMgZG9lcy5cclxuLy8gaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9Y29udmVudGlvbnM6c2FmZV9tZXRhX3Byb2dyYW1taW5nXHJcbmZ1bmN0aW9uIHVuY3VycnkoZjogYW55KSB7XHJcbiAgICBsZXQgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBjYWxsLmFwcGx5KGYsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyBzaGltc1xyXG5cclxuaWYgKCFPYmplY3QuY3JlYXRlKSB7XHJcbiAgICBPYmplY3QuY3JlYXRlID0gZnVuY3Rpb24gKHBhcmVudDogYW55KSB7XHJcbiAgICAgICAgbGV0IEYgPSA8YW55PmZ1bmN0aW9uICgpIHtcclxuICAgICAgICB9O1xyXG4gICAgICAgIEYucHJvdG90eXBlID0gcGFyZW50O1xyXG4gICAgICAgIHJldHVybiBuZXcgRigpO1xyXG4gICAgfTtcclxufVxyXG5cclxuLy8gc3RyaW5ncyBmb3IgZXJyb3IgbWVzc2FnZXNcclxuXHJcbmNvbnN0IHN0cmluZ3MgPSB7XHJcbiAgICBcIlRPX1RZUEVcIjogXCJBZGQgJ0VudGl0eVF1ZXJ5LnRvVHlwZSgpJyB0byB5b3VyIHF1ZXJ5LCBvciBjYWxsICdNZXRhZGF0YVN0b3JlLnNldEVudGl0eVR5cGVGb3JSZXNvdXJjZU5hbWUoKScgdG8gcmVnaXN0ZXIgYW4gRW50aXR5VHlwZSBmb3IgdGhpcyByZXNvdXJjZU5hbWUuXCJcclxufVxyXG5cclxuLy8gLy8gbm90IGFsbCBtZXRob2RzIGFib3ZlIGFyZSBleHBvcnRlZFxyXG5leHBvcnQgY29uc3QgY29yZSA9IHtcclxuICAgIGlzRVM1U3VwcG9ydGVkOiBpc0VTNVN1cHBvcnRlZCxcclxuICAgIGhhc093blByb3BlcnR5OiBoYXNPd25Qcm9wZXJ0eSxcclxuICAgIGdldE93blByb3BlcnR5VmFsdWVzOiBnZXRPd25Qcm9wZXJ0eVZhbHVlcyxcclxuICAgIGdldFByb3BlcnR5RGVzY3JpcHRvcjogZ2V0UHJvcERlc2NyaXB0b3IsXHJcbiAgICBvYmplY3RGb3JFYWNoOiBvYmplY3RGb3JFYWNoLFxyXG4gICAgb2JqZWN0Rmlyc3Q6IG9iamVjdEZpcnN0LFxyXG4gICAgb2JqZWN0TWFwOiBvYmplY3RNYXAsIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBzdHJvbmdseSB0eXBlZC5cclxuICAgIGV4dGVuZDogZXh0ZW5kLFxyXG4gICAgcHJvcEVxOiBwcm9wRXEsXHJcbiAgICBwcm9wc0VxOiBwcm9wc0VxLFxyXG4gICAgcGx1Y2s6IHBsdWNrLFxyXG4gICAgbWFwOiBtYXAsXHJcbiAgICByZXNvbHZlUHJvcGVydGllczogcmVzb2x2ZVByb3BlcnRpZXMsXHJcbiAgICBzZXRBc0RlZmF1bHQ6IHNldEFzRGVmYXVsdCxcclxuICAgIHVwZGF0ZVdpdGhEZWZhdWx0czogdXBkYXRlV2l0aERlZmF1bHRzLFxyXG4gICAgZ2V0QXJyYXk6IGdldEFycmF5LFxyXG4gICAgdG9BcnJheTogdG9BcnJheSxcclxuICAgIGFycmF5RXF1YWxzOiBhcnJheUVxdWFscyxcclxuICAgIGFycmF5U2xpY2U6IGFycmF5U2xpY2UsXHJcbiAgICBhcnJheUZpcnN0OiBhcnJheUZpcnN0LFxyXG4gICAgYXJyYXlJbmRleE9mOiBhcnJheUluZGV4T2YsXHJcbiAgICBhcnJheVJlbW92ZUl0ZW06IGFycmF5UmVtb3ZlSXRlbSxcclxuICAgIGFycmF5WmlwOiBhcnJheVppcCxcclxuICAgIGFycmF5QWRkSXRlbVVuaXF1ZTogYXJyYXlBZGRJdGVtVW5pcXVlLFxyXG4gICAgYXJyYXlGbGF0TWFwOiBhcnJheUZsYXRNYXAsXHJcblxyXG4gICAgcmVxdWlyZUxpYjogcmVxdWlyZUxpYixcclxuICAgIHVzaW5nOiB1c2luZyxcclxuICAgIHdyYXBFeGVjdXRpb246IHdyYXBFeGVjdXRpb24sXHJcblxyXG4gICAgbWVtb2l6ZTogbWVtb2l6ZSxcclxuICAgIGdldFV1aWQ6IGdldFV1aWQsXHJcbiAgICBkdXJhdGlvblRvU2Vjb25kczogZHVyYXRpb25Ub1NlY29uZHMsXHJcblxyXG4gICAgaXNTZXR0YWJsZTogaXNTZXR0YWJsZSxcclxuXHJcbiAgICBpc0RhdGU6IGlzRGF0ZSxcclxuICAgIGlzRGF0ZVN0cmluZzogaXNEYXRlU3RyaW5nLFxyXG4gICAgaXNHdWlkOiBpc0d1aWQsXHJcbiAgICBpc0R1cmF0aW9uOiBpc0R1cmF0aW9uLFxyXG4gICAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcclxuICAgIGlzRW1wdHk6IGlzRW1wdHksXHJcbiAgICBpc051bWVyaWM6IGlzTnVtZXJpYyxcclxuXHJcbiAgICBpZGVudGl0eTogaWRlbnRpdHksXHJcbiAgICBub29wOiBub29wLFxyXG5cclxuICAgIHN0cmluZ1N0YXJ0c1dpdGg6IHN0cmluZ1N0YXJ0c1dpdGgsXHJcbiAgICBzdHJpbmdFbmRzV2l0aDogc3RyaW5nRW5kc1dpdGgsXHJcbiAgICBmb3JtYXRTdHJpbmc6IGZvcm1hdFN0cmluZyxcclxuICAgIHRpdGxlQ2FzZTogdGl0bGVDYXNlU3BhY2UsXHJcblxyXG4gICAgdG9Kc29uOiB0b0pzb24sXHJcbiAgICB0b0pTT05TYWZlOiB0b0pTT05TYWZlLFxyXG4gICAgdG9KU09OU2FmZVJlcGxhY2VyOiB0b0pTT05TYWZlUmVwbGFjZXIsXHJcblxyXG4gICAgc3RyaW5nczogc3RyaW5nc1xyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNhbGxiYWNrIHtcclxuICAgIChlcnJvcjogYW55KTogdm9pZDtcclxufVxyXG5cclxuXHJcbi8vIFVudXNlZFxyXG4vKlxyXG4vLyByZXR1cm5zIHRydWUgZm9yIGJvb2xlYW5zLCBudW1iZXJzLCBzdHJpbmdzIGFuZCBkYXRlc1xyXG4vLyBmYWxzZSBmb3IgbnVsbCwgYW5kIG5vbi1kYXRlIG9iamVjdHMsIGZ1bmN0aW9ucywgYW5kIGFycmF5c1xyXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShvYmo6IGFueSkge1xyXG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB0cnVlIGZvciBudW1iZXJzLCBzdHJpbmdzLCBib29sZWFucyBhbmQgbnVsbCwgZmFsc2UgZm9yIG9iamVjdHNcclxuICAgIGlmIChvYmogIT0gT2JqZWN0KG9iaikpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGlzRGF0ZShvYmopO1xyXG59XHJcblxyXG4qLyJdfQ==
|
|
714
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2JyZWV6ZS1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrREFBa0Q7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQWVwQyxJQUFJLGNBQWMsR0FBMEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckcsSUFBSSxVQUFVLEdBQXVELE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1dBQ3RFO0lBQzFCLElBQUk7UUFDQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDMUU7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNSLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0FBQ0wsQ0FBQztBQU5ELElBQUksY0FBYyxHQUFZLElBTTFCLENBQUM7QUFFTCxzQkFBc0I7QUFDdEIsU0FBUyxhQUFhLENBQUMsR0FBVyxFQUFFLElBQW9DO0lBQ3BFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ2pCLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0o7QUFDTCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVyxFQUFFLElBQXFDO0lBQ2pFLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNqQixJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxD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RSxVQUFVO0lBQ3RCLFlBQVksRUFBRSxZQUFZO0lBQzFCLGVBQWUsRUFBRSxlQUFlO0lBQ2hDLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLGtCQUFrQixFQUFFLGtCQUFrQjtJQUN0QyxZQUFZLEVBQUUsWUFBWTtJQUUxQixVQUFVLEVBQUUsVUFBVTtJQUN0QixLQUFLLEVBQUUsS0FBSztJQUNaLGFBQWEsRUFBRSxhQUFhO0lBRTVCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLGlCQUFpQixFQUFFLGlCQUFpQjtJQUVwQyxVQUFVLEVBQUUsVUFBVTtJQUV0QixNQUFNLEVBQUUsTUFBTTtJQUNkLFlBQVksRUFBRSxZQUFZO0lBQzFCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLFVBQVU7SUFDdEIsVUFBVSxFQUFFLFVBQVU7SUFDdEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsU0FBUyxFQUFFLFNBQVM7SUFFcEIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsSUFBSSxFQUFFLElBQUk7SUFFVixnQkFBZ0IsRUFBRSxnQkFBZ0I7SUFDbEMsY0FBYyxFQUFFLGNBQWM7SUFDOUIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsU0FBUyxFQUFFLGNBQWM7SUFFekIsTUFBTSxFQUFFLE1BQU07SUFDZCxVQUFVLEVBQUUsVUFBVTtJQUN0QixrQkFBa0IsRUFBRSxrQkFBa0I7SUFFdEMsT0FBTyxFQUFFLE9BQU87Q0FDbkIsQ0FBQzs7QUFPRixTQUFTO0FBQ1Q7Ozs7Ozs7Ozs7RUFVRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBTZWUgaWYgdGhpcyBjb21tZW50IHdpbGwgbWFrZSBpdCBpbnRvIC5kLnRzICovXHJcbmltcG9ydCB7IEJyZWV6ZUVudW0gfSBmcm9tICcuL2VudW0nO1xyXG5kZWNsYXJlIHZhciBnbG9iYWw6IGFueTtcclxuZGVjbGFyZSB2YXIgd2luZG93OiBhbnk7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQ2FsbGJhY2sge1xyXG4gICAgKGVycm9yOiBFcnJvcik6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGJhY2sge1xyXG4gICAgKGRhdGE6IGFueSk6IHZvaWQ7XHJcbn1cclxuXHJcbi8vIHR5cGUgUHJlZGljYXRlID0gKGk6IGFueSkgPT4gYm9vbGVhbjtcclxudHlwZSBQcmVkaWNhdGU8VD4gPSAoaTogVCkgPT4gYm9vbGVhbjtcclxuXHJcbmxldCBoYXNPd25Qcm9wZXJ0eTogKG9iajogT2JqZWN0LCBrZXk6IHN0cmluZykgPT4gYm9vbGVhbiA9IHVuY3VycnkoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XHJcbmxldCBhcnJheVNsaWNlOiAoYXI6IGFueVtdLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSA9PiBhbnlbXSA9IHVuY3VycnkoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcclxubGV0IGlzRVM1U3VwcG9ydGVkOiBib29sZWFuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gISEoT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7fSkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufSAoKTtcclxuXHJcbi8vIGl0ZXJhdGUgb3ZlciBvYmplY3RcclxuZnVuY3Rpb24gb2JqZWN0Rm9yRWFjaChvYmo6IE9iamVjdCwga3ZGbjogKGtleTogc3RyaW5nLCB2YWw6IGFueSkgPT4gYW55KSB7XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICBrdkZuKGtleSwgb2JqW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb2JqZWN0TWFwKG9iajogT2JqZWN0LCBrdkZuPzogKGtleTogc3RyaW5nLCB2YWw6IGFueSkgPT4gYW55KTogYW55W10ge1xyXG4gICAgbGV0IHJlc3VsdHM6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwga2V5KSkge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0ga3ZGbiA/IGt2Rm4oa2V5LCBvYmpba2V5XSkgOiBvYmpba2V5XTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvYmplY3RGaXJzdChvYmo6IE9iamVjdCwga3ZQcmVkaWNhdGU6IChrZXk6IHN0cmluZywgdmFsOiBhbnkpID0+IGJvb2xlYW4pOiB7IGtleTogc3RyaW5nLCB2YWx1ZTogYW55IH0gfCBudWxsIHtcclxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xyXG4gICAgICAgICAgICBpZiAoa3ZQcmVkaWNhdGUoa2V5LCB2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheUZsYXRNYXA8VCwgVT4oYXJyOiBUW10sIG1hcEZuOiAoYXJnOiBUKSA9PiBVW10pIHtcclxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnIubWFwKG1hcEZuKSkgYXMgVVtdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1NldHRhYmxlKG9iajogT2JqZWN0LCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHBkID0gZ2V0UHJvcERlc2NyaXB0b3Iob2JqLCBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgaWYgKHBkID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuICEhKHBkLndyaXRhYmxlIHx8IHBkLnNldCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFByb3BEZXNjcmlwdG9yKG9iajogT2JqZWN0LCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIWlzRVM1U3VwcG9ydGVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcGVydHlOYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IG5leHRPYmogPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcclxuICAgICAgICBpZiAobmV4dE9iaiA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHJldHVybiBnZXRQcm9wRGVzY3JpcHRvcihuZXh0T2JqLCBwcm9wZXJ0eU5hbWUpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBGdW5jdGlvbmFsIGV4dGVuc2lvbnNcclxuXHJcbi8qKiBjYW4gYmUgdXNlZCBsaWtlOiBwZXJzb25zLmZpbHRlcihwcm9wRXEoXCJmaXJzdE5hbWVcIiwgXCJKb2huXCIpKSAqL1xyXG5mdW5jdGlvbiBwcm9wRXEocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiAob2JqOiBPYmplY3QpID0+IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmo6IGFueSkge1xyXG4gICAgICAgIHJldHVybiBvYmpbcHJvcGVydHlOYW1lXSA9PT0gdmFsdWU7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogY2FuIGJlIHVzZWQgbGlrZTogcGVyc29ucy5maWx0ZXIocHJvcEVxKFwiZmlyc3ROYW1lXCIsIFwiRmlyc3ROYW1lXCIsIFwiSm9oblwiKSkgKi9cclxuZnVuY3Rpb24gcHJvcHNFcShwcm9wZXJ0eTFOYW1lOiBzdHJpbmcsIHByb3BlcnR5Mk5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IChvYmo6IE9iamVjdCkgPT4gYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIG9ialtwcm9wZXJ0eTFOYW1lXSA9PT0gdmFsdWUgfHwgb2JqW3Byb3BlcnR5Mk5hbWVdID09PSB2YWx1ZTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8qKiBjYW4gYmUgdXNlZCBsaWtlIHBlcnNvbnMubWFwKHBsdWNrKFwiZmlyc3ROYW1lXCIpKSAqL1xyXG5mdW5jdGlvbiBwbHVjayhwcm9wZXJ0eU5hbWU6IGFueSk6IChvYmo6IE9iamVjdCkgPT4gYW55IHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gb2JqW3Byb3BlcnR5TmFtZV07XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyBlbmQgZnVuY3Rpb25hbCBleHRlbnNpb25zXHJcblxyXG4vKiogUmV0dXJuIGFuIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcyBmcm9tIHNvdXJjZSAqL1xyXG5mdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVZhbHVlcyhzb3VyY2U6IE9iamVjdCk6IGFueVtdIHtcclxuICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XHJcbiAgICBmb3IgKGxldCBuYW1lIGluIHNvdXJjZSkge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShzb3VyY2UsIG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNvdXJjZVtuYW1lXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqIENvcHkgcHJvcGVydGllcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuIFJldHVybnMgdGFyZ2V0LiAqL1xyXG5mdW5jdGlvbiBleHRlbmQodGFyZ2V0OiBPYmplY3QsIHNvdXJjZTogT2JqZWN0LCBwcm9wTmFtZXM/OiBzdHJpbmdbXSk6IE9iamVjdCB7XHJcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIHRhcmdldDtcclxuICAgIGlmIChwcm9wTmFtZXMpIHtcclxuICAgICAgICBwcm9wTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W3Byb3BOYW1lXSA9IHNvdXJjZVtwcm9wTmFtZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IHByb3BOYW1lIGluIHNvdXJjZSkge1xyXG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkoc291cmNlLCBwcm9wTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wTmFtZV0gPSBzb3VyY2VbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqIENvcHkgcHJvcGVydGllcyBmcm9tIGRlZmF1bHRzIGlmZiB1bmRlZmluZWQgb24gdGFyZ2V0LiAgUmV0dXJucyB0YXJnZXQuICovXHJcbmZ1bmN0aW9uIHVwZGF0ZVdpdGhEZWZhdWx0cyh0YXJnZXQ6IE9iamVjdCwgZGVmYXVsdHM6IE9iamVjdCk6IGFueSB7XHJcbiAgICBmb3IgKGxldCBuYW1lIGluIGRlZmF1bHRzKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldFtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtuYW1lXSA9IGRlZmF1bHRzW25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKiBTZXQgY3Rvci5kZWZhdWx0SW5zdGFuY2UgdG8gYW4gaW5zdGFuY2Ugb2YgY3RvciB3aXRoIHByb3BlcnRpZXMgZnJvbSB0YXJnZXQuXHJcbiAgICBXZSB3YW50IHRvIGluc3VyZSB0aGF0IHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgY3Rvci5kZWZhdWx0SW5zdGFuY2UgaXMgYWx3YXlzIGltbXV0YWJsZVxyXG4gICAgVXNlICd0YXJnZXQnIGFzIHRoZSBwcmltYXJ5IHRlbXBsYXRlIGZvciB0aGUgY3Rvci5kZWZhdWx0SW5zdGFuY2U7XHJcbiAgICBVc2UgY3VycmVudCAnY3Rvci5kZWZhdWx0SW5zdGFuY2UnIGFzIHRoZSB0ZW1wbGF0ZSBmb3IgYW55IG1pc3NpbmcgcHJvcGVydGllc1xyXG4gICAgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmb3IgY3Rvci5kZWZhdWx0SW5zdGFuY2VcclxuICAgIHJldHVybnMgdGFyZ2V0IHVuY2hhbmdlZCAqL1xyXG5mdW5jdGlvbiBzZXRBc0RlZmF1bHQodGFyZ2V0OiBPYmplY3QsIGN0b3I6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSwgZGVmYXVsdEluc3RhbmNlPzogYW55IH0pOiBhbnkge1xyXG4gICAgY3Rvci5kZWZhdWx0SW5zdGFuY2UgPSB1cGRhdGVXaXRoRGVmYXVsdHMobmV3IGN0b3IodGFyZ2V0KSwgY3Rvci5kZWZhdWx0SW5zdGFuY2UpO1xyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqXHJcbiAgICAnc291cmNlJyBpcyBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gYW5vdGhlclxyXG4gICAgJ3RlbXBsYXRlJyBpcyBhIG1hcCB3aGVyZSB0aGVcclxuICAgICAgIGtleXM6IGFyZSB0aGUga2V5cyB0byByZXR1cm5cclxuICAgICAgICAgaWYgYSBrZXkgY29udGFpbnMgJywncyB0aGVuIHRoZSBrZXkgaXMgdHJlYXRlZCBhcyBhIGRlbGltaXRlZCBzdHJpbmcgd2l0aCBmaXJzdCBvZiB0aGVcclxuICAgICAgICAga2V5cyBiZWluZyB0aGUga2V5IHRvIHJldHVybiBhbmQgdGhlIG90aGVycyBhbGwgdmFsaWQgYWxpYXNlcyBmb3IgdGhpcyBrZXlcclxuICAgICAgICd2YWx1ZXMnIGFyZSBlaXRoZXJcclxuICAgICAgICAgICAxKSB0aGUgJ2RlZmF1bHQnIHZhbHVlIG9mIHRoZSBrZXlcclxuICAgICAgICAgICAyKSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgaW4gdGhlIHNvdXJjZSB2YWx1ZSBhbmQgc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgdG8gc2V0XHJcbiAgICAgICAgIFRoZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgaXMgdGhlbiBzZXQgb24gdGhlIHRhcmdldCxcclxuICAgICAgICAgYWZ0ZXIgZmlyc3QgcGFzc2luZyB0aHJ1IHRoZSBmbiwgaWYgcHJvdmlkZWQsIFVOTEVTUzpcclxuICAgICAgICAgICAxKSBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgICAgIDIpIGl0IGlzIHVuZGVmaW5lZCAoIG51bGxzIFdJTEwgYmUgc2V0KVxyXG4gICAgJ3RhcmdldCcgaXMgb3B0aW9uYWxcclxuICAgICAgIC0gaWYgaXQgZXhpc3RzIHRoZW4gcHJvcGVydGllcyBvZiB0aGUgdGFyZ2V0IHdpbGwgYmUgc2V0ICggb3ZlcndyaXR0ZW4gaWYgdGhlIGV4aXN0KVxyXG4gICAgICAgLSBpZiBpdCBkb2VzIG5vdCBleGlzdCB0aGVuIGEgbmV3IG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgYXMgZmlsbGVkLlxyXG4gICAgJ3RhcmdldCBpcyByZXR1cm5lZC5cclxuKi9cclxuZnVuY3Rpb24gdG9Kc29uKHNvdXJjZTogT2JqZWN0LCB0ZW1wbGF0ZTogT2JqZWN0LCB0YXJnZXQ6IE9iamVjdCA9IHt9KTogT2JqZWN0IHtcclxuXHJcbiAgICBmb3IgKGxldCBrZXkgaW4gdGVtcGxhdGUpIHtcclxuICAgICAgICBsZXQgYWxpYXNlcyA9IGtleS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IHRlbXBsYXRlW2tleV07XHJcbiAgICAgICAgLy8gdXNpbmcgc29tZSBhcyBhIGZvckVhY2ggd2l0aCBhICdicmVhaydcclxuICAgICAgICBhbGlhc2VzLnNvbWUoZnVuY3Rpb24gKHByb3BOYW1lKSB7XHJcbiAgICAgICAgICAgIGlmICghKHByb3BOYW1lIGluIHNvdXJjZSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW3Byb3BOYW1lXTtcclxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBmdW5jdGlvbmFsIHByb3BlcnR5IGRlZmluZWQgd2l0aCB0aGlzIGFsaWFzICggbm90IHdoYXQgd2Ugd2FudCB0byByZXBsYWNlKS5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAvLyAnPT0nIGlzIGRlbGliZXJhdGUgaGVyZSAtIGlkZWEgaXMgdGhhdCBudWxsIG9yIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCBuZXZlciBnZXQgc2VyaWFsaXplZFxyXG4gICAgICAgICAgICAvLyBpZiBkZWZhdWx0IHZhbHVlIGlzIHNldCB0byBudWxsLlxyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09IGRlZmF1bHRWYWx1ZSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIChkZWZhdWx0VmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgQnJlZXplRW51bSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIHRhcmdldFthbGlhc2VzWzBdXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKiBSZXBsYWNlciBmdW5jdGlvbiBmb3IgdG9KU09OU2FmZSwgd2hlbiBzZXJpYWxpemluZyBlbnRpdGllcy4gIEV4Y2x1ZGVzIGVudGl0eUFzcGVjdCBhbmQgb3RoZXIgaW50ZXJuYWwgcHJvcGVydGllcy4gKi9cclxuZnVuY3Rpb24gdG9KU09OU2FmZVJlcGxhY2VyKHByb3A6IHN0cmluZywgdmFsOiBhbnkpIHtcclxuICAgIGlmIChwcm9wID09PSBcImVudGl0eUFzcGVjdFwiIHx8IHByb3AgPT09IFwiY29tcGxleEFzcGVjdFwiIHx8IHByb3AgPT09IFwiZW50aXR5VHlwZVwiIHx8IHByb3AgPT09IFwiY29tcGxleFR5cGVcIlxyXG4gICAgICAgIHx8IHByb3AgPT09IFwiZ2V0UHJvcGVydHlcIiB8fCBwcm9wID09PSBcInNldFByb3BlcnR5XCJcclxuICAgICAgICB8fCBwcm9wID09PSBcImNvbnN0cnVjdG9yXCIgfHwgcHJvcC5jaGFyQXQoMCkgPT09ICdfJyB8fCBwcm9wLmNoYXJBdCgwKSA9PT0gJyQnKSByZXR1cm47XHJcbiAgICByZXR1cm4gdmFsO1xyXG59XHJcblxyXG4vKiogU2FmZWx5IHBlcmZvcm0gdG9KU09OIGxvZ2ljIG9uIG9iamVjdHMgd2l0aCBjeWNsZXMuICovXHJcbmZ1bmN0aW9uIHRvSlNPTlNhZmUob2JqOiBhbnksIHJlcGxhY2VyPzogKHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KTogYW55IHtcclxuICAgIGlmIChvYmogIT09IE9iamVjdChvYmopKSByZXR1cm4gb2JqOyAvLyBwcmltaXRpdmUgdmFsdWVcclxuICAgIGlmIChvYmouXyR2aXNpdGVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgaWYgKG9iai50b0pTT04pIHtcclxuICAgICAgICBsZXQgbmV3T2JqID0gb2JqLnRvSlNPTigpO1xyXG4gICAgICAgIGlmIChuZXdPYmogIT09IE9iamVjdChuZXdPYmopKSByZXR1cm4gbmV3T2JqOyAvLyBwcmltaXRpdmUgdmFsdWVcclxuICAgICAgICBpZiAobmV3T2JqICE9PSBvYmopIHJldHVybiB0b0pTT05TYWZlKG5ld09iaiwgcmVwbGFjZXIpO1xyXG4gICAgICAgIC8vIHRvSlNPTiByZXR1cm5lZCB0aGUgb2JqZWN0IHVuY2hhbmdlZC5cclxuICAgICAgICBvYmogPSBuZXdPYmo7XHJcbiAgICB9XHJcbiAgICBvYmouXyR2aXNpdGVkID0gdHJ1ZTtcclxuICAgIGxldCByZXN1bHQ6IGFueTtcclxuICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgIHJlc3VsdCA9IG9iai5tYXAoZnVuY3Rpb24gKG86IGFueSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdG9KU09OU2FmZShvLCByZXBsYWNlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAob2JqKSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBwcm9wIGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfJHZpc2l0ZWRcIikgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF07XHJcbiAgICAgICAgICAgIGlmIChyZXBsYWNlcikge1xyXG4gICAgICAgICAgICAgICAgdmFsID0gcmVwbGFjZXIocHJvcCwgdmFsKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFsID0gdG9KU09OU2FmZSh2YWwsIHJlcGxhY2VyKTtcclxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcclxuICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGRlbGV0ZSBvYmouXyR2aXNpdGVkO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqIFJlc29sdmVzIHRoZSB2YWx1ZXMgb2YgYSBsaXN0IG9mIHByb3BlcnRpZXMgYnkgY2hlY2tpbmcgZWFjaCBwcm9wZXJ0eSBpbiBtdWx0aXBsZSBzb3VyY2VzIHVudGlsIGEgdmFsdWUgaXMgZm91bmQuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVQcm9wZXJ0aWVzKHNvdXJjZXM6IE9iamVjdFtdLCBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSk6IGFueSB7XHJcbiAgICBsZXQgciA9IHt9O1xyXG4gICAgbGV0IGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xyXG4gICAgcHJvcGVydHlOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChwbikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHNyYyA9IHNvdXJjZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChzcmMpIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBzcmNbcG5dO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcltwbl0gPSB2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5cclxuLy8gYXJyYXkgZnVuY3Rpb25zXHJcblxyXG5mdW5jdGlvbiB0b0FycmF5KGl0ZW06IGFueSk6IGFueVtdIHtcclxuICAgIGlmIChpdGVtID09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFtpdGVtXTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIGEgdmVyc2lvbiBvZiBBcnJheS5tYXAgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYW4gYXJyYXksIGkuZS4gd29ya3Mgb24gYXJyYXlzIGFuZCBzY2FsYXJzLiAqL1xyXG4vLyBmdW5jdGlvbiBtYXA8VCwgVT4oaXRlbXM6IFQgfCBUW10sIGZuOiAodjogVCwgaXg/OiBudW1iZXIpID0+IFUsIGluY2x1ZGVOdWxsPzogYm9vbGVhbik6IFUgfCBVW10ge1xyXG4gZnVuY3Rpb24gbWFwPFQ+KGl0ZW1zOiBUIHwgVFtdLCBmbjogKHY6IFQsIGl4PzogbnVtYmVyKSA9PiBhbnksIGluY2x1ZGVOdWxsPzogYm9vbGVhbik6IGFueSB8IGFueVtdIHtcclxuICAgIC8vIHdoZXRoZXIgdG8gcmV0dXJuIG51bGxzIGluIGFycmF5IG9mIHJlc3VsdHM7IGRlZmF1bHQgPSB0cnVlO1xyXG4gICAgaW5jbHVkZU51bGwgPSBpbmNsdWRlTnVsbCA9PSBudWxsID8gdHJ1ZSA6IGluY2x1ZGVOdWxsO1xyXG4gICAgaWYgKGl0ZW1zID09IG51bGwpIHJldHVybiBpdGVtcztcclxuICAgIC8vIGxldCByZXN1bHQ6IFVbXTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XHJcbiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAodjogYW55LCBpeDogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIGxldCByID0gZm4odiwgaXgpO1xyXG4gICAgICAgICAgICBpZiAociAhPSBudWxsIHx8IGluY2x1ZGVOdWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaXhdID0gcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBmbihpdGVtcyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8qKiBSZXR1cm4gZmlyc3QgZWxlbWVudCBtYXRjaGluZyBwcmVkaWNhdGUgKi9cclxuZnVuY3Rpb24gYXJyYXlGaXJzdDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxhbnk+KTogVDtcclxuZnVuY3Rpb24gYXJyYXlGaXJzdDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxUPikge1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2ldKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXJyYXlbaV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKiBSZXR1cm4gaW5kZXggb2YgZmlyc3QgZWxlbWVudCBtYXRjaGluZyBwcmVkaWNhdGUgKi9cclxuZnVuY3Rpb24gYXJyYXlJbmRleE9mPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogUHJlZGljYXRlPGFueT4pOiBudW1iZXI7XHJcbmZ1bmN0aW9uIGFycmF5SW5kZXhPZjxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6IFByZWRpY2F0ZTxUPik6IG51bWJlciB7XHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaV0pKSByZXR1cm4gaTtcclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxufVxyXG5cclxuLyoqIEFkZCBpdGVtIGlmIG5vdCBhbHJlYWR5IGluIGFycmF5ICovXHJcbmZ1bmN0aW9uIGFycmF5QWRkSXRlbVVuaXF1ZTxUPihhcnJheTogVFtdLCBpdGVtOiBUKSB7XHJcbiAgICBsZXQgaXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGl4ID09PSAtMSkgYXJyYXkucHVzaChpdGVtKTtcclxufVxyXG5cclxuLyoqIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0gYXJyYXlcclxuICogQHBhcmFtIHByZWRpY2F0ZU9ySXRlbSAtIGl0ZW0gdG8gcmVtb3ZlLCBvciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgbWF0Y2hpbmcgaXRlbVxyXG4gKiBAcGFyYW0gc2hvdWxkUmVtb3ZlTXVsdGlwbGUgLSB0cnVlIHRvIGtlZXAgcmVtb3ZpbmcgYWZ0ZXIgZmlyc3QgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZVxyXG4gKi9cclxuZnVuY3Rpb24gYXJyYXlSZW1vdmVJdGVtPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZU9ySXRlbTogVCB8IFByZWRpY2F0ZTxUPiAsIHNob3VsZFJlbW92ZU11bHRpcGxlPzogYm9vbGVhbikge1xyXG4gICAgbGV0IHByZWRpY2F0ZSA9IChpc0Z1bmN0aW9uKHByZWRpY2F0ZU9ySXRlbSkgPyBwcmVkaWNhdGVPckl0ZW0gOiB1bmRlZmluZWQpIGFzIFByZWRpY2F0ZTxUPjtcclxuICAgIGxldCBsYXN0SXggPSBhcnJheS5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGkgPSBsYXN0SXg7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZSA/IHByZWRpY2F0ZShhcnJheVtpXSkgOiAoYXJyYXlbaV0gPT09IHByZWRpY2F0ZU9ySXRlbSkpIHtcclxuICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKCFzaG91bGRSZW1vdmVNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVtb3ZlZDtcclxufVxyXG5cclxuLyoqIENvbWJpbmUgYXJyYXkgZWxlbWVudHMgdXNpbmcgdGhlIGNhbGxiYWNrLiAgUmV0dXJucyBhcnJheSB3aXRoIGxlbmd0aCA9PSBtaW4oYTEubGVuZ3RoLCBhMi5sZW5ndGgpICovXHJcbmZ1bmN0aW9uIGFycmF5WmlwKGExOiBhbnlbXSwgYTI6IGFueVtdLCBjYWxsYmFjazogKHgxOiBhbnksIHgyOiBhbnkpID0+IGFueSk6IGFueVtdIHtcclxuICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XHJcbiAgICBsZXQgbiA9IE1hdGgubWluKGExLmxlbmd0aCwgYTIubGVuZ3RoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2soYTFbaV0sIGEyW2ldKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vL2Z1bmN0aW9uIGFycmF5RGlzdGluY3QoYXJyYXkpIHtcclxuLy8gICAgYXJyYXkgPSBhcnJheSB8fCBbXTtcclxuLy8gICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4vLyAgICBmb3IgKGxldCBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xyXG4vLyAgICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKGFycmF5W2ldKSA8IDApXHJcbi8vICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xyXG4vLyAgICB9XHJcbi8vICAgIHJldHVybiByZXN1bHQ7XHJcbi8vfVxyXG5cclxuLy8gTm90IHlldCBuZWVkZWRcclxuLy8vLyBtdWNoIGZhc3RlciBidXQgb25seSB3b3JrcyBvbiBhcnJheSBpdGVtcyB3aXRoIGEgdG9TdHJpbmcgbWV0aG9kIHRoYXRcclxuLy8vLyByZXR1cm5zIGRpc3RpbmN0IHN0cmluZyBmb3IgZGlzdGluY3Qgb2JqZWN0cy4gIFNvIHRoaXMgaXMgc2FmZSBmb3IgYXJyYXlzIHdpdGggcHJpbWl0aXZlXHJcbi8vLy8gdHlwZXMgYnV0IG5vdCBmb3IgYXJyYXlzIHdpdGggb2JqZWN0IHR5cGVzLCB1bmxlc3MgdG9TdHJpbmcoKSBoYXMgYmVlbiBpbXBsZW1lbnRlZC5cclxuLy9mdW5jdGlvbiBhcnJheURpc3RpbmN0VW5zYWZlKGFycmF5KSB7XHJcbi8vICAgIGxldCBvID0ge30sIGksIGwgPSBhcnJheS5sZW5ndGgsIHIgPSBbXTtcclxuLy8gICAgZm9yIChpID0gMDsgaSA8IGw7IGkgKz0gMSkge1xyXG4vLyAgICAgICAgbGV0IHYgPSBhcnJheVtpXTtcclxuLy8gICAgICAgIG9bdl0gPSB2O1xyXG4vLyAgICB9XHJcbi8vICAgIGZvciAoaSBpbiBvKSByLnB1c2gob1tpXSk7XHJcbi8vICAgIHJldHVybiByO1xyXG4vL31cclxuXHJcbmZ1bmN0aW9uIGFycmF5RXF1YWxzKGExOiBhbnlbXSwgYTI6IGFueVtdLCBlcXVhbHNGbj86ICh4MTogYW55LCB4MjogYW55KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAvL0NoZWNrIGlmIHRoZSBhcnJheXMgYXJlIHVuZGVmaW5lZC9udWxsXHJcbiAgICBpZiAoIWExIHx8ICFhMikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChhMS5sZW5ndGggIT09IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vZ28gdGhydSBhbGwgdGhlIHZhcnNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvL2lmIHRoZSBsZXQgaXMgYW4gYXJyYXksIHdlIG5lZWQgdG8gbWFrZSBhIHJlY3Vyc2l2ZSBjaGVja1xyXG4gICAgICAgIC8vb3RoZXJ3aXNlIHdlJ2xsIGp1c3QgY29tcGFyZSB0aGUgdmFsdWVzXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYTFbaV0pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXJyYXlFcXVhbHMoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChlcXVhbHNGbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlcXVhbHNGbihhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYTFbaV0gIT09IGEyW2ldKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLy8gZW5kIG9mIGFycmF5IGZ1bmN0aW9uc1xyXG5cclxuLyoqIFJldHVybnMgYW4gYXJyYXkgZm9yIGEgc291cmNlIGFuZCBhIHByb3AsIGFuZCBjcmVhdGVzIHRoZSBwcm9wIGlmIG5lZWRlZC4gKi9cclxuZnVuY3Rpb24gZ2V0QXJyYXkoc291cmNlOiBPYmplY3QsIHByb3BOYW1lOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICBsZXQgYXJyID0gc291cmNlW3Byb3BOYW1lXTtcclxuICAgIGlmICghYXJyKSB7XHJcbiAgICAgICAgYXJyID0gW107XHJcbiAgICAgICAgc291cmNlW3Byb3BOYW1lXSA9IGFycjtcclxuICAgIH1cclxuICAgIHJldHVybiBhcnI7XHJcbn1cclxuXHJcbi8qKiBDYWxscyByZXF1aXJlTGliQ29yZSBvbiBzZW1pY29sb24tc2VwYXJhdGVkIGxpYk5hbWVzICovXHJcbmZ1bmN0aW9uIHJlcXVpcmVMaWIobGliTmFtZXM6IHN0cmluZywgZXJyTWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgbGV0IGFyck5hbWVzID0gbGliTmFtZXMuc3BsaXQoXCI7XCIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBhcnJOYW1lcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcclxuICAgICAgICBsZXQgbGliID0gcmVxdWlyZUxpYkNvcmUoYXJyTmFtZXNbaV0pO1xyXG4gICAgICAgIGlmIChsaWIpIHJldHVybiBsaWI7XHJcbiAgICB9XHJcbiAgICBpZiAoZXJyTWVzc2FnZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBpbml0aWFsaXplIFwiICsgbGliTmFtZXMgKyBcIi4gIFwiICsgZXJyTWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuLyoqIFJldHVybnMgdGhlICdsaWJOYW1lJyBtb2R1bGUgaWYgbG9hZGVkIG9yIGVsc2UgcmV0dXJucyB1bmRlZmluZWQgKi9cclxuZnVuY3Rpb24gcmVxdWlyZUxpYkNvcmUobGliTmFtZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgd2luID0gd2luZG93IHx8IChnbG9iYWwgPyBnbG9iYWwud2luZG93IDogdW5kZWZpbmVkKTtcclxuICAgIGlmICghd2luKSByZXR1cm47IC8vIE11c3QgcnVuIGluIGEgYnJvd3Nlci4gVG9kbzogYWRkIGNvbW1vbmpzIHN1cHBvcnRcclxuXHJcbiAgICAvLyBnZXQgbGlicmFyeSBmcm9tIGJyb3dzZXIgZ2xvYmFscyBpZiB3ZSBjYW5cclxuICAgIGxldCBsaWIgPSB3aW5bbGliTmFtZV07XHJcbiAgICBpZiAobGliKSByZXR1cm4gbGliO1xyXG5cclxuICAgIC8vIGlmIHJlcXVpcmUgZXhpc3RzLCBtYXliZSByZXF1aXJlIGNhbiBnZXQgaXQuXHJcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBzeW5jaHJvbm91cyBzbyBpdCBjYW4ndCBsb2FkIG1vZHVsZXMgd2l0aCBBTUQuXHJcbiAgICAvLyBJdCBjYW4gb25seSBvYnRhaW4gbW9kdWxlcyBmcm9tIHJlcXVpcmUgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQuXHJcbiAgICAvLyBEZXZlbG9wZXIgc2hvdWxkIGJvb3RzdHJhcCBzdWNoIHRoYXQgdGhlIGJyZWV6ZSBtb2R1bGVcclxuICAgIC8vIGxvYWRzIGFmdGVyIGFsbCBvdGhlciBsaWJyYXJpZXMgdGhhdCBicmVlemUgc2hvdWxkIGZpbmQgd2l0aCB0aGlzIG1ldGhvZFxyXG4gICAgLy8gU2VlIGRvY3VtZW50YXRpb25cclxuICAgIGxldCByID0gd2luLnJlcXVpcmU7XHJcbiAgICBpZiAocikgeyAvLyBpZiByZXF1aXJlIGV4aXN0c1xyXG4gICAgICAgIGlmIChyLmRlZmluZWQpIHsgLy8gcmVxdWlyZS5kZWZpbmVkIGlzIG5vdCBzdGFuZGFyZCBhbmQgbWF5IG5vdCBleGlzdFxyXG4gICAgICAgICAgICAvLyByZXF1aXJlLmRlZmluZWQgcmV0dXJucyB0cnVlIGlmIG1vZHVsZSBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICAgICAgcmV0dXJuIHIuZGVmaW5lZChsaWJOYW1lKSA/IHIobGliTmFtZSkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmVxdWlyZS5kZWZpbmVkIGRvZXMgbm90IGV4aXN0IHNvIHdlIGhhdmUgdG8gY2FsbCByZXF1aXJlKCdsaWJOYW1lJykgZGlyZWN0bHkuXHJcbiAgICAgICAgICAgIC8vIFRoZSByZXF1aXJlKCdsaWJOYW1lJykgb3ZlcmxvYWQgaXMgc3luY2hyb25vdXMgYW5kIGRvZXMgbm90IGxvYWQgbW9kdWxlcy5cclxuICAgICAgICAgICAgLy8gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbW9kdWxlIGlzbid0IGFscmVhZHkgbG9hZGVkLlxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHIobGliTmFtZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUoJ2xpYk5hbWUnKSB0aHJldyBiZWNhdXNlIG1vZHVsZSBub3QgbG9hZGVkXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBFeGVjdXRlIGZuIHdoaWxlIG9iaiBoYXMgdGVtcFZhbHVlIGZvciBwcm9wZXJ0eSAqL1xyXG5mdW5jdGlvbiB1c2luZyhvYmo6IE9iamVjdCwgcHJvcGVydHk6IHN0cmluZywgdGVtcFZhbHVlOiBhbnksIGZuOiAoKSA9PiBhbnkpIHtcclxuICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgcmV0dXJuIGZuKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9ialtwcm9wZXJ0eV07XHJcbiAgICBpZiAodGVtcFZhbHVlID09PSBvcmlnaW5hbFZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZuKCk7XHJcbiAgICB9XHJcbiAgICBvYmpbcHJvcGVydHldID0gdGVtcFZhbHVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gZm4oKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgb2JqW3Byb3BlcnR5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvYmpbcHJvcGVydHldID0gb3JpZ2luYWxWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBDYWxsIHN0YXRlID0gc3RhcnRGbigpLCBjYWxsIGZuKCksIGNhbGwgZW5kRm4oc3RhdGUpICovXHJcbmZ1bmN0aW9uIHdyYXBFeGVjdXRpb24oc3RhcnRGbjogKCkgPT4gYW55LCBlbmRGbjogKHN0YXRlOiBhbnkpID0+IGFueSwgZm46ICgpID0+IGFueSkge1xyXG4gICAgbGV0IHN0YXRlOiBhbnk7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHN0YXRlID0gc3RhcnRGbigpO1xyXG4gICAgICAgIHJldHVybiBmbigpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHN0YXRlKSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBlO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBlbmRGbihzdGF0ZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBSZW1lbWJlciAmIHJldHVybiB0aGUgdmFsdWUgb2YgZm4oKSB3aGVuIGl0IHdhcyBjYWxsZWQgd2l0aCBpdHMgY3VycmVudCBhcmdzICovXHJcbmZ1bmN0aW9uIG1lbW9pemUoZm46IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBhcmdzID0gYXJyYXlTbGljZSg8YW55PmFyZ3VtZW50cyksXHJcbiAgICAgICAgICAgIGhhc2ggPSBcIlwiLFxyXG4gICAgICAgICAgICBpID0gYXJncy5sZW5ndGgsXHJcbiAgICAgICAgICAgIGN1cnJlbnRBcmc6IGFueSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgICBjdXJyZW50QXJnID0gYXJnc1tpXTtcclxuICAgICAgICAgICAgaGFzaCArPSAoY3VycmVudEFyZyA9PT0gT2JqZWN0KGN1cnJlbnRBcmcpKSA/IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRBcmcpIDogY3VycmVudEFyZztcclxuICAgICAgICAgICAgZm4ubWVtb2l6ZSB8fCAoZm4ubWVtb2l6ZSA9IHt9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChoYXNoIGluIGZuLm1lbW9pemUpID9cclxuICAgICAgICAgICAgZm4ubWVtb2l6ZVtoYXNoXSA6XHJcbiAgICAgICAgICAgIGZuLm1lbW9pemVbaGFzaF0gPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH07XHJcbn1cclxuXHJcbmNvbnN0IHV1aWRyZXggPSAvW3h5XS9nO1xyXG5mdW5jdGlvbiBnZXRVdWlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSh1dWlkcmV4LCBmdW5jdGlvbiAoYykge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgIGxldCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxufVxyXG5cclxuY29uc3QgZHVyYXRpb25yZXggPSAvXlAoKFxcZCtZKT8oXFxkK00pPyhcXGQrRCk/KT8oVChcXGQrSCk/KFxcZCtNKT8oXFxkK1MpPyk/JC87XHJcbmNvbnN0IGxldHRlcnNyZXggPSAvW0EtWmEtel0rL2c7XHJcbmZ1bmN0aW9uIGR1cmF0aW9uVG9TZWNvbmRzKGR1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIC8vIGJhc2ljIGFsZ29yaXRobSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXphc2EvaXNvODYwMS1qcy1wZXJpb2RcclxuICAgIGlmICh0eXBlb2YgZHVyYXRpb24gIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSVNPODYwMSBkdXJhdGlvbiAnXCIgKyBkdXJhdGlvbiArIFwiJ1wiKTtcclxuXHJcbiAgICAvLyByZWdleCBzcGxpdHMgYXMgZm9sbG93cyAtIGdycDAsIGdycDEsIHksIG0sIGQsIGdycDIsIGgsIG0sIHNcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgMSAgICAgMiAgMyAgNCAgNSAgICAgNiAgNyAgOFxyXG4gICAgbGV0IHN0cnVjdCA9IGR1cmF0aW9ucmV4LmV4ZWMoZHVyYXRpb24pO1xyXG4gICAgaWYgKCFzdHJ1Y3QpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgSVNPODYwMSBkdXJhdGlvbiAnXCIgKyBkdXJhdGlvbiArIFwiJ1wiKTtcclxuXHJcbiAgICBsZXQgeW1kaG1zSW5kZXhlcyA9IFsyLCAzLCA0LCA2LCA3LCA4XTsgLy8gLT4gZ3JwMSx5LG0sZCxncnAyLGgsbSxzXHJcbiAgICBsZXQgZmFjdG9ycyA9IFszMTEwNDAwMCwgLy8geWVhciAoMzYwKjI0KjYwKjYwKVxyXG4gICAgICAgIDI1OTIwMDAsICAgICAgICAgICAgIC8vIG1vbnRoICgzMCoyNCo2MCo2MClcclxuICAgICAgICA4NjQwMCwgICAgICAgICAgICAgICAvLyBkYXkgKDI0KjYwKjYwKVxyXG4gICAgICAgIDM2MDAsICAgICAgICAgICAgICAgIC8vIGhvdXIgKDYwKjYwKVxyXG4gICAgICAgIDYwLCAgICAgICAgICAgICAgICAgIC8vIG1pbnV0ZSAoNjApXHJcbiAgICAgICAgMV07ICAgICAgICAgICAgICAgICAgLy8gc2Vjb25kICgxKVxyXG5cclxuICAgIGxldCBzZWNvbmRzID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGRpZ2l0ID0gc3RydWN0W3ltZGhtc0luZGV4ZXNbaV1dO1xyXG4gICAgICAgIC8vIHJlbW92ZSBsZXR0ZXJzLCByZXBsYWNlIGJ5IDAgaWYgbm90IGRlZmluZWRcclxuICAgICAgICBkaWdpdCA9IDxhbnk+KGRpZ2l0ID8gK2RpZ2l0LnJlcGxhY2UobGV0dGVyc3JleCwgJycpIDogMCk7XHJcbiAgICAgICAgc2Vjb25kcyArPSA8YW55PmRpZ2l0ICogZmFjdG9yc1tpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBzZWNvbmRzO1xyXG5cclxufVxyXG5cclxuLy8gaXMgZnVuY3Rpb25zXHJcblxyXG5mdW5jdGlvbiBub29wKCkge1xyXG4gICAgLy8gZG9lcyBub3RoaW5nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlkZW50aXR5KHg6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4geDtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xhc3NvZihvOiBhbnkpIHtcclxuICAgIGlmIChvID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xyXG4gICAgfVxyXG4gICAgaWYgKG8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNEYXRlKG86IGFueSkge1xyXG4gICAgcmV0dXJuIGNsYXNzb2YobykgPT09IFwiZGF0ZVwiICYmICFpc05hTihvLmdldFRpbWUoKSk7XHJcbn1cclxuXHJcbmNvbnN0IGlzZGF0ZXJleCA9IC9eKChcXGR7NH0tWzAxXVxcZC1bMC0zXVxcZFRbMC0yXVxcZDpbMC01XVxcZDpbMC01XVxcZFxcLlxcZCsoWystXVswLTJdXFxkOlswLTVdXFxkfFopKXwoXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGQoWystXVswLTJdXFxkOlswLTVdXFxkfFopKXwoXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQoWystXVswLTJdXFxkOlswLTVdXFxkfFopKSkkLztcclxuZnVuY3Rpb24gaXNEYXRlU3RyaW5nKHM6IHN0cmluZykge1xyXG4gICAgLy8gbGV0IHJ4ID0gL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLztcclxuICAgIHJldHVybiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIpICYmIGlzZGF0ZXJleC50ZXN0KHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG86IGFueSkge1xyXG4gICAgcmV0dXJuIGNsYXNzb2YobykgPT09IFwiZnVuY3Rpb25cIjtcclxufVxyXG5cclxuLy8gZnVuY3Rpb24gaXNTdHJpbmcobzogYW55KSB7XHJcbi8vICAgICByZXR1cm4gKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKTtcclxuLy8gfVxyXG5cclxuLy8gZnVuY3Rpb24gaXNPYmplY3QobzogYW55KSB7XHJcbi8vICAgICByZXR1cm4gKHR5cGVvZiBvID09PSBcIm9iamVjdFwiKTtcclxuLy8gfVxyXG5cclxuY29uc3QgaXNndWlkcmV4ID0gL15bYS1mQS1GXFxkXXs4fS0oPzpbYS1mQS1GXFxkXXs0fS0pezN9W2EtZkEtRlxcZF17MTJ9JC87XHJcbmZ1bmN0aW9uIGlzR3VpZCh2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgJiYgaXNndWlkcmV4LnRlc3QodmFsdWUpO1xyXG59XHJcblxyXG5jb25zdCBpc2R1cmF0aW9ucmV4ID0gL14oLXwpP1BbVF0/W1xcZFxcLixcXC1dK1tZTURUSFNdLztcclxuZnVuY3Rpb24gaXNEdXJhdGlvbih2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgJiYgaXNkdXJhdGlvbnJleC50ZXN0KHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNFbXB0eShvYmo6IGFueSkge1xyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc051bWVyaWMobjogYW55KSB7XHJcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xyXG59XHJcblxyXG5cclxuXHJcbi8vIGVuZCBvZiBpcyBGdW5jdGlvbnNcclxuXHJcbi8vIHN0cmluZyBmdW5jdGlvbnNcclxuXHJcbmZ1bmN0aW9uIHN0cmluZ1N0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XHJcbiAgICAvLyByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZyBvciBudWxsIHByZWZpeFxyXG4gICAgaWYgKCghc3RyKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHByZWZpeCA9PT0gXCJcIiB8fCBwcmVmaXggPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gc3RyLmluZGV4T2YocHJlZml4LCAwKSA9PT0gMDtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RyaW5nRW5kc1dpdGgoc3RyOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSB7XHJcbiAgICAvLyByZXR1cm5zIHRydWUgZm9yIGVtcHR5IHN0cmluZyBvciBudWxsIHN1ZmZpeFxyXG4gICAgaWYgKCghc3RyKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHN1ZmZpeCA9PT0gXCJcIiB8fCBzdWZmaXggPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gc3RyLmluZGV4T2Yoc3VmZml4LCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xyXG59XHJcblxyXG4vLyBCYXNlZCBvbiBmcmFnbWVudCBmcm9tIERlYW4gRWR3YXJkcycgQmFzZSAyIGxpYnJhcnlcclxuLyoqIGZvcm1hdChcImEgJTEgYW5kIGEgJTJcIiwgXCJjYXRcIiwgXCJkb2dcIikgLT4gXCJhIGNhdCBhbmQgYSBkb2dcIiAqL1xyXG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoc3RyOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pIHtcclxuICAgIGxldCBhcmdzID0gYXJndW1lbnRzO1xyXG4gICAgbGV0IHBhdHRlcm4gPSBSZWdFeHAoXCIlKFsxLVwiICsgKGFyZ3VtZW50cy5sZW5ndGggLSAxKSArIFwiXSlcIiwgXCJnXCIpO1xyXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHBhdHRlcm4sIGZ1bmN0aW9uIChtYXRjaCwgaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gYXJnc1tpbmRleF07XHJcbiAgICB9KTtcclxufVxyXG5cclxuLy8gU2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzIyNTQwNy9jb252ZXJ0LWNhbWVsY2FzZXRleHQtdG8tY2FtZWwtY2FzZS10ZXh0XHJcbi8qKiBDaGFuZ2UgdGV4dCB0byB0aXRsZSBjYXNlIHdpdGggc3BhY2VzLCBlLmcuICdteVByb3BlcnR5TmFtZTEyJyB0byAnTXkgUHJvcGVydHkgTmFtZSAxMicgKi9cclxuY29uc3QgY2FtZWxFZGdlcyA9IC8oW0EtWl0oPz1bQS1aXVthLXpdKXxbXkEtWl0oPz1bQS1aXSl8W2EtekEtWl0oPz1bXmEtekEtWl0pKS9nO1xyXG5mdW5jdGlvbiB0aXRsZUNhc2VTcGFjZSh0ZXh0OiBzdHJpbmcpIHtcclxuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoY2FtZWxFZGdlcywgJyQxICcpO1xyXG4gICAgdGV4dCA9IHRleHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXh0LnNsaWNlKDEpO1xyXG4gICAgcmV0dXJuIHRleHQ7XHJcbn1cclxuXHJcbi8vIGVuZCBvZiBzdHJpbmcgZnVuY3Rpb25zXHJcblxyXG4vLyBTZWUgTWFyayBNaWxsZXLigJlzIGV4cGxhbmF0aW9uIG9mIHdoYXQgdGhpcyBkb2VzLlxyXG4vLyBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1jb252ZW50aW9uczpzYWZlX21ldGFfcHJvZ3JhbW1pbmdcclxuZnVuY3Rpb24gdW5jdXJyeShmOiBhbnkpIHtcclxuICAgIGxldCBjYWxsID0gRnVuY3Rpb24uY2FsbDtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhbGwuYXBwbHkoZiwgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIHNoaW1zXHJcblxyXG5pZiAoIU9iamVjdC5jcmVhdGUpIHtcclxuICAgIE9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAocGFyZW50OiBhbnkpIHtcclxuICAgICAgICBsZXQgRiA9IDxhbnk+ZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRi5wcm90b3R5cGUgPSBwYXJlbnQ7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGKCk7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyBzdHJpbmdzIGZvciBlcnJvciBtZXNzYWdlc1xyXG5cclxuY29uc3Qgc3RyaW5ncyA9IHtcclxuICAgIFwiVE9fVFlQRVwiOiBcIkFkZCAnRW50aXR5UXVlcnkudG9UeXBlKCknIHRvIHlvdXIgcXVlcnksIG9yIGNhbGwgJ01ldGFkYXRhU3RvcmUuc2V0RW50aXR5VHlwZUZvclJlc291cmNlTmFtZSgpJyB0byByZWdpc3RlciBhbiBFbnRpdHlUeXBlIGZvciB0aGlzIHJlc291cmNlTmFtZS5cIlxyXG59XHJcblxyXG4vLyAvLyBub3QgYWxsIG1ldGhvZHMgYWJvdmUgYXJlIGV4cG9ydGVkXHJcbmV4cG9ydCBjb25zdCBjb3JlID0ge1xyXG4gICAgaXNFUzVTdXBwb3J0ZWQ6IGlzRVM1U3VwcG9ydGVkLFxyXG4gICAgaGFzT3duUHJvcGVydHk6IGhhc093blByb3BlcnR5LFxyXG4gICAgZ2V0T3duUHJvcGVydHlWYWx1ZXM6IGdldE93blByb3BlcnR5VmFsdWVzLFxyXG4gICAgZ2V0UHJvcGVydHlEZXNjcmlwdG9yOiBnZXRQcm9wRGVzY3JpcHRvcixcclxuICAgIG9iamVjdEZvckVhY2g6IG9iamVjdEZvckVhY2gsXHJcbiAgICBvYmplY3RGaXJzdDogb2JqZWN0Rmlyc3QsXHJcbiAgICBvYmplY3RNYXA6IG9iamVjdE1hcCwgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIHN0cm9uZ2x5IHR5cGVkLlxyXG4gICAgZXh0ZW5kOiBleHRlbmQsXHJcbiAgICBwcm9wRXE6IHByb3BFcSxcclxuICAgIHByb3BzRXE6IHByb3BzRXEsXHJcbiAgICBwbHVjazogcGx1Y2ssXHJcbiAgICBtYXA6IG1hcCxcclxuICAgIHJlc29sdmVQcm9wZXJ0aWVzOiByZXNvbHZlUHJvcGVydGllcyxcclxuICAgIHNldEFzRGVmYXVsdDogc2V0QXNEZWZhdWx0LFxyXG4gICAgdXBkYXRlV2l0aERlZmF1bHRzOiB1cGRhdGVXaXRoRGVmYXVsdHMsXHJcbiAgICBnZXRBcnJheTogZ2V0QXJyYXksXHJcbiAgICB0b0FycmF5OiB0b0FycmF5LFxyXG4gICAgYXJyYXlFcXVhbHM6IGFycmF5RXF1YWxzLFxyXG4gICAgYXJyYXlTbGljZTogYXJyYXlTbGljZSxcclxuICAgIGFycmF5Rmlyc3Q6IGFycmF5Rmlyc3QsXHJcbiAgICBhcnJheUluZGV4T2Y6IGFycmF5SW5kZXhPZixcclxuICAgIGFycmF5UmVtb3ZlSXRlbTogYXJyYXlSZW1vdmVJdGVtLFxyXG4gICAgYXJyYXlaaXA6IGFycmF5WmlwLFxyXG4gICAgYXJyYXlBZGRJdGVtVW5pcXVlOiBhcnJheUFkZEl0ZW1VbmlxdWUsXHJcbiAgICBhcnJheUZsYXRNYXA6IGFycmF5RmxhdE1hcCxcclxuXHJcbiAgICByZXF1aXJlTGliOiByZXF1aXJlTGliLFxyXG4gICAgdXNpbmc6IHVzaW5nLFxyXG4gICAgd3JhcEV4ZWN1dGlvbjogd3JhcEV4ZWN1dGlvbixcclxuXHJcbiAgICBtZW1vaXplOiBtZW1vaXplLFxyXG4gICAgZ2V0VXVpZDogZ2V0VXVpZCxcclxuICAgIGR1cmF0aW9uVG9TZWNvbmRzOiBkdXJhdGlvblRvU2Vjb25kcyxcclxuXHJcbiAgICBpc1NldHRhYmxlOiBpc1NldHRhYmxlLFxyXG5cclxuICAgIGlzRGF0ZTogaXNEYXRlLFxyXG4gICAgaXNEYXRlU3RyaW5nOiBpc0RhdGVTdHJpbmcsXHJcbiAgICBpc0d1aWQ6IGlzR3VpZCxcclxuICAgIGlzRHVyYXRpb246IGlzRHVyYXRpb24sXHJcbiAgICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxyXG4gICAgaXNFbXB0eTogaXNFbXB0eSxcclxuICAgIGlzTnVtZXJpYzogaXNOdW1lcmljLFxyXG5cclxuICAgIGlkZW50aXR5OiBpZGVudGl0eSxcclxuICAgIG5vb3A6IG5vb3AsXHJcblxyXG4gICAgc3RyaW5nU3RhcnRzV2l0aDogc3RyaW5nU3RhcnRzV2l0aCxcclxuICAgIHN0cmluZ0VuZHNXaXRoOiBzdHJpbmdFbmRzV2l0aCxcclxuICAgIGZvcm1hdFN0cmluZzogZm9ybWF0U3RyaW5nLFxyXG4gICAgdGl0bGVDYXNlOiB0aXRsZUNhc2VTcGFjZSxcclxuXHJcbiAgICB0b0pzb246IHRvSnNvbixcclxuICAgIHRvSlNPTlNhZmU6IHRvSlNPTlNhZmUsXHJcbiAgICB0b0pTT05TYWZlUmVwbGFjZXI6IHRvSlNPTlNhZmVSZXBsYWNlcixcclxuXHJcbiAgICBzdHJpbmdzOiBzdHJpbmdzXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQ2FsbGJhY2sge1xyXG4gICAgKGVycm9yOiBhbnkpOiB2b2lkO1xyXG59XHJcblxyXG5cclxuLy8gVW51c2VkXHJcbi8qXHJcbi8vIHJldHVybnMgdHJ1ZSBmb3IgYm9vbGVhbnMsIG51bWJlcnMsIHN0cmluZ3MgYW5kIGRhdGVzXHJcbi8vIGZhbHNlIGZvciBudWxsLCBhbmQgbm9uLWRhdGUgb2JqZWN0cywgZnVuY3Rpb25zLCBhbmQgYXJyYXlzXHJcbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKG9iajogYW55KSB7XHJcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIHRydWUgZm9yIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW5zIGFuZCBudWxsLCBmYWxzZSBmb3Igb2JqZWN0c1xyXG4gICAgaWYgKG9iaiAhPSBPYmplY3Qob2JqKSkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gaXNEYXRlKG9iaik7XHJcbn1cclxuXHJcbiovIl19
|