velocious 1.0.654 → 1.0.656
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/README.md +1 -1
- package/build/http-server/client/index.js +67 -5
- package/build/http-server/client/request-buffer/index.js +15 -1
- package/build/http-server/client/response-compression.js +6 -8
- package/build/src/http-server/client/index.d.ts +9 -1
- package/build/src/http-server/client/index.d.ts.map +1 -1
- package/build/src/http-server/client/index.js +68 -6
- package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
- package/build/src/http-server/client/request-buffer/index.js +16 -2
- package/build/src/http-server/client/response-compression.d.ts +4 -2
- package/build/src/http-server/client/response-compression.d.ts.map +1 -1
- package/build/src/http-server/client/response-compression.js +7 -8
- package/package.json +1 -1
- package/src/http-server/client/index.js +67 -5
- package/src/http-server/client/request-buffer/index.js +15 -1
- package/src/http-server/client/response-compression.js +6 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/http-server/client/request-buffer/index.js"],"names":[],"mappings":"AAGA,OAAO,YAAY,MAAM,qBAAqB,CAAA;AAC9C,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,OAAO,MAAM,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/http-server/client/request-buffer/index.js"],"names":[],"mappings":"AAGA,OAAO,YAAY,MAAM,qBAAqB,CAAA;AAC9C,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,OAAO,MAAM,MAAM,oBAAoB,CAAA;AAuBvC,MAAM,CAAC,OAAO,OAAO,aAAa;IAmCzB,aAAa;IACb,MAAM;IA+HF,qBAAqB;IAGnB,oBAAoB;IAmG1B,YAAY;IA4F2B,aAAa;IAiC9C,QAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,eAAe;IA+BrB,UAAU;IACV,WAAW;IACX,IAAI;IAOF,QAAQ;IAiCV,gBAAgB;IAjdvB,UAAU,SAAI;IAEd,mCAAmC;IACnC,eAAe,EADJ,MAAM,EAAE,GAAG,SAAS,CACJ;IAE3B;;0BAEsB;IACtB,IAAI,EADM,MAAM,EAAE,CACT;IAET,MAAM,6DAAqB;IAE3B;;wCAEoC;IACpC,aAAa,EADH,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACd;IAClB;;sCAEkC;IAClC,gBAAgB,EADN,MAAM,EAAE,GAAG,SAAS,CACF;IAE5B,kBAAkB,UAAQ;IAE1B,SAAS,UAAQ;IACjB,MAAM,KAAK;IACX,WAAW,UAAQ;IACnB,KAAK,SAAW;IAEhB;;;;OAIG;IACH,YAAY,EAAC,aAAa,EAAC,EAFxB;QAA0D,aAAa,EAA/D,OAAO,2BAA2B,EAAE,OAAO,CACrD;KAC0B,EAG1B;IAED,OAAO,SAEN;IAED;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAHE,MAGF,GAFI,MAAM,GAAG,SAAS,CA4B9B;IAED;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,MAAM,CAkClB;IAED;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAJN,MAIM,EAAE,KAAK,EAHb,MAGa,GAFX,MAAM,CAiBlB;IAED;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,MAAM,CA+ElB;IAED;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAHH,MAGG,GAFD,MAAM,CAQlB;IAED;;;OAGG;IACH,cAAc,IAFD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAelC;IAED;;;OAGG;IACH,gBAAgB,IAFH,IAAI,CAWhB;IAED,oBAAoB,YAEnB;IAED;;;OAGG;IACH,eAAe,IAFF,IAAI,CAKhB;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAHC,MAGD,GAFG,IAAI,CAoChB;IAED;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAHZ,MAGY,GAFV,MAAM,GAAG,SAAS,CAU9B;IAED;;;OAGG;IACH,SAAS,CAAC,MAAM,EAFL,MAEK,QAcf;IAED;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAHL,MAGK,GAFH,IAAI,CA+ChB;IAED;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAHT,MAGS,GAFP,IAAI,CAchB;IAED,eAAe,SAQd;IAED;;;;OAIG;IACH,kBAAkB,CAAC,UAAU,EAHlB,MAGkB,GAFhB,OAAO,CAInB;IAED;;;OAGG;IACH,iBAAiB,IAFJ,OAAO,CAMnB;IAED;;;OAGG;IACH,qBAAqB,IAFR,IAAI,CAOhB;IAED;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAHZ,MAGY,GAFV,IAAI,CAuBhB;IAED;;;OAGG;IACH,iBAAiB,IAFJ,IAAI,CAQhB;IAED;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAHN,MAGM,GAFJ,IAAI,CAKhB;IAED,eAAe,aAad;IAED,0BAA0B,SAMzB;IAED,0BAA0B,SAqCzB;CACF"}
|
|
@@ -6,6 +6,11 @@ import { incorporate } from "incorporator";
|
|
|
6
6
|
import Logger from "../../../logger.js";
|
|
7
7
|
import ParamsToObject from "../params-to-object.js";
|
|
8
8
|
import querystring from "querystring";
|
|
9
|
+
/**
|
|
10
|
+
* Request header fields whose repeated wire fields combine into one value
|
|
11
|
+
* (RFC 9110 §5.3) before the server consumes them.
|
|
12
|
+
* @type {Set<string>} */
|
|
13
|
+
const COMBINING_HEADER_FIELDS = new Set(["accept-encoding"]);
|
|
9
14
|
/**
|
|
10
15
|
* Runs truncate preview.
|
|
11
16
|
* @param {string | undefined} input - Input string.
|
|
@@ -325,7 +330,16 @@ export default class RequestBuffer {
|
|
|
325
330
|
*/
|
|
326
331
|
addHeader(header) {
|
|
327
332
|
const formattedName = header.getFormattedName();
|
|
328
|
-
this.headersByName[formattedName]
|
|
333
|
+
const existingHeader = this.headersByName[formattedName];
|
|
334
|
+
// RFC 9110 §5.3: a field may be repeated; its value is the concatenation of
|
|
335
|
+
// all field values separated by commas, in wire order. Only Accept-Encoding
|
|
336
|
+
// is consumed as a combined field by the server.
|
|
337
|
+
if (existingHeader && COMBINING_HEADER_FIELDS.has(formattedName)) {
|
|
338
|
+
existingHeader.value += `, ${header.getValue()}`;
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
this.headersByName[formattedName] = header;
|
|
342
|
+
}
|
|
329
343
|
if (formattedName == "content-length")
|
|
330
344
|
this.contentLength = parseInt(header.getValue());
|
|
331
345
|
}
|
|
@@ -527,4 +541,4 @@ export default class RequestBuffer {
|
|
|
527
541
|
}
|
|
528
542
|
}
|
|
529
543
|
}
|
|
530
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtYnVmZmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSxpQ0FBaUMsQ0FBQTtBQUMxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN4QyxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLGNBQWMsTUFBTSx3QkFBd0IsQ0FBQTtBQUNuRCxPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUE7QUFFckM7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUc7SUFDekMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV2QyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQTtBQUN0QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxhQUFhO0lBQ2hDLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFFZCxtQ0FBbUM7SUFDbkMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtJQUUzQjs7MEJBRXNCO0lBQ3RCLElBQUksR0FBRyxFQUFFLENBQUE7SUFFVCxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUUzQjs7d0NBRW9DO0lBQ3BDLGFBQWEsR0FBRyxFQUFFLENBQUE7SUFDbEI7O3NDQUVrQztJQUNsQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUE7SUFFNUIsa0JBQWtCLEdB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O29CQUN4QyxjQUFjLEVBQUU7d0JBQ2QsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSzt3QkFDbEQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO3dCQUMzQixhQUFhLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDNUQsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLGVBQWUsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDL0MsS0FBSyxFQUFFLDBCQUEwQjtxQkFDbEM7aUJBQ0YsQ0FBQTtnQkFFRCxNQUFNLFlBQVksQ0FBQTtZQUNwQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCBGb3JtRGF0YVBhcnQgZnJvbSBcIi4vZm9ybS1kYXRhLXBhcnQuanNcIlxuaW1wb3J0IEhlYWRlciBmcm9tIFwiLi9oZWFkZXIuanNcIlxuaW1wb3J0IHtpbmNvcnBvcmF0ZX0gZnJvbSBcImluY29ycG9yYXRvclwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFBhcmFtc1RvT2JqZWN0IGZyb20gXCIuLi9wYXJhbXMtdG8tb2JqZWN0LmpzXCJcbmltcG9ydCBxdWVyeXN0cmluZyBmcm9tIFwicXVlcnlzdHJpbmdcIlxuXG4vKipcbiAqIFJ1bnMgdHJ1bmNhdGUgcHJldmlldy5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBpbnB1dCAtIElucHV0IHN0cmluZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gTWF4IHByZXZpZXcgbGVuZ3RoLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUcnVuY2F0ZWQgcHJldmlldy5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVQcmV2aWV3KGlucHV0LCBsaW1pdCA9IDMwMCkge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmIChpbnB1dC5sZW5ndGggPD0gbGltaXQpIHJldHVybiBpbnB1dFxuXG4gIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBsaW1pdCl9Li4uYFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0QnVmZmVyIHtcbiAgYm9keUxlbmd0aCA9IDBcblxuICAvKiogQHR5cGUge0J1ZmZlcltdIHwgdW5kZWZpbmVkfSAqL1xuICBwb3N0Qm9keUJ1ZmZlcnMgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGF0YS5cbiAgICogQHR5cGUge251bWJlcltdfSAqL1xuICBkYXRhID0gW11cblxuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAvKipcbiAgICogSGVhZGVycyBieSBuYW1lLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgSGVhZGVyPn0gKi9cbiAgaGVhZGVyc0J5TmFtZSA9IHt9XG4gIC8qKlxuICAgKiBDaHVua2VkIGJvZHkgY2hhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJbXSB8IHVuZGVmaW5lZH0gKi9cbiAgY2h1bmtlZEJvZHlDaGFycyA9IHVuZGVmaW5lZFxuXG4gIG11bHRpUGFydHlGb3JtRGF0YSA9IGZhbHNlXG5cbiAgY29tcGxldGVkID0gZmFsc2VcbiAgcGFyYW1zID0ge31cbiAgcmVhZGluZ0JvZHkgPSBmYWxzZVxuICBzdGF0ZSA9IFwic3RhdHVzXCJcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbn0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMsIHtkZWJ1ZzogZmFsc2V9KVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICAvLyBEbyBub3RoaW5nIGZvciBub3cuLi5cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZlZWQuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7QnVmZmVyIHwgdW5kZWZpbmVkfSAtIFJlbWFpbmluZyBkYXRhLCBpZiBhbnkuXG4gICAqL1xuICBmZWVkKGRhdGEpIHtcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICB3aGlsZSAoaW5kZXggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgc3dpdGNoKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBcInN0YXR1c1wiOlxuICAgICAgICBjYXNlIFwiaGVhZGVyc1wiOlxuICAgICAgICBjYXNlIFwibXVsdGktcGFydC1mb3JtLWRhdGFcIjpcbiAgICAgICAgY2FzZSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWhlYWRlclwiOlxuICAgICAgICBjYXNlIFwiY2h1bmtlZC1zaXplXCI6XG4gICAgICAgIGNhc2UgXCJjaHVua2VkLXRyYWlsZXJcIjpcbiAgICAgICAgICBpbmRleCA9IHRoaXMuZmVlZExpbmUoZGF0YSwgaW5kZXgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInBvc3QtYm9keVwiOlxuICAgICAgICAgIGluZGV4ID0gdGhpcy5mZWVkUG9zdEJvZHkoZGF0YSwgaW5kZXgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbmRleCA9IHRoaXMuZmVlZEJ5dGUoZGF0YSwgaW5kZXgpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm4gZGF0YS5zdWJhcnJheShpbmRleClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgYnl0ZXMgZm9yIHRoZSBsaW5lLWJhc2VkIHN0YXRlcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBuZXh0IG5ld2xpbmUuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBSZWFkIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5ldyByZWFkIHBvc2l0aW9uLlxuICAgKi9cbiAgZmVlZExpbmUoZGF0YSwgaW5kZXgpIHtcbiAgICBjb25zdCBuZXdsaW5lSW5kZXggPSBkYXRhLmluZGV4T2YoMTAsIGluZGV4KVxuXG4gICAgaWYgKG5ld2xpbmVJbmRleCA9PT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLnJlYWRpbmdCb2R5KSB0aGlzLmJvZHlMZW5ndGggKz0gZGF0YS5sZW5ndGggLSBpbmRleFxuXG4gICAgICBmb3IgKGxldCBkYXRhSW5kZXggPSBpbmRleDsgZGF0YUluZGV4IDwgZGF0YS5sZW5ndGg7IGRhdGFJbmRleCArPSAxKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGRhdGFbZGF0YUluZGV4XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZGluZ0JvZHkpIHRoaXMuYm9keUxlbmd0aCArPSBuZXdsaW5lSW5kZXggKyAxIC0gaW5kZXhcblxuICAgIGxldCBsaW5lXG5cbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA9PSAwKSB7XG4gICAgICBsaW5lID0gZGF0YS50b1N0cmluZyhcImxhdGluMVwiLCBpbmRleCwgbmV3bGluZUluZGV4ICsgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlc3Qgb2YgYSBsaW5lIHRoYXQgc3RhcnRlZCBpbiBhIHByZXZpb3VzIGNodW5rLlxuICAgICAgZm9yIChsZXQgZGF0YUluZGV4ID0gaW5kZXg7IGRhdGFJbmRleCA8PSBuZXdsaW5lSW5kZXg7IGRhdGFJbmRleCArPSAxKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGRhdGFbZGF0YUluZGV4XSlcbiAgICAgIH1cblxuICAgICAgbGluZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdGhpcy5kYXRhKVxuICAgICAgdGhpcy5kYXRhID0gW11cbiAgICB9XG5cbiAgICB0aGlzLnBhcnNlKGxpbmUpXG5cbiAgICByZXR1cm4gbmV3bGluZUluZGV4ICsgMVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGZpeGVkLWxlbmd0aCByZXF1ZXN0IGJvZHkgYnl0ZXMgaW4gYnVsay5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFJlYWQgcG9zaXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTmV3IHJlYWQgcG9zaXRpb24uXG4gICAqL1xuICBmZWVkUG9zdEJvZHkoZGF0YSwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMucG9zdEJvZHlCdWZmZXJzKSB0aHJvdyBuZXcgRXJyb3IoXCJwb3N0Qm9keUJ1ZmZlcnMgbm90IGluaXRpYWxpemVkXCIpXG4gICAgaWYgKHRoaXMuY29udGVudExlbmd0aCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZW50IGxlbmd0aCBub3Qgc2V0XCIpXG5cbiAgICBjb25zdCByZW1haW5pbmdCb2R5Qnl0ZXMgPSBNYXRoLm1heCgxLCB0aGlzLmNvbnRlbnRMZW5ndGggLSB0aGlzLmJvZHlMZW5ndGgpXG4gICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihkYXRhLmxlbmd0aCwgaW5kZXggKyByZW1haW5pbmdCb2R5Qnl0ZXMpXG5cbiAgICB0aGlzLnBvc3RCb2R5QnVmZmVycy5wdXNoKGRhdGEuc3ViYXJyYXkoaW5kZXgsIGVuZEluZGV4KSlcbiAgICB0aGlzLmJvZHlMZW5ndGggKz0gZW5kSW5kZXggLSBpbmRleFxuXG4gICAgaWYgKHRoaXMuY29udGVudExlbmd0aCAmJiB0aGlzLmJvZHlMZW5ndGggPj0gdGhpcy5jb250ZW50TGVuZ3RoKSB7XG4gICAgICB0aGlzLnBvc3RSZXF1ZXN0RG9uZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVuZEluZGV4XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgYSBzaW5nbGUgYnl0ZSBmb3IgdGhlIGJ5dGUtYmFzZWQgcGFyc2VyIHN0YXRlcy5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFJlYWQgcG9zaXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTmV3IHJlYWQgcG9zaXRpb24uXG4gICAqL1xuICBmZWVkQnl0ZShkYXRhLCBpbmRleCkge1xuICAgIGNvbnN0IGNoYXIgPSBkYXRhW2luZGV4XVxuXG4gICAgaWYgKHRoaXMucmVhZGluZ0JvZHkpIHRoaXMuYm9keUxlbmd0aCArPSAxXG5cbiAgICBzd2l0Y2godGhpcy5zdGF0ZSkge1xuICAgICAgY2FzZSBcImNodW5rZWQtZGF0YVwiOiB7XG4gICAgICAgIGNvbnN0IGNodW5rZWRCb2R5Q2hhcnMgPSB0aGlzLmNodW5rZWRCb2R5Q2hhcnNcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2h1bmtTaXplID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNodW5rIHNpemUgbm90IGluaXRpYWxpemVkXCIpXG4gICAgICAgIGlmICghY2h1bmtlZEJvZHlDaGFycykgdGhyb3cgbmV3IEVycm9yKFwiQ2h1bmtlZCBib2R5IG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgICAgIGNodW5rZWRCb2R5Q2hhcnMucHVzaChjaGFyKVxuICAgICAgICAvKipcbiAgICAgICAgICogQ3VycmVudCBjaHVuayBieXRlcyByZWFkLlxuICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgICAgICBjb25zdCBjdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSAodGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgfHwgMCkgKyAxXG5cbiAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSBjdXJyZW50Q2h1bmtCeXRlc1JlYWRcblxuICAgICAgICBpZiAoY3VycmVudENodW5rQnl0ZXNSZWFkID49IHRoaXMuY3VycmVudENodW5rU2l6ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudENodW5rQ3JsZlJlYWQgPSAwXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtZGF0YS1jcmxmXCIpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBcImNodW5rZWQtZGF0YS1jcmxmXCI6XG4gICAgICAgIHRoaXMuY3VycmVudENodW5rQ3JsZlJlYWQgPSAodGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCB8fCAwKSArIDFcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCA+PSAyKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSAwXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtc2l6ZVwiKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YS1ib2R5XCI6IHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1EYXRhUGFydCkgdGhyb3cgbmV3IEVycm9yKFwiRm9ybURhdGEgcGFydCBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kYXJ5TGluZUVuZCkgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRhcnkgbGluZSBlbmQgbm90IGluaXRpYWxpemVkXCIpXG4gICAgICAgIGlmICghdGhpcy5ib3VuZGFyeUxpbmVOZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJCb3VuZGFyeSBsaW5lIG5leHQgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuZm9ybURhdGFQYXJ0LmJvZHlcblxuICAgICAgICBib2R5LnB1c2goY2hhcilcblxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5RW5kUG9zaXRpb24gPSBib2R5Lmxlbmd0aCAtIHRoaXMuYm91bmRhcnlMaW5lRW5kLmxlbmd0aFxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5RW5kQ2hhcnMgPSBib2R5LnNsaWNlKHBvc3NpYmxlQm91bmRhcnlFbmRQb3NpdGlvbiwgYm9keS5sZW5ndGgpXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlFbmQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHBvc3NpYmxlQm91bmRhcnlFbmRDaGFycylcblxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5TmV4dFBvc2l0aW9uID0gYm9keS5sZW5ndGggLSB0aGlzLmJvdW5kYXJ5TGluZU5leHQubGVuZ3RoXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlOZXh0Q2hhcnMgPSBib2R5LnNsaWNlKHBvc3NpYmxlQm91bmRhcnlOZXh0UG9zaXRpb24sIGJvZHkubGVuZ3RoKVxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5TmV4dCA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgcG9zc2libGVCb3VuZGFyeU5leHRDaGFycylcblxuICAgICAgICBpZiAocG9zc2libGVCb3VuZGFyeUVuZCA9PSB0aGlzLmJvdW5kYXJ5TGluZUVuZCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0LnJlbW92ZUZyb21Cb2R5KHBvc3NpYmxlQm91bmRhcnlFbmQpXG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnREb25lKClcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICAgIH0gZWxzZSBpZiAocG9zc2libGVCb3VuZGFyeU5leHQgPT0gdGhpcy5ib3VuZGFyeUxpbmVOZXh0KSB7XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnQucmVtb3ZlRnJvbUJvZHkocG9zc2libGVCb3VuZGFyeU5leHQpXG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnREb25lKClcbiAgICAgICAgICB0aGlzLm5ld0Zvcm1EYXRhUGFydCgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZW50TGVuZ3RoICYmIHRoaXMuYm9keUxlbmd0aCA+PSB0aGlzLmNvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuICAgICAgICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1EYXRhUGFydC5jb250ZW50TGVuZ3RoICYmIHRoaXMuYm9keUxlbmd0aCA+PSB0aGlzLmZvcm1EYXRhUGFydC5jb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnREb25lKClcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInN0dWJcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbYFVua25vd24gc3RhdGUgZm9yIHJlcXVlc3QgYnVmZmVyYCwge3N0YXRlOiB0aGlzLnN0YXRlfV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4ICsgMVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOYW1lLlxuICAgKiBAcmV0dXJucyB7SGVhZGVyfSAtIFRoZSBoZWFkZXIuXG4gICAqL1xuICBnZXRIZWFkZXIobmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGVhZGVyc0J5TmFtZVtuYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpXVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBbYGdldEhlYWRlciAke25hbWV9YCwge3Jlc3VsdDogcmVzdWx0Py50b1N0cmluZygpfV0pXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgaGVhZGVycyBoYXNoLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBUaGUgaGVhZGVycyBoYXNoLlxuICAgKi9cbiAgZ2V0SGVhZGVyc0hhc2goKSB7XG4gICAgLyoqXG4gICAgICogUmVzdWx0LlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlckZvcm1hdHRlZE5hbWUgaW4gdGhpcy5oZWFkZXJzQnlOYW1lKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmhlYWRlcnNCeU5hbWVbaGVhZGVyRm9ybWF0dGVkTmFtZV1cblxuICAgICAgcmVzdWx0W2hlYWRlci5nZXROYW1lKCldID0gaGVhZGVyLmdldFZhbHVlKClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtIGRhdGEgcGFydCBkb25lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBmb3JtRGF0YVBhcnREb25lKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhUGFydCA9IHRoaXMuZm9ybURhdGFQYXJ0XG5cbiAgICBpZiAoIWZvcm1EYXRhUGFydCkgdGhyb3cgbmV3IEVycm9yKFwiZm9ybURhdGFQYXJ0IHdhc250IHNldFwiKVxuXG4gICAgdGhpcy5mb3JtRGF0YVBhcnQgPSB1bmRlZmluZWRcbiAgICBmb3JtRGF0YVBhcnQuZmluaXNoKClcblxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJmb3JtLWRhdGEtcGFydFwiLCBmb3JtRGF0YVBhcnQpXG4gIH1cblxuICBpc011bHRpUGFydHlGb3JtRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aVBhcnR5Rm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5ldyBmb3JtIGRhdGEgcGFydC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgbmV3Rm9ybURhdGFQYXJ0KCkge1xuICAgIHRoaXMuZm9ybURhdGFQYXJ0ID0gbmV3IEZvcm1EYXRhUGFydCgpXG4gICAgdGhpcy5zZXRTdGF0ZShcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWhlYWRlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gTGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2UobGluZSkge1xuICAgIGlmICh0aGlzLnN0YXRlID09IFwic3RhdHVzXCIpIHtcbiAgICAgIHRoaXMucGFyc2VTdGF0dXNMaW5lKGxpbmUpXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwiaGVhZGVyc1wiKSB7XG4gICAgICB0aGlzLnBhcnNlSGVhZGVyKGxpbmUpXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwiY2h1bmtlZC1zaXplXCIpIHtcbiAgICAgIHRoaXMucGFyc2VDaHVua1NpemVMaW5lKGxpbmUpXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwiY2h1bmtlZC10cmFpbGVyXCIpIHtcbiAgICAgIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgICAgdGhpcy5maW5pc2hDaHVua2VkQm9keSgpXG4gICAgICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YVwiKSB7XG4gICAgICBpZiAobGluZSA9PSB0aGlzLmJvdW5kYXJ5TGluZSkge1xuICAgICAgICB0aGlzLm5ld0Zvcm1EYXRhUGFydCgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFwiZG9uZVwiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBib3VuZGFyeSBsaW5lIGJ1dCBkaWRuJ3QgZ2V0IGl0OiAke2xpbmV9YClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YS1oZWFkZXJcIikge1xuICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5yZWFkSGVhZGVyRnJvbUxpbmUobGluZSlcblxuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybURhdGFQYXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtRGF0YVBhcnQgbm90IHNldFwiKVxuXG4gICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0LmFkZEhlYWRlcihoZWFkZXIpXG4gICAgICAgIC8vdGhpcy5zdGF0ZSA9PSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhXCJcbiAgICAgIH0gZWxzZSBpZiAobGluZSA9PSBcIlxcclxcblwiKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YS1ib2R5XCIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGF0ZSBwYXJzaW5nIGxpbmU6ICR7dGhpcy5zdGF0ZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlYWQgaGVhZGVyIGZyb20gbGluZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBMaW5lLlxuICAgKiBAcmV0dXJucyB7SGVhZGVyIHwgdW5kZWZpbmVkfSAtIFRoZSBoZWFkZXIgZnJvbSBsaW5lLlxuICAgKi9cbiAgcmVhZEhlYWRlckZyb21MaW5lKGxpbmUpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14oLispOiAoLispXFxyXFxuLylcblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgaGVhZGVyID0gbmV3IEhlYWRlcihtYXRjaFsxXSwgbWF0Y2hbMl0pXG5cbiAgICAgIHJldHVybiBoZWFkZXJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgaGVhZGVyLlxuICAgKiBAcGFyYW0ge0hlYWRlcn0gaGVhZGVyIC0gSGVhZGVyIHZhbHVlLlxuICAgKi9cbiAgYWRkSGVhZGVyKGhlYWRlcikge1xuICAgIGNvbnN0IGZvcm1hdHRlZE5hbWUgPSBoZWFkZXIuZ2V0Rm9ybWF0dGVkTmFtZSgpXG5cbiAgICB0aGlzLmhlYWRlcnNCeU5hbWVbZm9ybWF0dGVkTmFtZV0gPSBoZWFkZXJcblxuICAgIGlmIChmb3JtYXR0ZWROYW1lID09IFwiY29udGVudC1sZW5ndGhcIikgdGhpcy5jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQoaGVhZGVyLmdldFZhbHVlKCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gTGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2VIZWFkZXIobGluZSkge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMucmVhZEhlYWRlckZyb21MaW5lKGxpbmUpXG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBQYXJzZWQgaGVhZGVyOiAke2hlYWRlci50b1N0cmluZygpfWApXG4gICAgICB0aGlzLmFkZEhlYWRlcihoZWFkZXIpXG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiaGVhZGVyXCIsIGhlYWRlcilcbiAgICB9IGVsc2UgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgY29uc3QgaHR0cE1ldGhvZCA9IHRoaXMuaHR0cE1ldGhvZD8udG9VcHBlckNhc2UoKVxuXG4gICAgICBpZiAoIWh0dHBNZXRob2QpIHRocm93IG5ldyBFcnJvcihcIkhUVFAgbWV0aG9kIG5vdCBzZXRcIilcblxuICAgICAgaWYgKCF0aGlzLmV4cGVjdHNSZXF1ZXN0Qm9keShodHRwTWV0aG9kKSkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaHVua2VkRW5jb2RpbmcoKSkge1xuICAgICAgICB0aGlzLnJlYWRpbmdCb2R5ID0gdHJ1ZVxuICAgICAgICB0aGlzLmJvZHlMZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNodW5rZWRCb2R5KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVhZGluZ0JvZHkgPSB0cnVlXG4gICAgICAgIHRoaXMuYm9keUxlbmd0aCA9IDBcblxuICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZ2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIpPy52YWx1ZT8ubWF0Y2goL15tdWx0aXBhcnRcXC9mb3JtLWRhdGE7XFxzKmJvdW5kYXJ5PSguKykkL2kpXG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgdGhpcy5ib3VuZGFyeSA9IG1hdGNoWzFdXG4gICAgICAgICAgdGhpcy5ib3VuZGFyeUxpbmUgPSBgLS0ke3RoaXMuYm91bmRhcnl9XFxyXFxuYFxuICAgICAgICAgIHRoaXMuYm91bmRhcnlMaW5lTmV4dCA9IGBcXHJcXG4tLSR7dGhpcy5ib3VuZGFyeX1cXHJcXG5gXG4gICAgICAgICAgdGhpcy5ib3VuZGFyeUxpbmVFbmQgPSBgXFxyXFxuLS0ke3RoaXMuYm91bmRhcnl9LS1gXG4gICAgICAgICAgdGhpcy5tdWx0aVBhcnR5Rm9ybURhdGEgPSB0cnVlXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShcIm11bHRpLXBhcnQtZm9ybS1kYXRhXCIpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZW50TGVuZ3RoID09PSAwIHx8IHRoaXMuY29udGVudExlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc05hTih0aGlzLmNvbnRlbnRMZW5ndGgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGVudCBsZW5ndGggaXMgaW52YWxpZFwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgICAgICAgKiBAdHlwZSB7QnVmZmVyW119ICovXG4gICAgICAgICAgdGhpcy5wb3N0Qm9keUJ1ZmZlcnMgPSBbXVxuXG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShcInBvc3QtYm9keVwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2Ugc3RhdHVzIGxpbmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gTGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2VTdGF0dXNMaW5lKGxpbmUpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14oW0EtWi1dKykgKC4rPykgSFRUUFxcLyguKylcXHJcXG4vKVxuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBtYXRjaCBzdGF0dXMgbGluZSBmcm9tOiAke2xpbmV9YClcbiAgICB9XG5cbiAgICB0aGlzLmh0dHBNZXRob2QgPSBtYXRjaFsxXVxuICAgIHRoaXMuaHR0cFZlcnNpb24gPSBtYXRjaFszXVxuICAgIHRoaXMucGF0aCA9IG1hdGNoWzJdXG4gICAgdGhpcy5zZXRTdGF0ZShcImhlYWRlcnNcIilcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IFtcIlBhcnNlZCBzdGF0dXMgbGluZVwiLCB7aHR0cE1ldGhvZDogdGhpcy5odHRwTWV0aG9kLCBodHRwVmVyc2lvbjogdGhpcy5odHRwVmVyc2lvbiwgcGF0aDogdGhpcy5wYXRofV0pXG4gIH1cblxuICBwb3N0UmVxdWVzdERvbmUoKSB7XG4gICAgaWYgKHRoaXMucG9zdEJvZHlCdWZmZXJzKSB7XG4gICAgICB0aGlzLnBvc3RCb2R5ID0gQnVmZmVyLmNvbmNhdCh0aGlzLnBvc3RCb2R5QnVmZmVycykudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgfVxuXG4gICAgdGhpcy5wb3N0Qm9keUJ1ZmZlcnMgPSB1bmRlZmluZWRcblxuICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGVjdHMgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaHR0cE1ldGhvZCAtIEhUVFAgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSByZXF1ZXN0IGV4cGVjdHMgYSBib2R5LlxuICAgKi9cbiAgZXhwZWN0c1JlcXVlc3RCb2R5KGh0dHBNZXRob2QpIHtcbiAgICByZXR1cm4gIVtcIkdFVFwiLCBcIk9QVElPTlNcIiwgXCJIRUFEXCJdLmluY2x1ZGVzKGh0dHBNZXRob2QpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBjaHVua2VkIGVuY29kaW5nLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSByZXF1ZXN0IHVzZXMgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZy5cbiAgICovXG4gIGlzQ2h1bmtlZEVuY29kaW5nKCkge1xuICAgIGNvbnN0IHRyYW5zZmVyRW5jb2RpbmcgPSB0aGlzLmdldEhlYWRlcihcInRyYW5zZmVyLWVuY29kaW5nXCIpPy52YWx1ZT8udG9Mb3dlckNhc2UoKVxuXG4gICAgcmV0dXJuIEJvb2xlYW4odHJhbnNmZXJFbmNvZGluZz8uaW5jbHVkZXMoXCJjaHVua2VkXCIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5pdGlhbGl6ZSBjaHVua2VkIGJvZHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGluaXRpYWxpemVDaHVua2VkQm9keSgpIHtcbiAgICB0aGlzLmNodW5rZWRCb2R5Q2hhcnMgPSBbXVxuICAgIHRoaXMuY3VycmVudENodW5rU2l6ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuY3VycmVudENodW5rQnl0ZXNSZWFkID0gMFxuICAgIHRoaXMuc2V0U3RhdGUoXCJjaHVua2VkLXNpemVcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBhcnNlIGNodW5rIHNpemUgbGluZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBDaHVuayBzaXplIGxpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlQ2h1bmtTaXplTGluZShsaW5lKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpXG5cbiAgICBpZiAoIXRyaW1tZWQpIHJldHVyblxuXG4gICAgY29uc3Qgc2l6ZVRva2VuID0gdHJpbW1lZC5zcGxpdChcIjtcIilbMF0/LnRyaW0oKVxuXG4gICAgaWYgKCFzaXplVG9rZW4pIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaHVuayBzaXplIGxpbmU6ICR7bGluZX1gKVxuXG4gICAgY29uc3Qgc2l6ZSA9IE51bWJlci5wYXJzZUludChzaXplVG9rZW4sIDE2KVxuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc2l6ZSkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaHVuayBzaXplOiAke3NpemVUb2tlbn1gKVxuXG4gICAgaWYgKHNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoXCJjaHVua2VkLXRyYWlsZXJcIilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY3VycmVudENodW5rU2l6ZSA9IHNpemVcbiAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1kYXRhXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5pc2ggY2h1bmtlZCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBmaW5pc2hDaHVua2VkQm9keSgpIHtcbiAgICBpZiAodGhpcy5jaHVua2VkQm9keUNoYXJzKSB7XG4gICAgICB0aGlzLnBvc3RCb2R5ID0gQnVmZmVyLmZyb20odGhpcy5jaHVua2VkQm9keUNoYXJzKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5jaHVua2VkQm9keUNoYXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgc3RhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdTdGF0ZSAtIE5ldyBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBDaGFuZ2luZyBzdGF0ZSBmcm9tICR7dGhpcy5zdGF0ZX0gdG8gJHtuZXdTdGF0ZX1gKVxuICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZVxuICB9XG5cbiAgY29tcGxldGVSZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHRoaXMuc3RhdGUgPSBcInN0YXR1c1wiIC8vIFJlc2V0IHN0YXRlIHRvIG5ldyByZXF1ZXN0XG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlXG5cbiAgICBpZiAodGhpcy5nZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIik/LnZhbHVlPy5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgdGhpcy5wYXJzZUFwcGxpY2F0aW9uSnNvblBhcmFtcygpXG4gICAgfSBlbHNlIGlmICh0aGlzLm11bHRpUGFydHlGb3JtRGF0YSkge1xuICAgICAgLy8gRG9uZSBhZnRlciBlYWNoIG5ldyBmb3JtIGRhdGEgcGFydFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnNlUXVlcnlTdHJpbmdQb3N0UGFyYW1zKClcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY29tcGxldGVkXCIpXG4gIH1cblxuICBwYXJzZUFwcGxpY2F0aW9uSnNvblBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keSkge1xuICAgICAgY29uc3QgbmV3UGFyYW1zID0gSlNPTi5wYXJzZSh0aGlzLnBvc3RCb2R5KVxuXG4gICAgICBpbmNvcnBvcmF0ZSh0aGlzLnBhcmFtcywgbmV3UGFyYW1zKVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlUXVlcnlTdHJpbmdQb3N0UGFyYW1zKCkge1xuICAgIGlmICh0aGlzLnBvc3RCb2R5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucG9zdEJvZHkpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbnBhcnNlZCBwYXJhbXMuXG4gICAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59ICovXG4gICAgICAgIGNvbnN0IHVucGFyc2VkUGFyYW1zID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWRRdWVyeSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB1bnBhcnNlZFBhcmFtc1trZXldID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXNUb09iamVjdCA9IG5ldyBQYXJhbXNUb09iamVjdCh1bnBhcnNlZFBhcmFtcylcbiAgICAgICAgY29uc3QgbmV3UGFyYW1zID0gcGFyYW1zVG9PYmplY3QudG9PYmplY3QoKVxuXG4gICAgICAgIGluY29ycG9yYXRlKHRoaXMucGFyYW1zLCBuZXdQYXJhbXMpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSAvKiogQHR5cGUge0Vycm9yICYge3ZlbG9jaW91c0NvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSAqLyAoZXJyb3IpXG5cbiAgICAgICAgZW5zdXJlZEVycm9yLnZlbG9jaW91c0NvbnRleHQgPSB7XG4gICAgICAgICAgLi4uKGVuc3VyZWRFcnJvci52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgICByZXF1ZXN0UGFyc2luZzoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHRoaXMuZ2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIpPy52YWx1ZSxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IHRoaXMuaHR0cE1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtZXRlcktleXM6IE9iamVjdC5rZXlzKHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucG9zdEJvZHkpKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aCxcbiAgICAgICAgICAgIHBvc3RCb2R5UHJldmlldzogdHJ1bmNhdGVQcmV2aWV3KHRoaXMucG9zdEJvZHkpLFxuICAgICAgICAgICAgc3RhZ2U6IFwicXVlcnktc3RyaW5nLXBvc3QtcGFyYW1zXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlbnN1cmVkRXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtYnVmZmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSxpQ0FBaUMsQ0FBQTtBQUMxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN4QyxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLGNBQWMsTUFBTSx3QkFBd0IsQ0FBQTtBQUNuRCxPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUE7QUFFckM7Ozt5QkFHeUI7QUFDekIsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtBQUU1RDs7Ozs7R0FLRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsR0FBRztJQUN6QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUMvQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXZDLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFBO0FBQ3RDLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLGFBQWE7SUFDaEMsVUFBVSxHQUFHLENBQUMsQ0FBQTtJQUVkLG1DQUFtQztJQUNuQyxlQUFlLEdBQUcsU0FBUyxDQUFBO0lBRTNCOzswQkFFc0I7SUFDdEIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUVULE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBRTNCOzt3Q0FFb0M7SUFD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QztnQkFDSCxDQUFDO2dCQUVELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUN6RCxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUE7Z0JBRTNDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3JDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sWUFBWSxHQUFHLHlGQUF5RixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBRXRILFlBQVksQ0FBQyxnQkFBZ0IsR0FBRztvQkFDOUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7b0JBQ3hDLGNBQWMsRUFBRTt3QkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLO3dCQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQzNCLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3dCQUMvQyxLQUFLLEVBQUUsMEJBQTBCO3FCQUNsQztpQkFDRixDQUFBO2dCQUVELE1BQU0sWUFBWSxDQUFBO1lBQ3BCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEZvcm1EYXRhUGFydCBmcm9tIFwiLi9mb3JtLWRhdGEtcGFydC5qc1wiXG5pbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlci5qc1wiXG5pbXBvcnQge2luY29ycG9yYXRlfSBmcm9tIFwiaW5jb3Jwb3JhdG9yXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUGFyYW1zVG9PYmplY3QgZnJvbSBcIi4uL3BhcmFtcy10by1vYmplY3QuanNcIlxuaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gXCJxdWVyeXN0cmluZ1wiXG5cbi8qKlxuICogUmVxdWVzdCBoZWFkZXIgZmllbGRzIHdob3NlIHJlcGVhdGVkIHdpcmUgZmllbGRzIGNvbWJpbmUgaW50byBvbmUgdmFsdWVcbiAqIChSRkMgOTExMCDCpzUuMykgYmVmb3JlIHRoZSBzZXJ2ZXIgY29uc3VtZXMgdGhlbS5cbiAqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbmNvbnN0IENPTUJJTklOR19IRUFERVJfRklFTERTID0gbmV3IFNldChbXCJhY2NlcHQtZW5jb2RpbmdcIl0pXG5cbi8qKlxuICogUnVucyB0cnVuY2F0ZSBwcmV2aWV3LlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGlucHV0IC0gSW5wdXQgc3RyaW5nLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gLSBNYXggcHJldmlldyBsZW5ndGguXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRydW5jYXRlZCBwcmV2aWV3LlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZVByZXZpZXcoaW5wdXQsIGxpbWl0ID0gMzAwKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKGlucHV0Lmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGlucHV0XG5cbiAgcmV0dXJuIGAke2lucHV0LnNsaWNlKDAsIGxpbWl0KX0uLi5gXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcXVlc3RCdWZmZXIge1xuICBib2R5TGVuZ3RoID0gMFxuXG4gIC8qKiBAdHlwZSB7QnVmZmVyW10gfCB1bmRlZmluZWR9ICovXG4gIHBvc3RCb2R5QnVmZmVycyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEYXRhLlxuICAgKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGRhdGEgPSBbXVxuXG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIC8qKlxuICAgKiBIZWFkZXJzIGJ5IG5hbWUuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBIZWFkZXI+fSAqL1xuICBoZWFkZXJzQnlOYW1lID0ge31cbiAgLyoqXG4gICAqIENodW5rZWQgYm9keSBjaGFycy5cbiAgICogQHR5cGUge251bWJlcltdIHwgdW5kZWZpbmVkfSAqL1xuICBjaHVua2VkQm9keUNoYXJzID0gdW5kZWZpbmVkXG5cbiAgbXVsdGlQYXJ0eUZvcm1EYXRhID0gZmFsc2VcblxuICBjb21wbGV0ZWQgPSBmYWxzZVxuICBwYXJhbXMgPSB7fVxuICByZWFkaW5nQm9keSA9IGZhbHNlXG4gIHN0YXRlID0gXCJzdGF0dXNcIlxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9ufSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcywge2RlYnVnOiBmYWxzZX0pXG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIC8vIERvIG5vdGhpbmcgZm9yIG5vdy4uLlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmVlZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtCdWZmZXIgfCB1bmRlZmluZWR9IC0gUmVtYWluaW5nIGRhdGEsIGlmIGFueS5cbiAgICovXG4gIGZlZWQoZGF0YSkge1xuICAgIGxldCBpbmRleCA9IDBcblxuICAgIHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoKSB7XG4gICAgICBzd2l0Y2godGhpcy5zdGF0ZSkge1xuICAgICAgICBjYXNlIFwic3RhdHVzXCI6XG4gICAgICAgIGNhc2UgXCJoZWFkZXJzXCI6XG4gICAgICAgIGNhc2UgXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YVwiOlxuICAgICAgICBjYXNlIFwibXVsdGktcGFydC1mb3JtLWRhdGEtaGVhZGVyXCI6XG4gICAgICAgIGNhc2UgXCJjaHVua2VkLXNpemVcIjpcbiAgICAgICAgY2FzZSBcImNodW5rZWQtdHJhaWxlclwiOlxuICAgICAgICAgIGluZGV4ID0gdGhpcy5mZWVkTGluZShkYXRhLCBpbmRleClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIFwicG9zdC1ib2R5XCI6XG4gICAgICAgICAgaW5kZXggPSB0aGlzLmZlZWRQb3N0Qm9keShkYXRhLCBpbmRleClcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGluZGV4ID0gdGhpcy5mZWVkQnl0ZShkYXRhLCBpbmRleClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KGluZGV4KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBieXRlcyBmb3IgdGhlIGxpbmUtYmFzZWQgc3RhdGVzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIG5leHQgbmV3bGluZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFJlYWQgcG9zaXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTmV3IHJlYWQgcG9zaXRpb24uXG4gICAqL1xuICBmZWVkTGluZShkYXRhLCBpbmRleCkge1xuICAgIGNvbnN0IG5ld2xpbmVJbmRleCA9IGRhdGEuaW5kZXhPZigxMCwgaW5kZXgpXG5cbiAgICBpZiAobmV3bGluZUluZGV4ID09PSAtMSkge1xuICAgICAgaWYgKHRoaXMucmVhZGluZ0JvZHkpIHRoaXMuYm9keUxlbmd0aCArPSBkYXRhLmxlbmd0aCAtIGluZGV4XG5cbiAgICAgIGZvciAobGV0IGRhdGFJbmRleCA9IGluZGV4OyBkYXRhSW5kZXggPCBkYXRhLmxlbmd0aDsgZGF0YUluZGV4ICs9IDEpIHtcbiAgICAgICAgdGhpcy5kYXRhLnB1c2goZGF0YVtkYXRhSW5kZXhdKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YS5sZW5ndGhcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFkaW5nQm9keSkgdGhpcy5ib2R5TGVuZ3RoICs9IG5ld2xpbmVJbmRleCArIDEgLSBpbmRleFxuXG4gICAgbGV0IGxpbmVcblxuICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09IDApIHtcbiAgICAgIGxpbmUgPSBkYXRhLnRvU3RyaW5nKFwibGF0aW4xXCIsIGluZGV4LCBuZXdsaW5lSW5kZXggKyAxKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVzdCBvZiBhIGxpbmUgdGhhdCBzdGFydGVkIGluIGEgcHJldmlvdXMgY2h1bmsuXG4gICAgICBmb3IgKGxldCBkYXRhSW5kZXggPSBpbmRleDsgZGF0YUluZGV4IDw9IG5ld2xpbmVJbmRleDsgZGF0YUluZGV4ICs9IDEpIHtcbiAgICAgICAgdGhpcy5kYXRhLnB1c2goZGF0YVtkYXRhSW5kZXhdKVxuICAgICAgfVxuXG4gICAgICBsaW5lID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0aGlzLmRhdGEpXG4gICAgICB0aGlzLmRhdGEgPSBbXVxuICAgIH1cblxuICAgIHRoaXMucGFyc2UobGluZSlcblxuICAgIHJldHVybiBuZXdsaW5lSW5kZXggKyAxXG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgZml4ZWQtbGVuZ3RoIHJlcXVlc3QgYm9keSBieXRlcyBpbiBidWxrLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gUmVhZCBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBOZXcgcmVhZCBwb3NpdGlvbi5cbiAgICovXG4gIGZlZWRQb3N0Qm9keShkYXRhLCBpbmRleCkge1xuICAgIGlmICghdGhpcy5wb3N0Qm9keUJ1ZmZlcnMpIHRocm93IG5ldyBFcnJvcihcInBvc3RCb2R5QnVmZmVycyBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICBpZiAodGhpcy5jb250ZW50TGVuZ3RoID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNvbnRlbnQgbGVuZ3RoIG5vdCBzZXRcIilcblxuICAgIGNvbnN0IHJlbWFpbmluZ0JvZHlCeXRlcyA9IE1hdGgubWF4KDEsIHRoaXMuY29udGVudExlbmd0aCAtIHRoaXMuYm9keUxlbmd0aClcbiAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGRhdGEubGVuZ3RoLCBpbmRleCArIHJlbWFpbmluZ0JvZHlCeXRlcylcblxuICAgIHRoaXMucG9zdEJvZHlCdWZmZXJzLnB1c2goZGF0YS5zdWJhcnJheShpbmRleCwgZW5kSW5kZXgpKVxuICAgIHRoaXMuYm9keUxlbmd0aCArPSBlbmRJbmRleCAtIGluZGV4XG5cbiAgICBpZiAodGhpcy5jb250ZW50TGVuZ3RoICYmIHRoaXMuYm9keUxlbmd0aCA+PSB0aGlzLmNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIHRoaXMucG9zdFJlcXVlc3REb25lKClcbiAgICB9XG5cbiAgICByZXR1cm4gZW5kSW5kZXhcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBhIHNpbmdsZSBieXRlIGZvciB0aGUgYnl0ZS1iYXNlZCBwYXJzZXIgc3RhdGVzLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gUmVhZCBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBOZXcgcmVhZCBwb3NpdGlvbi5cbiAgICovXG4gIGZlZWRCeXRlKGRhdGEsIGluZGV4KSB7XG4gICAgY29uc3QgY2hhciA9IGRhdGFbaW5kZXhdXG5cbiAgICBpZiAodGhpcy5yZWFkaW5nQm9keSkgdGhpcy5ib2R5TGVuZ3RoICs9IDFcblxuICAgIHN3aXRjaCh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlIFwiY2h1bmtlZC1kYXRhXCI6IHtcbiAgICAgICAgY29uc3QgY2h1bmtlZEJvZHlDaGFycyA9IHRoaXMuY2h1bmtlZEJvZHlDaGFyc1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaHVua1NpemUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiQ2h1bmsgc2l6ZSBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICAgICAgaWYgKCFjaHVua2VkQm9keUNoYXJzKSB0aHJvdyBuZXcgRXJyb3IoXCJDaHVua2VkIGJvZHkgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgICAgY2h1bmtlZEJvZHlDaGFycy5wdXNoKGNoYXIpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50IGNodW5rIGJ5dGVzIHJlYWQuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDaHVua0J5dGVzUmVhZCA9ICh0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCB8fCAwKSArIDFcblxuICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IGN1cnJlbnRDaHVua0J5dGVzUmVhZFxuXG4gICAgICAgIGlmIChjdXJyZW50Q2h1bmtCeXRlc1JlYWQgPj0gdGhpcy5jdXJyZW50Q2h1bmtTaXplKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCA9IDBcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1kYXRhLWNybGZcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIFwiY2h1bmtlZC1kYXRhLWNybGZcIjpcbiAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCA9ICh0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkIHx8IDApICsgMVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkID49IDIpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1zaXplXCIpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWJvZHlcIjoge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybURhdGFQYXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJGb3JtRGF0YSBwYXJ0IG5vdCBpbml0aWFsaXplZFwiKVxuICAgICAgICBpZiAoIXRoaXMuYm91bmRhcnlMaW5lRW5kKSB0aHJvdyBuZXcgRXJyb3IoXCJCb3VuZGFyeSBsaW5lIGVuZCBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kYXJ5TGluZU5leHQpIHRocm93IG5ldyBFcnJvcihcIkJvdW5kYXJ5IGxpbmUgbmV4dCBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5mb3JtRGF0YVBhcnQuYm9keVxuXG4gICAgICAgIGJvZHkucHVzaChjaGFyKVxuXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlFbmRQb3NpdGlvbiA9IGJvZHkubGVuZ3RoIC0gdGhpcy5ib3VuZGFyeUxpbmVFbmQubGVuZ3RoXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlFbmRDaGFycyA9IGJvZHkuc2xpY2UocG9zc2libGVCb3VuZGFyeUVuZFBvc2l0aW9uLCBib2R5Lmxlbmd0aClcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeUVuZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgcG9zc2libGVCb3VuZGFyeUVuZENoYXJzKVxuXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlOZXh0UG9zaXRpb24gPSBib2R5Lmxlbmd0aCAtIHRoaXMuYm91bmRhcnlMaW5lTmV4dC5sZW5ndGhcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeU5leHRDaGFycyA9IGJvZHkuc2xpY2UocG9zc2libGVCb3VuZGFyeU5leHRQb3NpdGlvbiwgYm9keS5sZW5ndGgpXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlOZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBwb3NzaWJsZUJvdW5kYXJ5TmV4dENoYXJzKVxuXG4gICAgICAgIGlmIChwb3NzaWJsZUJvdW5kYXJ5RW5kID09IHRoaXMuYm91bmRhcnlMaW5lRW5kKSB7XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnQucmVtb3ZlRnJvbUJvZHkocG9zc2libGVCb3VuZGFyeUVuZClcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuICAgICAgICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgICAgICAgfSBlbHNlIGlmIChwb3NzaWJsZUJvdW5kYXJ5TmV4dCA9PSB0aGlzLmJvdW5kYXJ5TGluZU5leHQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydC5yZW1vdmVGcm9tQm9keShwb3NzaWJsZUJvdW5kYXJ5TmV4dClcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuICAgICAgICAgIHRoaXMubmV3Rm9ybURhdGFQYXJ0KClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuY29udGVudExlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybURhdGFQYXJ0LmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuZm9ybURhdGFQYXJ0LmNvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3R1YlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgVW5rbm93biBzdGF0ZSBmb3IgcmVxdWVzdCBidWZmZXJgLCB7c3RhdGU6IHRoaXMuc3RhdGV9XSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXggKyAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gICAqIEByZXR1cm5zIHtIZWFkZXJ9IC0gVGhlIGhlYWRlci5cbiAgICovXG4gIGdldEhlYWRlcihuYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oZWFkZXJzQnlOYW1lW25hbWUudG9Mb3dlckNhc2UoKS50cmltKCldXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IFtgZ2V0SGVhZGVyICR7bmFtZX1gLCB7cmVzdWx0OiByZXN1bHQ/LnRvU3RyaW5nKCl9XSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBoZWFkZXJzIGhhc2guXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIFRoZSBoZWFkZXJzIGhhc2guXG4gICAqL1xuICBnZXRIZWFkZXJzSGFzaCgpIHtcbiAgICAvKipcbiAgICAgKiBSZXN1bHQuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgIGZvciAoY29uc3QgaGVhZGVyRm9ybWF0dGVkTmFtZSBpbiB0aGlzLmhlYWRlcnNCeU5hbWUpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuaGVhZGVyc0J5TmFtZVtoZWFkZXJGb3JtYXR0ZWROYW1lXVxuXG4gICAgICByZXN1bHRbaGVhZGVyLmdldE5hbWUoKV0gPSBoZWFkZXIuZ2V0VmFsdWUoKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm0gZGF0YSBwYXJ0IGRvbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGZvcm1EYXRhUGFydERvbmUoKSB7XG4gICAgY29uc3QgZm9ybURhdGFQYXJ0ID0gdGhpcy5mb3JtRGF0YVBhcnRcblxuICAgIGlmICghZm9ybURhdGFQYXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtRGF0YVBhcnQgd2FzbnQgc2V0XCIpXG5cbiAgICB0aGlzLmZvcm1EYXRhUGFydCA9IHVuZGVmaW5lZFxuICAgIGZvcm1EYXRhUGFydC5maW5pc2goKVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImZvcm0tZGF0YS1wYXJ0XCIsIGZvcm1EYXRhUGFydClcbiAgfVxuXG4gIGlzTXVsdGlQYXJ0eUZvcm1EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpUGFydHlGb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmV3IGZvcm0gZGF0YSBwYXJ0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBuZXdGb3JtRGF0YVBhcnQoKSB7XG4gICAgdGhpcy5mb3JtRGF0YVBhcnQgPSBuZXcgRm9ybURhdGFQYXJ0KClcbiAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGEtaGVhZGVyXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBMaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZShsaW5lKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT0gXCJzdGF0dXNcIikge1xuICAgICAgdGhpcy5wYXJzZVN0YXR1c0xpbmUobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJoZWFkZXJzXCIpIHtcbiAgICAgIHRoaXMucGFyc2VIZWFkZXIobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJjaHVua2VkLXNpemVcIikge1xuICAgICAgdGhpcy5wYXJzZUNodW5rU2l6ZUxpbmUobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJjaHVua2VkLXRyYWlsZXJcIikge1xuICAgICAgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgICB0aGlzLmZpbmlzaENodW5rZWRCb2R5KClcbiAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhXCIpIHtcbiAgICAgIGlmIChsaW5lID09IHRoaXMuYm91bmRhcnlMaW5lKSB7XG4gICAgICAgIHRoaXMubmV3Rm9ybURhdGFQYXJ0KClcbiAgICAgIH0gZWxzZSBpZiAobGluZSA9PSBcIlxcclxcblwiKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXCJkb25lXCIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJvdW5kYXJ5IGxpbmUgYnV0IGRpZG4ndCBnZXQgaXQ6ICR7bGluZX1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWhlYWRlclwiKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlYWRIZWFkZXJGcm9tTGluZShsaW5lKVxuXG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtRGF0YVBhcnQpIHRocm93IG5ldyBFcnJvcihcImZvcm1EYXRhUGFydCBub3Qgc2V0XCIpXG5cbiAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnQuYWRkSGVhZGVyKGhlYWRlcilcbiAgICAgICAgLy90aGlzLnN0YXRlID09IFwibXVsdGktcGFydC1mb3JtLWRhdGFcIlxuICAgICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWJvZHlcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXRlIHBhcnNpbmcgbGluZTogJHt0aGlzLnN0YXRlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVhZCBoZWFkZXIgZnJvbSBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHtIZWFkZXIgfCB1bmRlZmluZWR9IC0gVGhlIGhlYWRlciBmcm9tIGxpbmUuXG4gICAqL1xuICByZWFkSGVhZGVyRnJvbUxpbmUobGluZSkge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXiguKyk6ICguKylcXHJcXG4vKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBuZXcgSGVhZGVyKG1hdGNoWzFdLCBtYXRjaFsyXSlcblxuICAgICAgcmV0dXJuIGhlYWRlclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7SGVhZGVyfSBoZWFkZXIgLSBIZWFkZXIgdmFsdWUuXG4gICAqL1xuICBhZGRIZWFkZXIoaGVhZGVyKSB7XG4gICAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGhlYWRlci5nZXRGb3JtYXR0ZWROYW1lKClcbiAgICBjb25zdCBleGlzdGluZ0hlYWRlciA9IHRoaXMuaGVhZGVyc0J5TmFtZVtmb3JtYXR0ZWROYW1lXVxuXG4gICAgLy8gUkZDIDkxMTAgwqc1LjM6IGEgZmllbGQgbWF5IGJlIHJlcGVhdGVkOyBpdHMgdmFsdWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2ZcbiAgICAvLyBhbGwgZmllbGQgdmFsdWVzIHNlcGFyYXRlZCBieSBjb21tYXMsIGluIHdpcmUgb3JkZXIuIE9ubHkgQWNjZXB0LUVuY29kaW5nXG4gICAgLy8gaXMgY29uc3VtZWQgYXMgYSBjb21iaW5lZCBmaWVsZCBieSB0aGUgc2VydmVyLlxuICAgIGlmIChleGlzdGluZ0hlYWRlciAmJiBDT01CSU5JTkdfSEVBREVSX0ZJRUxEUy5oYXMoZm9ybWF0dGVkTmFtZSkpIHtcbiAgICAgIGV4aXN0aW5nSGVhZGVyLnZhbHVlICs9IGAsICR7aGVhZGVyLmdldFZhbHVlKCl9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNCeU5hbWVbZm9ybWF0dGVkTmFtZV0gPSBoZWFkZXJcbiAgICB9XG5cbiAgICBpZiAoZm9ybWF0dGVkTmFtZSA9PSBcImNvbnRlbnQtbGVuZ3RoXCIpIHRoaXMuY29udGVudExlbmd0aCA9IHBhcnNlSW50KGhlYWRlci5nZXRWYWx1ZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2UgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlSGVhZGVyKGxpbmUpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlYWRIZWFkZXJGcm9tTGluZShsaW5lKVxuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgUGFyc2VkIGhlYWRlcjogJHtoZWFkZXIudG9TdHJpbmcoKX1gKVxuICAgICAgdGhpcy5hZGRIZWFkZXIoaGVhZGVyKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImhlYWRlclwiLCBoZWFkZXIpXG4gICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgIGNvbnN0IGh0dHBNZXRob2QgPSB0aGlzLmh0dHBNZXRob2Q/LnRvVXBwZXJDYXNlKClcblxuICAgICAgaWYgKCFodHRwTWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJIVFRQIG1ldGhvZCBub3Qgc2V0XCIpXG5cbiAgICAgIGlmICghdGhpcy5leHBlY3RzUmVxdWVzdEJvZHkoaHR0cE1ldGhvZCkpIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ2h1bmtlZEVuY29kaW5nKCkpIHtcbiAgICAgICAgdGhpcy5yZWFkaW5nQm9keSA9IHRydWVcbiAgICAgICAgdGhpcy5ib2R5TGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluaXRpYWxpemVDaHVua2VkQm9keSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlYWRpbmdCb2R5ID0gdHJ1ZVxuICAgICAgICB0aGlzLmJvZHlMZW5ndGggPSAwXG5cbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmdldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiKT8udmFsdWU/Lm1hdGNoKC9ebXVsdGlwYXJ0XFwvZm9ybS1kYXRhO1xccypib3VuZGFyeT0oLispJC9pKVxuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHRoaXMuYm91bmRhcnkgPSBtYXRjaFsxXVxuICAgICAgICAgIHRoaXMuYm91bmRhcnlMaW5lID0gYC0tJHt0aGlzLmJvdW5kYXJ5fVxcclxcbmBcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZU5leHQgPSBgXFxyXFxuLS0ke3RoaXMuYm91bmRhcnl9XFxyXFxuYFxuICAgICAgICAgIHRoaXMuYm91bmRhcnlMaW5lRW5kID0gYFxcclxcbi0tJHt0aGlzLmJvdW5kYXJ5fS0tYFxuICAgICAgICAgIHRoaXMubXVsdGlQYXJ0eUZvcm1EYXRhID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YVwiKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudExlbmd0aCA9PT0gMCB8fCB0aGlzLmNvbnRlbnRMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4odGhpcy5jb250ZW50TGVuZ3RoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRlbnQgbGVuZ3RoIGlzIGludmFsaWRcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICogQHR5cGUge0J1ZmZlcltdfSAqL1xuICAgICAgICAgIHRoaXMucG9zdEJvZHlCdWZmZXJzID0gW11cblxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJwb3N0LWJvZHlcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBhcnNlIHN0YXR1cyBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlU3RhdHVzTGluZShsaW5lKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFtBLVotXSspICguKz8pIEhUVFBcXC8oLispXFxyXFxuLylcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgbWF0Y2ggc3RhdHVzIGxpbmUgZnJvbTogJHtsaW5lfWApXG4gICAgfVxuXG4gICAgdGhpcy5odHRwTWV0aG9kID0gbWF0Y2hbMV1cbiAgICB0aGlzLmh0dHBWZXJzaW9uID0gbWF0Y2hbM11cbiAgICB0aGlzLnBhdGggPSBtYXRjaFsyXVxuICAgIHRoaXMuc2V0U3RhdGUoXCJoZWFkZXJzXCIpXG4gICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBbXCJQYXJzZWQgc3RhdHVzIGxpbmVcIiwge2h0dHBNZXRob2Q6IHRoaXMuaHR0cE1ldGhvZCwgaHR0cFZlcnNpb246IHRoaXMuaHR0cFZlcnNpb24sIHBhdGg6IHRoaXMucGF0aH1dKVxuICB9XG5cbiAgcG9zdFJlcXVlc3REb25lKCkge1xuICAgIGlmICh0aGlzLnBvc3RCb2R5QnVmZmVycykge1xuICAgICAgdGhpcy5wb3N0Qm9keSA9IEJ1ZmZlci5jb25jYXQodGhpcy5wb3N0Qm9keUJ1ZmZlcnMpLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIH1cblxuICAgIHRoaXMucG9zdEJvZHlCdWZmZXJzID0gdW5kZWZpbmVkXG5cbiAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBlY3RzIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGh0dHBNZXRob2QgLSBIVFRQIG1ldGhvZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcmVxdWVzdCBleHBlY3RzIGEgYm9keS5cbiAgICovXG4gIGV4cGVjdHNSZXF1ZXN0Qm9keShodHRwTWV0aG9kKSB7XG4gICAgcmV0dXJuICFbXCJHRVRcIiwgXCJPUFRJT05TXCIsIFwiSEVBRFwiXS5pbmNsdWRlcyhodHRwTWV0aG9kKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgY2h1bmtlZCBlbmNvZGluZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcmVxdWVzdCB1c2VzIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcuXG4gICAqL1xuICBpc0NodW5rZWRFbmNvZGluZygpIHtcbiAgICBjb25zdCB0cmFuc2ZlckVuY29kaW5nID0gdGhpcy5nZXRIZWFkZXIoXCJ0cmFuc2Zlci1lbmNvZGluZ1wiKT8udmFsdWU/LnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBCb29sZWFuKHRyYW5zZmVyRW5jb2Rpbmc/LmluY2x1ZGVzKFwiY2h1bmtlZFwiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGluaXRpYWxpemUgY2h1bmtlZCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBpbml0aWFsaXplQ2h1bmtlZEJvZHkoKSB7XG4gICAgdGhpcy5jaHVua2VkQm9keUNoYXJzID0gW11cbiAgICB0aGlzLmN1cnJlbnRDaHVua1NpemUgPSB1bmRlZmluZWRcbiAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1zaXplXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBjaHVuayBzaXplIGxpbmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gQ2h1bmsgc2l6ZSBsaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZUNodW5rU2l6ZUxpbmUobGluZSkge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKVxuXG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm5cblxuICAgIGNvbnN0IHNpemVUb2tlbiA9IHRyaW1tZWQuc3BsaXQoXCI7XCIpWzBdPy50cmltKClcblxuICAgIGlmICghc2l6ZVRva2VuKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2h1bmsgc2l6ZSBsaW5lOiAke2xpbmV9YClcblxuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIucGFyc2VJbnQoc2l6ZVRva2VuLCAxNilcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHNpemUpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2h1bmsgc2l6ZTogJHtzaXplVG9rZW59YClcblxuICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC10cmFpbGVyXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRDaHVua1NpemUgPSBzaXplXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSAwXG4gICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtZGF0YVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluaXNoIGNodW5rZWQgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZmluaXNoQ2h1bmtlZEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuY2h1bmtlZEJvZHlDaGFycykge1xuICAgICAgdGhpcy5wb3N0Qm9keSA9IEJ1ZmZlci5mcm9tKHRoaXMuY2h1bmtlZEJvZHlDaGFycykudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMuY2h1bmtlZEJvZHlDaGFyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3U3RhdGUgLSBOZXcgc3RhdGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgQ2hhbmdpbmcgc3RhdGUgZnJvbSAke3RoaXMuc3RhdGV9IHRvICR7bmV3U3RhdGV9YClcbiAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGVcbiAgfVxuXG4gIGNvbXBsZXRlUmVxdWVzdCA9ICgpID0+IHtcbiAgICB0aGlzLnN0YXRlID0gXCJzdGF0dXNcIiAvLyBSZXNldCBzdGF0ZSB0byBuZXcgcmVxdWVzdFxuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZVxuXG4gICAgaWYgKHRoaXMuZ2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIpPy52YWx1ZT8uc3RhcnRzV2l0aChcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICAgIHRoaXMucGFyc2VBcHBsaWNhdGlvbkpzb25QYXJhbXMoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aVBhcnR5Rm9ybURhdGEpIHtcbiAgICAgIC8vIERvbmUgYWZ0ZXIgZWFjaCBuZXcgZm9ybSBkYXRhIHBhcnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJzZVF1ZXJ5U3RyaW5nUG9zdFBhcmFtcygpXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNvbXBsZXRlZFwiKVxuICB9XG5cbiAgcGFyc2VBcHBsaWNhdGlvbkpzb25QYXJhbXMoKSB7XG4gICAgaWYgKHRoaXMucG9zdEJvZHkpIHtcbiAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IEpTT04ucGFyc2UodGhpcy5wb3N0Qm9keSlcblxuICAgICAgaW5jb3Jwb3JhdGUodGhpcy5wYXJhbXMsIG5ld1BhcmFtcylcbiAgICB9XG4gIH1cblxuICBwYXJzZVF1ZXJ5U3RyaW5nUG9zdFBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnBvc3RCb2R5KVxuICAgICAgICAvKipcbiAgICAgICAgICogVW5wYXJzZWQgcGFyYW1zLlxuICAgICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+fSAqL1xuICAgICAgICBjb25zdCB1bnBhcnNlZFBhcmFtcyA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkUXVlcnkpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdW5wYXJzZWRQYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zVG9PYmplY3QgPSBuZXcgUGFyYW1zVG9PYmplY3QodW5wYXJzZWRQYXJhbXMpXG4gICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IHBhcmFtc1RvT2JqZWN0LnRvT2JqZWN0KClcblxuICAgICAgICBpbmNvcnBvcmF0ZSh0aGlzLnBhcmFtcywgbmV3UGFyYW1zKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZW5zdXJlZEVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHt2ZWxvY2lvdXNDb250ZXh0PzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gKi8gKGVycm9yKVxuXG4gICAgICAgIGVuc3VyZWRFcnJvci52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAgIC4uLihlbnN1cmVkRXJyb3IudmVsb2Npb3VzQ29udGV4dCB8fCB7fSksXG4gICAgICAgICAgcmVxdWVzdFBhcnNpbmc6IHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmdldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiKT8udmFsdWUsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiB0aGlzLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBwYXJhbWV0ZXJLZXlzOiBPYmplY3Qua2V5cyhxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnBvc3RCb2R5KSksXG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBwb3N0Qm9keVByZXZpZXc6IHRydW5jYXRlUHJldmlldyh0aGlzLnBvc3RCb2R5KSxcbiAgICAgICAgICAgIHN0YWdlOiBcInF1ZXJ5LXN0cmluZy1wb3N0LXBhcmFtc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZW5zdXJlZEVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -29,7 +29,9 @@ export declare function isCompressibleContentType(contentType: string): boolean;
|
|
|
29
29
|
/**
|
|
30
30
|
* Merges Accept-Encoding into the response Vary header case-insensitively and
|
|
31
31
|
* without duplicates. An existing `Vary: *` already covers every request header
|
|
32
|
-
* and is preserved as-is.
|
|
32
|
+
* and is preserved as-is. Called by the response sender for every
|
|
33
|
+
* framework-selected representation so the header is identical for every
|
|
34
|
+
* request on the same connection.
|
|
33
35
|
* @param {import("./response.js").default} response - Response instance.
|
|
34
36
|
* @returns {void} - No return value.
|
|
35
37
|
*/
|
|
@@ -53,7 +55,7 @@ export declare function addAcceptEncodingToVary(response: import("./response.js"
|
|
|
53
55
|
* @param {import("../../configuration-types.js").NormalizedHttpCompressionConfiguration} args.compression - Normalized compression configuration.
|
|
54
56
|
* @param {import("./request.js").default | import("./websocket-request.js").default} args.request - Request object.
|
|
55
57
|
* @param {import("./response.js").default} args.response - Response instance.
|
|
56
|
-
* @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome.
|
|
58
|
+
* @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome. The caller owns the Vary header and the file/406 representation decisions.
|
|
57
59
|
*/
|
|
58
60
|
export declare function applyResponseCompression({ bodyBuffer, compression, request, response }: {
|
|
59
61
|
bodyBuffer: Buffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-compression.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/response-compression.js"],"names":[],"mappings":"AA4BA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAHpC,MAGoC,GAFlC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA8B/B;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAH5C,MAAM,GAAG,IAAI,GAAG,SAG4B,GAF1C;IAAC,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAA;CAAC,GAAG;IAAC,aAAa,EAAE,IAAI,CAAA;CAAC,CAyBvG;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAH1C,MAG0C,GAFxC,OAAO,CAcnB;AAED
|
|
1
|
+
{"version":3,"file":"response-compression.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/response-compression.js"],"names":[],"mappings":"AA4BA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAHpC,MAGoC,GAFlC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA8B/B;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAH5C,MAAM,GAAG,IAAI,GAAG,SAG4B,GAF1C;IAAC,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAA;CAAC,GAAG;IAAC,aAAa,EAAE,IAAI,CAAA;CAAC,CAyBvG;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAH1C,MAG0C,GAFxC,OAAO,CAcnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAHrC,OAAO,eAAe,EAAE,OAGa,GAFnC,IAAI,CAmBhB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,wBAAwB,CAAC,EAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAC,EANxF;IAAqB,UAAU,EAAvB,MAAM,CACd;IAA4F,WAAW,EAA/F,OAAO,8BAA8B,EAAE,sCAAsC,CACrF;IAAwF,OAAO,EAAvF,OAAO,cAAc,EAAE,OAAO,GAAG,OAAO,wBAAwB,EAAE,OAAO,CACjF;IAA8C,QAAQ,EAA9C,OAAO,eAAe,EAAE,OAAO,CACvC;CAEwF,GAF9E,OAAO,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAC,GAAG;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAC,CAAC,CAyDhH"}
|
|
@@ -18,9 +18,9 @@ const COMPRESSIBLE_EXACT_MEDIA_TYPES = new Set([
|
|
|
18
18
|
]);
|
|
19
19
|
/**
|
|
20
20
|
* RFC 9110 §12.4.2 qvalue grammar: `0` or `1` with at most three fractional
|
|
21
|
-
* digits, and only zeros after `1`.
|
|
21
|
+
* digits (the boundary forms `0.` and `1.` are valid), and only zeros after `1`.
|
|
22
22
|
* @type {RegExp} */
|
|
23
|
-
const QVALUE_PATTERN = /^(?:0(?:\.\d{
|
|
23
|
+
const QVALUE_PATTERN = /^(?:0(?:\.\d{0,3})?|1(?:\.0{0,3})?)$/u;
|
|
24
24
|
/**
|
|
25
25
|
* Runs parse accept encoding.
|
|
26
26
|
* @param {string} headerValue - Accept-Encoding header value.
|
|
@@ -101,7 +101,9 @@ export function isCompressibleContentType(contentType) {
|
|
|
101
101
|
/**
|
|
102
102
|
* Merges Accept-Encoding into the response Vary header case-insensitively and
|
|
103
103
|
* without duplicates. An existing `Vary: *` already covers every request header
|
|
104
|
-
* and is preserved as-is.
|
|
104
|
+
* and is preserved as-is. Called by the response sender for every
|
|
105
|
+
* framework-selected representation so the header is identical for every
|
|
106
|
+
* request on the same connection.
|
|
105
107
|
* @param {import("./response.js").default} response - Response instance.
|
|
106
108
|
* @returns {void} - No return value.
|
|
107
109
|
*/
|
|
@@ -139,7 +141,7 @@ export function addAcceptEncodingToVary(response) {
|
|
|
139
141
|
* @param {import("../../configuration-types.js").NormalizedHttpCompressionConfiguration} args.compression - Normalized compression configuration.
|
|
140
142
|
* @param {import("./request.js").default | import("./websocket-request.js").default} args.request - Request object.
|
|
141
143
|
* @param {import("./response.js").default} args.response - Response instance.
|
|
142
|
-
* @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome.
|
|
144
|
+
* @returns {Promise<{outcome: "identity"} | {outcome: "compressed", body: Buffer} | {outcome: "not-acceptable"}>} - Compression outcome. The caller owns the Vary header and the file/406 representation decisions.
|
|
143
145
|
*/
|
|
144
146
|
export async function applyResponseCompression({ bodyBuffer, compression, request, response }) {
|
|
145
147
|
if (!compression.enabled)
|
|
@@ -178,9 +180,6 @@ export async function applyResponseCompression({ bodyBuffer, compression, reques
|
|
|
178
180
|
// identity; when identity is forbidden, no acceptable representation can be sent.
|
|
179
181
|
return negotiated.identityAcceptable ? { outcome: "identity" } : { outcome: "not-acceptable" };
|
|
180
182
|
}
|
|
181
|
-
// The representation now depends on the request's Accept-Encoding, even when this
|
|
182
|
-
// particular response ends up identity (missing header, higher-q identity, below threshold).
|
|
183
|
-
addAcceptEncodingToVary(response);
|
|
184
183
|
if (negotiated.encoding == "identity")
|
|
185
184
|
return { outcome: "identity" };
|
|
186
185
|
// Below the threshold the smaller identity representation is sent instead — but only
|
|
@@ -194,4 +193,4 @@ export async function applyResponseCompression({ bodyBuffer, compression, reques
|
|
|
194
193
|
response.setHeader("Content-Encoding", negotiated.encoding);
|
|
195
194
|
return { body, outcome: "compressed" };
|
|
196
195
|
}
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UtY29tcHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLWNvbXByZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUVuQyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDMUQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUV0Qzs7Ozt5QkFJeUI7QUFDekIsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM3Qyx3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLGtCQUFrQjtJQUNsQiwwQkFBMEI7SUFDMUIsaUJBQWlCO0lBQ2pCLGVBQWU7Q0FDaEIsQ0FBQyxDQUFBO0FBRUY7OztvQkFHb0I7QUFDcEIsTUFBTSxjQUFjLEdBQUcsdUNBQXVDLENBQUE7QUFFOUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxXQUFXO0lBQzdDLGtDQUFrQztJQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXpCLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUVoRCxJQUFJLENBQUMsTUFBTTtZQUFFLFNBQVE7UUFFckIsSUFBSSxDQUFD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U0FBUyxJQUFJLFVBQVUsQ0FBQyxrQkFBa0I7UUFBRSxPQUFPLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBQyxDQUFBO0lBRTVHLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN0QyxDQUFDLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsRUFBRSxXQUFXLENBQUMsYUFBYSxFQUFDLEVBQUMsQ0FBQztRQUNySCxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBRS9ELFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTNELE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBQyxDQUFBO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHpsaWIgZnJvbSBcIm5vZGU6emxpYlwiXG5pbXBvcnQge3Byb21pc2lmeX0gZnJvbSBcIm5vZGU6dXRpbFwiXG5cbmNvbnN0IGJyb3RsaUNvbXByZXNzQXN5bmMgPSBwcm9taXNpZnkoemxpYi5icm90bGlDb21wcmVzcylcbmNvbnN0IGd6aXBBc3luYyA9IHByb21pc2lmeSh6bGliLmd6aXApXG5cbi8qKlxuICogRXhhY3QgbWVkaWEgdHlwZXMgKGJleW9uZCB0aGUgdGV4dC8qLCAqK2pzb24sIGFuZCAqK3htbCBmYW1pbGllcykgdGhhdCBhcmUgd29ydGggY29tcHJlc3NpbmcuXG4gKiBFdmVyeXRoaW5nIGVsc2Ug4oCUIHVua25vd24gYmluYXJ5IHR5cGVzIGFuZCBjb21tb25seSBwcmUtY29tcHJlc3NlZCBtZWRpYSBzdWNoIGFzIGltYWdlcyxcbiAqIHZpZGVvLCBhbmQgYXJjaGl2ZXMg4oCUIGlzIGxlZnQgdW50b3VjaGVkIGJ5IHRoZSBjb25zZXJ2YXRpdmUgYWxsb3dsaXN0LlxuICogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuY29uc3QgQ09NUFJFU1NJQkxFX0VYQUNUX01FRElBX1RZUEVTID0gbmV3IFNldChbXG4gIFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiLFxuICBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIixcbiAgXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gIFwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCIsXG4gIFwiYXBwbGljYXRpb24veG1sXCIsXG4gIFwiaW1hZ2Uvc3ZnK3htbFwiXG5dKVxuXG4vKipcbiAqIFJGQyA5MTEwIMKnMTIuNC4yIHF2YWx1ZSBncmFtbWFyOiBgMGAgb3IgYDFgIHdpdGggYXQgbW9zdCB0aHJlZSBmcmFjdGlvbmFsXG4gKiBkaWdpdHMsIGFuZCBvbmx5IHplcm9zIGFmdGVyIGAxYC5cbiAqIEB0eXBlIHtSZWdFeHB9ICovXG5jb25zdCBRVkFMVUVfUEFUVEVSTiA9IC9eKD86MCg/OlxcLlxcZHsxLDN9KT98MSg/OlxcLjB7MSwzfSk/KSQvdVxuXG4vKipcbiAqIFJ1bnMgcGFyc2UgYWNjZXB0IGVuY29kaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclZhbHVlIC0gQWNjZXB0LUVuY29kaW5nIGhlYWRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBudW1iZXI+fSAtIExvd2VyY2FzZWQgY29kaW5nIHRvIHEtdmFsdWUgKDAtMSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFjY2VwdEVuY29kaW5nKGhlYWRlclZhbHVlKSB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gKi9cbiAgY29uc3QgY29kaW5ncyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgcGFydCBvZiBoZWFkZXJWYWx1ZS5zcGxpdChcIixcIikpIHtcbiAgICBjb25zdCBbY29kaW5nVG9rZW4sIC4uLnBhcmFtZXRlcnNdID0gcGFydC5zcGxpdChcIjtcIilcbiAgICBjb25zdCBjb2RpbmcgPSBjb2RpbmdUb2tlbj8udHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICAgIGlmICghY29kaW5nKSBjb250aW51ZVxuXG4gICAgbGV0IHEgPSAxXG5cbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gcGFyYW1ldGVyLnNwbGl0KFwiPVwiKVxuXG4gICAgICBpZiAobmFtZT8udHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gXCJxXCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHF2YWx1ZSA9IHZhbHVlPy50cmltKCkgfHwgXCJcIlxuXG4gICAgICAvLyBBIG1hbGZvcm1lZCBxLXZhbHVlIChlLmcuIGAuNWAsIGAwMWAsIGAxLjAwMWAsIG1vcmUgdGhhbiB0aHJlZSBmcmFjdGlvbmFsXG4gICAgICAvLyBkaWdpdHMsIG9yIGVtcHR5KSBpcyB0cmVhdGVkIGFzIFwibm90IGFjY2VwdGFibGVcIiAocT0wKSwgcGVyIFJGQyA5MTEwIMKnMTIuNC4yLlxuICAgICAgcSA9IFFWQUxVRV9QQVRURVJOLnRlc3QocXZhbHVlKSA/IE51bWJlcihxdmFsdWUpIDogMFxuICAgIH1cblxuICAgIGNvZGluZ3Muc2V0KGNvZGluZywgcSlcbiAgfVxuXG4gIHJldHVybiBjb2RpbmdzXG59XG5cbi8qKlxuICogTmVnb3RpYXRlcyB0aGUgY29udGVudCBjb2RpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQWNjZXB0LUVuY29kaW5nIGhlYWRlci5cbiAqIElkZW50aXR5IHBhcnRpY2lwYXRlcyBpbiB0aGUgc2FtZSBxdWFsaXR5IGNvbXBhcmlzb24gYXMgdGhlIHN1cHBvcnRlZCBjb2RpbmdzOlxuICogYSBoaWdoZXItcSBpZGVudGl0eSBzZWxlY3RzIGlkZW50aXR5LCBhbmQgZXF1YWwtcSB0aWVzIGJyZWFrIGluIHNlcnZlciBvcmRlclxuICogYnIsIGd6aXAsIGlkZW50aXR5LiBJZGVudGl0eSBkZWZhdWx0cyB0byBhY2NlcHRhYmxlIHVubGVzcyBleHBsaWNpdGx5IHJlZnVzZWRcbiAqIHdpdGggYGlkZW50aXR5O3E9MGAgb3IgYSBgKjtxPTBgIHdpbGRjYXJkIHdpdGhvdXQgYSBtb3JlIHNwZWNpZmljIGlkZW50aXR5XG4gKiBlbnRyeSwgYW5kIGFuIGV4cGxpY2l0IGNvZGluZyBlbnRyeSBiZWF0cyB0aGUgd2lsZGNhcmQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IGFjY2VwdEVuY29kaW5nIC0gQWNjZXB0LUVuY29kaW5nIGhlYWRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHt7ZW5jb2Rpbmc6IFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJpZGVudGl0eVwiLCBpZGVudGl0eUFjY2VwdGFibGU6IGJvb2xlYW59IHwge25vdEFjY2VwdGFibGU6IHRydWV9fSAtIE5lZ290aWF0ZWQgY29kaW5nLCBvciB0aGF0IG5vIGFjY2VwdGFibGUgcmVwcmVzZW50YXRpb24gZXhpc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVnb3RpYXRlQ29udGVudEVuY29kaW5nKGFjY2VwdEVuY29kaW5nKSB7XG4gIGlmIChhY2NlcHRFbmNvZGluZyA9PT0gdW5kZWZpbmVkIHx8IGFjY2VwdEVuY29kaW5nID09PSBudWxsIHx8IGFjY2VwdEVuY29kaW5nLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIHJldHVybiB7ZW5jb2Rpbmc6IFwiaWRlbnRpdHlcIiwgaWRlbnRpdHlBY2NlcHRhYmxlOiB0cnVlfVxuICB9XG5cbiAgY29uc3QgY29kaW5ncyA9IHBhcnNlQWNjZXB0RW5jb2RpbmcoYWNjZXB0RW5jb2RpbmcpXG4gIGNvbnN0IHdpbGRjYXJkUSA9IGNvZGluZ3MuZ2V0KFwiKlwiKVxuICBjb25zdCBpZGVudGl0eVEgPSBjb2RpbmdzLmdldChcImlkZW50aXR5XCIpID8/IHdpbGRjYXJkUSA/PyAxXG5cbiAgLy8gRGVjbGFyZWQgaW4gc2VydmVyIHByZWZlcmVuY2Ugb3JkZXI7IHRoZSBzdGFibGUgc29ydCBrZWVwcyB0aGlzIG9yZGVyIGZvciB0aWVzLlxuICAvKiogQHR5cGUge0FycmF5PHtjb2Rpbmc6IFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJpZGVudGl0eVwiLCBxOiBudW1iZXJ9Pn0gKi9cbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICB7Y29kaW5nOiBcImJyXCIsIHE6IGNvZGluZ3MuZ2V0KFwiYnJcIikgPz8gd2lsZGNhcmRRID8/IDB9LFxuICAgIHtjb2Rpbmc6IFwiZ3ppcFwiLCBxOiBjb2RpbmdzLmdldChcImd6aXBcIikgPz8gd2lsZGNhcmRRID8/IDB9LFxuICAgIHtjb2Rpbmc6IFwiaWRlbnRpdHlcIiwgcTogaWRlbnRpdHlRfVxuICBdXG4gIGNvbnN0IHNlbGVjdGVkID0gY2FuZGlkYXRlc1xuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnEgPiAwKVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnEgLSBhLnEpWzBdXG5cbiAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuIHtub3RBY2NlcHRhYmxlOiB0cnVlfVxuXG4gIHJldHVybiB7ZW5jb2Rpbmc6IHNlbGVjdGVkLmNvZGluZywgaWRlbnRpdHlBY2NlcHRhYmxlOiBpZGVudGl0eVEgPiAwfVxufVxuXG4vKipcbiAqIFJ1bnMgaXMgY29tcHJlc3NpYmxlIGNvbnRlbnQgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZSAtIENvbnRlbnQtVHlwZSBoZWFkZXIgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBtZWRpYSB0eXBlIGlzIG9uIHRoZSBjb21wcmVzc2libGUgYWxsb3dsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wcmVzc2libGVDb250ZW50VHlwZShjb250ZW50VHlwZSkge1xuICBjb25zdCBtZWRpYVR5cGUgPSBjb250ZW50VHlwZS5zcGxpdChcIjtcIilbMF0/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgaWYgKCFtZWRpYVR5cGUpIHJldHVybiBmYWxzZVxuXG4gIC8vIFNlcnZlci1zZW50IGV2ZW50cyBhcmUgbG9uZy1saXZlZCBzdHJlYW1zOyBidWZmZXJpbmcgdGhlbSBmb3IgY29tcHJlc3Npb25cbiAgLy8gd291bGQgYnJlYWsgZGVsaXZlcnksIHNvIHRoZXkgYXJlIGV4Y2x1ZGVkIGJlZm9yZSB0aGUgdGV4dHVhbCBhbGxvd2xpc3QuXG4gIGlmIChtZWRpYVR5cGUgPT0gXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSByZXR1cm4gZmFsc2VcbiAgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKFwidGV4dC9cIikpIHJldHVybiB0cnVlXG4gIGlmIChtZWRpYVR5cGUuZW5kc1dpdGgoXCIranNvblwiKSB8fCBtZWRpYVR5cGUuZW5kc1dpdGgoXCIreG1sXCIpKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBDT01QUkVTU0lCTEVfRVhBQ1RfTUVESUFfVFlQRVMuaGFzKG1lZGlhVHlwZSlcbn1cblxuLyoqXG4gKiBNZXJnZXMgQWNjZXB0LUVuY29kaW5nIGludG8gdGhlIHJlc3BvbnNlIFZhcnkgaGVhZGVyIGNhc2UtaW5zZW5zaXRpdmVseSBhbmRcbiAqIHdpdGhvdXQgZHVwbGljYXRlcy4gQW4gZXhpc3RpbmcgYFZhcnk6ICpgIGFscmVhZHkgY292ZXJzIGV2ZXJ5IHJlcXVlc3QgaGVhZGVyXG4gKiBhbmQgaXMgcHJlc2VydmVkIGFzLWlzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9IHJlc3BvbnNlIC0gUmVzcG9uc2UgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRBY2NlcHRFbmNvZGluZ1RvVmFyeShyZXNwb25zZSkge1xuICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgaWYgKGhlYWRlcktleS50b0xvd2VyQ2FzZSgpICE9IFwidmFyeVwiKSBjb250aW51ZVxuXG4gICAgY29uc3QgdmFsdWVzID0gcmVzcG9uc2UuaGVhZGVyc1toZWFkZXJLZXldXG4gICAgY29uc3QgdG9rZW5zID0gdmFsdWVzLmZsYXRNYXAoKHZhbHVlKSA9PiB2YWx1ZS5zcGxpdChcIixcIikubWFwKCh0b2tlbikgPT4gdG9rZW4udHJpbSgpLnRvTG93ZXJDYXNlKCkpKVxuXG4gICAgaWYgKHRva2Vucy5pbmNsdWRlcyhcIipcIikgfHwgdG9rZW5zLmluY2x1ZGVzKFwiYWNjZXB0LWVuY29kaW5nXCIpKSByZXR1cm5cblxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdmFsdWVzWzBdID0gYCR7dmFsdWVzWzBdfSwgQWNjZXB0LUVuY29kaW5nYFxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgcmVzcG9uc2Uuc2V0SGVhZGVyKFwiVmFyeVwiLCBcIkFjY2VwdC1FbmNvZGluZ1wiKVxufVxuXG4vKipcbiAqIE5lZ290aWF0ZXMgYW5kIGFwcGxpZXMgY29tcHJlc3Npb24gdG8gYSBidWZmZXJlZCByZXNwb25zZSBib2R5IGltbWVkaWF0ZWx5IGJlZm9yZVxuICogZnJhbWluZy4gT25seSBzdHJpbmcvVWludDhBcnJheSByZXNwb25zZXMgcmVhY2ggdGhpcyBwb2ludDsgc2VuZEZpbGUgcmVzcG9uc2VzIGFuZFxuICogYm9keWxlc3Mgc3RhdHVzZXMgYXJlIGV4Y2x1ZGVkIGJ5IHRoZSBjYWxsZXIuIFRyYW5zZm9ybWF0aW9uIGlzIHNraXBwZWQgZm9yXG4gKiBDYWNoZS1Db250cm9sIG5vLXRyYW5zZm9ybSwgbm9uLWFsbG93bGlzdGVkIG9yIHByZS1jb21wcmVzc2VkIG1lZGlhIHR5cGVzLFxuICogc2VydmVyLXNlbnQgZXZlbnRzLCBwYXJ0aWFsICgyMDYpIHJlc3BvbnNlcywgcmVxdWVzdHMgd2l0aCBhIFJhbmdlIGhlYWRlcixcbiAqIGNyZWRlbnRpYWxlZCByZXF1ZXN0cyAoQXV0aG9yaXphdGlvbi9Db29raWUgaGVhZGVycyksIHJlc3BvbnNlcyBjYXJyeWluZ1xuICogY3JlZGVudGlhbHMgb3IgdmFsaWRhdG9ycyAoU2V0LUNvb2tpZS9FVGFnL0RpZ2VzdC9Db250ZW50LURpZ2VzdC9Db250ZW50LVJhbmdlXG4gKiBoZWFkZXJzKSwgYW5kIHBlci1yZXNwb25zZSBvcHQtb3V0czsgYSBza2lwcGVkXG4gKiB0cmFuc2Zvcm1hdGlvbiBpcyBzdGlsbCBzZW50IGFzIGlkZW50aXR5IHdoZW4gdGhlIGNsaWVudCBhY2NlcHRzIGlkZW50aXR5LCBhbmRcbiAqIGFuc3dlcmVkIFwibm90LWFjY2VwdGFibGVcIiB3aGVuIGl0IGRvZXMgbm90LiBSZXNwb25zZXMgdGhhdCBhbHJlYWR5IGNhcnJ5IGFuXG4gKiBhcHBsaWNhdGlvbi1zdXBwbGllZCBDb250ZW50LUVuY29kaW5nIGFyZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQgYW5kIG5ldmVyXG4gKiBuZWdvdGlhdGUuIFdoZW4gdGhlIGNsaWVudCBmb3JiaWRzIGV2ZXJ5IHJlcHJlc2VudGF0aW9uIChpZGVudGl0eSBhbmQgYWxsXG4gKiBzdXBwb3J0ZWQgY29kaW5ncyksIHRoZSBvdXRjb21lIGlzIFwibm90LWFjY2VwdGFibGVcIi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYXJncy5ib2R5QnVmZmVyIC0gQnVmZmVyZWQgcmVzcG9uc2UgYm9keSBieXRlcyAoVVRGLTggZW5jb2RlZCBmb3Igc3RyaW5nIGJvZGllcykuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEh0dHBDb21wcmVzc2lvbkNvbmZpZ3VyYXRpb259IGFyZ3MuY29tcHJlc3Npb24gLSBOb3JtYWxpemVkIGNvbXByZXNzaW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlcXVlc3QgLSBSZXF1ZXN0IG9iamVjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2UgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7b3V0Y29tZTogXCJpZGVudGl0eVwifSB8IHtvdXRjb21lOiBcImNvbXByZXNzZWRcIiwgYm9keTogQnVmZmVyfSB8IHtvdXRjb21lOiBcIm5vdC1hY2NlcHRhYmxlXCJ9Pn0gLSBDb21wcmVzc2lvbiBvdXRjb21lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlSZXNwb25zZUNvbXByZXNzaW9uKHtib2R5QnVmZmVyLCBjb21wcmVzc2lvbiwgcmVxdWVzdCwgcmVzcG9uc2V9KSB7XG4gIGlmICghY29tcHJlc3Npb24uZW5hYmxlZCkgcmV0dXJuIHtvdXRjb21lOiBcImlkZW50aXR5XCJ9XG5cbiAgLy8gQXBwbGljYXRpb24tc3VwcGxpZWQgZW5jb2RpbmdzIHN0YXkgYXBwbGljYXRpb24tb3duZWQ6IHRoZXkgYXJlIHBhc3NlZCB0aHJvdWdoXG4gIC8vIHVuY2hhbmdlZCBhbmQgbmV2ZXIgdGFrZSBwYXJ0IGluIG5lZ290aWF0aW9uIGZhaWx1cmUgaGFuZGxpbmcuXG4gIGlmIChyZXNwb25zZS5nZXRIZWFkZXIoXCJDb250ZW50LUVuY29kaW5nXCIpLmxlbmd0aCA+IDApIHJldHVybiB7b3V0Y29tZTogXCJpZGVudGl0eVwifVxuXG4gIGNvbnN0IG5lZ290aWF0ZWQgPSBuZWdvdGlhdGVDb250ZW50RW5jb2RpbmcocmVxdWVzdC5oZWFkZXIoXCJhY2NlcHQtZW5jb2RpbmdcIikpXG5cbiAgaWYgKFwibm90QWNjZXB0YWJsZVwiIGluIG5lZ290aWF0ZWQpIHJldHVybiB7b3V0Y29tZTogXCJub3QtYWNjZXB0YWJsZVwifVxuXG4gIGNvbnN0IGNhY2hlQ29udHJvbFRva2VucyA9IHJlc3BvbnNlLmdldEhlYWRlcihcIkNhY2hlLUNvbnRyb2xcIilcbiAgICAuZmxhdE1hcCgodmFsdWUpID0+IHZhbHVlLnNwbGl0KFwiLFwiKSlcbiAgICAubWFwKCh0b2tlbikgPT4gdG9rZW4udHJpbSgpLnRvTG93ZXJDYXNlKCkpXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuZ2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIpWzBdXG5cbiAgLy8gQXV0b21hdGljIHNlY3VyaXR5IGV4Y2x1c2lvbnM6IGNyZWRlbnRpYWxlZCByZXF1ZXN0cyAoQXV0aG9yaXphdGlvbi9Db29raWUpIGFuZFxuICAvLyByZXNwb25zZXMgY2FycnlpbmcgY3JlZGVudGlhbHMgKFNldC1Db29raWUpIG9yIHJlcHJlc2VudGF0aW9uIHZhbGlkYXRvcnNcbiAgLy8gKEVUYWcvRGlnZXN0L0NvbnRlbnQtRGlnZXN0KSBhcmUgbmV2ZXIgdHJhbnNmb3JtZWQg4oCUIGNvbXByZXNzaW9uIGNvdWxkIGxlYWtcbiAgLy8gc2VjcmV0LWJlYXJpbmcgY29udGVudCB0aHJvdWdoIGEgY29tcHJlc3Npb24gb3JhY2xlLCBhbmQgdmFsaWRhdG9ycyBzdGF5XG4gIC8vIGFwcGxpY2F0aW9uLW93bmVkIHJhdGhlciB0aGFuIGJlaW5nIHJlY29tcHV0ZWQgZm9yIGVuY29kZWQgdmFyaWFudHMuXG4gIGNvbnN0IHRyYW5zZm9ybWFibGUgPSAhcmVzcG9uc2UuaXNDb21wcmVzc2lvbkRpc2FibGVkKCkgJiZcbiAgICByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkgIT09IDIwNiAmJlxuICAgICFyZXF1ZXN0LmhlYWRlcihcInJhbmdlXCIpICYmXG4gICAgIXJlcXVlc3QuaGVhZGVyKFwiYXV0aG9yaXphdGlvblwiKSAmJlxuICAgICFyZXF1ZXN0LmhlYWRlcihcImNvb2tpZVwiKSAmJlxuICAgIHJlc3BvbnNlLmdldEhlYWRlcihcIkNvbnRlbnQtUmFuZ2VcIikubGVuZ3RoID09PSAwICYmXG4gICAgcmVzcG9uc2UuZ2V0SGVhZGVyKFwiU2V0LUNvb2tpZVwiKS5sZW5ndGggPT09IDAgJiZcbiAgICByZXNwb25zZS5nZXRIZWFkZXIoXCJFVGFnXCIpLmxlbmd0aCA9PT0gMCAmJlxuICAgIHJlc3BvbnNlLmdldEhlYWRlcihcIkRpZ2VzdFwiKS5sZW5ndGggPT09IDAgJiZcbiAgICByZXNwb25zZS5nZXRIZWFkZXIoXCJDb250ZW50LURpZ2VzdFwiKS5sZW5ndGggPT09IDAgJiZcbiAgICAhY2FjaGVDb250cm9sVG9rZW5zLmluY2x1ZGVzKFwibm8tdHJhbnNmb3JtXCIpICYmXG4gICAgY29udGVudFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlzQ29tcHJlc3NpYmxlQ29udGVudFR5cGUoY29udGVudFR5cGUpXG5cbiAgaWYgKCF0cmFuc2Zvcm1hYmxlKSB7XG4gICAgLy8gQSBza2lwcGVkIHRyYW5zZm9ybWF0aW9uIG1heSBzdGlsbCBnbyBvdXQgYXMgaWRlbnRpdHkgd2hlbiB0aGUgY2xpZW50IGFjY2VwdHNcbiAgICAvLyBpZGVudGl0eTsgd2hlbiBpZGVudGl0eSBpcyBmb3JiaWRkZW4sIG5vIGFjY2VwdGFibGUgcmVwcmVzZW50YXRpb24gY2FuIGJlIHNlbnQuXG4gICAgcmV0dXJuIG5lZ290aWF0ZWQuaWRlbnRpdHlBY2NlcHRhYmxlID8ge291dGNvbWU6IFwiaWRlbnRpdHlcIn0gOiB7b3V0Y29tZTogXCJub3QtYWNjZXB0YWJsZVwifVxuICB9XG5cbiAgLy8gVGhlIHJlcHJlc2VudGF0aW9uIG5vdyBkZXBlbmRzIG9uIHRoZSByZXF1ZXN0J3MgQWNjZXB0LUVuY29kaW5nLCBldmVuIHdoZW4gdGhpc1xuICAvLyBwYXJ0aWN1bGFyIHJlc3BvbnNlIGVuZHMgdXAgaWRlbnRpdHkgKG1pc3NpbmcgaGVhZGVyLCBoaWdoZXItcSBpZGVudGl0eSwgYmVsb3cgdGhyZXNob2xkKS5cbiAgYWRkQWNjZXB0RW5jb2RpbmdUb1ZhcnkocmVzcG9uc2UpXG5cbiAgaWYgKG5lZ290aWF0ZWQuZW5jb2RpbmcgPT0gXCJpZGVudGl0eVwiKSByZXR1cm4ge291dGNvbWU6IFwiaWRlbnRpdHlcIn1cblxuICAvLyBCZWxvdyB0aGUgdGhyZXNob2xkIHRoZSBzbWFsbGVyIGlkZW50aXR5IHJlcHJlc2VudGF0aW9uIGlzIHNlbnQgaW5zdGVhZCDigJQgYnV0IG9ubHlcbiAgLy8gd2hlbiBpZGVudGl0eSBpcyBhY2NlcHRhYmxlOyBhIGNsaWVudCB0aGF0IGZvcmJpZHMgaWRlbnRpdHkgbXVzdCBuZXZlciBiZSBmb3JjZWRcbiAgLy8gb250byBhbiB1bmFjY2VwdGFibGUgcmVwcmVzZW50YXRpb24gYnkgdGhlIHNpemUgY2hlY2suXG4gIGlmIChib2R5QnVmZmVyLmxlbmd0aCA8IGNvbXByZXNzaW9uLnRocmVzaG9sZCAmJiBuZWdvdGlhdGVkLmlkZW50aXR5QWNjZXB0YWJsZSkgcmV0dXJuIHtvdXRjb21lOiBcImlkZW50aXR5XCJ9XG5cbiAgY29uc3QgYm9keSA9IG5lZ290aWF0ZWQuZW5jb2RpbmcgPT0gXCJiclwiXG4gICAgPyBhd2FpdCBicm90bGlDb21wcmVzc0FzeW5jKGJvZHlCdWZmZXIsIHtwYXJhbXM6IHtbemxpYi5jb25zdGFudHMuQlJPVExJX1BBUkFNX1FVQUxJVFldOiBjb21wcmVzc2lvbi5icm90bGlRdWFsaXR5fX0pXG4gICAgOiBhd2FpdCBnemlwQXN5bmMoYm9keUJ1ZmZlciwge2xldmVsOiBjb21wcmVzc2lvbi5nemlwTGV2ZWx9KVxuXG4gIHJlc3BvbnNlLnNldEhlYWRlcihcIkNvbnRlbnQtRW5jb2RpbmdcIiwgbmVnb3RpYXRlZC5lbmNvZGluZylcblxuICByZXR1cm4ge2JvZHksIG91dGNvbWU6IFwiY29tcHJlc3NlZFwifVxufVxuIl19
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UtY29tcHJlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLWNvbXByZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUVuQyxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDMUQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUV0Qzs7Ozt5QkFJeUI7QUFDekIsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM3Qyx3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLGtCQUFrQjtJQUNsQiwwQkFBMEI7SUFDMUIsaUJBQWlCO0lBQ2pCLGVBQWU7Q0FDaEIsQ0FBQyxDQUFBO0FBRUY7OztvQkFHb0I7QUFDcEIsTUFBTSxjQUFjLEdBQUcsdUNBQXVDLENBQUE7QUFFOUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxXQUFXO0lBQzdDLGtDQUFrQztJQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXpCLEtBQUssTUFBTSxJQUFJLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUVoRCxJQUFJLENBQUMsTUFBTTtZQUFFLFNBQVE7UUFFckIsSUFBSSxDQUFD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RUFBQyxDQUFBO0lBRTVHLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN0QyxDQUFDLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsRUFBRSxXQUFXLENBQUMsYUFBYSxFQUFDLEVBQUMsQ0FBQztRQUNySCxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO0lBRS9ELFFBQVEsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTNELE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBQyxDQUFBO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHpsaWIgZnJvbSBcIm5vZGU6emxpYlwiXG5pbXBvcnQge3Byb21pc2lmeX0gZnJvbSBcIm5vZGU6dXRpbFwiXG5cbmNvbnN0IGJyb3RsaUNvbXByZXNzQXN5bmMgPSBwcm9taXNpZnkoemxpYi5icm90bGlDb21wcmVzcylcbmNvbnN0IGd6aXBBc3luYyA9IHByb21pc2lmeSh6bGliLmd6aXApXG5cbi8qKlxuICogRXhhY3QgbWVkaWEgdHlwZXMgKGJleW9uZCB0aGUgdGV4dC8qLCAqK2pzb24sIGFuZCAqK3htbCBmYW1pbGllcykgdGhhdCBhcmUgd29ydGggY29tcHJlc3NpbmcuXG4gKiBFdmVyeXRoaW5nIGVsc2Ug4oCUIHVua25vd24gYmluYXJ5IHR5cGVzIGFuZCBjb21tb25seSBwcmUtY29tcHJlc3NlZCBtZWRpYSBzdWNoIGFzIGltYWdlcyxcbiAqIHZpZGVvLCBhbmQgYXJjaGl2ZXMg4oCUIGlzIGxlZnQgdW50b3VjaGVkIGJ5IHRoZSBjb25zZXJ2YXRpdmUgYWxsb3dsaXN0LlxuICogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuY29uc3QgQ09NUFJFU1NJQkxFX0VYQUNUX01FRElBX1RZUEVTID0gbmV3IFNldChbXG4gIFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiLFxuICBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIixcbiAgXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gIFwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCIsXG4gIFwiYXBwbGljYXRpb24veG1sXCIsXG4gIFwiaW1hZ2Uvc3ZnK3htbFwiXG5dKVxuXG4vKipcbiAqIFJGQyA5MTEwIMKnMTIuNC4yIHF2YWx1ZSBncmFtbWFyOiBgMGAgb3IgYDFgIHdpdGggYXQgbW9zdCB0aHJlZSBmcmFjdGlvbmFsXG4gKiBkaWdpdHMgKHRoZSBib3VuZGFyeSBmb3JtcyBgMC5gIGFuZCBgMS5gIGFyZSB2YWxpZCksIGFuZCBvbmx5IHplcm9zIGFmdGVyIGAxYC5cbiAqIEB0eXBlIHtSZWdFeHB9ICovXG5jb25zdCBRVkFMVUVfUEFUVEVSTiA9IC9eKD86MCg/OlxcLlxcZHswLDN9KT98MSg/OlxcLjB7MCwzfSk/KSQvdVxuXG4vKipcbiAqIFJ1bnMgcGFyc2UgYWNjZXB0IGVuY29kaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclZhbHVlIC0gQWNjZXB0LUVuY29kaW5nIGhlYWRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBudW1iZXI+fSAtIExvd2VyY2FzZWQgY29kaW5nIHRvIHEtdmFsdWUgKDAtMSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFjY2VwdEVuY29kaW5nKGhlYWRlclZhbHVlKSB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gKi9cbiAgY29uc3QgY29kaW5ncyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgcGFydCBvZiBoZWFkZXJWYWx1ZS5zcGxpdChcIixcIikpIHtcbiAgICBjb25zdCBbY29kaW5nVG9rZW4sIC4uLnBhcmFtZXRlcnNdID0gcGFydC5zcGxpdChcIjtcIilcbiAgICBjb25zdCBjb2RpbmcgPSBjb2RpbmdUb2tlbj8udHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICAgIGlmICghY29kaW5nKSBjb250aW51ZVxuXG4gICAgbGV0IHEgPSAxXG5cbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gcGFyYW1ldGVyLnNwbGl0KFwiPVwiKVxuXG4gICAgICBpZiAobmFtZT8udHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gXCJxXCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHF2YWx1ZSA9IHZhbHVlPy50cmltKCkgfHwgXCJcIlxuXG4gICAgICAvLyBBIG1hbGZvcm1lZCBxLXZhbHVlIChlLmcuIGAuNWAsIGAwMWAsIGAxLjAwMWAsIG1vcmUgdGhhbiB0aHJlZSBmcmFjdGlvbmFsXG4gICAgICAvLyBkaWdpdHMsIG9yIGVtcHR5KSBpcyB0cmVhdGVkIGFzIFwibm90IGFjY2VwdGFibGVcIiAocT0wKSwgcGVyIFJGQyA5MTEwIMKnMTIuNC4yLlxuICAgICAgcSA9IFFWQUxVRV9QQVRURVJOLnRlc3QocXZhbHVlKSA/IE51bWJlcihxdmFsdWUpIDogMFxuICAgIH1cblxuICAgIGNvZGluZ3Muc2V0KGNvZGluZywgcSlcbiAgfVxuXG4gIHJldHVybiBjb2RpbmdzXG59XG5cbi8qKlxuICogTmVnb3RpYXRlcyB0aGUgY29udGVudCBjb2RpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQWNjZXB0LUVuY29kaW5nIGhlYWRlci5cbiAqIElkZW50aXR5IHBhcnRpY2lwYXRlcyBpbiB0aGUgc2FtZSBxdWFsaXR5IGNvbXBhcmlzb24gYXMgdGhlIHN1cHBvcnRlZCBjb2RpbmdzOlxuICogYSBoaWdoZXItcSBpZGVudGl0eSBzZWxlY3RzIGlkZW50aXR5LCBhbmQgZXF1YWwtcSB0aWVzIGJyZWFrIGluIHNlcnZlciBvcmRlclxuICogYnIsIGd6aXAsIGlkZW50aXR5LiBJZGVudGl0eSBkZWZhdWx0cyB0byBhY2NlcHRhYmxlIHVubGVzcyBleHBsaWNpdGx5IHJlZnVzZWRcbiAqIHdpdGggYGlkZW50aXR5O3E9MGAgb3IgYSBgKjtxPTBgIHdpbGRjYXJkIHdpdGhvdXQgYSBtb3JlIHNwZWNpZmljIGlkZW50aXR5XG4gKiBlbnRyeSwgYW5kIGFuIGV4cGxpY2l0IGNvZGluZyBlbnRyeSBiZWF0cyB0aGUgd2lsZGNhcmQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IGFjY2VwdEVuY29kaW5nIC0gQWNjZXB0LUVuY29kaW5nIGhlYWRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHt7ZW5jb2Rpbmc6IFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJpZGVudGl0eVwiLCBpZGVudGl0eUFjY2VwdGFibGU6IGJvb2xlYW59IHwge25vdEFjY2VwdGFibGU6IHRydWV9fSAtIE5lZ290aWF0ZWQgY29kaW5nLCBvciB0aGF0IG5vIGFjY2VwdGFibGUgcmVwcmVzZW50YXRpb24gZXhpc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVnb3RpYXRlQ29udGVudEVuY29kaW5nKGFjY2VwdEVuY29kaW5nKSB7XG4gIGlmIChhY2NlcHRFbmNvZGluZyA9PT0gdW5kZWZpbmVkIHx8IGFjY2VwdEVuY29kaW5nID09PSBudWxsIHx8IGFjY2VwdEVuY29kaW5nLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIHJldHVybiB7ZW5jb2Rpbmc6IFwiaWRlbnRpdHlcIiwgaWRlbnRpdHlBY2NlcHRhYmxlOiB0cnVlfVxuICB9XG5cbiAgY29uc3QgY29kaW5ncyA9IHBhcnNlQWNjZXB0RW5jb2RpbmcoYWNjZXB0RW5jb2RpbmcpXG4gIGNvbnN0IHdpbGRjYXJkUSA9IGNvZGluZ3MuZ2V0KFwiKlwiKVxuICBjb25zdCBpZGVudGl0eVEgPSBjb2RpbmdzLmdldChcImlkZW50aXR5XCIpID8/IHdpbGRjYXJkUSA/PyAxXG5cbiAgLy8gRGVjbGFyZWQgaW4gc2VydmVyIHByZWZlcmVuY2Ugb3JkZXI7IHRoZSBzdGFibGUgc29ydCBrZWVwcyB0aGlzIG9yZGVyIGZvciB0aWVzLlxuICAvKiogQHR5cGUge0FycmF5PHtjb2Rpbmc6IFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJpZGVudGl0eVwiLCBxOiBudW1iZXJ9Pn0gKi9cbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICB7Y29kaW5nOiBcImJyXCIsIHE6IGNvZGluZ3MuZ2V0KFwiYnJcIikgPz8gd2lsZGNhcmRRID8/IDB9LFxuICAgIHtjb2Rpbmc6IFwiZ3ppcFwiLCBxOiBjb2RpbmdzLmdldChcImd6aXBcIikgPz8gd2lsZGNhcmRRID8/IDB9LFxuICAgIHtjb2Rpbmc6IFwiaWRlbnRpdHlcIiwgcTogaWRlbnRpdHlRfVxuICBdXG4gIGNvbnN0IHNlbGVjdGVkID0gY2FuZGlkYXRlc1xuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnEgPiAwKVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnEgLSBhLnEpWzBdXG5cbiAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuIHtub3RBY2NlcHRhYmxlOiB0cnVlfVxuXG4gIHJldHVybiB7ZW5jb2Rpbmc6IHNlbGVjdGVkLmNvZGluZywgaWRlbnRpdHlBY2NlcHRhYmxlOiBpZGVudGl0eVEgPiAwfVxufVxuXG4vKipcbiAqIFJ1bnMgaXMgY29tcHJlc3NpYmxlIGNvbnRlbnQgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZSAtIENvbnRlbnQtVHlwZSBoZWFkZXIgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBtZWRpYSB0eXBlIGlzIG9uIHRoZSBjb21wcmVzc2libGUgYWxsb3dsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wcmVzc2libGVDb250ZW50VHlwZShjb250ZW50VHlwZSkge1xuICBjb25zdCBtZWRpYVR5cGUgPSBjb250ZW50VHlwZS5zcGxpdChcIjtcIilbMF0/LnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgaWYgKCFtZWRpYVR5cGUpIHJldHVybiBmYWxzZVxuXG4gIC8vIFNlcnZlci1zZW50IGV2ZW50cyBhcmUgbG9uZy1saXZlZCBzdHJlYW1zOyBidWZmZXJpbmcgdGhlbSBmb3IgY29tcHJlc3Npb25cbiAgLy8gd291bGQgYnJlYWsgZGVsaXZlcnksIHNvIHRoZXkgYXJlIGV4Y2x1ZGVkIGJlZm9yZSB0aGUgdGV4dHVhbCBhbGxvd2xpc3QuXG4gIGlmIChtZWRpYVR5cGUgPT0gXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSByZXR1cm4gZmFsc2VcbiAgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKFwidGV4dC9cIikpIHJldHVybiB0cnVlXG4gIGlmIChtZWRpYVR5cGUuZW5kc1dpdGgoXCIranNvblwiKSB8fCBtZWRpYVR5cGUuZW5kc1dpdGgoXCIreG1sXCIpKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBDT01QUkVTU0lCTEVfRVhBQ1RfTUVESUFfVFlQRVMuaGFzKG1lZGlhVHlwZSlcbn1cblxuLyoqXG4gKiBNZXJnZXMgQWNjZXB0LUVuY29kaW5nIGludG8gdGhlIHJlc3BvbnNlIFZhcnkgaGVhZGVyIGNhc2UtaW5zZW5zaXRpdmVseSBhbmRcbiAqIHdpdGhvdXQgZHVwbGljYXRlcy4gQW4gZXhpc3RpbmcgYFZhcnk6ICpgIGFscmVhZHkgY292ZXJzIGV2ZXJ5IHJlcXVlc3QgaGVhZGVyXG4gKiBhbmQgaXMgcHJlc2VydmVkIGFzLWlzLiBDYWxsZWQgYnkgdGhlIHJlc3BvbnNlIHNlbmRlciBmb3IgZXZlcnlcbiAqIGZyYW1ld29yay1zZWxlY3RlZCByZXByZXNlbnRhdGlvbiBzbyB0aGUgaGVhZGVyIGlzIGlkZW50aWNhbCBmb3IgZXZlcnlcbiAqIHJlcXVlc3Qgb24gdGhlIHNhbWUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSByZXNwb25zZSAtIFJlc3BvbnNlIGluc3RhbmNlLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQWNjZXB0RW5jb2RpbmdUb1ZhcnkocmVzcG9uc2UpIHtcbiAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gcmVzcG9uc2UuaGVhZGVycykge1xuICAgIGlmIChoZWFkZXJLZXkudG9Mb3dlckNhc2UoKSAhPSBcInZhcnlcIikgY29udGludWVcblxuICAgIGNvbnN0IHZhbHVlcyA9IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyS2V5XVxuICAgIGNvbnN0IHRva2VucyA9IHZhbHVlcy5mbGF0TWFwKCh2YWx1ZSkgPT4gdmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgodG9rZW4pID0+IHRva2VuLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSlcblxuICAgIGlmICh0b2tlbnMuaW5jbHVkZXMoXCIqXCIpIHx8IHRva2Vucy5pbmNsdWRlcyhcImFjY2VwdC1lbmNvZGluZ1wiKSkgcmV0dXJuXG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhbHVlc1swXSA9IGAke3ZhbHVlc1swXX0sIEFjY2VwdC1FbmNvZGluZ2BcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIHJlc3BvbnNlLnNldEhlYWRlcihcIlZhcnlcIiwgXCJBY2NlcHQtRW5jb2RpbmdcIilcbn1cblxuLyoqXG4gKiBOZWdvdGlhdGVzIGFuZCBhcHBsaWVzIGNvbXByZXNzaW9uIHRvIGEgYnVmZmVyZWQgcmVzcG9uc2UgYm9keSBpbW1lZGlhdGVseSBiZWZvcmVcbiAqIGZyYW1pbmcuIE9ubHkgc3RyaW5nL1VpbnQ4QXJyYXkgcmVzcG9uc2VzIHJlYWNoIHRoaXMgcG9pbnQ7IHNlbmRGaWxlIHJlc3BvbnNlcyBhbmRcbiAqIGJvZHlsZXNzIHN0YXR1c2VzIGFyZSBleGNsdWRlZCBieSB0aGUgY2FsbGVyLiBUcmFuc2Zvcm1hdGlvbiBpcyBza2lwcGVkIGZvclxuICogQ2FjaGUtQ29udHJvbCBuby10cmFuc2Zvcm0sIG5vbi1hbGxvd2xpc3RlZCBvciBwcmUtY29tcHJlc3NlZCBtZWRpYSB0eXBlcyxcbiAqIHNlcnZlci1zZW50IGV2ZW50cywgcGFydGlhbCAoMjA2KSByZXNwb25zZXMsIHJlcXVlc3RzIHdpdGggYSBSYW5nZSBoZWFkZXIsXG4gKiBjcmVkZW50aWFsZWQgcmVxdWVzdHMgKEF1dGhvcml6YXRpb24vQ29va2llIGhlYWRlcnMpLCByZXNwb25zZXMgY2FycnlpbmdcbiAqIGNyZWRlbnRpYWxzIG9yIHZhbGlkYXRvcnMgKFNldC1Db29raWUvRVRhZy9EaWdlc3QvQ29udGVudC1EaWdlc3QvQ29udGVudC1SYW5nZVxuICogaGVhZGVycyksIGFuZCBwZXItcmVzcG9uc2Ugb3B0LW91dHM7IGEgc2tpcHBlZFxuICogdHJhbnNmb3JtYXRpb24gaXMgc3RpbGwgc2VudCBhcyBpZGVudGl0eSB3aGVuIHRoZSBjbGllbnQgYWNjZXB0cyBpZGVudGl0eSwgYW5kXG4gKiBhbnN3ZXJlZCBcIm5vdC1hY2NlcHRhYmxlXCIgd2hlbiBpdCBkb2VzIG5vdC4gUmVzcG9uc2VzIHRoYXQgYWxyZWFkeSBjYXJyeSBhblxuICogYXBwbGljYXRpb24tc3VwcGxpZWQgQ29udGVudC1FbmNvZGluZyBhcmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkIGFuZCBuZXZlclxuICogbmVnb3RpYXRlLiBXaGVuIHRoZSBjbGllbnQgZm9yYmlkcyBldmVyeSByZXByZXNlbnRhdGlvbiAoaWRlbnRpdHkgYW5kIGFsbFxuICogc3VwcG9ydGVkIGNvZGluZ3MpLCB0aGUgb3V0Y29tZSBpcyBcIm5vdC1hY2NlcHRhYmxlXCIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtCdWZmZXJ9IGFyZ3MuYm9keUJ1ZmZlciAtIEJ1ZmZlcmVkIHJlc3BvbnNlIGJvZHkgYnl0ZXMgKFVURi04IGVuY29kZWQgZm9yIHN0cmluZyBib2RpZXMpLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRIdHRwQ29tcHJlc3Npb25Db25maWd1cmF0aW9ufSBhcmdzLmNvbXByZXNzaW9uIC0gTm9ybWFsaXplZCBjb21wcmVzc2lvbiBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gYXJncy5yZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNwb25zZSAtIFJlc3BvbnNlIGluc3RhbmNlLlxuICogQHJldHVybnMge1Byb21pc2U8e291dGNvbWU6IFwiaWRlbnRpdHlcIn0gfCB7b3V0Y29tZTogXCJjb21wcmVzc2VkXCIsIGJvZHk6IEJ1ZmZlcn0gfCB7b3V0Y29tZTogXCJub3QtYWNjZXB0YWJsZVwifT59IC0gQ29tcHJlc3Npb24gb3V0Y29tZS4gVGhlIGNhbGxlciBvd25zIHRoZSBWYXJ5IGhlYWRlciBhbmQgdGhlIGZpbGUvNDA2IHJlcHJlc2VudGF0aW9uIGRlY2lzaW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5UmVzcG9uc2VDb21wcmVzc2lvbih7Ym9keUJ1ZmZlciwgY29tcHJlc3Npb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICBpZiAoIWNvbXByZXNzaW9uLmVuYWJsZWQpIHJldHVybiB7b3V0Y29tZTogXCJpZGVudGl0eVwifVxuXG4gIC8vIEFwcGxpY2F0aW9uLXN1cHBsaWVkIGVuY29kaW5ncyBzdGF5IGFwcGxpY2F0aW9uLW93bmVkOiB0aGV5IGFyZSBwYXNzZWQgdGhyb3VnaFxuICAvLyB1bmNoYW5nZWQgYW5kIG5ldmVyIHRha2UgcGFydCBpbiBuZWdvdGlhdGlvbiBmYWlsdXJlIGhhbmRsaW5nLlxuICBpZiAocmVzcG9uc2UuZ2V0SGVhZGVyKFwiQ29udGVudC1FbmNvZGluZ1wiKS5sZW5ndGggPiAwKSByZXR1cm4ge291dGNvbWU6IFwiaWRlbnRpdHlcIn1cblxuICBjb25zdCBuZWdvdGlhdGVkID0gbmVnb3RpYXRlQ29udGVudEVuY29kaW5nKHJlcXVlc3QuaGVhZGVyKFwiYWNjZXB0LWVuY29kaW5nXCIpKVxuXG4gIGlmIChcIm5vdEFjY2VwdGFibGVcIiBpbiBuZWdvdGlhdGVkKSByZXR1cm4ge291dGNvbWU6IFwibm90LWFjY2VwdGFibGVcIn1cblxuICBjb25zdCBjYWNoZUNvbnRyb2xUb2tlbnMgPSByZXNwb25zZS5nZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIpXG4gICAgLmZsYXRNYXAoKHZhbHVlKSA9PiB2YWx1ZS5zcGxpdChcIixcIikpXG4gICAgLm1hcCgodG9rZW4pID0+IHRva2VuLnRyaW0oKS50b0xvd2VyQ2FzZSgpKVxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmdldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKVswXVxuXG4gIC8vIEF1dG9tYXRpYyBzZWN1cml0eSBleGNsdXNpb25zOiBjcmVkZW50aWFsZWQgcmVxdWVzdHMgKEF1dGhvcml6YXRpb24vQ29va2llKSBhbmRcbiAgLy8gcmVzcG9uc2VzIGNhcnJ5aW5nIGNyZWRlbnRpYWxzIChTZXQtQ29va2llKSBvciByZXByZXNlbnRhdGlvbiB2YWxpZGF0b3JzXG4gIC8vIChFVGFnL0RpZ2VzdC9Db250ZW50LURpZ2VzdCkgYXJlIG5ldmVyIHRyYW5zZm9ybWVkIOKAlCBjb21wcmVzc2lvbiBjb3VsZCBsZWFrXG4gIC8vIHNlY3JldC1iZWFyaW5nIGNvbnRlbnQgdGhyb3VnaCBhIGNvbXByZXNzaW9uIG9yYWNsZSwgYW5kIHZhbGlkYXRvcnMgc3RheVxuICAvLyBhcHBsaWNhdGlvbi1vd25lZCByYXRoZXIgdGhhbiBiZWluZyByZWNvbXB1dGVkIGZvciBlbmNvZGVkIHZhcmlhbnRzLlxuICBjb25zdCB0cmFuc2Zvcm1hYmxlID0gIXJlc3BvbnNlLmlzQ29tcHJlc3Npb25EaXNhYmxlZCgpICYmXG4gICAgcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpICE9PSAyMDYgJiZcbiAgICAhcmVxdWVzdC5oZWFkZXIoXCJyYW5nZVwiKSAmJlxuICAgICFyZXF1ZXN0LmhlYWRlcihcImF1dGhvcml6YXRpb25cIikgJiZcbiAgICAhcmVxdWVzdC5oZWFkZXIoXCJjb29raWVcIikgJiZcbiAgICByZXNwb25zZS5nZXRIZWFkZXIoXCJDb250ZW50LVJhbmdlXCIpLmxlbmd0aCA9PT0gMCAmJlxuICAgIHJlc3BvbnNlLmdldEhlYWRlcihcIlNldC1Db29raWVcIikubGVuZ3RoID09PSAwICYmXG4gICAgcmVzcG9uc2UuZ2V0SGVhZGVyKFwiRVRhZ1wiKS5sZW5ndGggPT09IDAgJiZcbiAgICByZXNwb25zZS5nZXRIZWFkZXIoXCJEaWdlc3RcIikubGVuZ3RoID09PSAwICYmXG4gICAgcmVzcG9uc2UuZ2V0SGVhZGVyKFwiQ29udGVudC1EaWdlc3RcIikubGVuZ3RoID09PSAwICYmXG4gICAgIWNhY2hlQ29udHJvbFRva2Vucy5pbmNsdWRlcyhcIm5vLXRyYW5zZm9ybVwiKSAmJlxuICAgIGNvbnRlbnRUeXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICBpc0NvbXByZXNzaWJsZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKVxuXG4gIGlmICghdHJhbnNmb3JtYWJsZSkge1xuICAgIC8vIEEgc2tpcHBlZCB0cmFuc2Zvcm1hdGlvbiBtYXkgc3RpbGwgZ28gb3V0IGFzIGlkZW50aXR5IHdoZW4gdGhlIGNsaWVudCBhY2NlcHRzXG4gICAgLy8gaWRlbnRpdHk7IHdoZW4gaWRlbnRpdHkgaXMgZm9yYmlkZGVuLCBubyBhY2NlcHRhYmxlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSBzZW50LlxuICAgIHJldHVybiBuZWdvdGlhdGVkLmlkZW50aXR5QWNjZXB0YWJsZSA/IHtvdXRjb21lOiBcImlkZW50aXR5XCJ9IDoge291dGNvbWU6IFwibm90LWFjY2VwdGFibGVcIn1cbiAgfVxuXG4gIGlmIChuZWdvdGlhdGVkLmVuY29kaW5nID09IFwiaWRlbnRpdHlcIikgcmV0dXJuIHtvdXRjb21lOiBcImlkZW50aXR5XCJ9XG5cbiAgLy8gQmVsb3cgdGhlIHRocmVzaG9sZCB0aGUgc21hbGxlciBpZGVudGl0eSByZXByZXNlbnRhdGlvbiBpcyBzZW50IGluc3RlYWQg4oCUIGJ1dCBvbmx5XG4gIC8vIHdoZW4gaWRlbnRpdHkgaXMgYWNjZXB0YWJsZTsgYSBjbGllbnQgdGhhdCBmb3JiaWRzIGlkZW50aXR5IG11c3QgbmV2ZXIgYmUgZm9yY2VkXG4gIC8vIG9udG8gYW4gdW5hY2NlcHRhYmxlIHJlcHJlc2VudGF0aW9uIGJ5IHRoZSBzaXplIGNoZWNrLlxuICBpZiAoYm9keUJ1ZmZlci5sZW5ndGggPCBjb21wcmVzc2lvbi50aHJlc2hvbGQgJiYgbmVnb3RpYXRlZC5pZGVudGl0eUFjY2VwdGFibGUpIHJldHVybiB7b3V0Y29tZTogXCJpZGVudGl0eVwifVxuXG4gIGNvbnN0IGJvZHkgPSBuZWdvdGlhdGVkLmVuY29kaW5nID09IFwiYnJcIlxuICAgID8gYXdhaXQgYnJvdGxpQ29tcHJlc3NBc3luYyhib2R5QnVmZmVyLCB7cGFyYW1zOiB7W3psaWIuY29uc3RhbnRzLkJST1RMSV9QQVJBTV9RVUFMSVRZXTogY29tcHJlc3Npb24uYnJvdGxpUXVhbGl0eX19KVxuICAgIDogYXdhaXQgZ3ppcEFzeW5jKGJvZHlCdWZmZXIsIHtsZXZlbDogY29tcHJlc3Npb24uZ3ppcExldmVsfSlcblxuICByZXNwb25zZS5zZXRIZWFkZXIoXCJDb250ZW50LUVuY29kaW5nXCIsIG5lZ290aWF0ZWQuZW5jb2RpbmcpXG5cbiAgcmV0dXJuIHtib2R5LCBvdXRjb21lOiBcImNvbXByZXNzZWRcIn1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ import EventEmitter from "../../utils/event-emitter.js"
|
|
|
8
8
|
import Logger from "../../logger.js"
|
|
9
9
|
import Request from "./request.js"
|
|
10
10
|
import RequestRunner from "./request-runner.js"
|
|
11
|
-
import {applyResponseCompression} from "./response-compression.js"
|
|
11
|
+
import {addAcceptEncodingToVary, applyResponseCompression, negotiateContentEncoding} from "./response-compression.js"
|
|
12
12
|
import WebsocketSession from "./websocket-session.js"
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -384,7 +384,15 @@ export default class VeoliciousHttpServerClient {
|
|
|
384
384
|
}
|
|
385
385
|
|
|
386
386
|
/**
|
|
387
|
-
*
|
|
387
|
+
* Sends a finished response to the client. Owns the framework-owned
|
|
388
|
+
* `Vary: Accept-Encoding` dimension (emitted for every selected
|
|
389
|
+
* representation — transformed, identity, 406, and file — and for
|
|
390
|
+
* header-present and header-absent requests alike, so it is stable across
|
|
391
|
+
* requests on the same connection; never added when compression is disabled,
|
|
392
|
+
* the response is truly bodyless, or the application supplied a fixed
|
|
393
|
+
* `Content-Encoding`) and the file 406 rule (a sendFile response whose
|
|
394
|
+
* client forbids identity is answered with the empty 406, the file is never
|
|
395
|
+
* opened or streamed, and `onFinished` settles once as "completed").
|
|
388
396
|
* @param {RequestRunner} requestRunner - Request runner.
|
|
389
397
|
* @returns {Promise<void>} - Resolves when complete.
|
|
390
398
|
*/
|
|
@@ -436,12 +444,41 @@ export default class VeoliciousHttpServerClient {
|
|
|
436
444
|
/** @type {string | Uint8Array | null} */
|
|
437
445
|
let bodyToEmit = body
|
|
438
446
|
|
|
447
|
+
// The response representation can depend on the client's Accept-Encoding:
|
|
448
|
+
// the same request is answered with an identity body (or a file) when
|
|
449
|
+
// identity is acceptable and with an empty 406 when it is forbidden.
|
|
450
|
+
const compression = this.configuration.getHttpServerCompression()
|
|
451
|
+
const negotiated = compression.enabled ? negotiateContentEncoding(request.header("accept-encoding")) : undefined
|
|
452
|
+
// An application-supplied Content-Encoding is an application-owned
|
|
453
|
+
// representation contract, captured before the framework may add its own.
|
|
454
|
+
// A file carrying one is a fixed, application-owned representation: the
|
|
455
|
+
// framework neither negotiates it nor re-advertises it, so it is never a
|
|
456
|
+
// candidate for the identity-only 406.
|
|
457
|
+
const hasApplicationContentEncoding = response.getHeader("Content-Encoding").length > 0
|
|
458
|
+
// A file response only ever serves the identity representation: whenever
|
|
459
|
+
// the client forbids identity (including the not-acceptable case where no
|
|
460
|
+
// coding applies) and the file does not carry an application-supplied
|
|
461
|
+
// Content-Encoding, the file is rejected with the empty 406. A truly
|
|
462
|
+
// bodyless status selects no representation, so it is never rejected here.
|
|
463
|
+
const isFileNotAcceptable = hasFilePath && !!negotiated && ("notAcceptable" in negotiated || negotiated.identityAcceptable === false) && hasApplicationContentEncoding === false && !isBodylessStatus
|
|
464
|
+
|
|
439
465
|
if (!isBodylessStatus) {
|
|
440
466
|
let contentLength
|
|
441
467
|
|
|
442
468
|
if (hasFilePath) {
|
|
443
|
-
|
|
444
|
-
|
|
469
|
+
if (isFileNotAcceptable) {
|
|
470
|
+
// The client forbids identity and files are only ever sent identity:
|
|
471
|
+
// answer with the same empty 406 every other representation path
|
|
472
|
+
// uses. The file is never opened or streamed; onFinished is settled
|
|
473
|
+
// below, after the committed 406 headers are emitted.
|
|
474
|
+
response.setStatus(406)
|
|
475
|
+
response.setBody("")
|
|
476
|
+
bodyToEmit = ""
|
|
477
|
+
contentLength = 0
|
|
478
|
+
} else {
|
|
479
|
+
const stats = await fs.stat(filePath)
|
|
480
|
+
contentLength = stats.size
|
|
481
|
+
}
|
|
445
482
|
} else {
|
|
446
483
|
// String bodies are UTF-8 framed, so the buffered bytes are the UTF-8 encoding;
|
|
447
484
|
// Uint8Array bodies are already the exact wire bytes.
|
|
@@ -474,6 +511,18 @@ export default class VeoliciousHttpServerClient {
|
|
|
474
511
|
response.setHeader("Content-Length", contentLength)
|
|
475
512
|
}
|
|
476
513
|
|
|
514
|
+
// Framework-owned Vary dimension: whenever compression is enabled and a
|
|
515
|
+
// representation was selected, the response depends on Accept-Encoding,
|
|
516
|
+
// so caches must key on it. Applied identically for every outcome
|
|
517
|
+
// (transformed, identity, 406, file) and for header-present and
|
|
518
|
+
// header-absent requests alike, so the header is stable across requests on
|
|
519
|
+
// the same connection. A truly bodyless response selects no representation
|
|
520
|
+
// and carries no dimension; an application-supplied Content-Encoding keeps
|
|
521
|
+
// the representation contract application-owned and is never re-advertised.
|
|
522
|
+
if (negotiated && !isBodylessStatus && hasApplicationContentEncoding === false) {
|
|
523
|
+
addAcceptEncodingToVary(response)
|
|
524
|
+
}
|
|
525
|
+
|
|
477
526
|
response.setHeader("Date", date.toUTCString())
|
|
478
527
|
response.setHeader("Server", "Velocious")
|
|
479
528
|
|
|
@@ -492,8 +541,21 @@ export default class VeoliciousHttpServerClient {
|
|
|
492
541
|
this.events.emit("output", headers)
|
|
493
542
|
this.logger.debug(() => ["sendResponse headers emitted", {clientCount: this.clientCount, headersLength: headers.length}])
|
|
494
543
|
|
|
495
|
-
|
|
544
|
+
// A negotiated file 406 is committed above (status 406, empty body) and its
|
|
545
|
+
// headers were just emitted: settle onFinished now, so the callback runs
|
|
546
|
+
// after the response is committed — a slow or app-stopping callback cannot
|
|
547
|
+
// delay or block delivery of the already-emitted 406. The file is never
|
|
548
|
+
// opened, streamed, or reported (no file event), and the callback settles
|
|
549
|
+
// exactly once as "completed".
|
|
550
|
+
if (isFileNotAcceptable) {
|
|
551
|
+
this.logger.debug(() => ["sendResponse file body suppressed for 406", {clientCount: this.clientCount, filePath}])
|
|
552
|
+
await this.runFileOnFinished({filePath, onFinished: fileOnFinished, result: "completed"})
|
|
553
|
+
} else if (isBodylessStatus) {
|
|
496
554
|
this.logger.debug(() => ["sendResponse body suppressed for no-body status", {clientCount: this.clientCount, statusCode: response.getStatusCode()}])
|
|
555
|
+
// A bodyless status (1xx/204/304) selects no representation, so no file
|
|
556
|
+
// body or framework Vary is emitted. The file-ownership path still settles
|
|
557
|
+
// onFinished exactly once as "completed" (nothing was aborted) — even when
|
|
558
|
+
// the client forbids identity — preserving the pre-change settlement.
|
|
497
559
|
if (hasFilePath) await this.sendFileOutput(filePath, false, fileOnFinished)
|
|
498
560
|
} else if (isHeadRequest) {
|
|
499
561
|
this.logger.debug(() => ["sendResponse body suppressed for HEAD request", {clientCount: this.clientCount}])
|
|
@@ -8,6 +8,12 @@ import Logger from "../../../logger.js"
|
|
|
8
8
|
import ParamsToObject from "../params-to-object.js"
|
|
9
9
|
import querystring from "querystring"
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Request header fields whose repeated wire fields combine into one value
|
|
13
|
+
* (RFC 9110 §5.3) before the server consumes them.
|
|
14
|
+
* @type {Set<string>} */
|
|
15
|
+
const COMBINING_HEADER_FIELDS = new Set(["accept-encoding"])
|
|
16
|
+
|
|
11
17
|
/**
|
|
12
18
|
* Runs truncate preview.
|
|
13
19
|
* @param {string | undefined} input - Input string.
|
|
@@ -367,8 +373,16 @@ export default class RequestBuffer {
|
|
|
367
373
|
*/
|
|
368
374
|
addHeader(header) {
|
|
369
375
|
const formattedName = header.getFormattedName()
|
|
376
|
+
const existingHeader = this.headersByName[formattedName]
|
|
370
377
|
|
|
371
|
-
|
|
378
|
+
// RFC 9110 §5.3: a field may be repeated; its value is the concatenation of
|
|
379
|
+
// all field values separated by commas, in wire order. Only Accept-Encoding
|
|
380
|
+
// is consumed as a combined field by the server.
|
|
381
|
+
if (existingHeader && COMBINING_HEADER_FIELDS.has(formattedName)) {
|
|
382
|
+
existingHeader.value += `, ${header.getValue()}`
|
|
383
|
+
} else {
|
|
384
|
+
this.headersByName[formattedName] = header
|
|
385
|
+
}
|
|
372
386
|
|
|
373
387
|
if (formattedName == "content-length") this.contentLength = parseInt(header.getValue())
|
|
374
388
|
}
|