UNPKG

cesium

Version:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.

67 lines (65 loc) 13.9 MB
/** * @license * Cesium - https://github.com/CesiumGS/cesium * Version 1.133 * * Copyright 2011-2022 Cesium Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Columbus View (Pat. Pend.) * * Portions licensed separately. * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. */ var Cesium = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a3, b) => (typeof require !== "undefined" ? require : a3)[b] }) : x)(function(x) { if (typeof require !== "undefined") return require.apply(this, arguments); throw Error('Dynamic require of "' + x + '" is not supported'); }); var __commonJS = (cb, mod2) => function __require2() { return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target, mod2 )); var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2); // Build/InlineWorkers.js var require_InlineWorkers = __commonJS({ "Build/InlineWorkers.js"() { globalThis.CESIUM_WORKERS = atob("dmFyIENlc2l1bVdvcmtlcnMgPSAoKCkgPT4gewogIHZhciBfX2NyZWF0ZSA9IE9iamVjdC5jcmVhdGU7CiAgdmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICB2YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgdmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7CiAgdmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICB2YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICB2YXIgX19yZXF1aXJlID0gLyogQF9fUFVSRV9fICovICgoeCkgPT4gdHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiID8gcmVxdWlyZSA6IHR5cGVvZiBQcm94eSAhPT0gInVuZGVmaW5lZCIgPyBuZXcgUHJveHkoeCwgewogICAgZ2V0OiAoYTMsIGIpID0+ICh0eXBlb2YgcmVxdWlyZSAhPT0gInVuZGVmaW5lZCIgPyByZXF1aXJlIDogYTMpW2JdCiAgfSkgOiB4KShmdW5jdGlvbih4KSB7CiAgICBpZiAodHlwZW9mIHJlcXVpcmUgIT09ICJ1bmRlZmluZWQiKSByZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyArIHggKyAnIiBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgfSk7CiAgdmFyIF9fZ2xvYiA9IChtYXApID0+IChwYXRoKSA9PiB7CiAgICB2YXIgZm4gPSBtYXBbcGF0aF07CiAgICBpZiAoZm4pIHJldHVybiBmbigpOwogICAgdGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIiArIHBhdGgpOwogIH07CiAgdmFyIF9fZXNtID0gKGZuLCByZXMpID0+IGZ1bmN0aW9uIF9faW5pdCgpIHsKICAgIHJldHVybiBmbiAmJiAocmVzID0gKDAsIGZuW19fZ2V0T3duUHJvcE5hbWVzKGZuKVswXV0pKGZuID0gMCkpLCByZXM7CiAgfTsKICB2YXIgX19jb21tb25KUyA9IChjYiwgbW9kKSA9PiBmdW5jdGlvbiBfX3JlcXVpcmUyKCkgewogICAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7CiAgfTsKICB2YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHsKICAgIGZvciAodmFyIG5hbWUgaW4gYWxsKQogICAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pOwogIH07CiAgdmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHsKICAgIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSAib2JqZWN0IiB8fCB0eXBlb2YgZnJvbSA9PT0gImZ1bmN0aW9uIikgewogICAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpCiAgICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdCkKICAgICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTsKICAgIH0KICAgIHJldHVybiB0bzsKICB9OwogIHZhciBfX3RvRVNNID0gKG1vZCwgaXNOb2RlTW9kZSwgdGFyZ2V0KSA9PiAodGFyZ2V0ID0gbW9kICE9IG51bGwgPyBfX2NyZWF0ZShfX2dldFByb3RvT2YobW9kKSkgOiB7fSwgX19jb3B5UHJvcHMoCiAgICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNCiAgICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLQogICAgLy8gY29tcGF0aWJsZSB0cmFuc2Zvcm0gKGkuZS4gIl9fZXNNb2R1bGUiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldAogICAgLy8gImRlZmF1bHQiIHRvIHRoZSBDb21tb25KUyAibW9kdWxlLmV4cG9ydHMiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuCiAgICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgImRlZmF1bHQiLCB7IHZhbHVlOiBtb2QsIGVudW1lcmFibGU6IHRydWUgfSkgOiB0YXJnZXQsCiAgICBtb2QKICApKTsKICB2YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9kZWZpbmVkLmpzCiAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlICE9PSB2b2lkIDAgJiYgdmFsdWUgIT09IG51bGw7CiAgfQogIHZhciBkZWZpbmVkX2RlZmF1bHQ7CiAgdmFyIGluaXRfZGVmaW5lZCA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvZGVmaW5lZC5qcyIoKSB7CiAgICAgIGRlZmluZWRfZGVmYXVsdCA9IGRlZmluZWQ7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9EZXZlbG9wZXJFcnJvci5qcwogIGZ1bmN0aW9uIERldmVsb3BlckVycm9yKG1lc3NhZ2UpIHsKICAgIHRoaXMubmFtZSA9ICJEZXZlbG9wZXJFcnJvciI7CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgbGV0IHN0YWNrOwogICAgdHJ5IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHN0YWNrID0gZS5zdGFjazsKICAgIH0KICAgIHRoaXMuc3RhY2sgPSBzdGFjazsKICB9CiAgdmFyIERldmVsb3BlckVycm9yX2RlZmF1bHQ7CiAgdmFyIGluaXRfRGV2ZWxvcGVyRXJyb3IgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0RldmVsb3BlckVycm9yLmpzIigpIHsKICAgICAgaW5pdF9kZWZpbmVkKCk7CiAgICAgIGlmIChkZWZpbmVkX2RlZmF1bHQoT2JqZWN0LmNyZWF0ZSkpIHsKICAgICAgICBEZXZlbG9wZXJFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGV2ZWxvcGVyRXJyb3I7CiAgICAgIH0KICAgICAgRGV2ZWxvcGVyRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbGV0IHN0ciA9IGAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7CiAgICAgICAgaWYgKGRlZmluZWRfZGVmYXVsdCh0aGlzLnN0YWNrKSkgewogICAgICAgICAgc3RyICs9IGAKJHt0aGlzLnN0YWNrLnRvU3RyaW5nKCl9YDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgfTsKICAgICAgRGV2ZWxvcGVyRXJyb3IudGhyb3dJbnN0YW50aWF0aW9uRXJyb3IgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3IoCiAgICAgICAgICAiVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGFuIGludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIgogICAgICAgICk7CiAgICAgIH07CiAgICAgIERldmVsb3BlckVycm9yX2RlZmF1bHQgPSBEZXZlbG9wZXJFcnJvcjsKICAgIH0KICB9KTsKCiAgLy8gcGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NoZWNrLmpzCiAgZnVuY3Rpb24gZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpIHsKICAgIHJldHVybiBgJHtuYW1lfSBpcyByZXF1aXJlZCwgYWN0dWFsIHZhbHVlIHdhcyB1bmRlZmluZWRgOwogIH0KICBmdW5jdGlvbiBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKGFjdHVhbCwgZXhwZWN0ZWQsIG5hbWUpIHsKICAgIHJldHVybiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSB0eXBlb2YgJHtleHBlY3RlZH0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7YWN0dWFsfWA7CiAgfQogIHZhciBDaGVjaywgQ2hlY2tfZGVmYXVsdDsKICB2YXIgaW5pdF9DaGVjayA9IF9fZXNtKHsKICAgICJwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2hlY2suanMiKCkgewogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBDaGVjayA9IHt9OwogICAgICBDaGVjay50eXBlT2YgPSB7fTsKICAgICAgQ2hlY2suZGVmaW5lZCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdCh0ZXN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoZ2V0VW5kZWZpbmVkRXJyb3JNZXNzYWdlKG5hbWUpKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5mdW5jID0gZnVuY3Rpb24obmFtZSwgdGVzdCkgewogICAgICAgIGlmICh0eXBlb2YgdGVzdCAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGdldEZhaWxlZFR5cGVFcnJvck1lc3NhZ2UodHlwZW9mIHRlc3QsICJmdW5jdGlvbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLnN0cmluZyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgInN0cmluZyIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlciA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm51bWJlciIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5sZXNzVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGxlc3MgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA+IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8PSBsaW1pdCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGBFeHBlY3RlZCAke25hbWV9IHRvIGJlIGdyZWF0ZXIgdGhhbiAke2xpbWl0fSwgYWN0dWFsIHZhbHVlIHdhcyAke3Rlc3R9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscyA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QsIGxpbWl0KSB7CiAgICAgICAgQ2hlY2sudHlwZU9mLm51bWJlcihuYW1lLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCA8IGxpbWl0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgYEV4cGVjdGVkICR7bmFtZX0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bGltaXR9LCBhY3R1YWwgdmFsdWUgd2FzICR7dGVzdH1gCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm9iamVjdCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJvYmplY3QiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgIm9iamVjdCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJvb2wgPSBmdW5jdGlvbihuYW1lLCB0ZXN0KSB7CiAgICAgICAgaWYgKHR5cGVvZiB0ZXN0ICE9PSAiYm9vbGVhbiIpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KAogICAgICAgICAgICBnZXRGYWlsZWRUeXBlRXJyb3JNZXNzYWdlKHR5cGVvZiB0ZXN0LCAiYm9vbGVhbiIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLmJpZ2ludCA9IGZ1bmN0aW9uKG5hbWUsIHRlc3QpIHsKICAgICAgICBpZiAodHlwZW9mIHRlc3QgIT09ICJiaWdpbnQiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgZ2V0RmFpbGVkVHlwZUVycm9yTWVzc2FnZSh0eXBlb2YgdGVzdCwgImJpZ2ludCIsIG5hbWUpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQ2hlY2sudHlwZU9mLm51bWJlci5lcXVhbHMgPSBmdW5jdGlvbihuYW1lMSwgbmFtZTIsIHRlc3QxLCB0ZXN0MikgewogICAgICAgIENoZWNrLnR5cGVPZi5udW1iZXIobmFtZTEsIHRlc3QxKTsKICAgICAgICBDaGVjay50eXBlT2YubnVtYmVyKG5hbWUyLCB0ZXN0Mik7CiAgICAgICAgaWYgKHRlc3QxICE9PSB0ZXN0MikgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgIGAke25hbWUxfSBtdXN0IGJlIGVxdWFsIHRvICR7bmFtZTJ9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHt0ZXN0MX0gYW5kICR7dGVzdDJ9YAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIENoZWNrX2RlZmF1bHQgPSBDaGVjazsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL21lcnNlbm5lLXR3aXN0ZXIvc3JjL21lcnNlbm5lLXR3aXN0ZXIuanMKICB2YXIgcmVxdWlyZV9tZXJzZW5uZV90d2lzdGVyID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL21lcnNlbm5lLXR3aXN0ZXIvc3JjL21lcnNlbm5lLXR3aXN0ZXIuanMiKGV4cG9ydHMyLCBtb2R1bGUpIHsKICAgICAgdmFyIE1lcnNlbm5lVHdpc3RlcjIgPSBmdW5jdGlvbihzZWVkKSB7CiAgICAgICAgaWYgKHNlZWQgPT0gdm9pZCAwKSB7CiAgICAgICAgICBzZWVkID0gKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuTiA9IDYyNDsKICAgICAgICB0aGlzLk0gPSAzOTc7CiAgICAgICAgdGhpcy5NQVRSSVhfQSA9IDI1Njc0ODM2MTU7CiAgICAgICAgdGhpcy5VUFBFUl9NQVNLID0gMjE0NzQ4MzY0ODsKICAgICAgICB0aGlzLkxPV0VSX01BU0sgPSAyMTQ3NDgzNjQ3OwogICAgICAgIHRoaXMubXQgPSBuZXcgQXJyYXkodGhpcy5OKTsKICAgICAgICB0aGlzLm10aSA9IHRoaXMuTiArIDE7CiAgICAgICAgaWYgKHNlZWQuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgIHRoaXMuaW5pdF9ieV9hcnJheShzZWVkLCBzZWVkLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuaW5pdF9zZWVkKHNlZWQpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUuaW5pdF9zZWVkID0gZnVuY3Rpb24ocykgewogICAgICAgIHRoaXMubXRbMF0gPSBzID4+PiAwOwogICAgICAgIGZvciAodGhpcy5tdGkgPSAxOyB0aGlzLm10aSA8IHRoaXMuTjsgdGhpcy5tdGkrKykgewogICAgICAgICAgdmFyIHMgPSB0aGlzLm10W3RoaXMubXRpIC0gMV0gXiB0aGlzLm10W3RoaXMubXRpIC0gMV0gPj4+IDMwOwogICAgICAgICAgdGhpcy5tdFt0aGlzLm10aV0gPSAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE4MTI0MzMyNTMgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxODEyNDMzMjUzICsgdGhpcy5tdGk7CiAgICAgICAgICB0aGlzLm10W3RoaXMubXRpXSA+Pj49IDA7CiAgICAgICAgfQogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5ID0gZnVuY3Rpb24oaW5pdF9rZXksIGtleV9sZW5ndGgpIHsKICAgICAgICB2YXIgaSwgaiwgazsKICAgICAgICB0aGlzLmluaXRfc2VlZCgxOTY1MDIxOCk7CiAgICAgICAgaSA9IDE7CiAgICAgICAgaiA9IDA7CiAgICAgICAgayA9IHRoaXMuTiA+IGtleV9sZW5ndGggPyB0aGlzLk4gOiBrZXlfbGVuZ3RoOwogICAgICAgIGZvciAoOyBrOyBrLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFtpIC0gMV0gXiB0aGlzLm10W2kgLSAxXSA+Pj4gMzA7CiAgICAgICAgICB0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE2NjQ1MjUgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxNjY0NTI1KSArIGluaXRfa2V5W2pdICsgajsKICAgICAgICAgIHRoaXMubXRbaV0gPj4+PSAwOwogICAgICAgICAgaSsrOwogICAgICAgICAgaisrOwogICAgICAgICAgaWYgKGkgPj0gdGhpcy5OKSB7CiAgICAgICAgICAgIHRoaXMubXRbMF0gPSB0aGlzLm10W3RoaXMuTiAtIDFdOwogICAgICAgICAgICBpID0gMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChqID49IGtleV9sZW5ndGgpIGogPSAwOwogICAgICAgIH0KICAgICAgICBmb3IgKGsgPSB0aGlzLk4gLSAxOyBrOyBrLS0pIHsKICAgICAgICAgIHZhciBzID0gdGhpcy5tdFtpIC0gMV0gXiB0aGlzLm10W2kgLSAxXSA+Pj4gMzA7CiAgICAgICAgICB0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKChzICYgNDI5NDkwMTc2MCkgPj4+IDE2KSAqIDE1NjYwODM5NDEgPDwgMTYpICsgKHMgJiA2NTUzNSkgKiAxNTY2MDgzOTQxKSAtIGk7CiAgICAgICAgICB0aGlzLm10W2ldID4+Pj0gMDsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGlmIChpID49IHRoaXMuTikgewogICAgICAgICAgICB0aGlzLm10WzBdID0gdGhpcy5tdFt0aGlzLk4gLSAxXTsKICAgICAgICAgICAgaSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMubXRbMF0gPSAyMTQ3NDgzNjQ4OwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21faW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHk7CiAgICAgICAgdmFyIG1hZzAxID0gbmV3IEFycmF5KDAsIHRoaXMuTUFUUklYX0EpOwogICAgICAgIGlmICh0aGlzLm10aSA+PSB0aGlzLk4pIHsKICAgICAgICAgIHZhciBrazsKICAgICAgICAgIGlmICh0aGlzLm10aSA9PSB0aGlzLk4gKyAxKQogICAgICAgICAgICB0aGlzLmluaXRfc2VlZCg1NDg5KTsKICAgICAgICAgIGZvciAoa2sgPSAwOyBrayA8IHRoaXMuTiAtIHRoaXMuTTsga2srKykgewogICAgICAgICAgICB5ID0gdGhpcy5tdFtra10gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10W2trICsgMV0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICAgIHRoaXMubXRba2tdID0gdGhpcy5tdFtrayArIHRoaXMuTV0gXiB5ID4+PiAxIF4gbWFnMDFbeSAmIDFdOwogICAgICAgICAgfQogICAgICAgICAgZm9yICg7IGtrIDwgdGhpcy5OIC0gMTsga2srKykgewogICAgICAgICAgICB5ID0gdGhpcy5tdFtra10gJiB0aGlzLlVQUEVSX01BU0sgfCB0aGlzLm10W2trICsgMV0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICAgIHRoaXMubXRba2tdID0gdGhpcy5tdFtrayArICh0aGlzLk0gLSB0aGlzLk4pXSBeIHkgPj4+IDEgXiBtYWcwMVt5ICYgMV07CiAgICAgICAgICB9CiAgICAgICAgICB5ID0gdGhpcy5tdFt0aGlzLk4gLSAxXSAmIHRoaXMuVVBQRVJfTUFTSyB8IHRoaXMubXRbMF0gJiB0aGlzLkxPV0VSX01BU0s7CiAgICAgICAgICB0aGlzLm10W3RoaXMuTiAtIDFdID0gdGhpcy5tdFt0aGlzLk0gLSAxXSBeIHkgPj4+IDEgXiBtYWcwMVt5ICYgMV07CiAgICAgICAgICB0aGlzLm10aSA9IDA7CiAgICAgICAgfQogICAgICAgIHkgPSB0aGlzLm10W3RoaXMubXRpKytdOwogICAgICAgIHkgXj0geSA+Pj4gMTE7CiAgICAgICAgeSBePSB5IDw8IDcgJiAyNjM2OTI4NjQwOwogICAgICAgIHkgXj0geSA8PCAxNSAmIDQwMjI3MzA3NTI7CiAgICAgICAgeSBePSB5ID4+PiAxODsKICAgICAgICByZXR1cm4geSA+Pj4gMDsKICAgICAgfTsKICAgICAgTWVyc2VubmVUd2lzdGVyMi5wcm90b3R5cGUucmFuZG9tX2ludDMxID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmFuZG9tX2ludCgpID4+PiAxOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21faW5jbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSAqICgxIC8gNDI5NDk2NzI5NSk7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSAqICgxIC8gNDI5NDk2NzI5Nik7CiAgICAgIH07CiAgICAgIE1lcnNlbm5lVHdpc3RlcjIucHJvdG90eXBlLnJhbmRvbV9leGNsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnJhbmRvbV9pbnQoKSArIDAuNSkgKiAoMSAvIDQyOTQ5NjcyOTYpOwogICAgICB9OwogICAgICBNZXJzZW5uZVR3aXN0ZXIyLnByb3RvdHlwZS5yYW5kb21fbG9uZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhMyA9IHRoaXMucmFuZG9tX2ludCgpID4+PiA1LCBiID0gdGhpcy5yYW5kb21faW50KCkgPj4+IDY7CiAgICAgICAgcmV0dXJuIChhMyAqIDY3MTA4ODY0ICsgYikgKiAoMSAvIDkwMDcxOTkyNTQ3NDA5OTIpOwogICAgICB9OwogICAgICBtb2R1bGUuZXhwb3J0cyA9IE1lcnNlbm5lVHdpc3RlcjI7CiAgICB9CiAgfSk7CgogIC8vIHBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9NYXRoLmpzCiAgdmFyIGltcG9ydF9tZXJzZW5uZV90d2lzdGVyLCBDZXNpdW1NYXRoLCBmYWN0b3JpYWxzLCByYW5kb21OdW1iZXJHZW5lcmF0b3IsIE1hdGhfZGVmYXVsdDsKICB2YXIgaW5pdF9NYXRoID0gX19lc20oewogICAgInBhY2thZ2VzL2VuZ2luZS9Tb3VyY2UvQ29yZS9NYXRoLmpzIigpIHsKICAgICAgaW1wb3J0X21lcnNlbm5lX3R3aXN0ZXIgPSBfX3RvRVNNKHJlcXVpcmVfbWVyc2VubmVfdHdpc3RlcigpLCAxKTsKICAgICAgaW5pdF9DaGVjaygpOwogICAgICBpbml0X2RlZmluZWQoKTsKICAgICAgaW5pdF9EZXZlbG9wZXJFcnJvcigpOwogICAgICBDZXNpdW1NYXRoID0ge307CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjEgPSAwLjE7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjIgPSAwLjAxOwogICAgICBDZXNpdW1NYXRoLkVQU0lMT04zID0gMWUtMzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONCA9IDFlLTQ7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjUgPSAxZS01OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT042ID0gMWUtNjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9ONyA9IDFlLTc7CiAgICAgIENlc2l1bU1hdGguRVBTSUxPTjggPSAxZS04OwogICAgICBDZXNpdW1NYXRoLkVQU0lMT045ID0gMWUtOTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTAgPSAxZS0xMDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTEgPSAxZS0xMTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTIgPSAxZS0xMjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTMgPSAxZS0xMzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTQgPSAxZS0xNDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTUgPSAxZS0xNTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTYgPSAxZS0xNjsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTcgPSAxZS0xNzsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTggPSAxZS0xODsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMTkgPSAxZS0xOTsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMjAgPSAxZS0yMDsKICAgICAgQ2VzaXVtTWF0aC5FUFNJTE9OMjEgPSAxZS0yMTsKICAgICAgQ2VzaXVtTWF0aC5HUkFWSVRBVElPTkFMUEFSQU1FVEVSID0gMzk4NjAwNDQxOGU1OwogICAgICBDZXNpdW1NYXRoLlNPTEFSX1JBRElVUyA9IDY5NTVlNTsKICAgICAgQ2VzaXVtTWF0aC5MVU5BUl9SQURJVVMgPSAxNzM3NDAwOwogICAgICBDZXNpdW1NYXRoLlNJWFRZX0ZPVVJfS0lMT0JZVEVTID0gNjQgKiAxMDI0OwogICAgICBDZXNpdW1NYXRoLkZPVVJfR0lHQUJZVEVTID0gNCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKICAgICAgQ2VzaXVtTWF0aC5zaWduID0gTWF0aC5zaWduID8/IGZ1bmN0aW9uIHNpZ24odmFsdWUpIHsKICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsKICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgdmFsdWUgIT09IHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZSA+IDAgPyAxIDogLTE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguc2lnbk5vdFplcm8gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAtMSA6IDE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgudG9TTm9ybSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1heGltdW0pIHsKICAgICAgICByYW5nZU1heGltdW0gPSByYW5nZU1heGltdW0gPz8gMjU1OwogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKAogICAgICAgICAgKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSAqIDAuNSArIDAuNSkgKiByYW5nZU1heGltdW0KICAgICAgICApOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZyb21TTm9ybSA9IGZ1bmN0aW9uKHZhbHVlLCByYW5nZU1heGltdW0pIHsKICAgICAgICByYW5nZU1heGltdW0gPSByYW5nZU1heGltdW0gPz8gMjU1OwogICAgICAgIHJldHVybiBDZXNpdW1NYXRoLmNsYW1wKHZhbHVlLCAwLCByYW5nZU1heGltdW0pIC8gcmFuZ2VNYXhpbXVtICogMiAtIDE7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubm9ybWFsaXplID0gZnVuY3Rpb24odmFsdWUsIHJhbmdlTWluaW11bSwgcmFuZ2VNYXhpbXVtKSB7CiAgICAgICAgcmFuZ2VNYXhpbXVtID0gTWF0aC5tYXgocmFuZ2VNYXhpbXVtIC0gcmFuZ2VNaW5pbXVtLCAwKTsKICAgICAgICByZXR1cm4gcmFuZ2VNYXhpbXVtID09PSAwID8gMCA6IENlc2l1bU1hdGguY2xhbXAoKHZhbHVlIC0gcmFuZ2VNaW5pbXVtKSAvIHJhbmdlTWF4aW11bSwgMCwgMSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguc2luaCA9IE1hdGguc2luaCA/PyBmdW5jdGlvbiBzaW5oKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh2YWx1ZSkgLSBNYXRoLmV4cCgtdmFsdWUpKSAvIDI7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY29zaCA9IE1hdGguY29zaCA/PyBmdW5jdGlvbiBjb3NoKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIChNYXRoLmV4cCh2YWx1ZSkgKyBNYXRoLmV4cCgtdmFsdWUpKSAvIDI7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubGVycCA9IGZ1bmN0aW9uKHAsIHEsIHRpbWUpIHsKICAgICAgICByZXR1cm4gKDEgLSB0aW1lKSAqIHAgKyB0aW1lICogcTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5QSSA9IE1hdGguUEk7CiAgICAgIENlc2l1bU1hdGguT05FX09WRVJfUEkgPSAxIC8gTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1RXTyA9IE1hdGguUEkgLyAyOwogICAgICBDZXNpdW1NYXRoLlBJX09WRVJfVEhSRUUgPSBNYXRoLlBJIC8gMzsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX0ZPVVIgPSBNYXRoLlBJIC8gNDsKICAgICAgQ2VzaXVtTWF0aC5QSV9PVkVSX1NJWCA9IE1hdGguUEkgLyA2OwogICAgICBDZXNpdW1NYXRoLlRIUkVFX1BJX09WRVJfVFdPID0gMyAqIE1hdGguUEkgLyAyOwogICAgICBDZXNpdW1NYXRoLlRXT19QSSA9IDIgKiBNYXRoLlBJOwogICAgICBDZXNpdW1NYXRoLk9ORV9PVkVSX1RXT19QSSA9IDEgLyAoMiAqIE1hdGguUEkpOwogICAgICBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRSA9IE1hdGguUEkgLyAxODA7CiAgICAgIENlc2l1bU1hdGguREVHUkVFU19QRVJfUkFESUFOID0gMTgwIC8gTWF0aC5QSTsKICAgICAgQ2VzaXVtTWF0aC5SQURJQU5TX1BFUl9BUkNTRUNPTkQgPSBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRSAvIDM2MDA7CiAgICAgIENlc2l1bU1hdGgudG9SYWRpYW5zID0gZnVuY3Rpb24oZGVncmVlcykgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGRlZ3JlZXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZGVncmVlcyBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlZ3JlZXMgKiBDZXNpdW1NYXRoLlJBRElBTlNfUEVSX0RFR1JFRTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC50b0RlZ3JlZXMgPSBmdW5jdGlvbihyYWRpYW5zKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmFkaWFucykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYWRpYW5zIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFkaWFucyAqIENlc2l1bU1hdGguREVHUkVFU19QRVJfUkFESUFOOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNvbnZlcnRMb25naXR1ZGVSYW5nZSA9IGZ1bmN0aW9uKGFuZ2xlKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHR3b1BpID0gQ2VzaXVtTWF0aC5UV09fUEk7CiAgICAgICAgY29uc3Qgc2ltcGxpZmllZCA9IGFuZ2xlIC0gTWF0aC5mbG9vcihhbmdsZSAvIHR3b1BpKSAqIHR3b1BpOwogICAgICAgIGlmIChzaW1wbGlmaWVkIDwgLU1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBzaW1wbGlmaWVkICsgdHdvUGk7CiAgICAgICAgfQogICAgICAgIGlmIChzaW1wbGlmaWVkID49IE1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBzaW1wbGlmaWVkIC0gdHdvUGk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzaW1wbGlmaWVkOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmNsYW1wVG9MYXRpdHVkZVJhbmdlID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGguY2xhbXAoCiAgICAgICAgICBhbmdsZSwKICAgICAgICAgIC0xICogQ2VzaXVtTWF0aC5QSV9PVkVSX1RXTywKICAgICAgICAgIENlc2l1bU1hdGguUElfT1ZFUl9UV08KICAgICAgICApOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5lZ2F0aXZlUGlUb1BpID0gZnVuY3Rpb24oYW5nbGUpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhbmdsZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhbmdsZSBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGFuZ2xlID49IC1DZXNpdW1NYXRoLlBJICYmIGFuZ2xlIDw9IENlc2l1bU1hdGguUEkpIHsKICAgICAgICAgIHJldHVybiBhbmdsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGguemVyb1RvVHdvUGkoYW5nbGUgKyBDZXNpdW1NYXRoLlBJKSAtIENlc2l1bU1hdGguUEk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguemVyb1RvVHdvUGkgPSBmdW5jdGlvbihhbmdsZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFuZ2xlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFuZ2xlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoYW5nbGUgPj0gMCAmJiBhbmdsZSA8PSBDZXNpdW1NYXRoLlRXT19QSSkgewogICAgICAgICAgcmV0dXJuIGFuZ2xlOwogICAgICAgIH0KICAgICAgICBjb25zdCBtb2QgPSBDZXNpdW1NYXRoLm1vZChhbmdsZSwgQ2VzaXVtTWF0aC5UV09fUEkpOwogICAgICAgIGlmIChNYXRoLmFicyhtb2QpIDwgQ2VzaXVtTWF0aC5FUFNJTE9OMTQgJiYgTWF0aC5hYnMoYW5nbGUpID4gQ2VzaXVtTWF0aC5FUFNJTE9OMTQpIHsKICAgICAgICAgIHJldHVybiBDZXNpdW1NYXRoLlRXT19QSTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vZDsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5tb2QgPSBmdW5jdGlvbihtLCBuKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobSkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJtIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChuKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm4gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmIChuID09PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZGl2aXNvciBjYW5ub3QgYmUgMC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKENlc2l1bU1hdGguc2lnbihtKSA9PT0gQ2VzaXVtTWF0aC5zaWduKG4pICYmIE1hdGguYWJzKG0pIDwgTWF0aC5hYnMobikpIHsKICAgICAgICAgIHJldHVybiBtOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKG0gJSBuICsgbikgJSBuOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmVxdWFsc0Vwc2lsb24gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVsYXRpdmVFcHNpbG9uLCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImxlZnQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInJpZ2h0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZWxhdGl2ZUVwc2lsb24gPSByZWxhdGl2ZUVwc2lsb24gPz8gMDsKICAgICAgICBhYnNvbHV0ZUVwc2lsb24gPSBhYnNvbHV0ZUVwc2lsb24gPz8gcmVsYXRpdmVFcHNpbG9uOwogICAgICAgIGNvbnN0IGFic0RpZmYgPSBNYXRoLmFicyhsZWZ0IC0gcmlnaHQpOwogICAgICAgIHJldHVybiBhYnNEaWZmIDw9IGFic29sdXRlRXBzaWxvbiB8fCBhYnNEaWZmIDw9IHJlbGF0aXZlRXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGxlZnQpLCBNYXRoLmFicyhyaWdodCkpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxlc3NUaGFuID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIGFic29sdXRlRXBzaWxvbikgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGxlZnQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiZmlyc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJpZ2h0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlY29uZCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYWJzb2x1dGVFcHNpbG9uKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodCA8IC1hYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubGVzc1RoYW5PckVxdWFscyA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBhYnNvbHV0ZUVwc2lsb24pIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChsZWZ0KSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImZpcnN0IGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyaWdodCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KGFic29sdXRlRXBzaWxvbikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQgPCBhYnNvbHV0ZUVwc2lsb247CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguZ3JlYXRlclRoYW4gPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gYWJzb2x1dGVFcHNpbG9uOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmdyZWF0ZXJUaGFuT3JFcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgYWJzb2x1dGVFcHNpbG9uKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobGVmdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJmaXJzdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmlnaHQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgic2Vjb25kIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChhYnNvbHV0ZUVwc2lsb24pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0ID4gLWFic29sdXRlRXBzaWxvbjsKICAgICAgfTsKICAgICAgZmFjdG9yaWFscyA9IFsxXTsKICAgICAgQ2VzaXVtTWF0aC5mYWN0b3JpYWwgPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoCiAgICAgICAgICAgICJBIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCBpcyByZXF1aXJlZC4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBmYWN0b3JpYWxzLmxlbmd0aDsKICAgICAgICBpZiAobiA+PSBsZW5ndGgpIHsKICAgICAgICAgIGxldCBzdW0gPSBmYWN0b3JpYWxzW2xlbmd0aCAtIDFdOwogICAgICAgICAgZm9yIChsZXQgaSA9IGxlbmd0aDsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgbmV4dCA9IHN1bSAqIGk7CiAgICAgICAgICAgIGZhY3RvcmlhbHMucHVzaChuZXh0KTsKICAgICAgICAgICAgc3VtID0gbmV4dDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhY3RvcmlhbHNbbl07CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguaW5jcmVtZW50V3JhcCA9IGZ1bmN0aW9uKG4sIG1heGltdW1WYWx1ZSwgbWluaW11bVZhbHVlKSB7CiAgICAgICAgbWluaW11bVZhbHVlID0gbWluaW11bVZhbHVlID8/IDA7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQobikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJuIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAobWF4aW11bVZhbHVlIDw9IG1pbmltdW1WYWx1ZSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIm1heGltdW1WYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBtaW5pbXVtVmFsdWUuIik7CiAgICAgICAgfQogICAgICAgICsrbjsKICAgICAgICBpZiAobiA+IG1heGltdW1WYWx1ZSkgewogICAgICAgICAgbiA9IG1pbmltdW1WYWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguaXNQb3dlck9mVHdvID0gZnVuY3Rpb24obikgewogICAgICAgIGlmICh0eXBlb2YgbiAhPT0gIm51bWJlciIgfHwgbiA8IDAgfHwgbiA+IDQyOTQ5NjcyOTUpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbiAhPT0gMCAmJiAobiAmIG4gLSAxKSA9PT0gMDsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5uZXh0UG93ZXJPZlR3byA9IGZ1bmN0aW9uKG4pIHsKICAgICAgICBpZiAodHlwZW9mIG4gIT09ICJudW1iZXIiIHx8IG4gPCAwIHx8IG4gPiAyMTQ3NDgzNjQ4KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyXjMxIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICAtLW47CiAgICAgICAgbiB8PSBuID4+IDE7CiAgICAgICAgbiB8PSBuID4+IDI7CiAgICAgICAgbiB8PSBuID4+IDQ7CiAgICAgICAgbiB8PSBuID4+IDg7CiAgICAgICAgbiB8PSBuID4+IDE2OwogICAgICAgICsrbjsKICAgICAgICByZXR1cm4gbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5wcmV2aW91c1Bvd2VyT2ZUd28gPSBmdW5jdGlvbihuKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuICE9PSAibnVtYmVyIiB8fCBuIDwgMCB8fCBuID4gNDI5NDk2NzI5NSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIG4gfD0gbiA+PiAxOwogICAgICAgIG4gfD0gbiA+PiAyOwogICAgICAgIG4gfD0gbiA+PiA0OwogICAgICAgIG4gfD0gbiA+PiA4OwogICAgICAgIG4gfD0gbiA+PiAxNjsKICAgICAgICBuIHw9IG4gPj4gMzI7CiAgICAgICAgbiA9IChuID4+PiAwKSAtIChuID4+PiAxKTsKICAgICAgICByZXR1cm4gbjsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4zLCBtYXgzKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5udW1iZXIoIm1pbiIsIG1pbjMpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigibWF4IiwgbWF4Myk7CiAgICAgICAgcmV0dXJuIHZhbHVlIDwgbWluMyA/IG1pbjMgOiB2YWx1ZSA+IG1heDMgPyBtYXgzIDogdmFsdWU7CiAgICAgIH07CiAgICAgIHJhbmRvbU51bWJlckdlbmVyYXRvciA9IG5ldyBpbXBvcnRfbWVyc2VubmVfdHdpc3Rlci5kZWZhdWx0KCk7CiAgICAgIENlc2l1bU1hdGguc2V0UmFuZG9tTnVtYmVyU2VlZCA9IGZ1bmN0aW9uKHNlZWQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChzZWVkKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInNlZWQgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJhbmRvbU51bWJlckdlbmVyYXRvciA9IG5ldyBpbXBvcnRfbWVyc2VubmVfdHdpc3Rlci5kZWZhdWx0KHNlZWQpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLm5leHRSYW5kb21OdW1iZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcmFuZG9tTnVtYmVyR2VuZXJhdG9yLnJhbmRvbSgpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLnJhbmRvbUJldHdlZW4gPSBmdW5jdGlvbihtaW4zLCBtYXgzKSB7CiAgICAgICAgcmV0dXJuIENlc2l1bU1hdGgubmV4dFJhbmRvbU51bWJlcigpICogKG1heDMgLSBtaW4zKSArIG1pbjM7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguYWNvc0NsYW1wZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInZhbHVlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5hY29zKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguYXNpbkNsYW1wZWQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHZhbHVlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoInZhbHVlIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTWF0aC5hc2luKENlc2l1bU1hdGguY2xhbXAodmFsdWUsIC0xLCAxKSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2hvcmRMZW5ndGggPSBmdW5jdGlvbihhbmdsZSwgcmFkaXVzKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoYW5nbGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYW5nbGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIGlmICghZGVmaW5lZF9kZWZhdWx0KHJhZGl1cykpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJyYWRpdXMgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAyICogcmFkaXVzICogTWF0aC5zaW4oYW5nbGUgKiAwLjUpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmxvZ0Jhc2UgPSBmdW5jdGlvbihudW1iZXIsIGJhc2UpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChudW1iZXIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgibnVtYmVyIGlzIHJlcXVpcmVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChiYXNlKSkgewogICAgICAgICAgdGhyb3cgbmV3IERldmVsb3BlckVycm9yX2RlZmF1bHQoImJhc2UgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoLmxvZyhudW1iZXIpIC8gTWF0aC5sb2coYmFzZSk7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGguY2JydCA9IE1hdGguY2JydCA/PyBmdW5jdGlvbiBjYnJ0KG51bWJlcikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IE1hdGgucG93KE1hdGguYWJzKG51bWJlciksIDEgLyAzKTsKICAgICAgICByZXR1cm4gbnVtYmVyIDwgMCA/IC1yZXN1bHQgOiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENlc2l1bU1hdGgubG9nMiA9IE1hdGgubG9nMiA/PyBmdW5jdGlvbiBsb2cyKG51bWJlcikgewogICAgICAgIHJldHVybiBNYXRoLmxvZyhudW1iZXIpICogTWF0aC5MT0cyRTsKICAgICAgfTsKICAgICAgQ2VzaXVtTWF0aC5mb2cgPSBmdW5jdGlvbihkaXN0YW5jZVRvQ2FtZXJhLCBkZW5zaXR5KSB7CiAgICAgICAgY29uc3Qgc2NhbGFyID0gZGlzdGFuY2VUb0NhbWVyYSAqIGRlbnNpdHk7CiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLmV4cCgtKHNjYWxhciAqIHNjYWxhcikpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJ4IiwgeCk7CiAgICAgICAgcmV0dXJuIHggKiAoLTAuMTc4NCAqIE1hdGguYWJzKHgpIC0gMC4wNjYzICogeCAqIHggKyAxLjAzMDEpOwogICAgICB9OwogICAgICBDZXNpdW1NYXRoLmZhc3RBcHByb3hpbWF0ZUF0YW4yID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieCIsIHgpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlcigieSIsIHkpOwogICAgICAgIGxldCBvcHBvc2l0ZTsKICAgICAgICBsZXQgdCA9IE1hdGguYWJzKHgpOwogICAgICAgIG9wcG9zaXRlID0gTWF0aC5hYnMoeSk7CiAgICAgICAgY29uc3QgYWRqYWNlbnQgPSBNYXRoLm1heCh0LCBvcHBvc2l0ZSk7CiAgICAgICAgb3Bwb3NpdGUgPSBNYXRoLm1pbih0LCBvcHBvc2l0ZSk7CiAgICAgICAgY29uc3Qgb3Bwb3NpdGVPdmVyQWRqYWNlbnQgPSBvcHBvc2l0ZSAvIGFkamFjZW50OwogICAgICAgIGlmIChpc05hTihvcHBvc2l0ZU92ZXJBZGphY2VudCkpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJlaXRoZXIgeCBvciB5IG11c3QgYmUgbm9uemVybyIpOwogICAgICAgIH0KICAgICAgICB0ID0gQ2VzaXVtTWF0aC5mYXN0QXBwcm94aW1hdGVBdGFuKG9wcG9zaXRlT3ZlckFkamFjZW50KTsKICAgICAgICB0ID0gTWF0aC5hYnMoeSkgPiBNYXRoLmFicyh4KSA/IENlc2l1bU1hdGguUElfT1ZFUl9UV08gLSB0IDogdDsKICAgICAgICB0ID0geCA8IDAgPyBDZXNpdW1NYXRoLlBJIC0gdCA6IHQ7CiAgICAgICAgdCA9IHkgPCAwID8gLXQgOiB0OwogICAgICAgIHJldHVybiB0OwogICAgICB9OwogICAgICBNYXRoX2RlZmF1bHQgPSBDZXNpdW1NYXRoOwogICAgfQogIH0pOwoKICAvLyBwYWNrYWdlcy9lbmdpbmUvU291cmNlL0NvcmUvQ2FydGVzaWFuMy5qcwogIGZ1bmN0aW9uIENhcnRlc2lhbjMoeCwgeSwgeikgewogICAgdGhpcy54ID0geCA/PyAwOwogICAgdGhpcy55ID0geSA/PyAwOwogICAgdGhpcy56ID0geiA/PyAwOwogIH0KICB2YXIgZGlzdGFuY2VTY3JhdGNoLCBsZXJwU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaCwgYW5nbGVCZXR3ZWVuU2NyYXRjaDIsIG1vc3RPcnRob2dvbmFsQXhpc1NjcmF0Y2gsIHNjcmF0Y2hOLCBzY3JhdGNoSywgQ2FydGVzaWFuM19kZWZhdWx0OwogIHZhciBpbml0X0NhcnRlc2lhbjMgPSBfX2VzbSh7CiAgICAicGFja2FnZXMvZW5naW5lL1NvdXJjZS9Db3JlL0NhcnRlc2lhbjMuanMiKCkgewogICAgICBpbml0X0NoZWNrKCk7CiAgICAgIGluaXRfZGVmaW5lZCgpOwogICAgICBpbml0X0RldmVsb3BlckVycm9yKCk7CiAgICAgIGluaXRfTWF0aCgpOwogICAgICBDYXJ0ZXNpYW4zLmZyb21TcGhlcmljYWwgPSBmdW5jdGlvbihzcGhlcmljYWwsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic3BoZXJpY2FsIiwgc3BoZXJpY2FsKTsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuMygpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjbG9jayA9IHNwaGVyaWNhbC5jbG9jazsKICAgICAgICBjb25zdCBjb25lID0gc3BoZXJpY2FsLmNvbmU7CiAgICAgICAgY29uc3QgbWFnbml0dWRlID0gc3BoZXJpY2FsLm1hZ25pdHVkZSA/PyAxOwogICAgICAgIGNvbnN0IHJhZGlhbCA9IG1hZ25pdHVkZSAqIE1hdGguc2luKGNvbmUpOwogICAgICAgIHJlc3VsdC54ID0gcmFkaWFsICogTWF0aC5jb3MoY2xvY2spOwogICAgICAgIHJlc3VsdC55ID0gcmFkaWFsICogTWF0aC5zaW4oY2xvY2spOwogICAgICAgIHJlc3VsdC56ID0gbWFnbml0dWRlICogTWF0aC5jb3MoY29uZSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5mcm9tRWxlbWVudHMgPSBmdW5jdGlvbih4LCB5LCB6LCByZXN1bHQpIHsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjMoeCwgeSwgeik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0geDsKICAgICAgICByZXN1bHQueSA9IHk7CiAgICAgICAgcmVzdWx0LnogPSB6OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuY2xvbmUgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQoY2FydGVzaWFuMTEpKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXR1cm4gbmV3IENhcnRlc2lhbjMoY2FydGVzaWFuMTEueCwgY2FydGVzaWFuMTEueSwgY2FydGVzaWFuMTEueik7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC54ID0gY2FydGVzaWFuMTEueDsKICAgICAgICByZXN1bHQueSA9IGNhcnRlc2lhbjExLnk7CiAgICAgICAgcmVzdWx0LnogPSBjYXJ0ZXNpYW4xMS56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZnJvbUNhcnRlc2lhbjQgPSBDYXJ0ZXNpYW4zLmNsb25lOwogICAgICBDYXJ0ZXNpYW4zLnBhY2tlZExlbmd0aCA9IDM7CiAgICAgIENhcnRlc2lhbjMucGFjayA9IGZ1bmN0aW9uKHZhbHVlLCBhcnJheSwgc3RhcnRpbmdJbmRleCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBzdGFydGluZ0luZGV4ID0gc3RhcnRpbmdJbmRleCA/PyAwOwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS54OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXgrK10gPSB2YWx1ZS55OwogICAgICAgIGFycmF5W3N0YXJ0aW5nSW5kZXhdID0gdmFsdWUuejsKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMudW5wYWNrID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0aW5nSW5kZXgsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQuZGVmaW5lZCgiYXJyYXkiLCBhcnJheSk7CiAgICAgICAgc3RhcnRpbmdJbmRleCA9IHN0YXJ0aW5nSW5kZXggPz8gMDsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FydGVzaWFuMygpOwogICAgICAgIH0KICAgICAgICByZXN1bHQueCA9IGFycmF5W3N0YXJ0aW5nSW5kZXgrK107CiAgICAgICAgcmVzdWx0LnkgPSBhcnJheVtzdGFydGluZ0luZGV4KytdOwogICAgICAgIHJlc3VsdC56ID0gYXJyYXlbc3RhcnRpbmdJbmRleF07CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5wYWNrQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC5kZWZpbmVkKCJhcnJheSIsIGFycmF5KTsKICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgY29uc3QgcmVzdWx0TGVuZ3RoID0gbGVuZ3RoICogMzsKICAgICAgICBpZiAoIWRlZmluZWRfZGVmYXVsdChyZXN1bHQpKSB7CiAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkocmVzdWx0TGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCAhPT0gcmVzdWx0TGVuZ3RoKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgKICAgICAgICAgICAgIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiAzIGVsZW1lbnRzIgogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggIT09IHJlc3VsdExlbmd0aCkgewogICAgICAgICAgcmVzdWx0Lmxlbmd0aCA9IHJlc3VsdExlbmd0aDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgQ2FydGVzaWFuMy5wYWNrKGFycmF5W2ldLCByZXN1bHQsIGkgKiAzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy51bnBhY2tBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LmRlZmluZWQoImFycmF5IiwgYXJyYXkpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLCBhcnJheS5sZW5ndGgsIDMpOwogICAgICAgIGlmIChhcnJheS5sZW5ndGggJSAzICE9PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRGV2ZWxvcGVyRXJyb3JfZGVmYXVsdCgiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzLiIpOwogICAgICAgIH0KICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgaWYgKCFkZWZpbmVkX2RlZmF1bHQocmVzdWx0KSkgewogICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCAvIDMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHQubGVuZ3RoID0gbGVuZ3RoIC8gMzsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMykgewogICAgICAgICAgY29uc3QgaW5kZXggPSBpIC8gMzsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBDYXJ0ZXNpYW4zLnVucGFjayhhcnJheSwgaSwgcmVzdWx0W2luZGV4XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuZnJvbUFycmF5ID0gQ2FydGVzaWFuMy51bnBhY2s7CiAgICAgIENhcnRlc2lhbjMubWF4aW11bUNvbXBvbmVudCA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNhcnRlc2lhbjExLngsIGNhcnRlc2lhbjExLnksIGNhcnRlc2lhbjExLnopOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLm1pbmltdW1Db21wb25lbnQgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIiwgY2FydGVzaWFuMTEpOwogICAgICAgIHJldHVybiBNYXRoLm1pbihjYXJ0ZXNpYW4xMS54LCBjYXJ0ZXNpYW4xMS55LCBjYXJ0ZXNpYW4xMS56KTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5taW5pbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1pbihmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1pbihmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmVzdWx0LnogPSBNYXRoLm1pbihmaXJzdC56LCBzZWNvbmQueik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tYXhpbXVtQnlDb21wb25lbnQgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImZpcnN0IiwgZmlyc3QpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgic2Vjb25kIiwgc2Vjb25kKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBNYXRoLm1heChmaXJzdC54LCBzZWNvbmQueCk7CiAgICAgICAgcmVzdWx0LnkgPSBNYXRoLm1heChmaXJzdC55LCBzZWNvbmQueSk7CiAgICAgICAgcmVzdWx0LnogPSBNYXRoLm1heChmaXJzdC56LCBzZWNvbmQueik7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5jbGFtcCA9IGZ1bmN0aW9uKHZhbHVlLCBtaW4zLCBtYXgzLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibWluIiwgbWluMyk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJtYXgiLCBtYXgzKTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgY29uc3QgeCA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS54LCBtaW4zLngsIG1heDMueCk7CiAgICAgICAgY29uc3QgeSA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS55LCBtaW4zLnksIG1heDMueSk7CiAgICAgICAgY29uc3QgeiA9IE1hdGhfZGVmYXVsdC5jbGFtcCh2YWx1ZS56LCBtaW4zLnosIG1heDMueik7CiAgICAgICAgcmVzdWx0LnggPSB4OwogICAgICAgIHJlc3VsdC55ID0geTsKICAgICAgICByZXN1bHQueiA9IHo7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tYWduaXR1ZGVTcXVhcmVkID0gZnVuY3Rpb24oY2FydGVzaWFuMTEpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsIGNhcnRlc2lhbjExKTsKICAgICAgICByZXR1cm4gY2FydGVzaWFuMTEueCAqIGNhcnRlc2lhbjExLnggKyBjYXJ0ZXNpYW4xMS55ICogY2FydGVzaWFuMTEueSArIGNhcnRlc2lhbjExLnogKiBjYXJ0ZXNpYW4xMS56OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLm1hZ25pdHVkZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExKSB7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydChDYXJ0ZXNpYW4zLm1hZ25pdHVkZVNxdWFyZWQoY2FydGVzaWFuMTEpKTsKICAgICAgfTsKICAgICAgZGlzdGFuY2VTY3JhdGNoID0gbmV3IENhcnRlc2lhbjMoKTsKICAgICAgQ2FydGVzaWFuMy5kaXN0YW5jZSA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDYXJ0ZXNpYW4zLnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLm1hZ25pdHVkZShkaXN0YW5jZVNjcmF0Y2gpOwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmRpc3RhbmNlU3F1YXJlZCA9IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDYXJ0ZXNpYW4zLnN1YnRyYWN0KGxlZnQsIHJpZ2h0LCBkaXN0YW5jZVNjcmF0Y2gpOwogICAgICAgIHJldHVybiBDYXJ0ZXNpYW4zLm1hZ25pdHVkZVNxdWFyZWQoZGlzdGFuY2VTY3JhdGNoKTsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5ub3JtYWxpemUgPSBmdW5jdGlvbihjYXJ0ZXNpYW4xMSwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIGNvbnN0IG1hZ25pdHVkZSA9IENhcnRlc2lhbjMubWFnbml0dWRlKGNhcnRlc2lhbjExKTsKICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLnggLyBtYWduaXR1ZGU7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55IC8gbWFnbml0dWRlOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAvIG1hZ25pdHVkZTsKICAgICAgICBpZiAoaXNOYU4ocmVzdWx0LngpIHx8IGlzTmFOKHJlc3VsdC55KSB8fCBpc05hTihyZXN1bHQueikpIHsKICAgICAgICAgIHRocm93IG5ldyBEZXZlbG9wZXJFcnJvcl9kZWZhdWx0KCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5kb3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgcmV0dXJuIGxlZnQueCAqIHJpZ2h0LnggKyBsZWZ0LnkgKiByaWdodC55ICsgbGVmdC56ICogcmlnaHQuejsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tdWx0aXBseUNvbXBvbmVudHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBsZWZ0LnggKiByaWdodC54OwogICAgICAgIHJlc3VsdC55ID0gbGVmdC55ICogcmlnaHQueTsKICAgICAgICByZXN1bHQueiA9IGxlZnQueiAqIHJpZ2h0Lno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5kaXZpZGVDb21wb25lbnRzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54IC8gcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSAvIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogLyByaWdodC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuYWRkID0gZnVuY3Rpb24obGVmdCwgcmlnaHQsIHJlc3VsdCkgewogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgibGVmdCIsIGxlZnQpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmlnaHQiLCByaWdodCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC54ID0gbGVmdC54ICsgcmlnaHQueDsKICAgICAgICByZXN1bHQueSA9IGxlZnQueSArIHJpZ2h0Lnk7CiAgICAgICAgcmVzdWx0LnogPSBsZWZ0LnogKyByaWdodC56OwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICAgIENhcnRlc2lhbjMuc3VidHJhY3QgPSBmdW5jdGlvbihsZWZ0LCByaWdodCwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJsZWZ0IiwgbGVmdCk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJyaWdodCIsIHJpZ2h0KTsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgcmVzdWx0LnggPSBsZWZ0LnggLSByaWdodC54OwogICAgICAgIHJlc3VsdC55ID0gbGVmdC55IC0gcmlnaHQueTsKICAgICAgICByZXN1bHQueiA9IGxlZnQueiAtIHJpZ2h0Lno7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgQ2FydGVzaWFuMy5tdWx0aXBseUJ5U2NhbGFyID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLnggKiBzY2FsYXI7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55ICogc2NhbGFyOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAqIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLmRpdmlkZUJ5U2NhbGFyID0gZnVuY3Rpb24oY2FydGVzaWFuMTEsIHNjYWxhciwgcmVzdWx0KSB7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLCBjYXJ0ZXNpYW4xMSk7CiAgICAgICAgQ2hlY2tfZGVmYXVsdC50eXBlT2YubnVtYmVyKCJzY2FsYXIiLCBzY2FsYXIpOwogICAgICAgIENoZWNrX2RlZmF1bHQudHlwZU9mLm9iamVjdCgicmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICByZXN1bHQueCA9IGNhcnRlc2lhbjExLnggLyBzY2FsYXI7CiAgICAgICAgcmVzdWx0LnkgPSBjYXJ0ZXNpYW4xMS55IC8gc2NhbGFyOwogICAgICAgIHJlc3VsdC56ID0gY2FydGVzaWFuMTEueiAvIHNjYWxhcjsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBDYXJ0ZXNpYW4zLm5lZ2F0ZSA9IGZ1bmN0aW9uKGNhcnRlc2lhbjExLCByZXN1bHQpIHsKICAgICAgICBDaGVja19kZWZhdWx0LnR5cGVPZi5vYmplY3QoImNhcn