You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1 line
562 KiB

{"remainingRequest":"D:\\code\\vue\\front\\node_modules\\babel-loader\\lib\\index.js!D:\\code\\vue\\front\\src\\common\\cryptojs.js","dependencies":[{"path":"D:\\code\\vue\\front\\src\\common\\cryptojs.js","mtime":1709633799000},{"path":"D:\\code\\vue\\front\\babel.config.js","mtime":1709633798000},{"path":"D:\\code\\vue\\front\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\code\\vue\\front\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:cmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuZGV0YWNoZWQuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci50cmFuc2Zlci5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLnRyYW5zZmVyLXRvLWZpeGVkLWxlbmd0aC5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuYXQuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQtbGFzdC5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXJldmVyc2VkLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmRyb3AuanMiKTsKOwooZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICJvYmplY3QiKSB7CiAgICAvLyBDb21tb25KUwogICAgbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeSgpOwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7CiAgICAvLyBBTUQKICAgIGRlZmluZShbXSwgZmFjdG9yeSk7CiAgfSBlbHNlIHsKICAgIC8vIEdsb2JhbCAoYnJvd3NlcikKICAgIHJvb3QuQ3J5cHRvSlMgPSBmYWN0b3J5KCk7CiAgfQp9KSh0aGlzLCBmdW5jdGlvbiAoKSB7CiAgLyoqDQogICAqIENyeXB0b0pTIGNvcmUgY29tcG9uZW50cy4NCiAgICovCiAgdmFyIENyeXB0b0pTID0gQ3J5cHRvSlMgfHwgZnVuY3Rpb24gKE1hdGgsIHVuZGVmaW5lZCkgewogICAgLyoNCiAgICAgKiBMb2NhbCBwb2x5ZmlsIG9mIE9iamVjdC5jcmVhdGUNCiAgICAgKi8KICAgIHZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gRigpIHt9CiAgICAgIDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHsKICAgICAgICB2YXIgc3VidHlwZTsKICAgICAgICBGLnByb3RvdHlwZSA9IG9iajsKICAgICAgICBzdWJ0eXBlID0gbmV3IEYoKTsKICAgICAgICBGLnByb3RvdHlwZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIHN1YnR5cGU7CiAgICAgIH07CiAgICB9KCk7CgogICAgLyoqDQogICAgICogQ3J5cHRvSlMgbmFtZXNwYWNlLg0KICAgICAqLwogICAgdmFyIEMgPSB7fTsKCiAgICAvKioNCiAgICAgKiBMaWJyYXJ5IG5hbWVzcGFjZS4NCiAgICAgKi8KICAgIHZhciBDX2xpYiA9IEMubGliID0ge307CgogICAgLyoqDQogICAgICogQmFzZSBvYmplY3QgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuDQogICAgICovCiAgICB2YXIgQmFzZSA9IENfbGliLkJhc2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgLyoqDQogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGlzIG9iamVjdC4NCiAgICAgICAgICoNCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG92ZXJyaWRlcyBQcm9wZXJ0aWVzIHRvIGNvcHkgaW50byB0aGUgbmV3IG9iamVjdC4NCiAgICAgICAgICoNCiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IG9iamVjdC4NCiAgICAgICAgICoNCiAgICAgICAgICogQHN0YXRpYw0KICAgICAgICAgKg0KICAgICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICAgKg0KICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7DQogICAgICAgICAqICAgICAgICAgZmllbGQ6ICd2YWx1ZScsDQogICAgICAgICAqDQogICAgICAgICAqICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAqICAgICAgICAgfQ0KICAgICAgICAgKiAgICAgfSk7DQogICAgICAgICAqLwogICAgICAgIGV4dGVuZDogZnVuY3Rpb24gKG92ZXJyaWRlcykgewogICAgICAgICAgLy8gU3Bhd24KICAgICAgICAgIHZhciBzdWJ0eXBlID0gY3JlYXRlKHRoaXMpOwoKICAgICAgICAgIC8vIEF1Z21lbnQKICAgICAgICAgIGlmIChvdmVycmlkZXMpIHsKICAgICAgICAgICAgc3VidHlwZS5taXhJbihvdmVycmlkZXMpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIENyZWF0ZSBkZWZhdWx0IGluaXRpYWxpemVyCiAgICAgICAgICBpZiAoIXN1YnR5cGUuaGFzT3duUHJvcGVydHkoJ2luaXQnKSB8fCB0aGlzLmluaXQgPT09IHN1YnR5cGUuaW5pdCkgewogICAgICAgICAgICBzdWJ0eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9OwogICAgICAgICAgfQoKICAgICAgICAgIC8vIEluaXRpYWxpemVyJ3MgcHJvdG90eXBlIGlzIHRoZSBzdWJ0eXBlIG9iamVjdAogICAgICAgICAgc3VidHlwZS5pbml0LnByb3RvdHlwZSA9IHN1YnR5cGU7CgogICAgICAgICAgLy8gUmVmZXJlbmNlIHN1cGVydHlwZQogICAgICAgICAgc3VidHlwZS4kc3VwZXIgPSB0aGlzOwogICAgICAgICAgcmV0dXJuIHN1YnR5cGU7CiAgICAgICAgfSwKICAgICAgICAvKioNCiAgICAgICAgICogRXh0ZW5kcyB0aGlzIG9iamVjdCBhbmQgcnVucyB0aGUgaW5pdCBtZXRob2QuDQogICAgICAgICAqIEFyZ3VtZW50cyB0byBjcmVhdGUoKSB3aWxsIGJlIHBhc3NlZCB0byBpbml0KCkuDQogICAgICAgICAqDQogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuDQogICAgICAgICAqDQogICAgICAgICAqIEBzdGF0aWMNCiAgICAgICAgICoNCiAgICAgICAgICogQGV4YW1wbGUNCiAgICAgICAgICoNCiAgICAgICAgICogICAgIHZhciBpbnN0YW5jZSA9IE15VHlwZS5jcmVhdGUoKTsNCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmV4dGVuZCgpOwogICAgICAgICAgaW5zdGFuY2UuaW5pdC5hcHBseShpbnN0YW5jZSwgYXJndW1lbnRzKTsKICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9LAogICAgICAgIC8qKg0KICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0Lg0KICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhZGQgc29tZSBsb2dpYyB3aGVuIHlvdXIgb2JqZWN0cyBhcmUgY3JlYXRlZC4NCiAgICAgICAgICoNCiAgICAgICAgICogQGV4YW1wbGUNCiAgICAgICAgICoNCiAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoew0KICAgICAgICAgKiAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICogICAgICAgICAgICAgLy8gLi4uDQogICAgICAgICAqICAgICAgICAgfQ0KICAgICAgICAgKiAgICAgfSk7DQogICAgICAgICAqLwogICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHt9LAogICAgICAgIC8qKg0KICAgICAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBpbnRvIHRoaXMgb2JqZWN0Lg0KICAgICAgICAgKg0KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byBtaXggaW4uDQogICAgICAgICAqDQogICAgICAgICAqIEBleGFtcGxlDQogICAgICAgICAqDQogICAgICAgICAqICAgICBNeVR5cGUubWl4SW4oew0KICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnDQogICAgICAgICAqICAgICB9KTsNCiAgICAgICAgICovCiAgICAgICAgbWl4SW46IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7CiAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykgewogICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gSUUgd29uJ3QgY29weSB0b1N0cmluZyB1c2luZyB0aGUgbG9vcCBhYm92ZQogICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoJ3RvU3RyaW5nJykpIHsKICAgICAgICAgICAgdGhpcy50b1N0cmluZyA9IHByb3BlcnRpZXMudG9TdHJpbmc7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvKioNCiAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuDQogICAgICAgICAqDQogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLg0KICAgICAgICAgKg0KICAgICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICAgKg0KICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gaW5zdGFuY2UuY2xvbmUoKTsNCiAgICAgICAgICovCiAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9KCk7CgogICAgLyoqDQogICAgICogQW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLg0KICAgICAqDQogICAgICogQHByb3BlcnR5IHtBcnJheX0gd29yZHMgVGhlIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy4NCiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gc2lnQnl0ZXMgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGlzIHdvcmQgYXJyYXkuDQogICAgICovCiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5ID0gQmFzZS5leHRlbmQoewogICAgICAvKioNCiAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCB3b3JkIGFycmF5Lg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIChPcHRpb25hbCkgQW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLg0KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ0J5dGVzIChPcHRpb25hbCkgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGUgd29yZHMuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKCk7DQogICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSk7DQogICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSwgNik7DQogICAgICAgKi8KICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykgewogICAgICAgIHdvcmRzID0gdGhpcy53b3JkcyA9IHdvcmRzIHx8IFtdOwogICAgICAgIGlmIChzaWdCeXRlcyAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHdvcmRzLmxlbmd0aCAqIDQ7CiAgICAgICAgfQogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENvbnZlcnRzIHRoaXMgd29yZCBhcnJheSB0byBhIHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0VuY29kZXJ9IGVuY29kZXIgKE9wdGlvbmFsKSBUaGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBDcnlwdG9KUy5lbmMuSGV4DQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5naWZpZWQgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5ICsgJyc7DQogICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZygpOw0KICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpOw0KICAgICAgICovCiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZW5jb2RlcikgewogICAgICAgIHJldHVybiAoZW5jb2RlciB8fCBIZXgpLnN0cmluZ2lmeSh0aGlzKTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBDb25jYXRlbmF0ZXMgYSB3b3JkIGFycmF5IHRvIHRoaXMgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5IHRvIGFwcGVuZC4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoaXMgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB3b3JkQXJyYXkxLmNvbmNhdCh3b3JkQXJyYXkyKTsNCiAgICAgICAqLwogICAgICBjb25jYXQ6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgdGhpc1dvcmRzID0gdGhpcy53b3JkczsKICAgICAgICB2YXIgdGhhdFdvcmRzID0gd29yZEFycmF5LndvcmRzOwogICAgICAgIHZhciB0aGlzU2lnQnl0ZXMgPSB0aGlzLnNpZ0J5dGVzOwogICAgICAgIHZhciB0aGF0U2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7CgogICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzCiAgICAgICAgdGhpcy5jbGFtcCgpOwoKICAgICAgICAvLyBDb25jYXQKICAgICAgICBpZiAodGhpc1NpZ0J5dGVzICUgNCkgewogICAgICAgICAgLy8gQ29weSBvbmUgYnl0ZSBhdCBhIHRpbWUKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhhdFNpZ0J5dGVzOyBpKyspIHsKICAgICAgICAgICAgdmFyIHRoYXRCeXRlID0gdGhhdFdvcmRzW2kgPj4+IDJdID4+PiAyNCAtIGkgJSA0ICogOCAmIDB4ZmY7CiAgICAgICAgICAgIHRoaXNXb3Jkc1t0aGlzU2lnQnl0ZXMgKyBpID4+PiAyXSB8PSB0aGF0Qnl0ZSA8PCAyNCAtICh0aGlzU2lnQnl0ZXMgKyBpKSAlIDQgKiA4OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBDb3B5IG9uZSB3b3JkIGF0IGEgdGltZQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0U2lnQnl0ZXM7IGkgKz0gNCkgewogICAgICAgICAgICB0aGlzV29yZHNbdGhpc1NpZ0J5dGVzICsgaSA+Pj4gMl0gPSB0aGF0V29yZHNbaSA+Pj4gMl07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc2lnQnl0ZXMgKz0gdGhhdFNpZ0J5dGVzOwoKICAgICAgICAvLyBDaGFpbmFibGUKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBSZW1vdmVzIGluc2lnbmlmaWNhbnQgYml0cy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB3b3JkQXJyYXkuY2xhbXAoKTsNCiAgICAgICAqLwogICAgICBjbGFtcDogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciB3b3JkcyA9IHRoaXMud29yZHM7CiAgICAgICAgdmFyIHNpZ0J5dGVzID0gdGhpcy5zaWdCeXRlczsKCiAgICAgICAgLy8gQ2xhbXAKICAgICAgICB3b3Jkc1tzaWdCeXRlcyA+Pj4gMl0gJj0gMHhmZmZmZmZmZiA8PCAzMiAtIHNpZ0J5dGVzICUgNCAqIDg7CiAgICAgICAgd29yZHMubGVuZ3RoID0gTWF0aC5jZWlsKHNpZ0J5dGVzIC8gNCk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyB3b3JkIGFycmF5Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGNsb25lLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBjbG9uZSA9IHdvcmRBcnJheS5jbG9uZSgpOw0KICAgICAgICovCiAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNsb25lID0gQmFzZS5jbG9uZS5jYWxsKHRoaXMpOwogICAgICAgIGNsb25lLndvcmRzID0gdGhpcy53b3Jkcy5zbGljZSgwKTsKICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhIHdvcmQgYXJyYXkgZmlsbGVkIHdpdGggcmFuZG9tIGJ5dGVzLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuQnl0ZXMgVGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gZ2VuZXJhdGUuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcmFuZG9tIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSgxNik7DQogICAgICAgKi8KICAgICAgcmFuZG9tOiBmdW5jdGlvbiAobkJ5dGVzKSB7CiAgICAgICAgdmFyIHdvcmRzID0gW107CiAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAobV93KSB7CiAgICAgICAgICB2YXIgbV93ID0gbV93OwogICAgICAgICAgdmFyIG1feiA9IDB4M2FkZTY4YjE7CiAgICAgICAgICB2YXIgbWFzayA9IDB4ZmZmZmZmZmY7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBtX3ogPSAweDkwNjkgKiAobV96ICYgMHhGRkZGKSArIChtX3ogPj4gMHgxMCkgJiBtYXNrOwogICAgICAgICAgICBtX3cgPSAweDQ2NTAgKiAobV93ICYgMHhGRkZGKSArIChtX3cgPj4gMHgxMCkgJiBtYXNrOwogICAgICAgICAgICB2YXIgcmVzdWx0ID0gKG1feiA8PCAweDEwKSArIG1fdyAmIG1hc2s7CiAgICAgICAgICAgIHJlc3VsdCAvPSAweDEwMDAwMDAwMDsKICAgICAgICAgICAgcmVzdWx0ICs9IDAuNTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIChNYXRoLnJhbmRvbSgpID4gLjUgPyAxIDogLTEpOwogICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIGZvciAodmFyIGkgPSAwLCByY2FjaGU7IGkgPCBuQnl0ZXM7IGkgKz0gNCkgewogICAgICAgICAgdmFyIF9yID0gcigocmNhY2hlIHx8IE1hdGgucmFuZG9tKCkpICogMHgxMDAwMDAwMDApOwogICAgICAgICAgcmNhY2hlID0gX3IoKSAqIDB4M2FkZTY3Yjc7CiAgICAgICAgICB3b3Jkcy5wdXNoKF9yKCkgKiAweDEwMDAwMDAwMCB8IDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBuQnl0ZXMpOwogICAgICB9CiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBFbmNvZGVyIG5hbWVzcGFjZS4NCiAgICAgKi8KICAgIHZhciBDX2VuYyA9IEMuZW5jID0ge307CgogICAgLyoqDQogICAgICogSGV4IGVuY29kaW5nIHN0cmF0ZWd5Lg0KICAgICAqLwogICAgdmFyIEhleCA9IENfZW5jLkhleCA9IHsKICAgICAgLyoqDQogICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBoZXggc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHdvcmRBcnJheSk7DQogICAgICAgKi8KICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzOwogICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlczsKCiAgICAgICAgLy8gQ29udmVydAogICAgICAgIHZhciBoZXhDaGFycyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkrKykgewogICAgICAgICAgdmFyIGJpdGUgPSB3b3Jkc1tpID4+PiAyXSA+Pj4gMjQgLSBpICUgNCAqIDggJiAweGZmOwogICAgICAgICAgaGV4Q2hhcnMucHVzaCgoYml0ZSA+Pj4gNCkudG9TdHJpbmcoMTYpKTsKICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgJiAweDBmKS50b1N0cmluZygxNikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaGV4Q2hhcnMuam9pbignJyk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4U3RyIFRoZSBoZXggc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGhleFN0cmluZyk7DQogICAgICAgKi8KICAgICAgcGFyc2U6IGZ1bmN0aW9uIChoZXhTdHIpIHsKICAgICAgICAvLyBTaG9ydGN1dAogICAgICAgIHZhciBoZXhTdHJMZW5ndGggPSBoZXhTdHIubGVuZ3RoOwoKICAgICAgICAvLyBDb252ZXJ0CiAgICAgICAgdmFyIHdvcmRzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXhTdHJMZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgd29yZHNbaSA+Pj4gM10gfD0gcGFyc2VJbnQoaGV4U3RyLnN1YnN0cihpLCAyKSwgMTYpIDw8IDI0IC0gaSAlIDggKiA0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBoZXhTdHJMZW5ndGggLyAyKTsKICAgICAgfQogICAgfTsKCiAgICAvKioNCiAgICAgKiBMYXRpbjEgZW5jb2Rpbmcgc3RyYXRlZ3kuDQogICAgICovCiAgICB2YXIgTGF0aW4xID0gQ19lbmMuTGF0aW4xID0gewogICAgICAvKioNCiAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIExhdGluMSBzdHJpbmcuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBMYXRpbjEgc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgbGF0aW4xU3RyaW5nID0gQ3J5cHRvSlMuZW5jLkxhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KTsNCiAgICAgICAqLwogICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7CiAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzOwoKICAgICAgICAvLyBDb252ZXJ0CiAgICAgICAgdmFyIGxhdGluMUNoYXJzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7CiAgICAgICAgICB2YXIgYml0ZSA9IHdvcmRzW2kgPj4+IDJdID4+PiAyNCAtIGkgJSA0ICogOCAmIDB4ZmY7CiAgICAgICAgICBsYXRpbjFDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYml0ZSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGF0aW4xQ2hhcnMuam9pbignJyk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogQ29udmVydHMgYSBMYXRpbjEgc3RyaW5nIHRvIGEgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0aW4xU3RyIFRoZSBMYXRpbjEgc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnBhcnNlKGxhdGluMVN0cmluZyk7DQogICAgICAgKi8KICAgICAgcGFyc2U6IGZ1bmN0aW9uIChsYXRpbjFTdHIpIHsKICAgICAgICAvLyBTaG9ydGN1dAogICAgICAgIHZhciBsYXRpbjFTdHJMZW5ndGggPSBsYXRpbjFTdHIubGVuZ3RoOwoKICAgICAgICAvLyBDb252ZXJ0CiAgICAgICAgdmFyIHdvcmRzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXRpbjFTdHJMZW5ndGg7IGkrKykgewogICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gKGxhdGluMVN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZikgPDwgMjQgLSBpICUgNCAqIDg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIGxhdGluMVN0ckxlbmd0aCk7CiAgICAgIH0KICAgIH07CgogICAgLyoqDQogICAgICogVVRGLTggZW5jb2Rpbmcgc3RyYXRlZ3kuDQogICAgICovCiAgICB2YXIgVXRmOCA9IENfZW5jLlV0ZjggPSB7CiAgICAgIC8qKg0KICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgVVRGLTggc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTggc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgdXRmOFN0cmluZyA9IENyeXB0b0pTLmVuYy5VdGY4LnN0cmluZ2lmeSh3b3JkQXJyYXkpOw0KICAgICAgICovCiAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShMYXRpbjEuc3RyaW5naWZ5KHdvcmRBcnJheSkpKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBVVEYtOCBkYXRhJyk7CiAgICAgICAgfQogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENvbnZlcnRzIGEgVVRGLTggc3RyaW5nIHRvIGEgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXRmOFN0ciBUaGUgVVRGLTggc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh1dGY4U3RyaW5nKTsNCiAgICAgICAqLwogICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjhTdHIpIHsKICAgICAgICByZXR1cm4gTGF0aW4xLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh1dGY4U3RyKSkpOwogICAgICB9CiAgICB9OwoKICAgIC8qKg0KICAgICAqIEFic3RyYWN0IGJ1ZmZlcmVkIGJsb2NrIGFsZ29yaXRobSB0ZW1wbGF0ZS4NCiAgICAgKg0KICAgICAqIFRoZSBwcm9wZXJ0eSBibG9ja1NpemUgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIGNvbmNyZXRlIHN1YnR5cGUuDQogICAgICoNCiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX21pbkJ1ZmZlclNpemUgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBzaG91bGQgYmUga2VwdCB1bnByb2Nlc3NlZCBpbiB0aGUgYnVmZmVyLiBEZWZhdWx0OiAwDQogICAgICovCiAgICB2YXIgQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IENfbGliLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBCYXNlLmV4dGVuZCh7CiAgICAgIC8qKg0KICAgICAgICogUmVzZXRzIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgZGF0YSBidWZmZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldCgpOw0KICAgICAgICovCiAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXMKICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFdvcmRBcnJheS5pbml0KCk7CiAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyA9IDA7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogQWRkcyBuZXcgZGF0YSB0byB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGJ1ZmZlci4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYXBwZW5kLiBTdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gYSBXb3JkQXJyYXkgdXNpbmcgVVRGLTguDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKCdkYXRhJyk7DQogICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKHdvcmRBcnJheSk7DQogICAgICAgKi8KICAgICAgX2FwcGVuZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBXb3JkQXJyYXksIGVsc2UgYXNzdW1lIFdvcmRBcnJheSBhbHJlYWR5CiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgICBkYXRhID0gVXRmOC5wYXJzZShkYXRhKTsKICAgICAgICB9CgogICAgICAgIC8vIEFwcGVuZAogICAgICAgIHRoaXMuX2RhdGEuY29uY2F0KGRhdGEpOwogICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgKz0gZGF0YS5zaWdCeXRlczsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBQcm9jZXNzZXMgYXZhaWxhYmxlIGRhdGEgYmxvY2tzLg0KICAgICAgICoNCiAgICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgX2RvUHJvY2Vzc0Jsb2NrKG9mZnNldCksIHdoaWNoIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBjb25jcmV0ZSBzdWJ0eXBlLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9GbHVzaCBXaGV0aGVyIGFsbCBibG9ja3MgYW5kIHBhcnRpYWwgYmxvY2tzIHNob3VsZCBiZSBwcm9jZXNzZWQuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcHJvY2Vzc2VkIGRhdGEuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHByb2Nlc3NlZERhdGEgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9wcm9jZXNzKCk7DQogICAgICAgKiAgICAgdmFyIHByb2Nlc3NlZERhdGEgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7DQogICAgICAgKi8KICAgICAgX3Byb2Nlc3M6IGZ1bmN0aW9uIChkb0ZsdXNoKSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhOwogICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzOwogICAgICAgIHZhciBkYXRhU2lnQnl0ZXMgPSBkYXRhLnNpZ0J5dGVzOwogICAgICAgIHZhciBibG9ja1NpemUgPSB0aGlzLmJsb2NrU2l6ZTsKICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0OwoKICAgICAgICAvLyBDb3VudCBibG9ja3MgcmVhZHkKICAgICAgICB2YXIgbkJsb2Nrc1JlYWR5ID0gZGF0YVNpZ0J5dGVzIC8gYmxvY2tTaXplQnl0ZXM7CiAgICAgICAgaWYgKGRvRmx1c2gpIHsKICAgICAgICAgIC8vIFJvdW5kIHVwIHRvIGluY2x1ZGUgcGFydGlhbCBibG9ja3MKICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGguY2VpbChuQmxvY2tzUmVhZHkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBSb3VuZCBkb3duIHRvIGluY2x1ZGUgb25seSBmdWxsIGJsb2NrcywKICAgICAgICAgIC8vIGxlc3MgdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBtdXN0IHJlbWFpbiBpbiB0aGUgYnVmZmVyCiAgICAgICAgICBuQmxvY2tzUmVhZHkgPSBNYXRoLm1heCgobkJsb2Nrc1JlYWR5IHwgMCkgLSB0aGlzLl9taW5CdWZmZXJTaXplLCAwKTsKICAgICAgICB9CgogICAgICAgIC8vIENvdW50IHdvcmRzIHJlYWR5CiAgICAgICAgdmFyIG5Xb3Jkc1JlYWR5ID0gbkJsb2Nrc1JlYWR5ICogYmxvY2tTaXplOwoKICAgICAgICAvLyBDb3VudCBieXRlcyByZWFkeQogICAgICAgIHZhciBuQnl0ZXNSZWFkeSA9IE1hdGgubWluKG5Xb3Jkc1JlYWR5ICogNCwgZGF0YVNpZ0J5dGVzKTsKCiAgICAgICAgLy8gUHJvY2VzcyBibG9ja3MKICAgICAgICBpZiAobldvcmRzUmVhZHkpIHsKICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IG5Xb3Jkc1JlYWR5OyBvZmZzZXQgKz0gYmxvY2tTaXplKSB7CiAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtYWxnb3JpdGhtIGxvZ2ljCiAgICAgICAgICAgIHRoaXMuX2RvUHJvY2Vzc0Jsb2NrKGRhdGFXb3Jkcywgb2Zmc2V0KTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBSZW1vdmUgcHJvY2Vzc2VkIHdvcmRzCiAgICAgICAgICB2YXIgcHJvY2Vzc2VkV29yZHMgPSBkYXRhV29yZHMuc3BsaWNlKDAsIG5Xb3Jkc1JlYWR5KTsKICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gbkJ5dGVzUmVhZHk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm4gcHJvY2Vzc2VkIHdvcmRzCiAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdChwcm9jZXNzZWRXb3JkcywgbkJ5dGVzUmVhZHkpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBjbG9uZSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uY2xvbmUoKTsNCiAgICAgICAqLwogICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTsKICAgICAgICBjbG9uZS5fZGF0YSA9IHRoaXMuX2RhdGEuY2xvbmUoKTsKICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgIH0sCiAgICAgIF9taW5CdWZmZXJTaXplOiAwCiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBBYnN0cmFjdCBoYXNoZXIgdGVtcGxhdGUuDQogICAgICoNCiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgaGFzaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxNiAoNTEyIGJpdHMpDQogICAgICovCiAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoewogICAgICAvKioNCiAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4NCiAgICAgICAqLwogICAgICBjZmc6IEJhc2UuZXh0ZW5kKCksCiAgICAgIC8qKg0KICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGhhc2hlci4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgaGFzaCBjb21wdXRhdGlvbi4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgaGFzaGVyID0gQ3J5cHRvSlMuYWxnby5TSEEyNTYuY3JlYXRlKCk7DQogICAgICAgKi8KICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykgewogICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0cwogICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7CgogICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcwogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhpcyBoYXNoZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgaGFzaGVyLnJlc2V0KCk7DQogICAgICAgKi8KICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlcgogICAgICAgIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQuY2FsbCh0aGlzKTsKCiAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWMKICAgICAgICB0aGlzLl9kb1Jlc2V0KCk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogVXBkYXRlcyB0aGlzIGhhc2hlciB3aXRoIGEgbWVzc2FnZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge0hhc2hlcn0gVGhpcyBoYXNoZXIuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpOw0KICAgICAgICogICAgIGhhc2hlci51cGRhdGUod29yZEFycmF5KTsNCiAgICAgICAqLwogICAgICB1cGRhdGU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7CiAgICAgICAgLy8gQXBwZW5kCiAgICAgICAgdGhpcy5fYXBwZW5kKG1lc3NhZ2VVcGRhdGUpOwoKICAgICAgICAvLyBVcGRhdGUgdGhlIGhhc2gKICAgICAgICB0aGlzLl9wcm9jZXNzKCk7CgogICAgICAgIC8vIENoYWluYWJsZQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIEZpbmFsaXplcyB0aGUgaGFzaCBjb21wdXRhdGlvbi4NCiAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIChPcHRpb25hbCkgQSBmaW5hbCBtZXNzYWdlIHVwZGF0ZS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBoYXNoID0gaGFzaGVyLmZpbmFsaXplKCk7DQogICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTsNCiAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSh3b3JkQXJyYXkpOw0KICAgICAgICovCiAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkgewogICAgICAgIC8vIEZpbmFsIG1lc3NhZ2UgdXBkYXRlCiAgICAgICAgaWYgKG1lc3NhZ2VVcGRhdGUpIHsKICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTsKICAgICAgICB9CgogICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljCiAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9kb0ZpbmFsaXplKCk7CiAgICAgICAgcmV0dXJuIGhhc2g7CiAgICAgIH0sCiAgICAgIGJsb2NrU2l6ZTogNTEyIC8gMzIsCiAgICAgIC8qKg0KICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIGEgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHNob3J0Y3V0IGZ1bmN0aW9uLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSGVscGVyKENyeXB0b0pTLmFsZ28uU0hBMjU2KTsNCiAgICAgICAqLwogICAgICBfY3JlYXRlSGVscGVyOiBmdW5jdGlvbiAoaGFzaGVyKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBjZmcpIHsKICAgICAgICAgIHJldHVybiBuZXcgaGFzaGVyLmluaXQoY2ZnKS5maW5hbGl6ZShtZXNzYWdlKTsKICAgICAgICB9OwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIHVzZSBpbiB0aGlzIEhNQUMgaGVscGVyLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBIbWFjU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7DQogICAgICAgKi8KICAgICAgX2NyZWF0ZUhtYWNIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGtleSkgewogICAgICAgICAgcmV0dXJuIG5ldyBDX2FsZ28uSE1BQy5pbml0KGhhc2hlciwga2V5KS5maW5hbGl6ZShtZXNzYWdlKTsKICAgICAgICB9OwogICAgICB9CiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBBbGdvcml0aG0gbmFtZXNwYWNlLg0KICAgICAqLwogICAgdmFyIENfYWxnbyA9IEMuYWxnbyA9IHt9OwogICAgcmV0dXJuIEM7CiAgfShNYXRoKTsKICAoZnVuY3Rpb24gKCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIENfZW5jID0gQy5lbmM7CgogICAgLyoqDQogICAgICogQmFzZTY0IGVuY29kaW5nIHN0cmF0ZWd5Lg0KICAgICAqLwogICAgdmFyIEJhc2U2NCA9IENfZW5jLkJhc2U2NCA9IHsKICAgICAgLyoqDQogICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBCYXNlNjQgc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgQmFzZTY0IHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGJhc2U2NFN0cmluZyA9IENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KHdvcmRBcnJheSk7DQogICAgICAgKi8KICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzOwogICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlczsKICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwOwoKICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0cwogICAgICAgIHdvcmRBcnJheS5jbGFtcCgpOwoKICAgICAgICAvLyBDb252ZXJ0CiAgICAgICAgdmFyIGJhc2U2NENoYXJzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSArPSAzKSB7CiAgICAgICAgICB2YXIgYnl0ZTEgPSB3b3Jkc1tpID4+PiAyXSA+Pj4gMjQgLSBpICUgNCAqIDggJiAweGZmOwogICAgICAgICAgdmFyIGJ5dGUyID0gd29yZHNbaSArIDEgPj4+IDJdID4+PiAyNCAtIChpICsgMSkgJSA0ICogOCAmIDB4ZmY7CiAgICAgICAgICB2YXIgYnl0ZTMgPSB3b3Jkc1tpICsgMiA+Pj4gMl0gPj4+IDI0IC0gKGkgKyAyKSAlIDQgKiA4ICYgMHhmZjsKICAgICAgICAgIHZhciB0cmlwbGV0ID0gYnl0ZTEgPDwgMTYgfCBieXRlMiA8PCA4IHwgYnl0ZTM7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQgJiYgaSArIGogKiAwLjc1IDwgc2lnQnl0ZXM7IGorKykgewogICAgICAgICAgICBiYXNlNjRDaGFycy5wdXNoKG1hcC5jaGFyQXQodHJpcGxldCA+Pj4gNiAqICgzIC0gaikgJiAweDNmKSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgcGFkZGluZwogICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpOwogICAgICAgIGlmIChwYWRkaW5nQ2hhcikgewogICAgICAgICAgd2hpbGUgKGJhc2U2NENoYXJzLmxlbmd0aCAlIDQpIHsKICAgICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChwYWRkaW5nQ2hhcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBiYXNlNjRDaGFycy5qb2luKCcnKTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBDb252ZXJ0cyBhIEJhc2U2NCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5Lg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjRTdHIgVGhlIEJhc2U2NCBzdHJpbmcuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2UoYmFzZTY0U3RyaW5nKTsNCiAgICAgICAqLwogICAgICBwYXJzZTogZnVuY3Rpb24gKGJhc2U2NFN0cikgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBiYXNlNjRTdHJMZW5ndGggPSBiYXNlNjRTdHIubGVuZ3RoOwogICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7CiAgICAgICAgdmFyIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwOwogICAgICAgIGlmICghcmV2ZXJzZU1hcCkgewogICAgICAgICAgcmV2ZXJzZU1hcCA9IHRoaXMuX3JldmVyc2VNYXAgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWFwLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHJldmVyc2VNYXBbbWFwLmNoYXJDb2RlQXQoaildID0gajsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElnbm9yZSBwYWRkaW5nCiAgICAgICAgdmFyIHBhZGRpbmdDaGFyID0gbWFwLmNoYXJBdCg2NCk7CiAgICAgICAgaWYgKHBhZGRpbmdDaGFyKSB7CiAgICAgICAgICB2YXIgcGFkZGluZ0luZGV4ID0gYmFzZTY0U3RyLmluZGV4T2YocGFkZGluZ0NoYXIpOwogICAgICAgICAgaWYgKHBhZGRpbmdJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgYmFzZTY0U3RyTGVuZ3RoID0gcGFkZGluZ0luZGV4OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ29udmVydAogICAgICAgIHJldHVybiBwYXJzZUxvb3AoYmFzZTY0U3RyLCBiYXNlNjRTdHJMZW5ndGgsIHJldmVyc2VNYXApOwogICAgICB9LAogICAgICBfbWFwOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nCiAgICB9OwogICAgZnVuY3Rpb24gcGFyc2VMb29wKGJhc2U2NFN0ciwgYmFzZTY0U3RyTGVuZ3RoLCByZXZlcnNlTWFwKSB7CiAgICAgIHZhciB3b3JkcyA9IFtdOwogICAgICB2YXIgbkJ5dGVzID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlNjRTdHJMZW5ndGg7IGkrKykgewogICAgICAgIGlmIChpICUgNCkgewogICAgICAgICAgdmFyIGJpdHMxID0gcmV2ZXJzZU1hcFtiYXNlNjRTdHIuY2hhckNvZGVBdChpIC0gMSldIDw8IGkgJSA0ICogMjsKICAgICAgICAgIHZhciBiaXRzMiA9IHJldmVyc2VNYXBbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSldID4+PiA2IC0gaSAlIDQgKiAyOwogICAgICAgICAgd29yZHNbbkJ5dGVzID4+PiAyXSB8PSAoYml0czEgfCBiaXRzMikgPDwgMjQgLSBuQnl0ZXMgJSA0ICogODsKICAgICAgICAgIG5CeXRlcysrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gV29yZEFycmF5LmNyZWF0ZSh3b3JkcywgbkJ5dGVzKTsKICAgIH0KICB9KSgpOwogIChmdW5jdGlvbiAoTWF0aCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjsKICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgogICAgLy8gQ29uc3RhbnRzIHRhYmxlCiAgICB2YXIgVCA9IFtdOwoKICAgIC8vIENvbXB1dGUgY29uc3RhbnRzCiAgICAoZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgICBUW2ldID0gTWF0aC5hYnMoTWF0aC5zaW4oaSArIDEpKSAqIDB4MTAwMDAwMDAwIHwgMDsKICAgICAgfQogICAgfSkoKTsKCiAgICAvKioNCiAgICAgKiBNRDUgaGFzaCBhbGdvcml0aG0uDQogICAgICovCiAgICB2YXIgTUQ1ID0gQ19hbGdvLk1ENSA9IEhhc2hlci5leHRlbmQoewogICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzZdKTsKICAgICAgfSwKICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CiAgICAgICAgLy8gU3dhcCBlbmRpYW4KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgICAgdmFyIG9mZnNldF9pID0gb2Zmc2V0ICsgaTsKICAgICAgICAgIHZhciBNX29mZnNldF9pID0gTVtvZmZzZXRfaV07CiAgICAgICAgICBNW29mZnNldF9pXSA9IChNX29mZnNldF9pIDw8IDggfCBNX29mZnNldF9pID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKE1fb2Zmc2V0X2kgPDwgMjQgfCBNX29mZnNldF9pID4+PiA4KSAmIDB4ZmYwMGZmMDA7CiAgICAgICAgfQoKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7CiAgICAgICAgdmFyIE1fb2Zmc2V0XzAgPSBNW29mZnNldCArIDBdOwogICAgICAgIHZhciBNX29mZnNldF8xID0gTVtvZmZzZXQgKyAxXTsKICAgICAgICB2YXIgTV9vZmZzZXRfMiA9IE1bb2Zmc2V0ICsgMl07CiAgICAgICAgdmFyIE1fb2Zmc2V0XzMgPSBNW29mZnNldCArIDNdOwogICAgICAgIHZhciBNX29mZnNldF80ID0gTVtvZmZzZXQgKyA0XTsKICAgICAgICB2YXIgTV9vZmZzZXRfNSA9IE1bb2Zmc2V0ICsgNV07CiAgICAgICAgdmFyIE1fb2Zmc2V0XzYgPSBNW29mZnNldCArIDZdOwogICAgICAgIHZhciBNX29mZnNldF83ID0gTVtvZmZzZXQgKyA3XTsKICAgICAgICB2YXIgTV9vZmZzZXRfOCA9IE1bb2Zmc2V0ICsgOF07CiAgICAgICAgdmFyIE1fb2Zmc2V0XzkgPSBNW29mZnNldCArIDldOwogICAgICAgIHZhciBNX29mZnNldF8xMCA9IE1bb2Zmc2V0ICsgMTBdOwogICAgICAgIHZhciBNX29mZnNldF8xMSA9IE1bb2Zmc2V0ICsgMTFdOwogICAgICAgIHZhciBNX29mZnNldF8xMiA9IE1bb2Zmc2V0ICsgMTJdOwogICAgICAgIHZhciBNX29mZnNldF8xMyA9IE1bb2Zmc2V0ICsgMTNdOwogICAgICAgIHZhciBNX29mZnNldF8xNCA9IE1bb2Zmc2V0ICsgMTRdOwogICAgICAgIHZhciBNX29mZnNldF8xNSA9IE1bb2Zmc2V0ICsgMTVdOwoKICAgICAgICAvLyBXb3JraW5nIHZhcmlhbGJlcwogICAgICAgIHZhciBhID0gSFswXTsKICAgICAgICB2YXIgYiA9IEhbMV07CiAgICAgICAgdmFyIGMgPSBIWzJdOwogICAgICAgIHZhciBkID0gSFszXTsKCiAgICAgICAgLy8gQ29tcHV0YXRpb24KICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfMCwgNywgVFswXSk7CiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEsIDEyLCBUWzFdKTsKICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMiwgMTcsIFRbMl0pOwogICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8zLCAyMiwgVFszXSk7CiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzQsIDcsIFRbNF0pOwogICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF81LCAxMiwgVFs1XSk7CiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzYsIDE3LCBUWzZdKTsKICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfNywgMjIsIFRbN10pOwogICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF84LCA3LCBUWzhdKTsKICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfOSwgMTIsIFRbOV0pOwogICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8xMCwgMTcsIFRbMTBdKTsKICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTEsIDIyLCBUWzExXSk7CiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEyLCA3LCBUWzEyXSk7CiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEzLCAxMiwgVFsxM10pOwogICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8xNCwgMTcsIFRbMTRdKTsKICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTUsIDIyLCBUWzE1XSk7CiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEsIDUsIFRbMTZdKTsKICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfNiwgOSwgVFsxN10pOwogICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8xMSwgMTQsIFRbMThdKTsKICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfMCwgMjAsIFRbMTldKTsKICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfNSwgNSwgVFsyMF0pOwogICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8xMCwgOSwgVFsyMV0pOwogICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8xNSwgMTQsIFRbMjJdKTsKICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfNCwgMjAsIFRbMjNdKTsKICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgNSwgVFsyNF0pOwogICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8xNCwgOSwgVFsyNV0pOwogICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8zLCAxNCwgVFsyNl0pOwogICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF84LCAyMCwgVFsyN10pOwogICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF8xMywgNSwgVFsyOF0pOwogICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8yLCA5LCBUWzI5XSk7CiAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzcsIDE0LCBUWzMwXSk7CiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzEyLCAyMCwgVFszMV0pOwogICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF81LCA0LCBUWzMyXSk7CiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzgsIDExLCBUWzMzXSk7CiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzExLCAxNiwgVFszNF0pOwogICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xNCwgMjMsIFRbMzVdKTsKICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfMSwgNCwgVFszNl0pOwogICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF80LCAxMSwgVFszN10pOwogICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF83LCAxNiwgVFszOF0pOwogICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xMCwgMjMsIFRbMzldKTsKICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTMsIDQsIFRbNDBdKTsKICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfMCwgMTEsIFRbNDFdKTsKICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfMywgMTYsIFRbNDJdKTsKICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfNiwgMjMsIFRbNDNdKTsKICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgNCwgVFs0NF0pOwogICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF8xMiwgMTEsIFRbNDVdKTsKICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTUsIDE2LCBUWzQ2XSk7CiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzIsIDIzLCBUWzQ3XSk7CiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzAsIDYsIFRbNDhdKTsKICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfNywgMTAsIFRbNDldKTsKICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTQsIDE1LCBUWzUwXSk7CiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzUsIDIxLCBUWzUxXSk7CiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEyLCA2LCBUWzUyXSk7CiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzMsIDEwLCBUWzUzXSk7CiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzEwLCAxNSwgVFs1NF0pOwogICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF8xLCAyMSwgVFs1NV0pOwogICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF84LCA2LCBUWzU2XSk7CiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzE1LCAxMCwgVFs1N10pOwogICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF82LCAxNSwgVFs1OF0pOwogICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF8xMywgMjEsIFRbNTldKTsKICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfNCwgNiwgVFs2MF0pOwogICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF8xMSwgMTAsIFRbNjFdKTsKICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMiwgMTUsIFRbNjJdKTsKICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfOSwgMjEsIFRbNjNdKTsKCiAgICAgICAgLy8gSW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUKICAgICAgICBIWzBdID0gSFswXSArIGEgfCAwOwogICAgICAgIEhbMV0gPSBIWzFdICsgYiB8IDA7CiAgICAgICAgSFsyXSA9IEhbMl0gKyBjIHwgMDsKICAgICAgICBIWzNdID0gSFszXSArIGQgfCAwOwogICAgICB9LAogICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTsKICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkczsKICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4OwogICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODsKCiAgICAgICAgLy8gQWRkIHBhZGRpbmcKICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8IDI0IC0gbkJpdHNMZWZ0ICUgMzI7CiAgICAgICAgdmFyIG5CaXRzVG90YWxIID0gTWF0aC5mbG9vcihuQml0c1RvdGFsIC8gMHgxMDAwMDAwMDApOwogICAgICAgIHZhciBuQml0c1RvdGFsTCA9IG5CaXRzVG90YWw7CiAgICAgICAgZGF0YVdvcmRzWyhuQml0c0xlZnQgKyA2NCA+Pj4gOSA8PCA0KSArIDE1XSA9IChuQml0c1RvdGFsSCA8PCA4IHwgbkJpdHNUb3RhbEggPj4+IDI0KSAmIDB4MDBmZjAwZmYgfCAobkJpdHNUb3RhbEggPDwgMjQgfCBuQml0c1RvdGFsSCA+Pj4gOCkgJiAweGZmMDBmZjAwOwogICAgICAgIGRhdGFXb3Jkc1sobkJpdHNMZWZ0ICsgNjQgPj4+IDkgPDwgNCkgKyAxNF0gPSAobkJpdHNUb3RhbEwgPDwgOCB8IG5CaXRzVG90YWxMID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKG5CaXRzVG90YWxMIDw8IDI0IHwgbkJpdHNUb3RhbEwgPj4+IDgpICYgMHhmZjAwZmYwMDsKICAgICAgICBkYXRhLnNpZ0J5dGVzID0gKGRhdGFXb3Jkcy5sZW5ndGggKyAxKSAqIDQ7CgogICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzCiAgICAgICAgdGhpcy5fcHJvY2VzcygpOwoKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgaGFzaCA9IHRoaXMuX2hhc2g7CiAgICAgICAgdmFyIEggPSBoYXNoLndvcmRzOwoKICAgICAgICAvLyBTd2FwIGVuZGlhbgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAvLyBTaG9ydGN1dAogICAgICAgICAgdmFyIEhfaSA9IEhbaV07CiAgICAgICAgICBIW2ldID0gKEhfaSA8PCA4IHwgSF9pID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKEhfaSA8PCAyNCB8IEhfaSA+Pj4gOCkgJiAweGZmMDBmZjAwOwogICAgICAgIH0KCiAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2gKICAgICAgICByZXR1cm4gaGFzaDsKICAgICAgfSwKICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTsKICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTsKICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgIH0KICAgIH0pOwogICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgdCkgewogICAgICB2YXIgbiA9IGEgKyAoYiAmIGMgfCB+YiAmIGQpICsgeCArIHQ7CiAgICAgIHJldHVybiAobiA8PCBzIHwgbiA+Pj4gMzIgLSBzKSArIGI7CiAgICB9CiAgICBmdW5jdGlvbiBHRyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7CiAgICAgIHZhciBuID0gYSArIChiICYgZCB8IGMgJiB+ZCkgKyB4ICsgdDsKICAgICAgcmV0dXJuIChuIDw8IHMgfCBuID4+PiAzMiAtIHMpICsgYjsKICAgIH0KICAgIGZ1bmN0aW9uIEhIKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHsKICAgICAgdmFyIG4gPSBhICsgKGIgXiBjIF4gZCkgKyB4ICsgdDsKICAgICAgcmV0dXJuIChuIDw8IHMgfCBuID4+PiAzMiAtIHMpICsgYjsKICAgIH0KICAgIGZ1bmN0aW9uIElJKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHsKICAgICAgdmFyIG4gPSBhICsgKGMgXiAoYiB8IH5kKSkgKyB4ICsgdDsKICAgICAgcmV0dXJuIChuIDw8IHMgfCBuID4+PiAzMiAtIHMpICsgYjsKICAgIH0KCiAgICAvKioNCiAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLg0KICAgICAqDQogICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC4NCiAgICAgKg0KICAgICAqIEBzdGF0aWMNCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5NRDUoJ21lc3NhZ2UnKTsNCiAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5NRDUod29yZEFycmF5KTsNCiAgICAgKi8KICAgIEMuTUQ1ID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoTUQ1KTsKCiAgICAvKioNCiAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICoNCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4NCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS4NCiAgICAgKg0KICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuDQogICAgICoNCiAgICAgKiBAc3RhdGljDQogICAgICoNCiAgICAgKiBAZXhhbXBsZQ0KICAgICAqDQogICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY01ENShtZXNzYWdlLCBrZXkpOw0KICAgICAqLwogICAgQy5IbWFjTUQ1ID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKE1ENSk7CiAgfSkoTWF0aCk7CiAgKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNob3J0Y3V0cwogICAgdmFyIEMgPSBDcnlwdG9KUzsKICAgIHZhciBDX2xpYiA9IEMubGliOwogICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTsKICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7CiAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoKICAgIC8vIFJldXNhYmxlIG9iamVjdAogICAgdmFyIFcgPSBbXTsKCiAgICAvKioNCiAgICAgKiBTSEEtMSBoYXNoIGFsZ29yaXRobS4NCiAgICAgKi8KICAgIHZhciBTSEExID0gQ19hbGdvLlNIQTEgPSBIYXNoZXIuZXh0ZW5kKHsKICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFdvcmRBcnJheS5pbml0KFsweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LCAweGMzZDJlMWYwXSk7CiAgICAgIH0sCiAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewogICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzOwoKICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlcwogICAgICAgIHZhciBhID0gSFswXTsKICAgICAgICB2YXIgYiA9IEhbMV07CiAgICAgICAgdmFyIGMgPSBIWzJdOwogICAgICAgIHZhciBkID0gSFszXTsKICAgICAgICB2YXIgZSA9IEhbNF07CgogICAgICAgIC8vIENvbXB1dGF0aW9uCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7CiAgICAgICAgICBpZiAoaSA8IDE2KSB7CiAgICAgICAgICAgIFdbaV0gPSBNW29mZnNldCArIGldIHwgMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBuID0gV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XTsKICAgICAgICAgICAgV1tpXSA9IG4gPDwgMSB8IG4gPj4+IDMxOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHQgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgZSArIFdbaV07CiAgICAgICAgICBpZiAoaSA8IDIwKSB7CiAgICAgICAgICAgIHQgKz0gKGIgJiBjIHwgfmIgJiBkKSArIDB4NWE4Mjc5OTk7CiAgICAgICAgICB9IGVsc2UgaWYgKGkgPCA0MCkgewogICAgICAgICAgICB0ICs9IChiIF4gYyBeIGQpICsgMHg2ZWQ5ZWJhMTsKICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDYwKSB7CiAgICAgICAgICAgIHQgKz0gKGIgJiBjIHwgYiAmIGQgfCBjICYgZCkgLSAweDcwZTQ0MzI0OwogICAgICAgICAgfSBlbHNlIC8qIGlmIChpIDwgODApICovewogICAgICAgICAgICAgIHQgKz0gKGIgXiBjIF4gZCkgLSAweDM1OWQzZTJhOwogICAgICAgICAgICB9CiAgICAgICAgICBlID0gZDsKICAgICAgICAgIGQgPSBjOwogICAgICAgICAgYyA9IGIgPDwgMzAgfCBiID4+PiAyOwogICAgICAgICAgYiA9IGE7CiAgICAgICAgICBhID0gdDsKICAgICAgICB9CgogICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlCiAgICAgICAgSFswXSA9IEhbMF0gKyBhIHwgMDsKICAgICAgICBIWzFdID0gSFsxXSArIGIgfCAwOwogICAgICAgIEhbMl0gPSBIWzJdICsgYyB8IDA7CiAgICAgICAgSFszXSA9IEhbM10gKyBkIHwgMDsKICAgICAgICBIWzRdID0gSFs0XSArIGUgfCAwOwogICAgICB9LAogICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTsKICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkczsKICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4OwogICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODsKCiAgICAgICAgLy8gQWRkIHBhZGRpbmcKICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8IDI0IC0gbkJpdHNMZWZ0ICUgMzI7CiAgICAgICAgZGF0YVdvcmRzWyhuQml0c0xlZnQgKyA2NCA+Pj4gOSA8PCA0KSArIDE0XSA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTsKICAgICAgICBkYXRhV29yZHNbKG5CaXRzTGVmdCArIDY0ID4+PiA5IDw8IDQpICsgMTVdID0gbkJpdHNUb3RhbDsKICAgICAgICBkYXRhLnNpZ0J5dGVzID0gZGF0YVdvcmRzLmxlbmd0aCAqIDQ7CgogICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzCiAgICAgICAgdGhpcy5fcHJvY2VzcygpOwoKICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaAogICAgICAgIHJldHVybiB0aGlzLl9oYXNoOwogICAgICB9LAogICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpOwogICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpOwogICAgICAgIHJldHVybiBjbG9uZTsKICAgICAgfQogICAgfSk7CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICoNCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4NCiAgICAgKg0KICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guDQogICAgICoNCiAgICAgKiBAc3RhdGljDQogICAgICoNCiAgICAgKiBAZXhhbXBsZQ0KICAgICAqDQogICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMSgnbWVzc2FnZScpOw0KICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTEod29yZEFycmF5KTsNCiAgICAgKi8KICAgIEMuU0hBMSA9IEhhc2hlci5fY3JlYXRlSGVscGVyKFNIQTEpOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5Lg0KICAgICAqDQogICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy4NCiAgICAgKg0KICAgICAqIEBzdGF0aWMNCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMShtZXNzYWdlLCBrZXkpOw0KICAgICAqLwogICAgQy5IbWFjU0hBMSA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihTSEExKTsKICB9KSgpOwogIChmdW5jdGlvbiAoTWF0aCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjsKICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgogICAgLy8gSW5pdGlhbGl6YXRpb24gYW5kIHJvdW5kIGNvbnN0YW50cyB0YWJsZXMKICAgIHZhciBIID0gW107CiAgICB2YXIgSyA9IFtdOwoKICAgIC8vIENvbXB1dGUgY29uc3RhbnRzCiAgICAoZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBpc1ByaW1lKG4pIHsKICAgICAgICB2YXIgc3FydE4gPSBNYXRoLnNxcnQobik7CiAgICAgICAgZm9yICh2YXIgZmFjdG9yID0gMjsgZmFjdG9yIDw9IHNxcnROOyBmYWN0b3IrKykgewogICAgICAgICAgaWYgKCEobiAlIGZhY3RvcikpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBnZXRGcmFjdGlvbmFsQml0cyhuKSB7CiAgICAgICAgcmV0dXJuIChuIC0gKG4gfCAwKSkgKiAweDEwMDAwMDAwMCB8IDA7CiAgICAgIH0KICAgICAgdmFyIG4gPSAyOwogICAgICB2YXIgblByaW1lID0gMDsKICAgICAgd2hpbGUgKG5QcmltZSA8IDY0KSB7CiAgICAgICAgaWYgKGlzUHJpbWUobikpIHsKICAgICAgICAgIGlmIChuUHJpbWUgPCA4KSB7CiAgICAgICAgICAgIEhbblByaW1lXSA9IGdldEZyYWN0aW9uYWxCaXRzKE1hdGgucG93KG4sIDEgLyAyKSk7CiAgICAgICAgICB9CiAgICAgICAgICBLW25QcmltZV0gPSBnZXRGcmFjdGlvbmFsQml0cyhNYXRoLnBvdyhuLCAxIC8gMykpOwogICAgICAgICAgblByaW1lKys7CiAgICAgICAgfQogICAgICAgIG4rKzsKICAgICAgfQogICAgfSkoKTsKCiAgICAvLyBSZXVzYWJsZSBvYmplY3QKICAgIHZhciBXID0gW107CgogICAgLyoqDQogICAgICogU0hBLTI1NiBoYXNoIGFsZ29yaXRobS4NCiAgICAgKi8KICAgIHZhciBTSEEyNTYgPSBDX2FsZ28uU0hBMjU2ID0gSGFzaGVyLmV4dGVuZCh7CiAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChILnNsaWNlKDApKTsKICAgICAgfSwKICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CiAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7CgogICAgICAgIC8vIFdvcmtpbmcgdmFyaWFibGVzCiAgICAgICAgdmFyIGEgPSBIWzBdOwogICAgICAgIHZhciBiID0gSFsxXTsKICAgICAgICB2YXIgYyA9IEhbMl07CiAgICAgICAgdmFyIGQgPSBIWzNdOwogICAgICAgIHZhciBlID0gSFs0XTsKICAgICAgICB2YXIgZiA9IEhbNV07CiAgICAgICAgdmFyIGcgPSBIWzZdOwogICAgICAgIHZhciBoID0gSFs3XTsKCiAgICAgICAgLy8gQ29tcHV0YXRpb24KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgICAgIGlmIChpIDwgMTYpIHsKICAgICAgICAgICAgV1tpXSA9IE1bb2Zmc2V0ICsgaV0gfCAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGdhbW1hMHggPSBXW2kgLSAxNV07CiAgICAgICAgICAgIHZhciBnYW1tYTAgPSAoZ2FtbWEweCA8PCAyNSB8IGdhbW1hMHggPj4+IDcpIF4gKGdhbW1hMHggPDwgMTQgfCBnYW1tYTB4ID4+PiAxOCkgXiBnYW1tYTB4ID4+PiAzOwogICAgICAgICAgICB2YXIgZ2FtbWExeCA9IFdbaSAtIDJdOwogICAgICAgICAgICB2YXIgZ2FtbWExID0gKGdhbW1hMXggPDwgMTUgfCBnYW1tYTF4ID4+PiAxNykgXiAoZ2FtbWExeCA8PCAxMyB8IGdhbW1hMXggPj4+IDE5KSBeIGdhbW1hMXggPj4+IDEwOwogICAgICAgICAgICBXW2ldID0gZ2FtbWEwICsgV1tpIC0gN10gKyBnYW1tYTEgKyBXW2kgLSAxNl07CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY2ggPSBlICYgZiBeIH5lICYgZzsKICAgICAgICAgIHZhciBtYWogPSBhICYgYiBeIGEgJiBjIF4gYiAmIGM7CiAgICAgICAgICB2YXIgc2lnbWEwID0gKGEgPDwgMzAgfCBhID4+PiAyKSBeIChhIDw8IDE5IHwgYSA+Pj4gMTMpIF4gKGEgPDwgMTAgfCBhID4+PiAyMik7CiAgICAgICAgICB2YXIgc2lnbWExID0gKGUgPDwgMjYgfCBlID4+PiA2KSBeIChlIDw8IDIxIHwgZSA+Pj4gMTEpIF4gKGUgPDwgNyB8IGUgPj4+IDI1KTsKICAgICAgICAgIHZhciB0MSA9IGggKyBzaWdtYTEgKyBjaCArIEtbaV0gKyBXW2ldOwogICAgICAgICAgdmFyIHQyID0gc2lnbWEwICsgbWFqOwogICAgICAgICAgaCA9IGc7CiAgICAgICAgICBnID0gZjsKICAgICAgICAgIGYgPSBlOwogICAgICAgICAgZSA9IGQgKyB0MSB8IDA7CiAgICAgICAgICBkID0gYzsKICAgICAgICAgIGMgPSBiOwogICAgICAgICAgYiA9IGE7CiAgICAgICAgICBhID0gdDEgKyB0MiB8IDA7CiAgICAgICAgfQoKICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZQogICAgICAgIEhbMF0gPSBIWzBdICsgYSB8IDA7CiAgICAgICAgSFsxXSA9IEhbMV0gKyBiIHwgMDsKICAgICAgICBIWzJdID0gSFsyXSArIGMgfCAwOwogICAgICAgIEhbM10gPSBIWzNdICsgZCB8IDA7CiAgICAgICAgSFs0XSA9IEhbNF0gKyBlIHwgMDsKICAgICAgICBIWzVdID0gSFs1XSArIGYgfCAwOwogICAgICAgIEhbNl0gPSBIWzZdICsgZyB8IDA7CiAgICAgICAgSFs3XSA9IEhbN10gKyBoIHwgMDsKICAgICAgfSwKICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7CiAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7CiAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODsKICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7CgogICAgICAgIC8vIEFkZCBwYWRkaW5nCiAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHg4MCA8PCAyNCAtIG5CaXRzTGVmdCAlIDMyOwogICAgICAgIGRhdGFXb3Jkc1sobkJpdHNMZWZ0ICsgNjQgPj4+IDkgPDwgNCkgKyAxNF0gPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7CiAgICAgICAgZGF0YVdvcmRzWyhuQml0c0xlZnQgKyA2NCA+Pj4gOSA8PCA0KSArIDE1XSA9IG5CaXRzVG90YWw7CiAgICAgICAgZGF0YS5zaWdCeXRlcyA9IGRhdGFXb3Jkcy5sZW5ndGggKiA0OwoKICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2NrcwogICAgICAgIHRoaXMuX3Byb2Nlc3MoKTsKCiAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2gKICAgICAgICByZXR1cm4gdGhpcy5faGFzaDsKICAgICAgfSwKICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTsKICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTsKICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLg0KICAgICAqDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLg0KICAgICAqDQogICAgICogQHN0YXRpYw0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTI1NignbWVzc2FnZScpOw0KICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTI1Nih3b3JkQXJyYXkpOw0KICAgICAqLwogICAgQy5TSEEyNTYgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEEyNTYpOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5Lg0KICAgICAqDQogICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy4NCiAgICAgKg0KICAgICAqIEBzdGF0aWMNCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMjU2KG1lc3NhZ2UsIGtleSk7DQogICAgICovCiAgICBDLkhtYWNTSEEyNTYgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMjU2KTsKICB9KShNYXRoKTsKICAoZnVuY3Rpb24gKCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIENfZW5jID0gQy5lbmM7CgogICAgLyoqDQogICAgICogVVRGLTE2IEJFIGVuY29kaW5nIHN0cmF0ZWd5Lg0KICAgICAqLwogICAgdmFyIFV0ZjE2QkUgPSBDX2VuYy5VdGYxNiA9IENfZW5jLlV0ZjE2QkUgPSB7CiAgICAgIC8qKg0KICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgVVRGLTE2IEJFIHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi0xNiBCRSBzdHJpbmcuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciB1dGYxNlN0cmluZyA9IENyeXB0b0pTLmVuYy5VdGYxNi5zdHJpbmdpZnkod29yZEFycmF5KTsNCiAgICAgICAqLwogICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7CiAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzOwoKICAgICAgICAvLyBDb252ZXJ0CiAgICAgICAgdmFyIHV0ZjE2Q2hhcnMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpICs9IDIpIHsKICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSB3b3Jkc1tpID4+PiAyXSA+Pj4gMTYgLSBpICUgNCAqIDggJiAweGZmZmY7CiAgICAgICAgICB1dGYxNkNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHV0ZjE2Q2hhcnMuam9pbignJyk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogQ29udmVydHMgYSBVVEYtMTYgQkUgc3RyaW5nIHRvIGEgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXRmMTZTdHIgVGhlIFVURi0xNiBCRSBzdHJpbmcuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGYxNi5wYXJzZSh1dGYxNlN0cmluZyk7DQogICAgICAgKi8KICAgICAgcGFyc2U6IGZ1bmN0aW9uICh1dGYxNlN0cikgewogICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgdmFyIHV0ZjE2U3RyTGVuZ3RoID0gdXRmMTZTdHIubGVuZ3RoOwoKICAgICAgICAvLyBDb252ZXJ0CiAgICAgICAgdmFyIHdvcmRzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1dGYxNlN0ckxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB3b3Jkc1tpID4+PiAxXSB8PSB1dGYxNlN0ci5jaGFyQ29kZUF0KGkpIDw8IDE2IC0gaSAlIDIgKiAxNjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFdvcmRBcnJheS5jcmVhdGUod29yZHMsIHV0ZjE2U3RyTGVuZ3RoICogMik7CiAgICAgIH0KICAgIH07CgogICAgLyoqDQogICAgICogVVRGLTE2IExFIGVuY29kaW5nIHN0cmF0ZWd5Lg0KICAgICAqLwogICAgQ19lbmMuVXRmMTZMRSA9IHsKICAgICAgLyoqDQogICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtMTYgTEUgc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTE2IExFIHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHV0ZjE2U3RyID0gQ3J5cHRvSlMuZW5jLlV0ZjE2TEUuc3RyaW5naWZ5KHdvcmRBcnJheSk7DQogICAgICAgKi8KICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzOwogICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlczsKCiAgICAgICAgLy8gQ29udmVydAogICAgICAgIHZhciB1dGYxNkNoYXJzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSArPSAyKSB7CiAgICAgICAgICB2YXIgY29kZVBvaW50ID0gc3dhcEVuZGlhbih3b3Jkc1tpID4+PiAyXSA+Pj4gMTYgLSBpICUgNCAqIDggJiAweGZmZmYpOwogICAgICAgICAgdXRmMTZDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGYxNkNoYXJzLmpvaW4oJycpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENvbnZlcnRzIGEgVVRGLTE2IExFIHN0cmluZyB0byBhIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjE2U3RyIFRoZSBVVEYtMTYgTEUgc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmMTZMRS5wYXJzZSh1dGYxNlN0cik7DQogICAgICAgKi8KICAgICAgcGFyc2U6IGZ1bmN0aW9uICh1dGYxNlN0cikgewogICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgdmFyIHV0ZjE2U3RyTGVuZ3RoID0gdXRmMTZTdHIubGVuZ3RoOwoKICAgICAgICAvLyBDb252ZXJ0CiAgICAgICAgdmFyIHdvcmRzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1dGYxNlN0ckxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB3b3Jkc1tpID4+PiAxXSB8PSBzd2FwRW5kaWFuKHV0ZjE2U3RyLmNoYXJDb2RlQXQoaSkgPDwgMTYgLSBpICUgMiAqIDE2KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFdvcmRBcnJheS5jcmVhdGUod29yZHMsIHV0ZjE2U3RyTGVuZ3RoICogMik7CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBzd2FwRW5kaWFuKHdvcmQpIHsKICAgICAgcmV0dXJuIHdvcmQgPDwgOCAmIDB4ZmYwMGZmMDAgfCB3b3JkID4+PiA4ICYgMHgwMGZmMDBmZjsKICAgIH0KICB9KSgpOwogIChmdW5jdGlvbiAoKSB7CiAgICAvLyBDaGVjayBpZiB0eXBlZCBhcnJheXMgYXJlIHN1cHBvcnRlZAogICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBTaG9ydGN1dHMKICAgIHZhciBDID0gQ3J5cHRvSlM7CiAgICB2YXIgQ19saWIgPSBDLmxpYjsKICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgogICAgLy8gUmVmZXJlbmNlIG9yaWdpbmFsIGluaXQKICAgIHZhciBzdXBlckluaXQgPSBXb3JkQXJyYXkuaW5pdDsKCiAgICAvLyBBdWdtZW50IFdvcmRBcnJheS5pbml0IHRvIGhhbmRsZSB0eXBlZCBhcnJheXMKICAgIHZhciBzdWJJbml0ID0gV29yZEFycmF5LmluaXQgPSBmdW5jdGlvbiAodHlwZWRBcnJheSkgewogICAgICAvLyBDb252ZXJ0IGJ1ZmZlcnMgdG8gdWludDgKICAgICAgaWYgKHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgIHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheSh0eXBlZEFycmF5KTsKICAgICAgfQoKICAgICAgLy8gQ29udmVydCBvdGhlciBhcnJheSB2aWV3cyB0byB1aW50OAogICAgICBpZiAodHlwZWRBcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSB8fCB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSB8fCB0eXBlZEFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSB8fCB0eXBlZEFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgfHwgdHlwZWRBcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgfHwgdHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8IHR5cGVkQXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgdHlwZWRBcnJheSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkgewogICAgICAgIHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheSh0eXBlZEFycmF5LmJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5LmJ5dGVMZW5ndGgpOwogICAgICB9CgogICAgICAvLyBIYW5kbGUgVWludDhBcnJheQogICAgICBpZiAodHlwZWRBcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgICAvLyBTaG9ydGN1dAogICAgICAgIHZhciB0eXBlZEFycmF5Qnl0ZUxlbmd0aCA9IHR5cGVkQXJyYXkuYnl0ZUxlbmd0aDsKCiAgICAgICAgLy8gRXh0cmFjdCBieXRlcwogICAgICAgIHZhciB3b3JkcyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZWRBcnJheUJ5dGVMZW5ndGg7IGkrKykgewogICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gdHlwZWRBcnJheVtpXSA8PCAyNCAtIGkgJSA0ICogODsKICAgICAgICB9CgogICAgICAgIC8vIEluaXRpYWxpemUgdGhpcyB3b3JkIGFycmF5CiAgICAgICAgc3VwZXJJbml0LmNhbGwodGhpcywgd29yZHMsIHR5cGVkQXJyYXlCeXRlTGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBFbHNlIGNhbGwgbm9ybWFsIGluaXQKICAgICAgICBzdXBlckluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfQogICAgfTsKICAgIHN1YkluaXQucHJvdG90eXBlID0gV29yZEFycmF5OwogIH0pKCk7CgogIC8qKiBAcHJlc2VydmUNCiAgKGMpIDIwMTIgYnkgQ8OpZHJpYyBNZXNuaWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogIAogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAgCiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQogIAogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogICovCgogIChmdW5jdGlvbiAoTWF0aCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjsKICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgogICAgLy8gQ29uc3RhbnRzIHRhYmxlCiAgICB2YXIgX3psID0gV29yZEFycmF5LmNyZWF0ZShbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgNywgNCwgMTMsIDEsIDEwLCA2LCAxNSwgMywgMTIsIDAsIDksIDUsIDIsIDE0LCAxMSwgOCwgMywgMTAsIDE0LCA0LCA5LCAxNSwgOCwgMSwgMiwgNywgMCwgNiwgMTMsIDExLCA1LCAxMiwgMSwgOSwgMTEsIDEwLCAwLCA4LCAxMiwgNCwgMTMsIDMsIDcsIDE1LCAxNCwgNSwgNiwgMiwgNCwgMCwgNSwgOSwgNywgMTIsIDIsIDEwLCAxNCwgMSwgMywgOCwgMTEsIDYsIDE1LCAxM10pOwogICAgdmFyIF96ciA9IFdvcmRBcnJheS5jcmVhdGUoWzUsIDE0LCA3LCAwLCA5LCAyLCAxMSwgNCwgMTMsIDYsIDE1LCA4LCAxLCAxMCwgMywgMTIsIDYsIDExLCAzLCA3LCAwLCAxMywgNSwgMTAsIDE0LCAxNSwgOCwgMTIsIDQsIDksIDEsIDIsIDE1LCA1LCAxLCAzLCA3LCAxNCwgNiwgOSwgMTEsIDgsIDEyLCAyLCAxMCwgMCwgNCwgMTMsIDgsIDYsIDQsIDEsIDMsIDExLCAxNSwgMCwgNSwgMTIsIDIsIDEzLCA5LCA3LCAxMCwgMTQsIDEyLCAxNSwgMTAsIDQsIDEsIDUsIDgsIDcsIDYsIDIsIDEzLCAxNCwgMCwgMywgOSwgMTFdKTsKICAgIHZhciBfc2wgPSBXb3JkQXJyYXkuY3JlYXRlKFsxMSwgMTQsIDE1LCAxMiwgNSwgOCwgNywgOSwgMTEsIDEzLCAxNCwgMTUsIDYsIDcsIDksIDgsIDcsIDYsIDgsIDEzLCAxMSwgOSwgNywgMTUsIDcsIDEyLCAxNSwgOSwgMTEsIDcsIDEzLCAxMiwgMTEsIDEzLCA2LCA3LCAxNCwgOSwgMTMsIDE1LCAxNCwgOCwgMTMsIDYsIDUsIDEyLCA3LCA1LCAxMSwgMTIsIDE0LCAxNSwgMTQsIDE1LCA5LCA4LCA5LCAxNCwgNSwgNiwgOCwgNiwgNSwgMTIsIDksIDE1LCA1LCAxMSwgNiwgOCwgMTMsIDEyLCA1LCAxMiwgMTMsIDE0LCAxMSwgOCwgNSwgNl0pOwogICAgdmFyIF9zciA9IFdvcmRBcnJheS5jcmVhdGUoWzgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNiwgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLCA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCwgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXSk7CiAgICB2YXIgX2hsID0gV29yZEFycmF5LmNyZWF0ZShbMHgwMDAwMDAwMCwgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSwgMHg4RjFCQkNEQywgMHhBOTUzRkQ0RV0pOwogICAgdmFyIF9ociA9IFdvcmRBcnJheS5jcmVhdGUoWzB4NTBBMjhCRTYsIDB4NUM0REQxMjQsIDB4NkQ3MDNFRjMsIDB4N0E2RDc2RTksIDB4MDAwMDAwMDBdKTsKCiAgICAvKioNCiAgICAgKiBSSVBFTUQxNjAgaGFzaCBhbGdvcml0aG0uDQogICAgICovCiAgICB2YXIgUklQRU1EMTYwID0gQ19hbGdvLlJJUEVNRDE2MCA9IEhhc2hlci5leHRlbmQoewogICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuX2hhc2ggPSBXb3JkQXJyYXkuY3JlYXRlKFsweDY3NDUyMzAxLCAweEVGQ0RBQjg5LCAweDk4QkFEQ0ZFLCAweDEwMzI1NDc2LCAweEMzRDJFMUYwXSk7CiAgICAgIH0sCiAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewogICAgICAgIC8vIFN3YXAgZW5kaWFuCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAgICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICAgIHZhciBvZmZzZXRfaSA9IG9mZnNldCArIGk7CiAgICAgICAgICB2YXIgTV9vZmZzZXRfaSA9IE1bb2Zmc2V0X2ldOwoKICAgICAgICAgIC8vIFN3YXAKICAgICAgICAgIE1bb2Zmc2V0X2ldID0gKE1fb2Zmc2V0X2kgPDwgOCB8IE1fb2Zmc2V0X2kgPj4+IDI0KSAmIDB4MDBmZjAwZmYgfCAoTV9vZmZzZXRfaSA8PCAyNCB8IE1fb2Zmc2V0X2kgPj4+IDgpICYgMHhmZjAwZmYwMDsKICAgICAgICB9CiAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7CiAgICAgICAgdmFyIGhsID0gX2hsLndvcmRzOwogICAgICAgIHZhciBociA9IF9oci53b3JkczsKICAgICAgICB2YXIgemwgPSBfemwud29yZHM7CiAgICAgICAgdmFyIHpyID0gX3pyLndvcmRzOwogICAgICAgIHZhciBzbCA9IF9zbC53b3JkczsKICAgICAgICB2YXIgc3IgPSBfc3Iud29yZHM7CgogICAgICAgIC8vIFdvcmtpbmcgdmFyaWFibGVzCiAgICAgICAgdmFyIGFsLCBibCwgY2wsIGRsLCBlbDsKICAgICAgICB2YXIgYXIsIGJyLCBjciwgZHIsIGVyOwogICAgICAgIGFyID0gYWwgPSBIWzBdOwogICAgICAgIGJyID0gYmwgPSBIWzFdOwogICAgICAgIGNyID0gY2wgPSBIWzJdOwogICAgICAgIGRyID0gZGwgPSBIWzNdOwogICAgICAgIGVyID0gZWwgPSBIWzRdOwogICAgICAgIC8vIENvbXB1dGF0aW9uCiAgICAgICAgdmFyIHQ7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSArPSAxKSB7CiAgICAgICAgICB0ID0gYWwgKyBNW29mZnNldCArIHpsW2ldXSB8IDA7CiAgICAgICAgICBpZiAoaSA8IDE2KSB7CiAgICAgICAgICAgIHQgKz0gZjEoYmwsIGNsLCBkbCkgKyBobFswXTsKICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDMyKSB7CiAgICAgICAgICAgIHQgKz0gZjIoYmwsIGNsLCBkbCkgKyBobFsxXTsKICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDQ4KSB7CiAgICAgICAgICAgIHQgKz0gZjMoYmwsIGNsLCBkbCkgKyBobFsyXTsKICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDY0KSB7CiAgICAgICAgICAgIHQgKz0gZjQoYmwsIGNsLCBkbCkgKyBobFszXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGlmIChpPDgwKSB7CiAgICAgICAgICAgIHQgKz0gZjUoYmwsIGNsLCBkbCkgKyBobFs0XTsKICAgICAgICAgIH0KICAgICAgICAgIHQgPSB0IHwgMDsKICAgICAgICAgIHQgPSByb3RsKHQsIHNsW2ldKTsKICAgICAgICAgIHQgPSB0ICsgZWwgfCAwOwogICAgICAgICAgYWwgPSBlbDsKICAgICAgICAgIGVsID0gZGw7CiAgICAgICAgICBkbCA9IHJvdGwoY2wsIDEwKTsKICAgICAgICAgIGNsID0gYmw7CiAgICAgICAgICBibCA9IHQ7CiAgICAgICAgICB0ID0gYXIgKyBNW29mZnNldCArIHpyW2ldXSB8IDA7CiAgICAgICAgICBpZiAoaSA8IDE2KSB7CiAgICAgICAgICAgIHQgKz0gZjUoYnIsIGNyLCBkcikgKyBoclswXTsKICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDMyKSB7CiAgICAgICAgICAgIHQgKz0gZjQoYnIsIGNyLCBkcikgKyBoclsxXTsKICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDQ4KSB7CiAgICAgICAgICAgIHQgKz0gZjMoYnIsIGNyLCBkcikgKyBoclsyXTsKICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDY0KSB7CiAgICAgICAgICAgIHQgKz0gZjIoYnIsIGNyLCBkcikgKyBoclszXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGlmIChpPDgwKSB7CiAgICAgICAgICAgIHQgKz0gZjEoYnIsIGNyLCBkcikgKyBocls0XTsKICAgICAgICAgIH0KICAgICAgICAgIHQgPSB0IHwgMDsKICAgICAgICAgIHQgPSByb3RsKHQsIHNyW2ldKTsKICAgICAgICAgIHQgPSB0ICsgZXIgfCAwOwogICAgICAgICAgYXIgPSBlcjsKICAgICAgICAgIGVyID0gZHI7CiAgICAgICAgICBkciA9IHJvdGwoY3IsIDEwKTsKICAgICAgICAgIGNyID0gYnI7CiAgICAgICAgICBiciA9IHQ7CiAgICAgICAgfQogICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlCiAgICAgICAgdCA9IEhbMV0gKyBjbCArIGRyIHwgMDsKICAgICAgICBIWzFdID0gSFsyXSArIGRsICsgZXIgfCAwOwogICAgICAgIEhbMl0gPSBIWzNdICsgZWwgKyBhciB8IDA7CiAgICAgICAgSFszXSA9IEhbNF0gKyBhbCArIGJyIHwgMDsKICAgICAgICBIWzRdID0gSFswXSArIGJsICsgY3IgfCAwOwogICAgICAgIEhbMF0gPSB0OwogICAgICB9LAogICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTsKICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkczsKICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4OwogICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODsKCiAgICAgICAgLy8gQWRkIHBhZGRpbmcKICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8IDI0IC0gbkJpdHNMZWZ0ICUgMzI7CiAgICAgICAgZGF0YVdvcmRzWyhuQml0c0xlZnQgKyA2NCA+Pj4gOSA8PCA0KSArIDE0XSA9IChuQml0c1RvdGFsIDw8IDggfCBuQml0c1RvdGFsID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKG5CaXRzVG90YWwgPDwgMjQgfCBuQml0c1RvdGFsID4+PiA4KSAmIDB4ZmYwMGZmMDA7CiAgICAgICAgZGF0YS5zaWdCeXRlcyA9IChkYXRhV29yZHMubGVuZ3RoICsgMSkgKiA0OwoKICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2NrcwogICAgICAgIHRoaXMuX3Byb2Nlc3MoKTsKCiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoOwogICAgICAgIHZhciBIID0gaGFzaC53b3JkczsKCiAgICAgICAgLy8gU3dhcCBlbmRpYW4KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKykgewogICAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICAgIHZhciBIX2kgPSBIW2ldOwoKICAgICAgICAgIC8vIFN3YXAKICAgICAgICAgIEhbaV0gPSAoSF9pIDw8IDggfCBIX2kgPj4+IDI0KSAmIDB4MDBmZjAwZmYgfCAoSF9pIDw8IDI0IHwgSF9pID4+PiA4KSAmIDB4ZmYwMGZmMDA7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaAogICAgICAgIHJldHVybiBoYXNoOwogICAgICB9LAogICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpOwogICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpOwogICAgICAgIHJldHVybiBjbG9uZTsKICAgICAgfQogICAgfSk7CiAgICBmdW5jdGlvbiBmMSh4LCB5LCB6KSB7CiAgICAgIHJldHVybiB4IF4geSBeIHo7CiAgICB9CiAgICBmdW5jdGlvbiBmMih4LCB5LCB6KSB7CiAgICAgIHJldHVybiB4ICYgeSB8IH54ICYgejsKICAgIH0KICAgIGZ1bmN0aW9uIGYzKHgsIHksIHopIHsKICAgICAgcmV0dXJuICh4IHwgfnkpIF4gejsKICAgIH0KICAgIGZ1bmN0aW9uIGY0KHgsIHksIHopIHsKICAgICAgcmV0dXJuIHggJiB6IHwgeSAmIH56OwogICAgfQogICAgZnVuY3Rpb24gZjUoeCwgeSwgeikgewogICAgICByZXR1cm4geCBeICh5IHwgfnopOwogICAgfQogICAgZnVuY3Rpb24gcm90bCh4LCBuKSB7CiAgICAgIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47CiAgICB9CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICoNCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4NCiAgICAgKg0KICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guDQogICAgICoNCiAgICAgKiBAc3RhdGljDQogICAgICoNCiAgICAgKiBAZXhhbXBsZQ0KICAgICAqDQogICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuUklQRU1EMTYwKCdtZXNzYWdlJyk7DQogICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuUklQRU1EMTYwKHdvcmRBcnJheSk7DQogICAgICovCiAgICBDLlJJUEVNRDE2MCA9IEhhc2hlci5fY3JlYXRlSGVscGVyKFJJUEVNRDE2MCk7CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLg0KICAgICAqDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLg0KICAgICAqDQogICAgICogQHN0YXRpYw0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNSSVBFTUQxNjAobWVzc2FnZSwga2V5KTsNCiAgICAgKi8KICAgIEMuSG1hY1JJUEVNRDE2MCA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihSSVBFTUQxNjApOwogIH0pKE1hdGgpOwogIChmdW5jdGlvbiAoKSB7CiAgICAvLyBTaG9ydGN1dHMKICAgIHZhciBDID0gQ3J5cHRvSlM7CiAgICB2YXIgQ19saWIgPSBDLmxpYjsKICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTsKICAgIHZhciBDX2VuYyA9IEMuZW5jOwogICAgdmFyIFV0ZjggPSBDX2VuYy5VdGY4OwogICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCiAgICAvKioNCiAgICAgKiBITUFDIGFsZ29yaXRobS4NCiAgICAgKi8KICAgIHZhciBITUFDID0gQ19hbGdvLkhNQUMgPSBCYXNlLmV4dGVuZCh7CiAgICAgIC8qKg0KICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIEhNQUMuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlLg0KICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGhtYWNIYXNoZXIgPSBDcnlwdG9KUy5hbGdvLkhNQUMuY3JlYXRlKENyeXB0b0pTLmFsZ28uU0hBMjU2LCBrZXkpOw0KICAgICAgICovCiAgICAgIGluaXQ6IGZ1bmN0aW9uIChoYXNoZXIsIGtleSkgewogICAgICAgIC8vIEluaXQgaGFzaGVyCiAgICAgICAgaGFzaGVyID0gdGhpcy5faGFzaGVyID0gbmV3IGhhc2hlci5pbml0KCk7CgogICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHkKICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykgewogICAgICAgICAga2V5ID0gVXRmOC5wYXJzZShrZXkpOwogICAgICAgIH0KCiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZSA9IGhhc2hlci5ibG9ja1NpemU7CiAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZUJ5dGVzID0gaGFzaGVyQmxvY2tTaXplICogNDsKCiAgICAgICAgLy8gQWxsb3cgYXJiaXRyYXJ5IGxlbmd0aCBrZXlzCiAgICAgICAgaWYgKGtleS5zaWdCeXRlcyA+IGhhc2hlckJsb2NrU2l6ZUJ5dGVzKSB7CiAgICAgICAgICBrZXkgPSBoYXNoZXIuZmluYWxpemUoa2V5KTsKICAgICAgICB9CgogICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzCiAgICAgICAga2V5LmNsYW1wKCk7CgogICAgICAgIC8vIENsb25lIGtleSBmb3IgaW5uZXIgYW5kIG91dGVyIHBhZHMKICAgICAgICB2YXIgb0tleSA9IHRoaXMuX29LZXkgPSBrZXkuY2xvbmUoKTsKICAgICAgICB2YXIgaUtleSA9IHRoaXMuX2lLZXkgPSBrZXkuY2xvbmUoKTsKCiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIG9LZXlXb3JkcyA9IG9LZXkud29yZHM7CiAgICAgICAgdmFyIGlLZXlXb3JkcyA9IGlLZXkud29yZHM7CgogICAgICAgIC8vIFhPUiBrZXlzIHdpdGggcGFkIGNvbnN0YW50cwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFzaGVyQmxvY2tTaXplOyBpKyspIHsKICAgICAgICAgIG9LZXlXb3Jkc1tpXSBePSAweDVjNWM1YzVjOwogICAgICAgICAgaUtleVdvcmRzW2ldIF49IDB4MzYzNjM2MzY7CiAgICAgICAgfQogICAgICAgIG9LZXkuc2lnQnl0ZXMgPSBpS2V5LnNpZ0J5dGVzID0gaGFzaGVyQmxvY2tTaXplQnl0ZXM7CgogICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcwogICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBSZXNldHMgdGhpcyBITUFDIHRvIGl0cyBpbml0aWFsIHN0YXRlLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIGhtYWNIYXNoZXIucmVzZXQoKTsNCiAgICAgICAqLwogICAgICByZXNldDogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgdmFyIGhhc2hlciA9IHRoaXMuX2hhc2hlcjsKCiAgICAgICAgLy8gUmVzZXQKICAgICAgICBoYXNoZXIucmVzZXQoKTsKICAgICAgICBoYXNoZXIudXBkYXRlKHRoaXMuX2lLZXkpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIFVwZGF0ZXMgdGhpcyBITUFDIHdpdGggYSBtZXNzYWdlLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSBUaGUgbWVzc2FnZSB0byBhcHBlbmQuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7SE1BQ30gVGhpcyBITUFDIGluc3RhbmNlLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIGhtYWNIYXNoZXIudXBkYXRlKCdtZXNzYWdlJyk7DQogICAgICAgKiAgICAgaG1hY0hhc2hlci51cGRhdGUod29yZEFycmF5KTsNCiAgICAgICAqLwogICAgICB1cGRhdGU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7CiAgICAgICAgdGhpcy5faGFzaGVyLnVwZGF0ZShtZXNzYWdlVXBkYXRlKTsKCiAgICAgICAgLy8gQ2hhaW5hYmxlCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogRmluYWxpemVzIHRoZSBITUFDIGNvbXB1dGF0aW9uLg0KICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKCk7DQogICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKCdtZXNzYWdlJyk7DQogICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7DQogICAgICAgKi8KICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7CiAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICB2YXIgaGFzaGVyID0gdGhpcy5faGFzaGVyOwoKICAgICAgICAvLyBDb21wdXRlIEhNQUMKICAgICAgICB2YXIgaW5uZXJIYXNoID0gaGFzaGVyLmZpbmFsaXplKG1lc3NhZ2VVcGRhdGUpOwogICAgICAgIGhhc2hlci5yZXNldCgpOwogICAgICAgIHZhciBobWFjID0gaGFzaGVyLmZpbmFsaXplKHRoaXMuX29LZXkuY2xvbmUoKS5jb25jYXQoaW5uZXJIYXNoKSk7CiAgICAgICAgcmV0dXJuIGhtYWM7CiAgICAgIH0KICAgIH0pOwogIH0pKCk7CiAgKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNob3J0Y3V0cwogICAgdmFyIEMgPSBDcnlwdG9KUzsKICAgIHZhciBDX2xpYiA9IEMubGliOwogICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlOwogICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTsKICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CiAgICB2YXIgU0hBMSA9IENfYWxnby5TSEExOwogICAgdmFyIEhNQUMgPSBDX2FsZ28uSE1BQzsKCiAgICAvKioNCiAgICAgKiBQYXNzd29yZC1CYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAyIGFsZ29yaXRobS4NCiAgICAgKi8KICAgIHZhciBQQktERjIgPSBDX2FsZ28uUEJLREYyID0gQmFzZS5leHRlbmQoewogICAgICAvKioNCiAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4NCiAgICAgICAqDQogICAgICAgKiBAcHJvcGVydHkge251bWJlcn0ga2V5U2l6ZSBUaGUga2V5IHNpemUgaW4gd29yZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKQ0KICAgICAgICogQHByb3BlcnR5IHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIHVzZS4gRGVmYXVsdDogU0hBMQ0KICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl0ZXJhdGlvbnMgVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm0uIERlZmF1bHQ6IDENCiAgICAgICAqLwogICAgICBjZmc6IEJhc2UuZXh0ZW5kKHsKICAgICAgICBrZXlTaXplOiAxMjggLyAzMiwKICAgICAgICBoYXNoZXI6IFNIQTEsCiAgICAgICAgaXRlcmF0aW9uczogMQogICAgICB9KSwKICAgICAgLyoqDQogICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgZGVyaXZhdGlvbi4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5QQktERjIuY3JlYXRlKCk7DQogICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uUEJLREYyLmNyZWF0ZSh7IGtleVNpemU6IDggfSk7DQogICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uUEJLREYyLmNyZWF0ZSh7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7DQogICAgICAgKi8KICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykgewogICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogQ29tcHV0ZXMgdGhlIFBhc3N3b3JkLUJhc2VkIEtleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIDIuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5Lg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBrZXkgPSBrZGYuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7DQogICAgICAgKi8KICAgICAgY29tcHV0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0KSB7CiAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7CgogICAgICAgIC8vIEluaXQgSE1BQwogICAgICAgIHZhciBobWFjID0gSE1BQy5jcmVhdGUoY2ZnLmhhc2hlciwgcGFzc3dvcmQpOwoKICAgICAgICAvLyBJbml0aWFsIHZhbHVlcwogICAgICAgIHZhciBkZXJpdmVkS2V5ID0gV29yZEFycmF5LmNyZWF0ZSgpOwogICAgICAgIHZhciBibG9ja0luZGV4ID0gV29yZEFycmF5LmNyZWF0ZShbMHgwMDAwMDAwMV0pOwoKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgZGVyaXZlZEtleVdvcmRzID0gZGVyaXZlZEtleS53b3JkczsKICAgICAgICB2YXIgYmxvY2tJbmRleFdvcmRzID0gYmxvY2tJbmRleC53b3JkczsKICAgICAgICB2YXIga2V5U2l6ZSA9IGNmZy5rZXlTaXplOwogICAgICAgIHZhciBpdGVyYXRpb25zID0gY2ZnLml0ZXJhdGlvbnM7CgogICAgICAgIC8vIEdlbmVyYXRlIGtleQogICAgICAgIHdoaWxlIChkZXJpdmVkS2V5V29yZHMubGVuZ3RoIDwga2V5U2l6ZSkgewogICAgICAgICAgdmFyIGJsb2NrID0gaG1hYy51cGRhdGUoc2FsdCkuZmluYWxpemUoYmxvY2tJbmRleCk7CiAgICAgICAgICBobWFjLnJlc2V0KCk7CgogICAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgICB2YXIgYmxvY2tXb3JkcyA9IGJsb2NrLndvcmRzOwogICAgICAgICAgdmFyIGJsb2NrV29yZHNMZW5ndGggPSBibG9ja1dvcmRzLmxlbmd0aDsKCiAgICAgICAgICAvLyBJdGVyYXRpb25zCiAgICAgICAgICB2YXIgaW50ZXJtZWRpYXRlID0gYmxvY2s7CiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewogICAgICAgICAgICBpbnRlcm1lZGlhdGUgPSBobWFjLmZpbmFsaXplKGludGVybWVkaWF0ZSk7CiAgICAgICAgICAgIGhtYWMucmVzZXQoKTsKCiAgICAgICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgICAgIHZhciBpbnRlcm1lZGlhdGVXb3JkcyA9IGludGVybWVkaWF0ZS53b3JkczsKCiAgICAgICAgICAgIC8vIFhPUiBpbnRlcm1lZGlhdGUgd2l0aCBibG9jawogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJsb2NrV29yZHNMZW5ndGg7IGorKykgewogICAgICAgICAgICAgIGJsb2NrV29yZHNbal0gXj0gaW50ZXJtZWRpYXRlV29yZHNbal07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGRlcml2ZWRLZXkuY29uY2F0KGJsb2NrKTsKICAgICAgICAgIGJsb2NrSW5kZXhXb3Jkc1swXSsrOwogICAgICAgIH0KICAgICAgICBkZXJpdmVkS2V5LnNpZ0J5dGVzID0ga2V5U2l6ZSAqIDQ7CiAgICAgICAgcmV0dXJuIGRlcml2ZWRLZXk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKg0KICAgICAqIENvbXB1dGVzIHRoZSBQYXNzd29yZC1CYXNlZCBLZXkgRGVyaXZhdGlvbiBGdW5jdGlvbiAyLg0KICAgICAqDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC4NCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgY29tcHV0YXRpb24uDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS4NCiAgICAgKg0KICAgICAqIEBzdGF0aWMNCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLlBCS0RGMihwYXNzd29yZCwgc2FsdCk7DQogICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5QQktERjIocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCB9KTsNCiAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLlBCS0RGMihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pOw0KICAgICAqLwogICAgQy5QQktERjIgPSBmdW5jdGlvbiAocGFzc3dvcmQsIHNhbHQsIGNmZykgewogICAgICByZXR1cm4gUEJLREYyLmNyZWF0ZShjZmcpLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpOwogICAgfTsKICB9KSgpOwogIChmdW5jdGlvbiAoKSB7CiAgICAvLyBTaG9ydGN1dHMKICAgIHZhciBDID0gQ3J5cHRvSlM7CiAgICB2YXIgQ19saWIgPSBDLmxpYjsKICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTsKICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CiAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwogICAgdmFyIE1ENSA9IENfYWxnby5NRDU7CgogICAgLyoqDQogICAgICogVGhpcyBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBpcyBtZWFudCB0byBjb25mb3JtIHdpdGggRVZQX0J5dGVzVG9LZXkuDQogICAgICogd3d3Lm9wZW5zc2wub3JnL2RvY3MvY3J5cHRvL0VWUF9CeXRlc1RvS2V5Lmh0bWwNCiAgICAgKi8KICAgIHZhciBFdnBLREYgPSBDX2FsZ28uRXZwS0RGID0gQmFzZS5leHRlbmQoewogICAgICAvKioNCiAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4NCiAgICAgICAqDQogICAgICAgKiBAcHJvcGVydHkge251bWJlcn0ga2V5U2l6ZSBUaGUga2V5IHNpemUgaW4gd29yZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKQ0KICAgICAgICogQHByb3BlcnR5IHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlLiBEZWZhdWx0OiBNRDUNCiAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdGVyYXRpb25zIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtLiBEZWZhdWx0OiAxDQogICAgICAgKi8KICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7CiAgICAgICAga2V5U2l6ZTogMTI4IC8gMzIsCiAgICAgICAgaGFzaGVyOiBNRDUsCiAgICAgICAgaXRlcmF0aW9uczogMQogICAgICB9KSwKICAgICAgLyoqDQogICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgZGVyaXZhdGlvbi4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5FdnBLREYuY3JlYXRlKCk7DQogICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDggfSk7DQogICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7DQogICAgICAgKi8KICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykgewogICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogRGVyaXZlcyBhIGtleSBmcm9tIGEgcGFzc3dvcmQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5Lg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBrZXkgPSBrZGYuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7DQogICAgICAgKi8KICAgICAgY29tcHV0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0KSB7CiAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7CgogICAgICAgIC8vIEluaXQgaGFzaGVyCiAgICAgICAgdmFyIGhhc2hlciA9IGNmZy5oYXNoZXIuY3JlYXRlKCk7CgogICAgICAgIC8vIEluaXRpYWwgdmFsdWVzCiAgICAgICAgdmFyIGRlcml2ZWRLZXkgPSBXb3JkQXJyYXkuY3JlYXRlKCk7CgogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBkZXJpdmVkS2V5V29yZHMgPSBkZXJpdmVkS2V5LndvcmRzOwogICAgICAgIHZhciBrZXlTaXplID0gY2ZnLmtleVNpemU7CiAgICAgICAgdmFyIGl0ZXJhdGlvbnMgPSBjZmcuaXRlcmF0aW9uczsKCiAgICAgICAgLy8gR2VuZXJhdGUga2V5CiAgICAgICAgd2hpbGUgKGRlcml2ZWRLZXlXb3Jkcy5sZW5ndGggPCBrZXlTaXplKSB7CiAgICAgICAgICBpZiAoYmxvY2spIHsKICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZShibG9jayk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgYmxvY2sgPSBoYXNoZXIudXBkYXRlKHBhc3N3b3JkKS5maW5hbGl6ZShzYWx0KTsKICAgICAgICAgIGhhc2hlci5yZXNldCgpOwoKICAgICAgICAgIC8vIEl0ZXJhdGlvbnMKICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CiAgICAgICAgICAgIGJsb2NrID0gaGFzaGVyLmZpbmFsaXplKGJsb2NrKTsKICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBkZXJpdmVkS2V5LmNvbmNhdChibG9jayk7CiAgICAgICAgfQogICAgICAgIGRlcml2ZWRLZXkuc2lnQnl0ZXMgPSBrZXlTaXplICogNDsKICAgICAgICByZXR1cm4gZGVyaXZlZEtleTsKICAgICAgfQogICAgfSk7CgogICAgLyoqDQogICAgICogRGVyaXZlcyBhIGtleSBmcm9tIGEgcGFzc3dvcmQuDQogICAgICoNCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC4NCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0Lg0KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBjb21wdXRhdGlvbi4NCiAgICAgKg0KICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRlcml2ZWQga2V5Lg0KICAgICAqDQogICAgICogQHN0YXRpYw0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0KTsNCiAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4IH0pOw0KICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0LCB7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7DQogICAgICovCiAgICBDLkV2cEtERiA9IGZ1bmN0aW9uIChwYXNzd29yZCwgc2FsdCwgY2ZnKSB7CiAgICAgIHJldHVybiBFdnBLREYuY3JlYXRlKGNmZykuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7CiAgICB9OwogIH0pKCk7CiAgKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNob3J0Y3V0cwogICAgdmFyIEMgPSBDcnlwdG9KUzsKICAgIHZhciBDX2xpYiA9IEMubGliOwogICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTsKICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CiAgICB2YXIgU0hBMjU2ID0gQ19hbGdvLlNIQTI1NjsKCiAgICAvKioNCiAgICAgKiBTSEEtMjI0IGhhc2ggYWxnb3JpdGhtLg0KICAgICAqLwogICAgdmFyIFNIQTIyNCA9IENfYWxnby5TSEEyMjQgPSBTSEEyNTYuZXh0ZW5kKHsKICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFdvcmRBcnJheS5pbml0KFsweGMxMDU5ZWQ4LCAweDM2N2NkNTA3LCAweDMwNzBkZDE3LCAweGY3MGU1OTM5LCAweGZmYzAwYjMxLCAweDY4NTgxNTExLCAweDY0Zjk4ZmE3LCAweGJlZmE0ZmE0XSk7CiAgICAgIH0sCiAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGhhc2ggPSBTSEEyNTYuX2RvRmluYWxpemUuY2FsbCh0aGlzKTsKICAgICAgICBoYXNoLnNpZ0J5dGVzIC09IDQ7CiAgICAgICAgcmV0dXJuIGhhc2g7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLg0KICAgICAqDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLg0KICAgICAqDQogICAgICogQHN0YXRpYw0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTIyNCgnbWVzc2FnZScpOw0KICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLlNIQTIyNCh3b3JkQXJyYXkpOw0KICAgICAqLwogICAgQy5TSEEyMjQgPSBTSEEyNTYuX2NyZWF0ZUhlbHBlcihTSEEyMjQpOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5Lg0KICAgICAqDQogICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy4NCiAgICAgKg0KICAgICAqIEBzdGF0aWMNCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjU0hBMjI0KG1lc3NhZ2UsIGtleSk7DQogICAgICovCiAgICBDLkhtYWNTSEEyMjQgPSBTSEEyNTYuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMjI0KTsKICB9KSgpOwogIChmdW5jdGlvbiAodW5kZWZpbmVkKSB7CiAgICAvLyBTaG9ydGN1dHMKICAgIHZhciBDID0gQ3J5cHRvSlM7CiAgICB2YXIgQ19saWIgPSBDLmxpYjsKICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTsKICAgIHZhciBYMzJXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7CgogICAgLyoqDQogICAgICogeDY0IG5hbWVzcGFjZS4NCiAgICAgKi8KICAgIHZhciBDX3g2NCA9IEMueDY0ID0ge307CgogICAgLyoqDQogICAgICogQSA2NC1iaXQgd29yZC4NCiAgICAgKi8KICAgIHZhciBYNjRXb3JkID0gQ194NjQuV29yZCA9IEJhc2UuZXh0ZW5kKHsKICAgICAgLyoqDQogICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgNjQtYml0IHdvcmQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggVGhlIGhpZ2ggMzIgYml0cy4NCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAzMiBiaXRzLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciB4NjRXb3JkID0gQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MDAwMTAyMDMsIDB4MDQwNTA2MDcpOw0KICAgICAgICovCiAgICAgIGluaXQ6IGZ1bmN0aW9uIChoaWdoLCBsb3cpIHsKICAgICAgICB0aGlzLmhpZ2ggPSBoaWdoOwogICAgICAgIHRoaXMubG93ID0gbG93OwogICAgICB9CgogICAgICAvKioNCiAgICAgICAqIEJpdHdpc2UgTk9UcyB0aGlzIHdvcmQuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIG5lZ2F0aW5nLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBuZWdhdGVkID0geDY0V29yZC5ub3QoKTsNCiAgICAgICAqLwogICAgICAvLyBub3Q6IGZ1bmN0aW9uICgpIHsKICAgICAgLy8gdmFyIGhpZ2ggPSB+dGhpcy5oaWdoOwogICAgICAvLyB2YXIgbG93ID0gfnRoaXMubG93OwoKICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7CiAgICAgIC8vIH0sCgogICAgICAvKioNCiAgICAgICAqIEJpdHdpc2UgQU5EcyB0aGlzIHdvcmQgd2l0aCB0aGUgcGFzc2VkIHdvcmQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtYNjRXb3JkfSB3b3JkIFRoZSB4NjQtV29yZCB0byBBTkQgd2l0aCB0aGlzIHdvcmQuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIEFORGluZy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgYW5kZWQgPSB4NjRXb3JkLmFuZChhbm90aGVyWDY0V29yZCk7DQogICAgICAgKi8KICAgICAgLy8gYW5kOiBmdW5jdGlvbiAod29yZCkgewogICAgICAvLyB2YXIgaGlnaCA9IHRoaXMuaGlnaCAmIHdvcmQuaGlnaDsKICAgICAgLy8gdmFyIGxvdyA9IHRoaXMubG93ICYgd29yZC5sb3c7CgogICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTsKICAgICAgLy8gfSwKCiAgICAgIC8qKg0KICAgICAgICogQml0d2lzZSBPUnMgdGhpcyB3b3JkIHdpdGggdGhlIHBhc3NlZCB3b3JkLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7WDY0V29yZH0gd29yZCBUaGUgeDY0LVdvcmQgdG8gT1Igd2l0aCB0aGlzIHdvcmQuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIE9SaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBvcmVkID0geDY0V29yZC5vcihhbm90aGVyWDY0V29yZCk7DQogICAgICAgKi8KICAgICAgLy8gb3I6IGZ1bmN0aW9uICh3b3JkKSB7CiAgICAgIC8vIHZhciBoaWdoID0gdGhpcy5oaWdoIHwgd29yZC5oaWdoOwogICAgICAvLyB2YXIgbG93ID0gdGhpcy5sb3cgfCB3b3JkLmxvdzsKCiAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpOwogICAgICAvLyB9LAoKICAgICAgLyoqDQogICAgICAgKiBCaXR3aXNlIFhPUnMgdGhpcyB3b3JkIHdpdGggdGhlIHBhc3NlZCB3b3JkLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7WDY0V29yZH0gd29yZCBUaGUgeDY0LVdvcmQgdG8gWE9SIHdpdGggdGhpcyB3b3JkLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBYT1JpbmcuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHhvcmVkID0geDY0V29yZC54b3IoYW5vdGhlclg2NFdvcmQpOw0KICAgICAgICovCiAgICAgIC8vIHhvcjogZnVuY3Rpb24gKHdvcmQpIHsKICAgICAgLy8gdmFyIGhpZ2ggPSB0aGlzLmhpZ2ggXiB3b3JkLmhpZ2g7CiAgICAgIC8vIHZhciBsb3cgPSB0aGlzLmxvdyBeIHdvcmQubG93OwoKICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7CiAgICAgIC8vIH0sCgogICAgICAvKioNCiAgICAgICAqIFNoaWZ0cyB0aGlzIHdvcmQgbiBiaXRzIHRvIHRoZSBsZWZ0Lg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdC4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkfSBBIG5ldyB4NjQtV29yZCBvYmplY3QgYWZ0ZXIgc2hpZnRpbmcuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHNoaWZ0ZWQgPSB4NjRXb3JkLnNoaWZ0TCgyNSk7DQogICAgICAgKi8KICAgICAgLy8gc2hpZnRMOiBmdW5jdGlvbiAobikgewogICAgICAvLyBpZiAobiA8IDMyKSB7CiAgICAgIC8vIHZhciBoaWdoID0gKHRoaXMuaGlnaCA8PCBuKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbikpOwogICAgICAvLyB2YXIgbG93ID0gdGhpcy5sb3cgPDwgbjsKICAgICAgLy8gfSBlbHNlIHsKICAgICAgLy8gdmFyIGhpZ2ggPSB0aGlzLmxvdyA8PCAobiAtIDMyKTsKICAgICAgLy8gdmFyIGxvdyA9IDA7CiAgICAgIC8vIH0KCiAgICAgIC8vIHJldHVybiBYNjRXb3JkLmNyZWF0ZShoaWdoLCBsb3cpOwogICAgICAvLyB9LAoKICAgICAgLyoqDQogICAgICAgKiBTaGlmdHMgdGhpcyB3b3JkIG4gYml0cyB0byB0aGUgcmlnaHQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciBzaGlmdGluZy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgc2hpZnRlZCA9IHg2NFdvcmQuc2hpZnRSKDcpOw0KICAgICAgICovCiAgICAgIC8vIHNoaWZ0UjogZnVuY3Rpb24gKG4pIHsKICAgICAgLy8gaWYgKG4gPCAzMikgewogICAgICAvLyB2YXIgbG93ID0gKHRoaXMubG93ID4+PiBuKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbikpOwogICAgICAvLyB2YXIgaGlnaCA9IHRoaXMuaGlnaCA+Pj4gbjsKICAgICAgLy8gfSBlbHNlIHsKICAgICAgLy8gdmFyIGxvdyA9IHRoaXMuaGlnaCA+Pj4gKG4gLSAzMik7CiAgICAgIC8vIHZhciBoaWdoID0gMDsKICAgICAgLy8gfQoKICAgICAgLy8gcmV0dXJuIFg2NFdvcmQuY3JlYXRlKGhpZ2gsIGxvdyk7CiAgICAgIC8vIH0sCgogICAgICAvKioNCiAgICAgICAqIFJvdGF0ZXMgdGhpcyB3b3JkIG4gYml0cyB0byB0aGUgbGVmdC4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gcm90YXRlLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1g2NFdvcmR9IEEgbmV3IHg2NC1Xb3JkIG9iamVjdCBhZnRlciByb3RhdGluZy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgcm90YXRlZCA9IHg2NFdvcmQucm90TCgyNSk7DQogICAgICAgKi8KICAgICAgLy8gcm90TDogZnVuY3Rpb24gKG4pIHsKICAgICAgLy8gcmV0dXJuIHRoaXMuc2hpZnRMKG4pLm9yKHRoaXMuc2hpZnRSKDY0IC0gbikpOwogICAgICAvLyB9LAoKICAgICAgLyoqDQogICAgICAgKiBSb3RhdGVzIHRoaXMgd29yZCBuIGJpdHMgdG8gdGhlIHJpZ2h0Lg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byByb3RhdGUuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIHJvdGF0aW5nLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciByb3RhdGVkID0geDY0V29yZC5yb3RSKDcpOw0KICAgICAgICovCiAgICAgIC8vIHJvdFI6IGZ1bmN0aW9uIChuKSB7CiAgICAgIC8vIHJldHVybiB0aGlzLnNoaWZ0UihuKS5vcih0aGlzLnNoaWZ0TCg2NCAtIG4pKTsKICAgICAgLy8gfSwKCiAgICAgIC8qKg0KICAgICAgICogQWRkcyB0aGlzIHdvcmQgd2l0aCB0aGUgcGFzc2VkIHdvcmQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtYNjRXb3JkfSB3b3JkIFRoZSB4NjQtV29yZCB0byBhZGQgd2l0aCB0aGlzIHdvcmQuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7WDY0V29yZH0gQSBuZXcgeDY0LVdvcmQgb2JqZWN0IGFmdGVyIGFkZGluZy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgYWRkZWQgPSB4NjRXb3JkLmFkZChhbm90aGVyWDY0V29yZCk7DQogICAgICAgKi8KICAgICAgLy8gYWRkOiBmdW5jdGlvbiAod29yZCkgewogICAgICAvLyB2YXIgbG93ID0gKHRoaXMubG93ICsgd29yZC5sb3cpIHwgMDsKICAgICAgLy8gdmFyIGNhcnJ5ID0gKGxvdyA+Pj4gMCkgPCAodGhpcy5sb3cgPj4+IDApID8gMSA6IDA7CiAgICAgIC8vIHZhciBoaWdoID0gKHRoaXMuaGlnaCArIHdvcmQuaGlnaCArIGNhcnJ5KSB8IDA7CgogICAgICAvLyByZXR1cm4gWDY0V29yZC5jcmVhdGUoaGlnaCwgbG93KTsKICAgICAgLy8gfQogICAgfSk7CgogICAgLyoqDQogICAgICogQW4gYXJyYXkgb2YgNjQtYml0IHdvcmRzLg0KICAgICAqDQogICAgICogQHByb3BlcnR5IHtBcnJheX0gd29yZHMgVGhlIGFycmF5IG9mIENyeXB0b0pTLng2NC5Xb3JkIG9iamVjdHMuDQogICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5Lg0KICAgICAqLwogICAgdmFyIFg2NFdvcmRBcnJheSA9IENfeDY0LldvcmRBcnJheSA9IEJhc2UuZXh0ZW5kKHsKICAgICAgLyoqDQogICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyAoT3B0aW9uYWwpIEFuIGFycmF5IG9mIENyeXB0b0pTLng2NC5Xb3JkIG9iamVjdHMuDQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2lnQnl0ZXMgKE9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoZSB3b3Jkcy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMueDY0LldvcmRBcnJheS5jcmVhdGUoKTsNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLng2NC5Xb3JkQXJyYXkuY3JlYXRlKFsNCiAgICAgICAqICAgICAgICAgQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MDAwMTAyMDMsIDB4MDQwNTA2MDcpLA0KICAgICAgICogICAgICAgICBDcnlwdG9KUy54NjQuV29yZC5jcmVhdGUoMHgxODE5MWExYiwgMHgxYzFkMWUxZikNCiAgICAgICAqICAgICBdKTsNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLng2NC5Xb3JkQXJyYXkuY3JlYXRlKFsNCiAgICAgICAqICAgICAgICAgQ3J5cHRvSlMueDY0LldvcmQuY3JlYXRlKDB4MDAwMTAyMDMsIDB4MDQwNTA2MDcpLA0KICAgICAgICogICAgICAgICBDcnlwdG9KUy54NjQuV29yZC5jcmVhdGUoMHgxODE5MWExYiwgMHgxYzFkMWUxZikNCiAgICAgICAqICAgICBdLCAxMCk7DQogICAgICAgKi8KICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykgewogICAgICAgIHdvcmRzID0gdGhpcy53b3JkcyA9IHdvcmRzIHx8IFtdOwogICAgICAgIGlmIChzaWdCeXRlcyAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zaWdCeXRlcyA9IHdvcmRzLmxlbmd0aCAqIDg7CiAgICAgICAgfQogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENvbnZlcnRzIHRoaXMgNjQtYml0IHdvcmQgYXJyYXkgdG8gYSAzMi1iaXQgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtDcnlwdG9KUy5saWIuV29yZEFycmF5fSBUaGlzIHdvcmQgYXJyYXkncyBkYXRhIGFzIGEgMzItYml0IHdvcmQgYXJyYXkuDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHgzMldvcmRBcnJheSA9IHg2NFdvcmRBcnJheS50b1gzMigpOw0KICAgICAgICovCiAgICAgIHRvWDMyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIHg2NFdvcmRzID0gdGhpcy53b3JkczsKICAgICAgICB2YXIgeDY0V29yZHNMZW5ndGggPSB4NjRXb3Jkcy5sZW5ndGg7CgogICAgICAgIC8vIENvbnZlcnQKICAgICAgICB2YXIgeDMyV29yZHMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHg2NFdvcmRzTGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB4NjRXb3JkID0geDY0V29yZHNbaV07CiAgICAgICAgICB4MzJXb3Jkcy5wdXNoKHg2NFdvcmQuaGlnaCk7CiAgICAgICAgICB4MzJXb3Jkcy5wdXNoKHg2NFdvcmQubG93KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFgzMldvcmRBcnJheS5jcmVhdGUoeDMyV29yZHMsIHRoaXMuc2lnQnl0ZXMpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgd29yZCBhcnJheS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtYNjRXb3JkQXJyYXl9IFRoZSBjbG9uZS4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgY2xvbmUgPSB4NjRXb3JkQXJyYXkuY2xvbmUoKTsNCiAgICAgICAqLwogICAgICBjbG9uZTogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTsKCiAgICAgICAgLy8gQ2xvbmUgIndvcmRzIiBhcnJheQogICAgICAgIHZhciB3b3JkcyA9IGNsb25lLndvcmRzID0gdGhpcy53b3Jkcy5zbGljZSgwKTsKCiAgICAgICAgLy8gQ2xvbmUgZWFjaCBYNjRXb3JkIG9iamVjdAogICAgICAgIHZhciB3b3Jkc0xlbmd0aCA9IHdvcmRzLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzTGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdvcmRzW2ldID0gd29yZHNbaV0uY2xvbmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsb25lOwogICAgICB9CiAgICB9KTsKICB9KSgpOwogIChmdW5jdGlvbiAoTWF0aCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjsKICAgIHZhciBDX3g2NCA9IEMueDY0OwogICAgdmFyIFg2NFdvcmQgPSBDX3g2NC5Xb3JkOwogICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCiAgICAvLyBDb25zdGFudHMgdGFibGVzCiAgICB2YXIgUkhPX09GRlNFVFMgPSBbXTsKICAgIHZhciBQSV9JTkRFWEVTID0gW107CiAgICB2YXIgUk9VTkRfQ09OU1RBTlRTID0gW107CgogICAgLy8gQ29tcHV0ZSBDb25zdGFudHMKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgIC8vIENvbXB1dGUgcmhvIG9mZnNldCBjb25zdGFudHMKICAgICAgdmFyIHggPSAxLAogICAgICAgIHkgPSAwOwogICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDI0OyB0KyspIHsKICAgICAgICBSSE9fT0ZGU0VUU1t4ICsgNSAqIHldID0gKHQgKyAxKSAqICh0ICsgMikgLyAyICUgNjQ7CiAgICAgICAgdmFyIG5ld1ggPSB5ICUgNTsKICAgICAgICB2YXIgbmV3WSA9ICgyICogeCArIDMgKiB5KSAlIDU7CiAgICAgICAgeCA9IG5ld1g7CiAgICAgICAgeSA9IG5ld1k7CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgcGkgaW5kZXggY29uc3RhbnRzCiAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgNTsgeCsrKSB7CiAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCA1OyB5KyspIHsKICAgICAgICAgIFBJX0lOREVYRVNbeCArIDUgKiB5XSA9IHkgKyAoMiAqIHggKyAzICogeSkgJSA1ICogNTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgcm91bmQgY29uc3RhbnRzCiAgICAgIHZhciBMRlNSID0gMHgwMTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNDsgaSsrKSB7CiAgICAgICAgdmFyIHJvdW5kQ29uc3RhbnRNc3cgPSAwOwogICAgICAgIHZhciByb3VuZENvbnN0YW50THN3ID0gMDsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDc7IGorKykgewogICAgICAgICAgaWYgKExGU1IgJiAweDAxKSB7CiAgICAgICAgICAgIHZhciBiaXRQb3NpdGlvbiA9ICgxIDw8IGopIC0gMTsKICAgICAgICAgICAgaWYgKGJpdFBvc2l0aW9uIDwgMzIpIHsKICAgICAgICAgICAgICByb3VuZENvbnN0YW50THN3IF49IDEgPDwgYml0UG9zaXRpb247CiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoYml0UG9zaXRpb24gPj0gMzIpICovewogICAgICAgICAgICAgICAgcm91bmRDb25zdGFudE1zdyBePSAxIDw8IGJpdFBvc2l0aW9uIC0gMzI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8vIENvbXB1dGUgbmV4dCBMRlNSCiAgICAgICAgICBpZiAoTEZTUiAmIDB4ODApIHsKICAgICAgICAgICAgLy8gUHJpbWl0aXZlIHBvbHlub21pYWwgb3ZlciBHRigyKTogeF44ICsgeF42ICsgeF41ICsgeF40ICsgMQogICAgICAgICAgICBMRlNSID0gTEZTUiA8PCAxIF4gMHg3MTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIExGU1IgPDw9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFJPVU5EX0NPTlNUQU5UU1tpXSA9IFg2NFdvcmQuY3JlYXRlKHJvdW5kQ29uc3RhbnRNc3csIHJvdW5kQ29uc3RhbnRMc3cpOwogICAgICB9CiAgICB9KSgpOwoKICAgIC8vIFJldXNhYmxlIG9iamVjdHMgZm9yIHRlbXBvcmFyeSB2YWx1ZXMKICAgIHZhciBUID0gW107CiAgICAoZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHsKICAgICAgICBUW2ldID0gWDY0V29yZC5jcmVhdGUoKTsKICAgICAgfQogICAgfSkoKTsKCiAgICAvKioNCiAgICAgKiBTSEEtMyBoYXNoIGFsZ29yaXRobS4NCiAgICAgKi8KICAgIHZhciBTSEEzID0gQ19hbGdvLlNIQTMgPSBIYXNoZXIuZXh0ZW5kKHsKICAgICAgLyoqDQogICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuDQogICAgICAgKg0KICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IG91dHB1dExlbmd0aA0KICAgICAgICogICBUaGUgZGVzaXJlZCBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3V0cHV0IGhhc2guDQogICAgICAgKiAgIE9ubHkgdmFsdWVzIHBlcm1pdHRlZCBhcmU6IDIyNCwgMjU2LCAzODQsIDUxMi4NCiAgICAgICAqICAgRGVmYXVsdDogNTEyDQogICAgICAgKi8KICAgICAgY2ZnOiBIYXNoZXIuY2ZnLmV4dGVuZCh7CiAgICAgICAgb3V0cHV0TGVuZ3RoOiA1MTIKICAgICAgfSksCiAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGUgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHsKICAgICAgICAgIHN0YXRlW2ldID0gbmV3IFg2NFdvcmQuaW5pdCgpOwogICAgICAgIH0KICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9ICgxNjAwIC0gMiAqIHRoaXMuY2ZnLm91dHB1dExlbmd0aCkgLyAzMjsKICAgICAgfSwKICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fc3RhdGU7CiAgICAgICAgdmFyIG5CbG9ja1NpemVMYW5lcyA9IHRoaXMuYmxvY2tTaXplIC8gMjsKCiAgICAgICAgLy8gQWJzb3JiCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuQmxvY2tTaXplTGFuZXM7IGkrKykgewogICAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgICB2YXIgTTJpID0gTVtvZmZzZXQgKyAyICogaV07CiAgICAgICAgICB2YXIgTTJpMSA9IE1bb2Zmc2V0ICsgMiAqIGkgKyAxXTsKCiAgICAgICAgICAvLyBTd2FwIGVuZGlhbgogICAgICAgICAgTTJpID0gKE0yaSA8PCA4IHwgTTJpID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKE0yaSA8PCAyNCB8IE0yaSA+Pj4gOCkgJiAweGZmMDBmZjAwOwogICAgICAgICAgTTJpMSA9IChNMmkxIDw8IDggfCBNMmkxID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKE0yaTEgPDwgMjQgfCBNMmkxID4+PiA4KSAmIDB4ZmYwMGZmMDA7CgogICAgICAgICAgLy8gQWJzb3JiIG1lc3NhZ2UgaW50byBzdGF0ZQogICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVtpXTsKICAgICAgICAgIGxhbmUuaGlnaCBePSBNMmkxOwogICAgICAgICAgbGFuZS5sb3cgXj0gTTJpOwogICAgICAgIH0KCiAgICAgICAgLy8gUm91bmRzCiAgICAgICAgZm9yICh2YXIgcm91bmQgPSAwOyByb3VuZCA8IDI0OyByb3VuZCsrKSB7CiAgICAgICAgICAvLyBUaGV0YQogICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCA1OyB4KyspIHsKICAgICAgICAgICAgLy8gTWl4IGNvbHVtbiBsYW5lcwogICAgICAgICAgICB2YXIgdE1zdyA9IDAsCiAgICAgICAgICAgICAgdExzdyA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgNTsgeSsrKSB7CiAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVt4ICsgNSAqIHldOwogICAgICAgICAgICAgIHRNc3cgXj0gbGFuZS5oaWdoOwogICAgICAgICAgICAgIHRMc3cgXj0gbGFuZS5sb3c7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRlbXBvcmFyeSB2YWx1ZXMKICAgICAgICAgICAgdmFyIFR4ID0gVFt4XTsKICAgICAgICAgICAgVHguaGlnaCA9IHRNc3c7CiAgICAgICAgICAgIFR4LmxvdyA9IHRMc3c7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IDU7IHgrKykgewogICAgICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICAgICAgdmFyIFR4NCA9IFRbKHggKyA0KSAlIDVdOwogICAgICAgICAgICB2YXIgVHgxID0gVFsoeCArIDEpICUgNV07CiAgICAgICAgICAgIHZhciBUeDFNc3cgPSBUeDEuaGlnaDsKICAgICAgICAgICAgdmFyIFR4MUxzdyA9IFR4MS5sb3c7CgogICAgICAgICAgICAvLyBNaXggc3Vycm91bmRpbmcgY29sdW1ucwogICAgICAgICAgICB2YXIgdE1zdyA9IFR4NC5oaWdoIF4gKFR4MU1zdyA8PCAxIHwgVHgxTHN3ID4+PiAzMSk7CiAgICAgICAgICAgIHZhciB0THN3ID0gVHg0LmxvdyBeIChUeDFMc3cgPDwgMSB8IFR4MU1zdyA+Pj4gMzEpOwogICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykgewogICAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbeCArIDUgKiB5XTsKICAgICAgICAgICAgICBsYW5lLmhpZ2ggXj0gdE1zdzsKICAgICAgICAgICAgICBsYW5lLmxvdyBePSB0THN3OwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gUmhvIFBpCiAgICAgICAgICBmb3IgKHZhciBsYW5lSW5kZXggPSAxOyBsYW5lSW5kZXggPCAyNTsgbGFuZUluZGV4KyspIHsKICAgICAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgICAgIHZhciBsYW5lID0gc3RhdGVbbGFuZUluZGV4XTsKICAgICAgICAgICAgdmFyIGxhbmVNc3cgPSBsYW5lLmhpZ2g7CiAgICAgICAgICAgIHZhciBsYW5lTHN3ID0gbGFuZS5sb3c7CiAgICAgICAgICAgIHZhciByaG9PZmZzZXQgPSBSSE9fT0ZGU0VUU1tsYW5lSW5kZXhdOwoKICAgICAgICAgICAgLy8gUm90YXRlIGxhbmVzCiAgICAgICAgICAgIGlmIChyaG9PZmZzZXQgPCAzMikgewogICAgICAgICAgICAgIHZhciB0TXN3ID0gbGFuZU1zdyA8PCByaG9PZmZzZXQgfCBsYW5lTHN3ID4+PiAzMiAtIHJob09mZnNldDsKICAgICAgICAgICAgICB2YXIgdExzdyA9IGxhbmVMc3cgPDwgcmhvT2Zmc2V0IHwgbGFuZU1zdyA+Pj4gMzIgLSByaG9PZmZzZXQ7CiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAocmhvT2Zmc2V0ID49IDMyKSAqL3sKICAgICAgICAgICAgICAgIHZhciB0TXN3ID0gbGFuZUxzdyA8PCByaG9PZmZzZXQgLSAzMiB8IGxhbmVNc3cgPj4+IDY0IC0gcmhvT2Zmc2V0OwogICAgICAgICAgICAgICAgdmFyIHRMc3cgPSBsYW5lTXN3IDw8IHJob09mZnNldCAtIDMyIHwgbGFuZUxzdyA+Pj4gNjQgLSByaG9PZmZzZXQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVHJhbnNwb3NlIGxhbmVzCiAgICAgICAgICAgIHZhciBUUGlMYW5lID0gVFtQSV9JTkRFWEVTW2xhbmVJbmRleF1dOwogICAgICAgICAgICBUUGlMYW5lLmhpZ2ggPSB0TXN3OwogICAgICAgICAgICBUUGlMYW5lLmxvdyA9IHRMc3c7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gUmhvIHBpIGF0IHggPSB5ID0gMAogICAgICAgICAgdmFyIFQwID0gVFswXTsKICAgICAgICAgIHZhciBzdGF0ZTAgPSBzdGF0ZVswXTsKICAgICAgICAgIFQwLmhpZ2ggPSBzdGF0ZTAuaGlnaDsKICAgICAgICAgIFQwLmxvdyA9IHN0YXRlMC5sb3c7CgogICAgICAgICAgLy8gQ2hpCiAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IDU7IHgrKykgewogICAgICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IDU7IHkrKykgewogICAgICAgICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgICAgICAgIHZhciBsYW5lSW5kZXggPSB4ICsgNSAqIHk7CiAgICAgICAgICAgICAgdmFyIGxhbmUgPSBzdGF0ZVtsYW5lSW5kZXhdOwogICAgICAgICAgICAgIHZhciBUTGFuZSA9IFRbbGFuZUluZGV4XTsKICAgICAgICAgICAgICB2YXIgVHgxTGFuZSA9IFRbKHggKyAxKSAlIDUgKyA1ICogeV07CiAgICAgICAgICAgICAgdmFyIFR4MkxhbmUgPSBUWyh4ICsgMikgJSA1ICsgNSAqIHldOwoKICAgICAgICAgICAgICAvLyBNaXggcm93cwogICAgICAgICAgICAgIGxhbmUuaGlnaCA9IFRMYW5lLmhpZ2ggXiB+VHgxTGFuZS5oaWdoICYgVHgyTGFuZS5oaWdoOwogICAgICAgICAgICAgIGxhbmUubG93ID0gVExhbmUubG93IF4gflR4MUxhbmUubG93ICYgVHgyTGFuZS5sb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBJb3RhCiAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlWzBdOwogICAgICAgICAgdmFyIHJvdW5kQ29uc3RhbnQgPSBST1VORF9DT05TVEFOVFNbcm91bmRdOwogICAgICAgICAgbGFuZS5oaWdoIF49IHJvdW5kQ29uc3RhbnQuaGlnaDsKICAgICAgICAgIGxhbmUubG93IF49IHJvdW5kQ29uc3RhbnQubG93OwogICAgICAgICAgOwogICAgICAgIH0KICAgICAgfSwKICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7CiAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7CiAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODsKICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7CiAgICAgICAgdmFyIGJsb2NrU2l6ZUJpdHMgPSB0aGlzLmJsb2NrU2l6ZSAqIDMyOwoKICAgICAgICAvLyBBZGQgcGFkZGluZwogICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4MSA8PCAyNCAtIG5CaXRzTGVmdCAlIDMyOwogICAgICAgIGRhdGFXb3Jkc1soTWF0aC5jZWlsKChuQml0c0xlZnQgKyAxKSAvIGJsb2NrU2l6ZUJpdHMpICogYmxvY2tTaXplQml0cyA+Pj4gNSkgLSAxXSB8PSAweDgwOwogICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDsKCiAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3MKICAgICAgICB0aGlzLl9wcm9jZXNzKCk7CgogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX3N0YXRlOwogICAgICAgIHZhciBvdXRwdXRMZW5ndGhCeXRlcyA9IHRoaXMuY2ZnLm91dHB1dExlbmd0aCAvIDg7CiAgICAgICAgdmFyIG91dHB1dExlbmd0aExhbmVzID0gb3V0cHV0TGVuZ3RoQnl0ZXMgLyA4OwoKICAgICAgICAvLyBTcXVlZXplCiAgICAgICAgdmFyIGhhc2hXb3JkcyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0cHV0TGVuZ3RoTGFuZXM7IGkrKykgewogICAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgICB2YXIgbGFuZSA9IHN0YXRlW2ldOwogICAgICAgICAgdmFyIGxhbmVNc3cgPSBsYW5lLmhpZ2g7CiAgICAgICAgICB2YXIgbGFuZUxzdyA9IGxhbmUubG93OwoKICAgICAgICAgIC8vIFN3YXAgZW5kaWFuCiAgICAgICAgICBsYW5lTXN3ID0gKGxhbmVNc3cgPDwgOCB8IGxhbmVNc3cgPj4+IDI0KSAmIDB4MDBmZjAwZmYgfCAobGFuZU1zdyA8PCAyNCB8IGxhbmVNc3cgPj4+IDgpICYgMHhmZjAwZmYwMDsKICAgICAgICAgIGxhbmVMc3cgPSAobGFuZUxzdyA8PCA4IHwgbGFuZUxzdyA+Pj4gMjQpICYgMHgwMGZmMDBmZiB8IChsYW5lTHN3IDw8IDI0IHwgbGFuZUxzdyA+Pj4gOCkgJiAweGZmMDBmZjAwOwoKICAgICAgICAgIC8vIFNxdWVlemUgc3RhdGUgdG8gcmV0cmlldmUgaGFzaAogICAgICAgICAgaGFzaFdvcmRzLnB1c2gobGFuZUxzdyk7CiAgICAgICAgICBoYXNoV29yZHMucHVzaChsYW5lTXN3KTsKICAgICAgICB9CgogICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoCiAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdChoYXNoV29yZHMsIG91dHB1dExlbmd0aEJ5dGVzKTsKICAgICAgfSwKICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTsKICAgICAgICB2YXIgc3RhdGUgPSBjbG9uZS5fc3RhdGUgPSB0aGlzLl9zdGF0ZS5zbGljZSgwKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1OyBpKyspIHsKICAgICAgICAgIHN0YXRlW2ldID0gc3RhdGVbaV0uY2xvbmUoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsb25lOwogICAgICB9CiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLg0KICAgICAqDQogICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC4NCiAgICAgKg0KICAgICAqIEBzdGF0aWMNCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEzKCdtZXNzYWdlJyk7DQogICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMyh3b3JkQXJyYXkpOw0KICAgICAqLwogICAgQy5TSEEzID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoU0hBMyk7CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLg0KICAgICAqDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLg0KICAgICAqDQogICAgICogQHN0YXRpYw0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEEzKG1lc3NhZ2UsIGtleSk7DQogICAgICovCiAgICBDLkhtYWNTSEEzID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTMpOwogIH0pKE1hdGgpOwogIChmdW5jdGlvbiAoKSB7CiAgICAvLyBTaG9ydGN1dHMKICAgIHZhciBDID0gQ3J5cHRvSlM7CiAgICB2YXIgQ19saWIgPSBDLmxpYjsKICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7CiAgICB2YXIgQ194NjQgPSBDLng2NDsKICAgIHZhciBYNjRXb3JkID0gQ194NjQuV29yZDsKICAgIHZhciBYNjRXb3JkQXJyYXkgPSBDX3g2NC5Xb3JkQXJyYXk7CiAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwogICAgZnVuY3Rpb24gWDY0V29yZF9jcmVhdGUoKSB7CiAgICAgIHJldHVybiBYNjRXb3JkLmNyZWF0ZS5hcHBseShYNjRXb3JkLCBhcmd1bWVudHMpOwogICAgfQoKICAgIC8vIENvbnN0YW50cwogICAgdmFyIEsgPSBbWDY0V29yZF9jcmVhdGUoMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiksIFg2NFdvcmRfY3JlYXRlKDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QpLCBYNjRXb3JkX2NyZWF0ZSgweGI1YzBmYmNmLCAweGVjNGQzYjJmKSwgWDY0V29yZF9jcmVhdGUoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksIFg2NFdvcmRfY3JlYXRlKDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgpLCBYNjRXb3JkX2NyZWF0ZSgweDU5ZjExMWYxLCAweGI2MDVkMDE5KSwgWDY0V29yZF9jcmVhdGUoMHg5MjNmODJhNCwgMHhhZjE5NGY5YiksIFg2NFdvcmRfY3JlYXRlKDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgpLCBYNjRXb3JkX2NyZWF0ZSgweGQ4MDdhYTk4LCAweGEzMDMwMjQyKSwgWDY0V29yZF9jcmVhdGUoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksIFg2NFdvcmRfY3JlYXRlKDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMpLCBYNjRXb3JkX2NyZWF0ZSgweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyKSwgWDY0V29yZF9jcmVhdGUoMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiksIFg2NFdvcmRfY3JlYXRlKDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEpLCBYNjRXb3JkX2NyZWF0ZSgweDliZGMwNmE3LCAweDI1YzcxMjM1KSwgWDY0V29yZF9jcmVhdGUoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksIFg2NFdvcmRfY3JlYXRlKDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIpLCBYNjRXb3JkX2NyZWF0ZSgweGVmYmU0Nzg2LCAweDM4NGYyNWUzKSwgWDY0V29yZF9jcmVhdGUoMHgwZmMxOWRjNiwgMHg4YjhjZDViNSksIFg2NFdvcmRfY3JlYXRlKDB4MjQwY2ExY2MsIDB4NzdhYzljNjUpLCBYNjRXb3JkX2NyZWF0ZSgweDJkZTkyYzZmLCAweDU5MmIwMjc1KSwgWDY0V29yZF9jcmVhdGUoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksIFg2NFdvcmRfY3JlYXRlKDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQpLCBYNjRXb3JkX2NyZWF0ZSgweDc2Zjk4OGRhLCAweDgzMTE1M2I1KSwgWDY0V29yZF9jcmVhdGUoMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiksIFg2NFdvcmRfY3JlYXRlKDB4YTgzMWM2NmQsIDB4MmRiNDMyMTApLCBYNjRXb3JkX2NyZWF0ZSgweGIwMDMyN2M4LCAweDk4ZmIyMTNmKSwgWDY0V29yZF9jcmVhdGUoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksIFg2NFdvcmRfY3JlYXRlKDB4YzZlMDBiZjMsIDB4M2RhODhmYzIpLCBYNjRXb3JkX2NyZWF0ZSgweGQ1YTc5MTQ3LCAweDkzMGFhNzI1KSwgWDY0V29yZF9jcmVhdGUoMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiksIFg2NFdvcmRfY3JlYXRlKDB4MTQyOTI5NjcsIDB4MGEwZTZlNzApLCBYNjRXb3JkX2NyZWF0ZSgweDI3YjcwYTg1LCAweDQ2ZDIyZmZjKSwgWDY0V29yZF9jcmVhdGUoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksIFg2NFdvcmRfY3JlYXRlKDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQpLCBYNjRXb3JkX2NyZWF0ZSgweDUzMzgwZDEzLCAweDlkOTViM2RmKSwgWDY0V29yZF9jcmVhdGUoMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSksIFg2NFdvcmRfY3JlYXRlKDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgpLCBYNjRXb3JkX2NyZWF0ZSgweDgxYzJjOTJlLCAweDQ3ZWRhZWU2KSwgWDY0V29yZF9jcmVhdGUoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksIFg2NFdvcmRfY3JlYXRlKDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQpLCBYNjRXb3JkX2NyZWF0ZSgweGE4MWE2NjRiLCAweGJjNDIzMDAxKSwgWDY0V29yZF9jcmVhdGUoMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSksIFg2NFdvcmRfY3JlYXRlKDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzApLCBYNjRXb3JkX2NyZWF0ZSgweGQxOTJlODE5LCAweGQ2ZWY1MjE4KSwgWDY0V29yZF9jcmVhdGUoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksIFg2NFdvcmRfY3JlYXRlKDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEpLCBYNjRXb3JkX2NyZWF0ZSgweDEwNmFhMDcwLCAweDMyYmJkMWI4KSwgWDY0V29yZF9jcmVhdGUoMHgxOWE0YzExNiwgMHhiOGQyZDBjOCksIFg2NFdvcmRfY3JlYXRlKDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMpLCBYNjRXb3JkX2NyZWF0ZSgweDI3NDg3NzRjLCAweGRmOGVlYjk5KSwgWDY0V29yZF9jcmVhdGUoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksIFg2NFdvcmRfY3JlYXRlKDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMpLCBYNjRXb3JkX2NyZWF0ZSgweDRlZDhhYTRhLCAweGUzNDE4YWNiKSwgWDY0V29yZF9jcmVhdGUoMHg1YjljY2E0ZiwgMHg3NzYzZTM3MyksIFg2NFdvcmRfY3JlYXRlKDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMpLCBYNjRXb3JkX2NyZWF0ZSgweDc0OGY4MmVlLCAweDVkZWZiMmZjKSwgWDY0V29yZF9jcmVhdGUoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksIFg2NFdvcmRfY3JlYXRlKDB4ODRjODc4MTQsIDB4YTFmMGFiNzIpLCBYNjRXb3JkX2NyZWF0ZSgweDhjYzcwMjA4LCAweDFhNjQzOWVjKSwgWDY0V29yZF9jcmVhdGUoMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCksIFg2NFdvcmRfY3JlYXRlKDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTkpLCBYNjRXb3JkX2NyZWF0ZSgweGJlZjlhM2Y3LCAweGIyYzY3OTE1KSwgWDY0V29yZF9jcmVhdGUoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksIFg2NFdvcmRfY3JlYXRlKDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMpLCBYNjRXb3JkX2NyZWF0ZSgweGQxODZiOGM3LCAweDIxYzBjMjA3KSwgWDY0V29yZF9jcmVhdGUoMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSksIFg2NFdvcmRfY3JlYXRlKDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgpLCBYNjRXb3JkX2NyZWF0ZSgweDA2ZjA2N2FhLCAweDcyMTc2ZmJhKSwgWDY0V29yZF9jcmVhdGUoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksIFg2NFdvcmRfY3JlYXRlKDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUpLCBYNjRXb3JkX2NyZWF0ZSgweDFiNzEwYjM1LCAweDEzMWM0NzFiKSwgWDY0V29yZF9jcmVhdGUoMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCksIFg2NFdvcmRfY3JlYXRlKDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMpLCBYNjRXb3JkX2NyZWF0ZSgweDNjOWViZTBhLCAweDE1YzliZWJjKSwgWDY0V29yZF9jcmVhdGUoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksIFg2NFdvcmRfY3JlYXRlKDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYpLCBYNjRXb3JkX2NyZWF0ZSgweDU5N2YyOTljLCAweGZjNjU3ZTJhKSwgWDY0V29yZF9jcmVhdGUoMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYyksIFg2NFdvcmRfY3JlYXRlKDB4NmM0NDE5OGMsIDB4NGE0NzU4MTcpXTsKCiAgICAvLyBSZXVzYWJsZSBvYmplY3RzCiAgICB2YXIgVyA9IFtdOwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7CiAgICAgICAgV1tpXSA9IFg2NFdvcmRfY3JlYXRlKCk7CiAgICAgIH0KICAgIH0pKCk7CgogICAgLyoqDQogICAgICogU0hBLTUxMiBoYXNoIGFsZ29yaXRobS4NCiAgICAgKi8KICAgIHZhciBTSEE1MTIgPSBDX2FsZ28uU0hBNTEyID0gSGFzaGVyLmV4dGVuZCh7CiAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBYNjRXb3JkQXJyYXkuaW5pdChbbmV3IFg2NFdvcmQuaW5pdCgweDZhMDllNjY3LCAweGYzYmNjOTA4KSwgbmV3IFg2NFdvcmQuaW5pdCgweGJiNjdhZTg1LCAweDg0Y2FhNzNiKSwgbmV3IFg2NFdvcmQuaW5pdCgweDNjNmVmMzcyLCAweGZlOTRmODJiKSwgbmV3IFg2NFdvcmQuaW5pdCgweGE1NGZmNTNhLCAweDVmMWQzNmYxKSwgbmV3IFg2NFdvcmQuaW5pdCgweDUxMGU1MjdmLCAweGFkZTY4MmQxKSwgbmV3IFg2NFdvcmQuaW5pdCgweDliMDU2ODhjLCAweDJiM2U2YzFmKSwgbmV3IFg2NFdvcmQuaW5pdCgweDFmODNkOWFiLCAweGZiNDFiZDZiKSwgbmV3IFg2NFdvcmQuaW5pdCgweDViZTBjZDE5LCAweDEzN2UyMTc5KV0pOwogICAgICB9LAogICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7CiAgICAgICAgdmFyIEgwID0gSFswXTsKICAgICAgICB2YXIgSDEgPSBIWzFdOwogICAgICAgIHZhciBIMiA9IEhbMl07CiAgICAgICAgdmFyIEgzID0gSFszXTsKICAgICAgICB2YXIgSDQgPSBIWzRdOwogICAgICAgIHZhciBINSA9IEhbNV07CiAgICAgICAgdmFyIEg2ID0gSFs2XTsKICAgICAgICB2YXIgSDcgPSBIWzddOwogICAgICAgIHZhciBIMGggPSBIMC5oaWdoOwogICAgICAgIHZhciBIMGwgPSBIMC5sb3c7CiAgICAgICAgdmFyIEgxaCA9IEgxLmhpZ2g7CiAgICAgICAgdmFyIEgxbCA9IEgxLmxvdzsKICAgICAgICB2YXIgSDJoID0gSDIuaGlnaDsKICAgICAgICB2YXIgSDJsID0gSDIubG93OwogICAgICAgIHZhciBIM2ggPSBIMy5oaWdoOwogICAgICAgIHZhciBIM2wgPSBIMy5sb3c7CiAgICAgICAgdmFyIEg0aCA9IEg0LmhpZ2g7CiAgICAgICAgdmFyIEg0bCA9IEg0LmxvdzsKICAgICAgICB2YXIgSDVoID0gSDUuaGlnaDsKICAgICAgICB2YXIgSDVsID0gSDUubG93OwogICAgICAgIHZhciBINmggPSBINi5oaWdoOwogICAgICAgIHZhciBINmwgPSBINi5sb3c7CiAgICAgICAgdmFyIEg3aCA9IEg3LmhpZ2g7CiAgICAgICAgdmFyIEg3bCA9IEg3LmxvdzsKCiAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXMKICAgICAgICB2YXIgYWggPSBIMGg7CiAgICAgICAgdmFyIGFsID0gSDBsOwogICAgICAgIHZhciBiaCA9IEgxaDsKICAgICAgICB2YXIgYmwgPSBIMWw7CiAgICAgICAgdmFyIGNoID0gSDJoOwogICAgICAgIHZhciBjbCA9IEgybDsKICAgICAgICB2YXIgZGggPSBIM2g7CiAgICAgICAgdmFyIGRsID0gSDNsOwogICAgICAgIHZhciBlaCA9IEg0aDsKICAgICAgICB2YXIgZWwgPSBINGw7CiAgICAgICAgdmFyIGZoID0gSDVoOwogICAgICAgIHZhciBmbCA9IEg1bDsKICAgICAgICB2YXIgZ2ggPSBINmg7CiAgICAgICAgdmFyIGdsID0gSDZsOwogICAgICAgIHZhciBoaCA9IEg3aDsKICAgICAgICB2YXIgaGwgPSBIN2w7CgogICAgICAgIC8vIFJvdW5kcwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODA7IGkrKykgewogICAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICAgIHZhciBXaSA9IFdbaV07CgogICAgICAgICAgLy8gRXh0ZW5kIG1lc3NhZ2UKICAgICAgICAgIGlmIChpIDwgMTYpIHsKICAgICAgICAgICAgdmFyIFdpaCA9IFdpLmhpZ2ggPSBNW29mZnNldCArIGkgKiAyXSB8IDA7CiAgICAgICAgICAgIHZhciBXaWwgPSBXaS5sb3cgPSBNW29mZnNldCArIGkgKiAyICsgMV0gfCAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gR2FtbWEwCiAgICAgICAgICAgIHZhciBnYW1tYTB4ID0gV1tpIC0gMTVdOwogICAgICAgICAgICB2YXIgZ2FtbWEweGggPSBnYW1tYTB4LmhpZ2g7CiAgICAgICAgICAgIHZhciBnYW1tYTB4bCA9IGdhbW1hMHgubG93OwogICAgICAgICAgICB2YXIgZ2FtbWEwaCA9IChnYW1tYTB4aCA+Pj4gMSB8IGdhbW1hMHhsIDw8IDMxKSBeIChnYW1tYTB4aCA+Pj4gOCB8IGdhbW1hMHhsIDw8IDI0KSBeIGdhbW1hMHhoID4+PiA3OwogICAgICAgICAgICB2YXIgZ2FtbWEwbCA9IChnYW1tYTB4bCA+Pj4gMSB8IGdhbW1hMHhoIDw8IDMxKSBeIChnYW1tYTB4bCA+Pj4gOCB8IGdhbW1hMHhoIDw8IDI0KSBeIChnYW1tYTB4bCA+Pj4gNyB8IGdhbW1hMHhoIDw8IDI1KTsKCiAgICAgICAgICAgIC8vIEdhbW1hMQogICAgICAgICAgICB2YXIgZ2FtbWExeCA9IFdbaSAtIDJdOwogICAgICAgICAgICB2YXIgZ2FtbWExeGggPSBnYW1tYTF4LmhpZ2g7CiAgICAgICAgICAgIHZhciBnYW1tYTF4bCA9IGdhbW1hMXgubG93OwogICAgICAgICAgICB2YXIgZ2FtbWExaCA9IChnYW1tYTF4aCA+Pj4gMTkgfCBnYW1tYTF4bCA8PCAxMykgXiAoZ2FtbWExeGggPDwgMyB8IGdhbW1hMXhsID4+PiAyOSkgXiBnYW1tYTF4aCA+Pj4gNjsKICAgICAgICAgICAgdmFyIGdhbW1hMWwgPSAoZ2FtbWExeGwgPj4+IDE5IHwgZ2FtbWExeGggPDwgMTMpIF4gKGdhbW1hMXhsIDw8IDMgfCBnYW1tYTF4aCA+Pj4gMjkpIF4gKGdhbW1hMXhsID4+PiA2IHwgZ2FtbWExeGggPDwgMjYpOwoKICAgICAgICAgICAgLy8gV1tpXSA9IGdhbW1hMCArIFdbaSAtIDddICsgZ2FtbWExICsgV1tpIC0gMTZdCiAgICAgICAgICAgIHZhciBXaTcgPSBXW2kgLSA3XTsKICAgICAgICAgICAgdmFyIFdpN2ggPSBXaTcuaGlnaDsKICAgICAgICAgICAgdmFyIFdpN2wgPSBXaTcubG93OwogICAgICAgICAgICB2YXIgV2kxNiA9IFdbaSAtIDE2XTsKICAgICAgICAgICAgdmFyIFdpMTZoID0gV2kxNi5oaWdoOwogICAgICAgICAgICB2YXIgV2kxNmwgPSBXaTE2LmxvdzsKICAgICAgICAgICAgdmFyIFdpbCA9IGdhbW1hMGwgKyBXaTdsOwogICAgICAgICAgICB2YXIgV2loID0gZ2FtbWEwaCArIFdpN2ggKyAoV2lsID4+PiAwIDwgZ2FtbWEwbCA+Pj4gMCA/IDEgOiAwKTsKICAgICAgICAgICAgdmFyIFdpbCA9IFdpbCArIGdhbW1hMWw7CiAgICAgICAgICAgIHZhciBXaWggPSBXaWggKyBnYW1tYTFoICsgKFdpbCA+Pj4gMCA8IGdhbW1hMWwgPj4+IDAgPyAxIDogMCk7CiAgICAgICAgICAgIHZhciBXaWwgPSBXaWwgKyBXaTE2bDsKICAgICAgICAgICAgdmFyIFdpaCA9IFdpaCArIFdpMTZoICsgKFdpbCA+Pj4gMCA8IFdpMTZsID4+PiAwID8gMSA6IDApOwogICAgICAgICAgICBXaS5oaWdoID0gV2loOwogICAgICAgICAgICBXaS5sb3cgPSBXaWw7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY2hoID0gZWggJiBmaCBeIH5laCAmIGdoOwogICAgICAgICAgdmFyIGNobCA9IGVsICYgZmwgXiB+ZWwgJiBnbDsKICAgICAgICAgIHZhciBtYWpoID0gYWggJiBiaCBeIGFoICYgY2ggXiBiaCAmIGNoOwogICAgICAgICAgdmFyIG1hamwgPSBhbCAmIGJsIF4gYWwgJiBjbCBeIGJsICYgY2w7CiAgICAgICAgICB2YXIgc2lnbWEwaCA9IChhaCA+Pj4gMjggfCBhbCA8PCA0KSBeIChhaCA8PCAzMCB8IGFsID4+PiAyKSBeIChhaCA8PCAyNSB8IGFsID4+PiA3KTsKICAgICAgICAgIHZhciBzaWdtYTBsID0gKGFsID4+PiAyOCB8IGFoIDw8IDQpIF4gKGFsIDw8IDMwIHwgYWggPj4+IDIpIF4gKGFsIDw8IDI1IHwgYWggPj4+IDcpOwogICAgICAgICAgdmFyIHNpZ21hMWggPSAoZWggPj4+IDE0IHwgZWwgPDwgMTgpIF4gKGVoID4+PiAxOCB8IGVsIDw8IDE0KSBeIChlaCA8PCAyMyB8IGVsID4+PiA5KTsKICAgICAgICAgIHZhciBzaWdtYTFsID0gKGVsID4+PiAxNCB8IGVoIDw8IDE4KSBeIChlbCA+Pj4gMTggfCBlaCA8PCAxNCkgXiAoZWwgPDwgMjMgfCBlaCA+Pj4gOSk7CgogICAgICAgICAgLy8gdDEgPSBoICsgc2lnbWExICsgY2ggKyBLW2ldICsgV1tpXQogICAgICAgICAgdmFyIEtpID0gS1tpXTsKICAgICAgICAgIHZhciBLaWggPSBLaS5oaWdoOwogICAgICAgICAgdmFyIEtpbCA9IEtpLmxvdzsKICAgICAgICAgIHZhciB0MWwgPSBobCArIHNpZ21hMWw7CiAgICAgICAgICB2YXIgdDFoID0gaGggKyBzaWdtYTFoICsgKHQxbCA+Pj4gMCA8IGhsID4+PiAwID8gMSA6IDApOwogICAgICAgICAgdmFyIHQxbCA9IHQxbCArIGNobDsKICAgICAgICAgIHZhciB0MWggPSB0MWggKyBjaGggKyAodDFsID4+PiAwIDwgY2hsID4+PiAwID8gMSA6IDApOwogICAgICAgICAgdmFyIHQxbCA9IHQxbCArIEtpbDsKICAgICAgICAgIHZhciB0MWggPSB0MWggKyBLaWggKyAodDFsID4+PiAwIDwgS2lsID4+PiAwID8gMSA6IDApOwogICAgICAgICAgdmFyIHQxbCA9IHQxbCArIFdpbDsKICAgICAgICAgIHZhciB0MWggPSB0MWggKyBXaWggKyAodDFsID4+PiAwIDwgV2lsID4+PiAwID8gMSA6IDApOwoKICAgICAgICAgIC8vIHQyID0gc2lnbWEwICsgbWFqCiAgICAgICAgICB2YXIgdDJsID0gc2lnbWEwbCArIG1hamw7CiAgICAgICAgICB2YXIgdDJoID0gc2lnbWEwaCArIG1hamggKyAodDJsID4+PiAwIDwgc2lnbWEwbCA+Pj4gMCA/IDEgOiAwKTsKCiAgICAgICAgICAvLyBVcGRhdGUgd29ya2luZyB2YXJpYWJsZXMKICAgICAgICAgIGhoID0gZ2g7CiAgICAgICAgICBobCA9IGdsOwogICAgICAgICAgZ2ggPSBmaDsKICAgICAgICAgIGdsID0gZmw7CiAgICAgICAgICBmaCA9IGVoOwogICAgICAgICAgZmwgPSBlbDsKICAgICAgICAgIGVsID0gZGwgKyB0MWwgfCAwOwogICAgICAgICAgZWggPSBkaCArIHQxaCArIChlbCA+Pj4gMCA8IGRsID4+PiAwID8gMSA6IDApIHwgMDsKICAgICAgICAgIGRoID0gY2g7CiAgICAgICAgICBkbCA9IGNsOwogICAgICAgICAgY2ggPSBiaDsKICAgICAgICAgIGNsID0gYmw7CiAgICAgICAgICBiaCA9IGFoOwogICAgICAgICAgYmwgPSBhbDsKICAgICAgICAgIGFsID0gdDFsICsgdDJsIHwgMDsKICAgICAgICAgIGFoID0gdDFoICsgdDJoICsgKGFsID4+PiAwIDwgdDFsID4+PiAwID8gMSA6IDApIHwgMDsKICAgICAgICB9CgogICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlCiAgICAgICAgSDBsID0gSDAubG93ID0gSDBsICsgYWw7CiAgICAgICAgSDAuaGlnaCA9IEgwaCArIGFoICsgKEgwbCA+Pj4gMCA8IGFsID4+PiAwID8gMSA6IDApOwogICAgICAgIEgxbCA9IEgxLmxvdyA9IEgxbCArIGJsOwogICAgICAgIEgxLmhpZ2ggPSBIMWggKyBiaCArIChIMWwgPj4+IDAgPCBibCA+Pj4gMCA/IDEgOiAwKTsKICAgICAgICBIMmwgPSBIMi5sb3cgPSBIMmwgKyBjbDsKICAgICAgICBIMi5oaWdoID0gSDJoICsgY2ggKyAoSDJsID4+PiAwIDwgY2wgPj4+IDAgPyAxIDogMCk7CiAgICAgICAgSDNsID0gSDMubG93ID0gSDNsICsgZGw7CiAgICAgICAgSDMuaGlnaCA9IEgzaCArIGRoICsgKEgzbCA+Pj4gMCA8IGRsID4+PiAwID8gMSA6IDApOwogICAgICAgIEg0bCA9IEg0LmxvdyA9IEg0bCArIGVsOwogICAgICAgIEg0LmhpZ2ggPSBINGggKyBlaCArIChINGwgPj4+IDAgPCBlbCA+Pj4gMCA/IDEgOiAwKTsKICAgICAgICBINWwgPSBINS5sb3cgPSBINWwgKyBmbDsKICAgICAgICBINS5oaWdoID0gSDVoICsgZmggKyAoSDVsID4+PiAwIDwgZmwgPj4+IDAgPyAxIDogMCk7CiAgICAgICAgSDZsID0gSDYubG93ID0gSDZsICsgZ2w7CiAgICAgICAgSDYuaGlnaCA9IEg2aCArIGdoICsgKEg2bCA+Pj4gMCA8IGdsID4+PiAwID8gMSA6IDApOwogICAgICAgIEg3bCA9IEg3LmxvdyA9IEg3bCArIGhsOwogICAgICAgIEg3LmhpZ2ggPSBIN2ggKyBoaCArIChIN2wgPj4+IDAgPCBobCA+Pj4gMCA/IDEgOiAwKTsKICAgICAgfSwKICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7CiAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7CiAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODsKICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7CgogICAgICAgIC8vIEFkZCBwYWRkaW5nCiAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHg4MCA8PCAyNCAtIG5CaXRzTGVmdCAlIDMyOwogICAgICAgIGRhdGFXb3Jkc1sobkJpdHNMZWZ0ICsgMTI4ID4+PiAxMCA8PCA1KSArIDMwXSA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTsKICAgICAgICBkYXRhV29yZHNbKG5CaXRzTGVmdCArIDEyOCA+Pj4gMTAgPDwgNSkgKyAzMV0gPSBuQml0c1RvdGFsOwogICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDsKCiAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3MKICAgICAgICB0aGlzLl9wcm9jZXNzKCk7CgogICAgICAgIC8vIENvbnZlcnQgaGFzaCB0byAzMi1iaXQgd29yZCBhcnJheSBiZWZvcmUgcmV0dXJuaW5nCiAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoLnRvWDMyKCk7CgogICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoCiAgICAgICAgcmV0dXJuIGhhc2g7CiAgICAgIH0sCiAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7CiAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7CiAgICAgICAgcmV0dXJuIGNsb25lOwogICAgICB9LAogICAgICBibG9ja1NpemU6IDEwMjQgLyAzMgogICAgfSk7CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICoNCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4NCiAgICAgKg0KICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guDQogICAgICoNCiAgICAgKiBAc3RhdGljDQogICAgICoNCiAgICAgKiBAZXhhbXBsZQ0KICAgICAqDQogICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBNTEyKCdtZXNzYWdlJyk7DQogICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBNTEyKHdvcmRBcnJheSk7DQogICAgICovCiAgICBDLlNIQTUxMiA9IEhhc2hlci5fY3JlYXRlSGVscGVyKFNIQTUxMik7CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLg0KICAgICAqDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guDQogICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuDQogICAgICoNCiAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLg0KICAgICAqDQogICAgICogQHN0YXRpYw0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEE1MTIobWVzc2FnZSwga2V5KTsNCiAgICAgKi8KICAgIEMuSG1hY1NIQTUxMiA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihTSEE1MTIpOwogIH0pKCk7CiAgKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNob3J0Y3V0cwogICAgdmFyIEMgPSBDcnlwdG9KUzsKICAgIHZhciBDX3g2NCA9IEMueDY0OwogICAgdmFyIFg2NFdvcmQgPSBDX3g2NC5Xb3JkOwogICAgdmFyIFg2NFdvcmRBcnJheSA9IENfeDY0LldvcmRBcnJheTsKICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CiAgICB2YXIgU0hBNTEyID0gQ19hbGdvLlNIQTUxMjsKCiAgICAvKioNCiAgICAgKiBTSEEtMzg0IGhhc2ggYWxnb3JpdGhtLg0KICAgICAqLwogICAgdmFyIFNIQTM4NCA9IENfYWxnby5TSEEzODQgPSBTSEE1MTIuZXh0ZW5kKHsKICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFg2NFdvcmRBcnJheS5pbml0KFtuZXcgWDY0V29yZC5pbml0KDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgpLCBuZXcgWDY0V29yZC5pbml0KDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcpLCBuZXcgWDY0V29yZC5pbml0KDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcpLCBuZXcgWDY0V29yZC5pbml0KDB4MTUyZmVjZDgsIDB4ZjcwZTU5MzkpLCBuZXcgWDY0V29yZC5pbml0KDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEpLCBuZXcgWDY0V29yZC5pbml0KDB4OGViNDRhODcsIDB4Njg1ODE1MTEpLCBuZXcgWDY0V29yZC5pbml0KDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcpLCBuZXcgWDY0V29yZC5pbml0KDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQpXSk7CiAgICAgIH0sCiAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGhhc2ggPSBTSEE1MTIuX2RvRmluYWxpemUuY2FsbCh0aGlzKTsKICAgICAgICBoYXNoLnNpZ0J5dGVzIC09IDE2OwogICAgICAgIHJldHVybiBoYXNoOwogICAgICB9CiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLg0KICAgICAqDQogICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC4NCiAgICAgKg0KICAgICAqIEBzdGF0aWMNCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEzODQoJ21lc3NhZ2UnKTsNCiAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEEzODQod29yZEFycmF5KTsNCiAgICAgKi8KICAgIEMuU0hBMzg0ID0gU0hBNTEyLl9jcmVhdGVIZWxwZXIoU0hBMzg0KTsKCiAgICAvKioNCiAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICoNCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC4NCiAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS4NCiAgICAgKg0KICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuDQogICAgICoNCiAgICAgKiBAc3RhdGljDQogICAgICoNCiAgICAgKiBAZXhhbXBsZQ0KICAgICAqDQogICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTM4NChtZXNzYWdlLCBrZXkpOw0KICAgICAqLwogICAgQy5IbWFjU0hBMzg0ID0gU0hBNTEyLl9jcmVhdGVIbWFjSGVscGVyKFNIQTM4NCk7CiAgfSkoKTsKCiAgLyoqDQogICAqIENpcGhlciBjb3JlIGNvbXBvbmVudHMuDQogICAqLwogIENyeXB0b0pTLmxpYi5DaXBoZXIgfHwgZnVuY3Rpb24gKHVuZGVmaW5lZCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtOwogICAgdmFyIENfZW5jID0gQy5lbmM7CiAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7CiAgICB2YXIgQmFzZTY0ID0gQ19lbmMuQmFzZTY0OwogICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKICAgIHZhciBFdnBLREYgPSBDX2FsZ28uRXZwS0RGOwoKICAgIC8qKg0KICAgICAqIEFic3RyYWN0IGJhc2UgY2lwaGVyIHRlbXBsYXRlLg0KICAgICAqDQogICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhpcyBjaXBoZXIncyBrZXkgc2l6ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpDQogICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl2U2l6ZSBUaGlzIGNpcGhlcidzIElWIHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKQ0KICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfRU5DX1hGT1JNX01PREUgQSBjb25zdGFudCByZXByZXNlbnRpbmcgZW5jcnlwdGlvbiBtb2RlLg0KICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfREVDX1hGT1JNX01PREUgQSBjb25zdGFudCByZXByZXNlbnRpbmcgZGVjcnlwdGlvbiBtb2RlLg0KICAgICAqLwogICAgdmFyIENpcGhlciA9IENfbGliLkNpcGhlciA9IEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uZXh0ZW5kKHsKICAgICAgLyoqDQogICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuDQogICAgICAgKg0KICAgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGl2IFRoZSBJViB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLg0KICAgICAgICovCiAgICAgIGNmZzogQmFzZS5leHRlbmQoKSwKICAgICAgLyoqDQogICAgICAgKiBDcmVhdGVzIHRoaXMgY2lwaGVyIGluIGVuY3J5cHRpb24gbW9kZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuDQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVFbmNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTsNCiAgICAgICAqLwogICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChrZXksIGNmZykgewogICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSwga2V5LCBjZmcpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENyZWF0ZXMgdGhpcyBjaXBoZXIgaW4gZGVjcnlwdGlvbiBtb2RlLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS4NCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZURlY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pOw0KICAgICAgICovCiAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMuX0RFQ19YRk9STV9NT0RFLCBrZXksIGNmZyk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlci4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge251bWJlcn0geGZvcm1Nb2RlIEVpdGhlciB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHRyYW5zb3JtYXRpb24gbW9kZSBjb25zdGFudC4NCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS4NCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZShDcnlwdG9KUy5hbGdvLkFFUy5fRU5DX1hGT1JNX01PREUsIGtleVdvcmRBcnJheSwgeyBpdjogaXZXb3JkQXJyYXkgfSk7DQogICAgICAgKi8KICAgICAgaW5pdDogZnVuY3Rpb24gKHhmb3JtTW9kZSwga2V5LCBjZmcpIHsKICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHMKICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpOwoKICAgICAgICAvLyBTdG9yZSB0cmFuc2Zvcm0gbW9kZSBhbmQga2V5CiAgICAgICAgdGhpcy5feGZvcm1Nb2RlID0geGZvcm1Nb2RlOwogICAgICAgIHRoaXMuX2tleSA9IGtleTsKCiAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzCiAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIFJlc2V0cyB0aGlzIGNpcGhlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICBjaXBoZXIucmVzZXQoKTsNCiAgICAgICAqLwogICAgICByZXNldDogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFJlc2V0IGRhdGEgYnVmZmVyCiAgICAgICAgQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldC5jYWxsKHRoaXMpOwoKICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWNpcGhlciBsb2dpYwogICAgICAgIHRoaXMuX2RvUmVzZXQoKTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBBZGRzIGRhdGEgdG8gYmUgZW5jcnlwdGVkIG9yIGRlY3J5cHRlZC4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgcHJvY2Vzc2luZy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3MoJ2RhdGEnKTsNCiAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3Mod29yZEFycmF5KTsNCiAgICAgICAqLwogICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkgewogICAgICAgIC8vIEFwcGVuZAogICAgICAgIHRoaXMuX2FwcGVuZChkYXRhVXBkYXRlKTsKCiAgICAgICAgLy8gUHJvY2VzcyBhdmFpbGFibGUgYmxvY2tzCiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3MoKTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBGaW5hbGl6ZXMgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBwcm9jZXNzLg0KICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGZpbmFsIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgZmluYWwgcHJvY2Vzc2luZy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKCk7DQogICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSgnZGF0YScpOw0KICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUod29yZEFycmF5KTsNCiAgICAgICAqLwogICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKGRhdGFVcGRhdGUpIHsKICAgICAgICAvLyBGaW5hbCBkYXRhIHVwZGF0ZQogICAgICAgIGlmIChkYXRhVXBkYXRlKSB7CiAgICAgICAgICB0aGlzLl9hcHBlbmQoZGF0YVVwZGF0ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWNpcGhlciBsb2dpYwogICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZERhdGEgPSB0aGlzLl9kb0ZpbmFsaXplKCk7CiAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkRGF0YTsKICAgICAgfSwKICAgICAga2V5U2l6ZTogMTI4IC8gMzIsCiAgICAgIGl2U2l6ZTogMTI4IC8gMzIsCiAgICAgIF9FTkNfWEZPUk1fTU9ERTogMSwKICAgICAgX0RFQ19YRk9STV9NT0RFOiAyLAogICAgICAvKioNCiAgICAgICAqIENyZWF0ZXMgc2hvcnRjdXQgZnVuY3Rpb25zIHRvIGEgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIGVuY3J5cHQgYW5kIGRlY3J5cHQgc2hvcnRjdXQgZnVuY3Rpb25zLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgQUVTID0gQ3J5cHRvSlMubGliLkNpcGhlci5fY3JlYXRlSGVscGVyKENyeXB0b0pTLmFsZ28uQUVTKTsNCiAgICAgICAqLwogICAgICBfY3JlYXRlSGVscGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KSB7CiAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykgewogICAgICAgICAgICByZXR1cm4gUGFzc3dvcmRCYXNlZENpcGhlcjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBTZXJpYWxpemFibGVDaXBoZXI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2lwaGVyKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAobWVzc2FnZSwga2V5LCBjZmcpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5lbmNyeXB0KGNpcGhlciwgbWVzc2FnZSwga2V5LCBjZmcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVydGV4dCwga2V5LCBjZmcpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5kZWNyeXB0KGNpcGhlciwgY2lwaGVydGV4dCwga2V5LCBjZmcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgIH0oKQogICAgfSk7CgogICAgLyoqDQogICAgICogQWJzdHJhY3QgYmFzZSBzdHJlYW0gY2lwaGVyIHRlbXBsYXRlLg0KICAgICAqDQogICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGNpcGhlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogMSAoMzIgYml0cykNCiAgICAgKi8KICAgIHZhciBTdHJlYW1DaXBoZXIgPSBDX2xpYi5TdHJlYW1DaXBoZXIgPSBDaXBoZXIuZXh0ZW5kKHsKICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBQcm9jZXNzIHBhcnRpYWwgYmxvY2tzCiAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpOwogICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZEJsb2NrczsKICAgICAgfSwKICAgICAgYmxvY2tTaXplOiAxCiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBNb2RlIG5hbWVzcGFjZS4NCiAgICAgKi8KICAgIHZhciBDX21vZGUgPSBDLm1vZGUgPSB7fTsKCiAgICAvKioNCiAgICAgKiBBYnN0cmFjdCBiYXNlIGJsb2NrIGNpcGhlciBtb2RlIHRlbXBsYXRlLg0KICAgICAqLwogICAgdmFyIEJsb2NrQ2lwaGVyTW9kZSA9IENfbGliLkJsb2NrQ2lwaGVyTW9kZSA9IEJhc2UuZXh0ZW5kKHsKICAgICAgLyoqDQogICAgICAgKiBDcmVhdGVzIHRoaXMgbW9kZSBmb3IgZW5jcnlwdGlvbi4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLg0KICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLmNyZWF0ZUVuY3J5cHRvcihjaXBoZXIsIGl2LndvcmRzKTsNCiAgICAgICAqLwogICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBDcmVhdGVzIHRoaXMgbW9kZSBmb3IgZGVjcnlwdGlvbi4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLg0KICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLmNyZWF0ZURlY3J5cHRvcihjaXBoZXIsIGl2LndvcmRzKTsNCiAgICAgICAqLwogICAgICBjcmVhdGVEZWNyeXB0b3I6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgbW9kZS4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLg0KICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2LndvcmRzKTsNCiAgICAgICAqLwogICAgICBpbml0OiBmdW5jdGlvbiAoY2lwaGVyLCBpdikgewogICAgICAgIHRoaXMuX2NpcGhlciA9IGNpcGhlcjsKICAgICAgICB0aGlzLl9pdiA9IGl2OwogICAgICB9CiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZS4NCiAgICAgKi8KICAgIHZhciBDQkMgPSBDX21vZGUuQ0JDID0gZnVuY3Rpb24gKCkgewogICAgICAvKioNCiAgICAgICAqIEFic3RyYWN0IGJhc2UgQ0JDIG1vZGUuDQogICAgICAgKi8KICAgICAgdmFyIENCQyA9IEJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTsKCiAgICAgIC8qKg0KICAgICAgICogQ0JDIGVuY3J5cHRvci4NCiAgICAgICAqLwogICAgICBDQkMuRW5jcnlwdG9yID0gQ0JDLmV4dGVuZCh7CiAgICAgICAgLyoqDQogICAgICAgICAqIFByb2Nlc3NlcyB0aGUgZGF0YSBibG9jayBhdCBvZmZzZXQuDQogICAgICAgICAqDQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIFRoZSBkYXRhIHdvcmRzIHRvIG9wZXJhdGUgb24uDQogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCB3aGVyZSB0aGUgYmxvY2sgc3RhcnRzLg0KICAgICAgICAgKg0KICAgICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICAgKg0KICAgICAgICAgKiAgICAgbW9kZS5wcm9jZXNzQmxvY2soZGF0YS53b3Jkcywgb2Zmc2V0KTsNCiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkgewogICAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyOwogICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7CgogICAgICAgICAgLy8gWE9SIGFuZCBlbmNyeXB0CiAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7CiAgICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKHdvcmRzLCBvZmZzZXQpOwoKICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYmxvY2sgdG8gdXNlIHdpdGggbmV4dCBibG9jawogICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gd29yZHMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBibG9ja1NpemUpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICAvKioNCiAgICAgICAqIENCQyBkZWNyeXB0b3IuDQogICAgICAgKi8KICAgICAgQ0JDLkRlY3J5cHRvciA9IENCQy5leHRlbmQoewogICAgICAgIC8qKg0KICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0Lg0KICAgICAgICAgKg0KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyBUaGUgZGF0YSB3b3JkcyB0byBvcGVyYXRlIG9uLg0KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy4NCiAgICAgICAgICoNCiAgICAgICAgICogQGV4YW1wbGUNCiAgICAgICAgICoNCiAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7DQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHsKICAgICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjsKICAgICAgICAgIHZhciBibG9ja1NpemUgPSBjaXBoZXIuYmxvY2tTaXplOwoKICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYmxvY2sgdG8gdXNlIHdpdGggbmV4dCBibG9jawogICAgICAgICAgdmFyIHRoaXNCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTsKCiAgICAgICAgICAvLyBEZWNyeXB0IGFuZCBYT1IKICAgICAgICAgIGNpcGhlci5kZWNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7CiAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7CgogICAgICAgICAgLy8gVGhpcyBibG9jayBiZWNvbWVzIHRoZSBwcmV2aW91cyBibG9jawogICAgICAgICAgdGhpcy5fcHJldkJsb2NrID0gdGhpc0Jsb2NrOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGZ1bmN0aW9uIHhvckJsb2NrKHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSkgewogICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7CgogICAgICAgIC8vIENob29zZSBtaXhpbmcgYmxvY2sKICAgICAgICBpZiAoaXYpIHsKICAgICAgICAgIHZhciBibG9jayA9IGl2OwoKICAgICAgICAgIC8vIFJlbW92ZSBJViBmb3Igc3Vic2VxdWVudCBibG9ja3MKICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLl9wcmV2QmxvY2s7CiAgICAgICAgfQoKICAgICAgICAvLyBYT1IgYmxvY2tzCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewogICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0gYmxvY2tbaV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBDQkM7CiAgICB9KCk7CgogICAgLyoqDQogICAgICogUGFkZGluZyBuYW1lc3BhY2UuDQogICAgICovCiAgICB2YXIgQ19wYWQgPSBDLnBhZCA9IHt9OwoKICAgIC8qKg0KICAgICAqIFBLQ1MgIzUvNyBwYWRkaW5nIHN0cmF0ZWd5Lg0KICAgICAqLwogICAgdmFyIFBrY3M3ID0gQ19wYWQuUGtjczcgPSB7CiAgICAgIC8qKg0KICAgICAgICogUGFkcyBkYXRhIHVzaW5nIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBQS0NTICM1LzcuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGRhdGEgVGhlIGRhdGEgdG8gcGFkLg0KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbXVsdGlwbGUgdGhhdCB0aGUgZGF0YSBzaG91bGQgYmUgcGFkZGVkIHRvLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcucGFkKHdvcmRBcnJheSwgNCk7DQogICAgICAgKi8KICAgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7CiAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0OwoKICAgICAgICAvLyBDb3VudCBwYWRkaW5nIGJ5dGVzCiAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBibG9ja1NpemVCeXRlcyAtIGRhdGEuc2lnQnl0ZXMgJSBibG9ja1NpemVCeXRlczsKCiAgICAgICAgLy8gQ3JlYXRlIHBhZGRpbmcgd29yZAogICAgICAgIHZhciBwYWRkaW5nV29yZCA9IG5QYWRkaW5nQnl0ZXMgPDwgMjQgfCBuUGFkZGluZ0J5dGVzIDw8IDE2IHwgblBhZGRpbmdCeXRlcyA8PCA4IHwgblBhZGRpbmdCeXRlczsKCiAgICAgICAgLy8gQ3JlYXRlIHBhZGRpbmcKICAgICAgICB2YXIgcGFkZGluZ1dvcmRzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUGFkZGluZ0J5dGVzOyBpICs9IDQpIHsKICAgICAgICAgIHBhZGRpbmdXb3Jkcy5wdXNoKHBhZGRpbmdXb3JkKTsKICAgICAgICB9CiAgICAgICAgdmFyIHBhZGRpbmcgPSBXb3JkQXJyYXkuY3JlYXRlKHBhZGRpbmdXb3JkcywgblBhZGRpbmdCeXRlcyk7CgogICAgICAgIC8vIEFkZCBwYWRkaW5nCiAgICAgICAgZGF0YS5jb25jYXQocGFkZGluZyk7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogVW5wYWRzIGRhdGEgdGhhdCBoYWQgYmVlbiBwYWRkZWQgdXNpbmcgdGhlIGFsZ29yaXRobSBkZWZpbmVkIGluIFBLQ1MgIzUvNy4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byB1bnBhZC4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgQ3J5cHRvSlMucGFkLlBrY3M3LnVucGFkKHdvcmRBcnJheSk7DQogICAgICAgKi8KICAgICAgdW5wYWQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgLy8gR2V0IG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGZyb20gbGFzdCBieXRlCiAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBkYXRhLndvcmRzW2RhdGEuc2lnQnl0ZXMgLSAxID4+PiAyXSAmIDB4ZmY7CgogICAgICAgIC8vIFJlbW92ZSBwYWRkaW5nCiAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuUGFkZGluZ0J5dGVzOwogICAgICB9CiAgICB9OwoKICAgIC8qKg0KICAgICAqIEFic3RyYWN0IGJhc2UgYmxvY2sgY2lwaGVyIHRlbXBsYXRlLg0KICAgICAqDQogICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGNpcGhlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogNCAoMTI4IGJpdHMpDQogICAgICovCiAgICB2YXIgQmxvY2tDaXBoZXIgPSBDX2xpYi5CbG9ja0NpcGhlciA9IENpcGhlci5leHRlbmQoewogICAgICAvKioNCiAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4NCiAgICAgICAqDQogICAgICAgKiBAcHJvcGVydHkge01vZGV9IG1vZGUgVGhlIGJsb2NrIG1vZGUgdG8gdXNlLiBEZWZhdWx0OiBDQkMNCiAgICAgICAqIEBwcm9wZXJ0eSB7UGFkZGluZ30gcGFkZGluZyBUaGUgcGFkZGluZyBzdHJhdGVneSB0byB1c2UuIERlZmF1bHQ6IFBrY3M3DQogICAgICAgKi8KICAgICAgY2ZnOiBDaXBoZXIuY2ZnLmV4dGVuZCh7CiAgICAgICAgbW9kZTogQ0JDLAogICAgICAgIHBhZGRpbmc6IFBrY3M3CiAgICAgIH0pLAogICAgICByZXNldDogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFJlc2V0IGNpcGhlcgogICAgICAgIENpcGhlci5yZXNldC5jYWxsKHRoaXMpOwoKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7CiAgICAgICAgdmFyIGl2ID0gY2ZnLml2OwogICAgICAgIHZhciBtb2RlID0gY2ZnLm1vZGU7CgogICAgICAgIC8vIFJlc2V0IGJsb2NrIG1vZGUKICAgICAgICBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0VOQ19YRk9STV9NT0RFKSB7CiAgICAgICAgICB2YXIgbW9kZUNyZWF0b3IgPSBtb2RlLmNyZWF0ZUVuY3J5cHRvcjsKICAgICAgICB9IGVsc2UgLyogaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9ERUNfWEZPUk1fTU9ERSkgKi97CiAgICAgICAgICAgIHZhciBtb2RlQ3JlYXRvciA9IG1vZGUuY3JlYXRlRGVjcnlwdG9yOwogICAgICAgICAgICAvLyBLZWVwIGF0IGxlYXN0IG9uZSBibG9jayBpbiB0aGUgYnVmZmVyIGZvciB1bnBhZGRpbmcKICAgICAgICAgICAgdGhpcy5fbWluQnVmZmVyU2l6ZSA9IDE7CiAgICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX21vZGUgJiYgdGhpcy5fbW9kZS5fX2NyZWF0b3IgPT0gbW9kZUNyZWF0b3IpIHsKICAgICAgICAgIHRoaXMuX21vZGUuaW5pdCh0aGlzLCBpdiAmJiBpdi53b3Jkcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX21vZGUgPSBtb2RlQ3JlYXRvci5jYWxsKG1vZGUsIHRoaXMsIGl2ICYmIGl2LndvcmRzKTsKICAgICAgICAgIHRoaXMuX21vZGUuX19jcmVhdG9yID0gbW9kZUNyZWF0b3I7CiAgICAgICAgfQogICAgICB9LAogICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7CiAgICAgICAgdGhpcy5fbW9kZS5wcm9jZXNzQmxvY2sod29yZHMsIG9mZnNldCk7CiAgICAgIH0sCiAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gU2hvcnRjdXQKICAgICAgICB2YXIgcGFkZGluZyA9IHRoaXMuY2ZnLnBhZGRpbmc7CgogICAgICAgIC8vIEZpbmFsaXplCiAgICAgICAgaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9FTkNfWEZPUk1fTU9ERSkgewogICAgICAgICAgLy8gUGFkIGRhdGEKICAgICAgICAgIHBhZGRpbmcucGFkKHRoaXMuX2RhdGEsIHRoaXMuYmxvY2tTaXplKTsKCiAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2NrcwogICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpOwogICAgICAgIH0gZWxzZSAvKiBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0RFQ19YRk9STV9NT0RFKSAqL3sKICAgICAgICAgICAgLy8gUHJvY2VzcyBmaW5hbCBibG9ja3MKICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpOwoKICAgICAgICAgICAgLy8gVW5wYWQgZGF0YQogICAgICAgICAgICBwYWRkaW5nLnVucGFkKGZpbmFsUHJvY2Vzc2VkQmxvY2tzKTsKICAgICAgICAgIH0KICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWRCbG9ja3M7CiAgICAgIH0sCiAgICAgIGJsb2NrU2l6ZTogMTI4IC8gMzIKICAgIH0pOwoKICAgIC8qKg0KICAgICAqIEEgY29sbGVjdGlvbiBvZiBjaXBoZXIgcGFyYW1ldGVycy4NCiAgICAgKg0KICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBjaXBoZXJ0ZXh0IFRoZSByYXcgY2lwaGVydGV4dC4NCiAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkgdG8gdGhpcyBjaXBoZXJ0ZXh0Lg0KICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBpdiBUaGUgSVYgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi4NCiAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gc2FsdCBUaGUgc2FsdCB1c2VkIHdpdGggYSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi4NCiAgICAgKiBAcHJvcGVydHkge0NpcGhlcn0gYWxnb3JpdGhtIFRoZSBjaXBoZXIgYWxnb3JpdGhtLg0KICAgICAqIEBwcm9wZXJ0eSB7TW9kZX0gbW9kZSBUaGUgYmxvY2sgbW9kZSB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLg0KICAgICAqIEBwcm9wZXJ0eSB7UGFkZGluZ30gcGFkZGluZyBUaGUgcGFkZGluZyBzY2hlbWUgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi4NCiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBibG9jayBzaXplIG9mIHRoZSBjaXBoZXIuDQogICAgICogQHByb3BlcnR5IHtGb3JtYXR9IGZvcm1hdHRlciBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIGNvbnZlcnQgdGhpcyBjaXBoZXIgcGFyYW1zIG9iamVjdCB0byBhIHN0cmluZy4NCiAgICAgKi8KICAgIHZhciBDaXBoZXJQYXJhbXMgPSBDX2xpYi5DaXBoZXJQYXJhbXMgPSBCYXNlLmV4dGVuZCh7CiAgICAgIC8qKg0KICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlciBwYXJhbXMgb2JqZWN0Lg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaXBoZXJQYXJhbXMgQW4gb2JqZWN0IHdpdGggYW55IG9mIHRoZSBwb3NzaWJsZSBjaXBoZXIgcGFyYW1ldGVycy4NCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgY2lwaGVyUGFyYW1zID0gQ3J5cHRvSlMubGliLkNpcGhlclBhcmFtcy5jcmVhdGUoew0KICAgICAgICogICAgICAgICBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0V29yZEFycmF5LA0KICAgICAgICogICAgICAgICBrZXk6IGtleVdvcmRBcnJheSwNCiAgICAgICAqICAgICAgICAgaXY6IGl2V29yZEFycmF5LA0KICAgICAgICogICAgICAgICBzYWx0OiBzYWx0V29yZEFycmF5LA0KICAgICAgICogICAgICAgICBhbGdvcml0aG06IENyeXB0b0pTLmFsZ28uQUVTLA0KICAgICAgICogICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQywNCiAgICAgICAqICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBLQ1M3LA0KICAgICAgICogICAgICAgICBibG9ja1NpemU6IDQsDQogICAgICAgKiAgICAgICAgIGZvcm1hdHRlcjogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wNCiAgICAgICAqICAgICB9KTsNCiAgICAgICAqLwogICAgICBpbml0OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7CiAgICAgICAgdGhpcy5taXhJbihjaXBoZXJQYXJhbXMpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENvbnZlcnRzIHRoaXMgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBzdHJpbmcuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtGb3JtYXR9IGZvcm1hdHRlciAoT3B0aW9uYWwpIFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIHVzZS4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCBjaXBoZXIgcGFyYW1zLg0KICAgICAgICoNCiAgICAgICAqIEB0aHJvd3MgRXJyb3IgSWYgbmVpdGhlciB0aGUgZm9ybWF0dGVyIG5vciB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgaXMgc2V0Lg0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMgKyAnJzsNCiAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zLnRvU3RyaW5nKCk7DQogICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcy50b1N0cmluZyhDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCk7DQogICAgICAgKi8KICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChmb3JtYXR0ZXIpIHsKICAgICAgICByZXR1cm4gKGZvcm1hdHRlciB8fCB0aGlzLmZvcm1hdHRlcikuc3RyaW5naWZ5KHRoaXMpOwogICAgICB9CiAgICB9KTsKCiAgICAvKioNCiAgICAgKiBGb3JtYXQgbmFtZXNwYWNlLg0KICAgICAqLwogICAgdmFyIENfZm9ybWF0ID0gQy5mb3JtYXQgPSB7fTsKCiAgICAvKioNCiAgICAgKiBPcGVuU1NMIGZvcm1hdHRpbmcgc3RyYXRlZ3kuDQogICAgICovCiAgICB2YXIgT3BlblNTTEZvcm1hdHRlciA9IENfZm9ybWF0Lk9wZW5TU0wgPSB7CiAgICAgIC8qKg0KICAgICAgICogQ29udmVydHMgYSBjaXBoZXIgcGFyYW1zIG9iamVjdCB0byBhbiBPcGVuU1NMLWNvbXBhdGlibGUgc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfSBjaXBoZXJQYXJhbXMgVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0Lg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuDQogICAgICAgKg0KICAgICAgICogQHN0YXRpYw0KICAgICAgICoNCiAgICAgICAqIEBleGFtcGxlDQogICAgICAgKg0KICAgICAgICogICAgIHZhciBvcGVuU1NMU3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wuc3RyaW5naWZ5KGNpcGhlclBhcmFtcyk7DQogICAgICAgKi8KICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBjaXBoZXJQYXJhbXMuY2lwaGVydGV4dDsKICAgICAgICB2YXIgc2FsdCA9IGNpcGhlclBhcmFtcy5zYWx0OwoKICAgICAgICAvLyBGb3JtYXQKICAgICAgICBpZiAoc2FsdCkgewogICAgICAgICAgdmFyIHdvcmRBcnJheSA9IFdvcmRBcnJheS5jcmVhdGUoWzB4NTM2MTZjNzQsIDB4NjU2NDVmNWZdKS5jb25jYXQoc2FsdCkuY29uY2F0KGNpcGhlcnRleHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgd29yZEFycmF5ID0gY2lwaGVydGV4dDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdvcmRBcnJheS50b1N0cmluZyhCYXNlNjQpOwogICAgICB9LAogICAgICAvKioNCiAgICAgICAqIENvbnZlcnRzIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcgdG8gYSBjaXBoZXIgcGFyYW1zIG9iamVjdC4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlblNTTFN0ciBUaGUgT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMLnBhcnNlKG9wZW5TU0xTdHJpbmcpOw0KICAgICAgICovCiAgICAgIHBhcnNlOiBmdW5jdGlvbiAob3BlblNTTFN0cikgewogICAgICAgIC8vIFBhcnNlIGJhc2U2NAogICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gQmFzZTY0LnBhcnNlKG9wZW5TU0xTdHIpOwoKICAgICAgICAvLyBTaG9ydGN1dAogICAgICAgIHZhciBjaXBoZXJ0ZXh0V29yZHMgPSBjaXBoZXJ0ZXh0LndvcmRzOwoKICAgICAgICAvLyBUZXN0IGZvciBzYWx0CiAgICAgICAgaWYgKGNpcGhlcnRleHRXb3Jkc1swXSA9PSAweDUzNjE2Yzc0ICYmIGNpcGhlcnRleHRXb3Jkc1sxXSA9PSAweDY1NjQ1ZjVmKSB7CiAgICAgICAgICAvLyBFeHRyYWN0IHNhbHQKICAgICAgICAgIHZhciBzYWx0ID0gV29yZEFycmF5LmNyZWF0ZShjaXBoZXJ0ZXh0V29yZHMuc2xpY2UoMiwgNCkpOwoKICAgICAgICAgIC8vIFJlbW92ZSBzYWx0IGZyb20gY2lwaGVydGV4dAogICAgICAgICAgY2lwaGVydGV4dFdvcmRzLnNwbGljZSgwLCA0KTsKICAgICAgICAgIGNpcGhlcnRleHQuc2lnQnl0ZXMgLT0gMTY7CiAgICAgICAgfQogICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsKICAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHQsCiAgICAgICAgICBzYWx0OiBzYWx0CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgogICAgLyoqDQogICAgICogQSBjaXBoZXIgd3JhcHBlciB0aGF0IHJldHVybnMgY2lwaGVydGV4dCBhcyBhIHNlcmlhbGl6YWJsZSBjaXBoZXIgcGFyYW1zIG9iamVjdC4NCiAgICAgKi8KICAgIHZhciBTZXJpYWxpemFibGVDaXBoZXIgPSBDX2xpYi5TZXJpYWxpemFibGVDaXBoZXIgPSBCYXNlLmV4dGVuZCh7CiAgICAgIC8qKg0KICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLg0KICAgICAgICoNCiAgICAgICAqIEBwcm9wZXJ0eSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCBjaXBoZXIgcGFyYW0gb2JqZWN0cyB0byBhbmQgZnJvbSBhIHN0cmluZy4gRGVmYXVsdDogT3BlblNTTA0KICAgICAgICovCiAgICAgIGNmZzogQmFzZS5leHRlbmQoewogICAgICAgIGZvcm1hdDogT3BlblNTTEZvcm1hdHRlcgogICAgICB9KSwKICAgICAgLyoqDQogICAgICAgKiBFbmNyeXB0cyBhIG1lc3NhZ2UuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZW5jcnlwdC4NCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS4NCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0Lg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5KTsNCiAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5LCB7IGl2OiBpdiB9KTsNCiAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTsNCiAgICAgICAqLwogICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBrZXksIGNmZykgewogICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0cwogICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpOwoKICAgICAgICAvLyBFbmNyeXB0CiAgICAgICAgdmFyIGVuY3J5cHRvciA9IGNpcGhlci5jcmVhdGVFbmNyeXB0b3Ioa2V5LCBjZmcpOwogICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gZW5jcnlwdG9yLmZpbmFsaXplKG1lc3NhZ2UpOwoKICAgICAgICAvLyBTaG9ydGN1dAogICAgICAgIHZhciBjaXBoZXJDZmcgPSBlbmNyeXB0b3IuY2ZnOwoKICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtcwogICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsKICAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHQsCiAgICAgICAgICBrZXk6IGtleSwKICAgICAgICAgIGl2OiBjaXBoZXJDZmcuaXYsCiAgICAgICAgICBhbGdvcml0aG06IGNpcGhlciwKICAgICAgICAgIG1vZGU6IGNpcGhlckNmZy5tb2RlLAogICAgICAgICAgcGFkZGluZzogY2lwaGVyQ2ZnLnBhZGRpbmcsCiAgICAgICAgICBibG9ja1NpemU6IGNpcGhlci5ibG9ja1NpemUsCiAgICAgICAgICBmb3JtYXR0ZXI6IGNmZy5mb3JtYXQKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBEZWNyeXB0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuDQogICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQgdG8gZGVjcnlwdC4NCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS4NCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcGxhaW50ZXh0Lg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBmb3JtYXR0ZWRDaXBoZXJ0ZXh0LCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pOw0KICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGNpcGhlcnRleHRQYXJhbXMsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7DQogICAgICAgKi8KICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgY2lwaGVydGV4dCwga2V5LCBjZmcpIHsKICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHMKICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTsKCiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gQ2lwaGVyUGFyYW1zCiAgICAgICAgY2lwaGVydGV4dCA9IHRoaXMuX3BhcnNlKGNpcGhlcnRleHQsIGNmZy5mb3JtYXQpOwoKICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgdmFyIHBsYWludGV4dCA9IGNpcGhlci5jcmVhdGVEZWNyeXB0b3Ioa2V5LCBjZmcpLmZpbmFsaXplKGNpcGhlcnRleHQuY2lwaGVydGV4dCk7CiAgICAgICAgcmV0dXJuIHBsYWludGV4dDsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBDb252ZXJ0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQgdG8gQ2lwaGVyUGFyYW1zLA0KICAgICAgICogZWxzZSBhc3N1bWVkIENpcGhlclBhcmFtcyBhbHJlYWR5IGFuZCByZXR1cm5zIGNpcGhlcnRleHQgdW5jaGFuZ2VkLg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dC4NCiAgICAgICAqIEBwYXJhbSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlIHRvIHBhcnNlIHNlcmlhbGl6ZWQgY2lwaGVydGV4dC4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSB1bnNlcmlhbGl6ZWQgY2lwaGVydGV4dC4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLl9wYXJzZShjaXBoZXJ0ZXh0U3RyaW5nT3JQYXJhbXMsIGZvcm1hdCk7DQogICAgICAgKi8KICAgICAgX3BhcnNlOiBmdW5jdGlvbiAoY2lwaGVydGV4dCwgZm9ybWF0KSB7CiAgICAgICAgaWYgKHR5cGVvZiBjaXBoZXJ0ZXh0ID09ICdzdHJpbmcnKSB7CiAgICAgICAgICByZXR1cm4gZm9ybWF0LnBhcnNlKGNpcGhlcnRleHQsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY2lwaGVydGV4dDsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKg0KICAgICAqIEtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIG5hbWVzcGFjZS4NCiAgICAgKi8KICAgIHZhciBDX2tkZiA9IEMua2RmID0ge307CgogICAgLyoqDQogICAgICogT3BlblNTTCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi4NCiAgICAgKi8KICAgIHZhciBPcGVuU1NMS2RmID0gQ19rZGYuT3BlblNTTCA9IHsKICAgICAgLyoqDQogICAgICAgKiBEZXJpdmVzIGEga2V5IGFuZCBJViBmcm9tIGEgcGFzc3dvcmQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBkZXJpdmUgZnJvbS4NCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrZXlTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBrZXkgdG8gZ2VuZXJhdGUuDQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaXZTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBJViB0byBnZW5lcmF0ZS4NCiAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCAoT3B0aW9uYWwpIEEgNjQtYml0IHNhbHQgdG8gdXNlLiBJZiBvbWl0dGVkLCBhIHNhbHQgd2lsbCBiZSBnZW5lcmF0ZWQgcmFuZG9tbHkuDQogICAgICAgKg0KICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0IHdpdGggdGhlIGtleSwgSVYsIGFuZCBzYWx0Lg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIpOw0KICAgICAgICogICAgIHZhciBkZXJpdmVkUGFyYW1zID0gQ3J5cHRvSlMua2RmLk9wZW5TU0wuZXhlY3V0ZSgnUGFzc3dvcmQnLCAyNTYvMzIsIDEyOC8zMiwgJ3NhbHRzYWx0Jyk7DQogICAgICAgKi8KICAgICAgZXhlY3V0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBrZXlTaXplLCBpdlNpemUsIHNhbHQpIHsKICAgICAgICAvLyBHZW5lcmF0ZSByYW5kb20gc2FsdAogICAgICAgIGlmICghc2FsdCkgewogICAgICAgICAgc2FsdCA9IFdvcmRBcnJheS5yYW5kb20oNjQgLyA4KTsKICAgICAgICB9CgogICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIElWCiAgICAgICAgdmFyIGtleSA9IEV2cEtERi5jcmVhdGUoewogICAgICAgICAga2V5U2l6ZToga2V5U2l6ZSArIGl2U2l6ZQogICAgICAgIH0pLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpOwoKICAgICAgICAvLyBTZXBhcmF0ZSBrZXkgYW5kIElWCiAgICAgICAgdmFyIGl2ID0gV29yZEFycmF5LmNyZWF0ZShrZXkud29yZHMuc2xpY2Uoa2V5U2l6ZSksIGl2U2l6ZSAqIDQpOwogICAgICAgIGtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0OwoKICAgICAgICAvLyBSZXR1cm4gcGFyYW1zCiAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoewogICAgICAgICAga2V5OiBrZXksCiAgICAgICAgICBpdjogaXYsCiAgICAgICAgICBzYWx0OiBzYWx0CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgogICAgLyoqDQogICAgICogQSBzZXJpYWxpemFibGUgY2lwaGVyIHdyYXBwZXIgdGhhdCBkZXJpdmVzIHRoZSBrZXkgZnJvbSBhIHBhc3N3b3JkLA0KICAgICAqIGFuZCByZXR1cm5zIGNpcGhlcnRleHQgYXMgYSBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuDQogICAgICovCiAgICB2YXIgUGFzc3dvcmRCYXNlZENpcGhlciA9IENfbGliLlBhc3N3b3JkQmFzZWRDaXBoZXIgPSBTZXJpYWxpemFibGVDaXBoZXIuZXh0ZW5kKHsKICAgICAgLyoqDQogICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuDQogICAgICAgKg0KICAgICAgICogQHByb3BlcnR5IHtLREZ9IGtkZiBUaGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gdG8gdXNlIHRvIGdlbmVyYXRlIGEga2V5IGFuZCBJViBmcm9tIGEgcGFzc3dvcmQuIERlZmF1bHQ6IE9wZW5TU0wNCiAgICAgICAqLwogICAgICBjZmc6IFNlcmlhbGl6YWJsZUNpcGhlci5jZmcuZXh0ZW5kKHsKICAgICAgICBrZGY6IE9wZW5TU0xLZGYKICAgICAgfSksCiAgICAgIC8qKg0KICAgICAgICogRW5jcnlwdHMgYSBtZXNzYWdlIHVzaW5nIGEgcGFzc3dvcmQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuDQogICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gZW5jcnlwdC4NCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuDQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gQSBjaXBoZXIgcGFyYW1zIG9iamVjdC4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCAncGFzc3dvcmQnKTsNCiAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTsNCiAgICAgICAqLwogICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBwYXNzd29yZCwgY2ZnKSB7CiAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzCiAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7CgogICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIG90aGVyIHBhcmFtcwogICAgICAgIHZhciBkZXJpdmVkUGFyYW1zID0gY2ZnLmtkZi5leGVjdXRlKHBhc3N3b3JkLCBjaXBoZXIua2V5U2l6ZSwgY2lwaGVyLml2U2l6ZSk7CgogICAgICAgIC8vIEFkZCBJViB0byBjb25maWcKICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2OwoKICAgICAgICAvLyBFbmNyeXB0CiAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBTZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdC5jYWxsKHRoaXMsIGNpcGhlciwgbWVzc2FnZSwgZGVyaXZlZFBhcmFtcy5rZXksIGNmZyk7CgogICAgICAgIC8vIE1peCBpbiBkZXJpdmVkIHBhcmFtcwogICAgICAgIGNpcGhlcnRleHQubWl4SW4oZGVyaXZlZFBhcmFtcyk7CiAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7CiAgICAgIH0sCiAgICAgIC8qKg0KICAgICAgICogRGVjcnlwdHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0IHVzaW5nIGEgcGFzc3dvcmQuDQogICAgICAgKg0KICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuDQogICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQgdG8gZGVjcnlwdC4NCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuDQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLg0KICAgICAgICoNCiAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHBsYWludGV4dC4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGZvcm1hdHRlZENpcGhlcnRleHQsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTsNCiAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pOw0KICAgICAgICovCiAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIGNpcGhlcnRleHQsIHBhc3N3b3JkLCBjZmcpIHsKICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHMKICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTsKCiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gQ2lwaGVyUGFyYW1zCiAgICAgICAgY2lwaGVydGV4dCA9IHRoaXMuX3BhcnNlKGNpcGhlcnRleHQsIGNmZy5mb3JtYXQpOwoKICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXMKICAgICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IGNmZy5rZGYuZXhlY3V0ZShwYXNzd29yZCwgY2lwaGVyLmtleVNpemUsIGNpcGhlci5pdlNpemUsIGNpcGhlcnRleHQuc2FsdCk7CgogICAgICAgIC8vIEFkZCBJViB0byBjb25maWcKICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2OwoKICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgdmFyIHBsYWludGV4dCA9IFNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0LmNhbGwodGhpcywgY2lwaGVyLCBjaXBoZXJ0ZXh0LCBkZXJpdmVkUGFyYW1zLmtleSwgY2ZnKTsKICAgICAgICByZXR1cm4gcGxhaW50ZXh0OwogICAgICB9CiAgICB9KTsKICB9KCk7CgogIC8qKg0KICAgKiBDaXBoZXIgRmVlZGJhY2sgYmxvY2sgbW9kZS4NCiAgICovCiAgQ3J5cHRvSlMubW9kZS5DRkIgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgQ0ZCID0gQ3J5cHRvSlMubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTsKICAgIENGQi5FbmNyeXB0b3IgPSBDRkIuZXh0ZW5kKHsKICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7CiAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7CiAgICAgICAgZ2VuZXJhdGVLZXlzdHJlYW1BbmRFbmNyeXB0LmNhbGwodGhpcywgd29yZHMsIG9mZnNldCwgYmxvY2tTaXplLCBjaXBoZXIpOwoKICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIHRvIHVzZSB3aXRoIG5leHQgYmxvY2sKICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB3b3Jkcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJsb2NrU2l6ZSk7CiAgICAgIH0KICAgIH0pOwogICAgQ0ZCLkRlY3J5cHRvciA9IENGQi5leHRlbmQoewogICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjsKICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTsKCiAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrCiAgICAgICAgdmFyIHRoaXNCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTsKICAgICAgICBnZW5lcmF0ZUtleXN0cmVhbUFuZEVuY3J5cHQuY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUsIGNpcGhlcik7CgogICAgICAgIC8vIFRoaXMgYmxvY2sgYmVjb21lcyB0aGUgcHJldmlvdXMgYmxvY2sKICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB0aGlzQmxvY2s7CiAgICAgIH0KICAgIH0pOwogICAgZnVuY3Rpb24gZ2VuZXJhdGVLZXlzdHJlYW1BbmRFbmNyeXB0KHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSwgY2lwaGVyKSB7CiAgICAgIC8vIFNob3J0Y3V0CiAgICAgIHZhciBpdiA9IHRoaXMuX2l2OwoKICAgICAgLy8gR2VuZXJhdGUga2V5c3RyZWFtCiAgICAgIGlmIChpdikgewogICAgICAgIHZhciBrZXlzdHJlYW0gPSBpdi5zbGljZSgwKTsKCiAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2NrcwogICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBrZXlzdHJlYW0gPSB0aGlzLl9wcmV2QmxvY2s7CiAgICAgIH0KICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayhrZXlzdHJlYW0sIDApOwoKICAgICAgLy8gRW5jcnlwdAogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CiAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0ga2V5c3RyZWFtW2ldOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gQ0ZCOwogIH0oKTsKCiAgLyoqDQogICAqIEVsZWN0cm9uaWMgQ29kZWJvb2sgYmxvY2sgbW9kZS4NCiAgICovCiAgQ3J5cHRvSlMubW9kZS5FQ0IgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgRUNCID0gQ3J5cHRvSlMubGliLkJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTsKICAgIEVDQi5FbmNyeXB0b3IgPSBFQ0IuZXh0ZW5kKHsKICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkgewogICAgICAgIHRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7CiAgICAgIH0KICAgIH0pOwogICAgRUNCLkRlY3J5cHRvciA9IEVDQi5leHRlbmQoewogICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7CiAgICAgICAgdGhpcy5fY2lwaGVyLmRlY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gRUNCOwogIH0oKTsKCiAgLyoqDQogICAqIEFOU0kgWC45MjMgcGFkZGluZyBzdHJhdGVneS4NCiAgICovCiAgQ3J5cHRvSlMucGFkLkFuc2lYOTIzID0gewogICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7CiAgICAgIC8vIFNob3J0Y3V0cwogICAgICB2YXIgZGF0YVNpZ0J5dGVzID0gZGF0YS5zaWdCeXRlczsKICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDsKCiAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXMKICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBibG9ja1NpemVCeXRlcyAtIGRhdGFTaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzOwoKICAgICAgLy8gQ29tcHV0ZSBsYXN0IGJ5dGUgcG9zaXRpb24KICAgICAgdmFyIGxhc3RCeXRlUG9zID0gZGF0YVNpZ0J5dGVzICsgblBhZGRpbmdCeXRlcyAtIDE7CgogICAgICAvLyBQYWQKICAgICAgZGF0YS5jbGFtcCgpOwogICAgICBkYXRhLndvcmRzW2xhc3RCeXRlUG9zID4+PiAyXSB8PSBuUGFkZGluZ0J5dGVzIDw8IDI0IC0gbGFzdEJ5dGVQb3MgJSA0ICogODsKICAgICAgZGF0YS5zaWdCeXRlcyArPSBuUGFkZGluZ0J5dGVzOwogICAgfSwKICAgIHVucGFkOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAvLyBHZXQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgZnJvbSBsYXN0IGJ5dGUKICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBkYXRhLndvcmRzW2RhdGEuc2lnQnl0ZXMgLSAxID4+PiAyXSAmIDB4ZmY7CgogICAgICAvLyBSZW1vdmUgcGFkZGluZwogICAgICBkYXRhLnNpZ0J5dGVzIC09IG5QYWRkaW5nQnl0ZXM7CiAgICB9CiAgfTsKCiAgLyoqDQogICAqIElTTyAxMDEyNiBwYWRkaW5nIHN0cmF0ZWd5Lg0KICAgKi8KICBDcnlwdG9KUy5wYWQuSXNvMTAxMjYgPSB7CiAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHsKICAgICAgLy8gU2hvcnRjdXQKICAgICAgdmFyIGJsb2NrU2l6ZUJ5dGVzID0gYmxvY2tTaXplICogNDsKCiAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXMKICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBibG9ja1NpemVCeXRlcyAtIGRhdGEuc2lnQnl0ZXMgJSBibG9ja1NpemVCeXRlczsKCiAgICAgIC8vIFBhZAogICAgICBkYXRhLmNvbmNhdChDcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbShuUGFkZGluZ0J5dGVzIC0gMSkpLmNvbmNhdChDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbblBhZGRpbmdCeXRlcyA8PCAyNF0sIDEpKTsKICAgIH0sCiAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgLy8gR2V0IG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGZyb20gbGFzdCBieXRlCiAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1tkYXRhLnNpZ0J5dGVzIC0gMSA+Pj4gMl0gJiAweGZmOwoKICAgICAgLy8gUmVtb3ZlIHBhZGRpbmcKICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuUGFkZGluZ0J5dGVzOwogICAgfQogIH07CgogIC8qKg0KICAgKiBJU08vSUVDIDk3OTctMSBQYWRkaW5nIE1ldGhvZCAyLg0KICAgKi8KICBDcnlwdG9KUy5wYWQuSXNvOTc5NzEgPSB7CiAgICBwYWQ6IGZ1bmN0aW9uIChkYXRhLCBibG9ja1NpemUpIHsKICAgICAgLy8gQWRkIDB4ODAgYnl0ZQogICAgICBkYXRhLmNvbmNhdChDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHg4MDAwMDAwMF0sIDEpKTsKCiAgICAgIC8vIFplcm8gcGFkIHRoZSByZXN0CiAgICAgIENyeXB0b0pTLnBhZC5aZXJvUGFkZGluZy5wYWQoZGF0YSwgYmxvY2tTaXplKTsKICAgIH0sCiAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgLy8gUmVtb3ZlIHplcm8gcGFkZGluZwogICAgICBDcnlwdG9KUy5wYWQuWmVyb1BhZGRpbmcudW5wYWQoZGF0YSk7CgogICAgICAvLyBSZW1vdmUgb25lIG1vcmUgYnl0ZSAtLSB0aGUgMHg4MCBieXRlCiAgICAgIGRhdGEuc2lnQnl0ZXMtLTsKICAgIH0KICB9OwoKICAvKioNCiAgICogT3V0cHV0IEZlZWRiYWNrIGJsb2NrIG1vZGUuDQogICAqLwogIENyeXB0b0pTLm1vZGUuT0ZCID0gZnVuY3Rpb24gKCkgewogICAgdmFyIE9GQiA9IENyeXB0b0pTLmxpYi5CbG9ja0NpcGhlck1vZGUuZXh0ZW5kKCk7CiAgICB2YXIgRW5jcnlwdG9yID0gT0ZCLkVuY3J5cHRvciA9IE9GQi5leHRlbmQoewogICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIGNpcGhlciA9IHRoaXMuX2NpcGhlcjsKICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTsKICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjsKICAgICAgICB2YXIga2V5c3RyZWFtID0gdGhpcy5fa2V5c3RyZWFtOwoKICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW0KICAgICAgICBpZiAoaXYpIHsKICAgICAgICAgIGtleXN0cmVhbSA9IHRoaXMuX2tleXN0cmVhbSA9IGl2LnNsaWNlKDApOwoKICAgICAgICAgIC8vIFJlbW92ZSBJViBmb3Igc3Vic2VxdWVudCBibG9ja3MKICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKGtleXN0cmVhbSwgMCk7CgogICAgICAgIC8vIEVuY3J5cHQKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CiAgICAgICAgICB3b3Jkc1tvZmZzZXQgKyBpXSBePSBrZXlzdHJlYW1baV07CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIE9GQi5EZWNyeXB0b3IgPSBFbmNyeXB0b3I7CiAgICByZXR1cm4gT0ZCOwogIH0oKTsKCiAgLyoqDQogICAqIEEgbm9vcCBwYWRkaW5nIHN0cmF0ZWd5Lg0KICAgKi8KICBDcnlwdG9KUy5wYWQuTm9QYWRkaW5nID0gewogICAgcGFkOiBmdW5jdGlvbiAoKSB7fSwKICAgIHVucGFkOiBmdW5jdGlvbiAoKSB7fQogIH07CiAgKGZ1bmN0aW9uICh1bmRlZmluZWQpIHsKICAgIC8vIFNob3J0Y3V0cwogICAgdmFyIEMgPSBDcnlwdG9KUzsKICAgIHZhciBDX2xpYiA9IEMubGliOwogICAgdmFyIENpcGhlclBhcmFtcyA9IENfbGliLkNpcGhlclBhcmFtczsKICAgIHZhciBDX2VuYyA9IEMuZW5jOwogICAgdmFyIEhleCA9IENfZW5jLkhleDsKICAgIHZhciBDX2Zvcm1hdCA9IEMuZm9ybWF0OwogICAgdmFyIEhleEZvcm1hdHRlciA9IENfZm9ybWF0LkhleCA9IHsKICAgICAgLyoqDQogICAgICAgKiBDb252ZXJ0cyB0aGUgY2lwaGVydGV4dCBvZiBhIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgaGV4YWRlY2ltYWxseSBlbmNvZGVkIHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc30gY2lwaGVyUGFyYW1zIFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoZXhhZGVjaW1hbGx5IGVuY29kZWQgc3RyaW5nLg0KICAgICAgICoNCiAgICAgICAqIEBzdGF0aWMNCiAgICAgICAqDQogICAgICAgKiBAZXhhbXBsZQ0KICAgICAgICoNCiAgICAgICAqICAgICB2YXIgaGV4U3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0LkhleC5zdHJpbmdpZnkoY2lwaGVyUGFyYW1zKTsNCiAgICAgICAqLwogICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHsKICAgICAgICByZXR1cm4gY2lwaGVyUGFyYW1zLmNpcGhlcnRleHQudG9TdHJpbmcoSGV4KTsKICAgICAgfSwKICAgICAgLyoqDQogICAgICAgKiBDb252ZXJ0cyBhIGhleGFkZWNpbWFsbHkgZW5jb2RlZCBjaXBoZXJ0ZXh0IHN0cmluZyB0byBhIGNpcGhlciBwYXJhbXMgb2JqZWN0Lg0KICAgICAgICoNCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBUaGUgaGV4YWRlY2ltYWxseSBlbmNvZGVkIHN0cmluZy4NCiAgICAgICAqDQogICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC4NCiAgICAgICAqDQogICAgICAgKiBAc3RhdGljDQogICAgICAgKg0KICAgICAgICogQGV4YW1wbGUNCiAgICAgICAqDQogICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmZvcm1hdC5IZXgucGFyc2UoaGV4U3RyaW5nKTsNCiAgICAgICAqLwogICAgICBwYXJzZTogZnVuY3Rpb24gKGlucHV0KSB7CiAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBIZXgucGFyc2UoaW5wdXQpOwogICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsKICAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHQKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICB9KSgpOwogIChmdW5jdGlvbiAoKSB7CiAgICAvLyBTaG9ydGN1dHMKICAgIHZhciBDID0gQ3J5cHRvSlM7CiAgICB2YXIgQ19saWIgPSBDLmxpYjsKICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyOwogICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCiAgICAvLyBMb29rdXAgdGFibGVzCiAgICB2YXIgU0JPWCA9IFtdOwogICAgdmFyIElOVl9TQk9YID0gW107CiAgICB2YXIgU1VCX01JWF8wID0gW107CiAgICB2YXIgU1VCX01JWF8xID0gW107CiAgICB2YXIgU1VCX01JWF8yID0gW107CiAgICB2YXIgU1VCX01JWF8zID0gW107CiAgICB2YXIgSU5WX1NVQl9NSVhfMCA9IFtdOwogICAgdmFyIElOVl9TVUJfTUlYXzEgPSBbXTsKICAgIHZhciBJTlZfU1VCX01JWF8yID0gW107CiAgICB2YXIgSU5WX1NVQl9NSVhfMyA9IFtdOwoKICAgIC8vIENvbXB1dGUgbG9va3VwIHRhYmxlcwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgLy8gQ29tcHV0ZSBkb3VibGUgdGFibGUKICAgICAgdmFyIGQgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgIGlmIChpIDwgMTI4KSB7CiAgICAgICAgICBkW2ldID0gaSA8PCAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkW2ldID0gaSA8PCAxIF4gMHgxMWI7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBXYWxrIEdGKDJeOCkKICAgICAgdmFyIHggPSAwOwogICAgICB2YXIgeGkgPSAwOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgLy8gQ29tcHV0ZSBzYm94CiAgICAgICAgdmFyIHN4ID0geGkgXiB4aSA8PCAxIF4geGkgPDwgMiBeIHhpIDw8IDMgXiB4aSA8PCA0OwogICAgICAgIHN4ID0gc3ggPj4+IDggXiBzeCAmIDB4ZmYgXiAweDYzOwogICAgICAgIFNCT1hbeF0gPSBzeDsKICAgICAgICBJTlZfU0JPWFtzeF0gPSB4OwoKICAgICAgICAvLyBDb21wdXRlIG11bHRpcGxpY2F0aW9uCiAgICAgICAgdmFyIHgyID0gZFt4XTsKICAgICAgICB2YXIgeDQgPSBkW3gyXTsKICAgICAgICB2YXIgeDggPSBkW3g0XTsKCiAgICAgICAgLy8gQ29tcHV0ZSBzdWIgYnl0ZXMsIG1peCBjb2x1bW5zIHRhYmxlcwogICAgICAgIHZhciB0ID0gZFtzeF0gKiAweDEwMSBeIHN4ICogMHgxMDEwMTAwOwogICAgICAgIFNVQl9NSVhfMFt4XSA9IHQgPDwgMjQgfCB0ID4+PiA4OwogICAgICAgIFNVQl9NSVhfMVt4XSA9IHQgPDwgMTYgfCB0ID4+PiAxNjsKICAgICAgICBTVUJfTUlYXzJbeF0gPSB0IDw8IDggfCB0ID4+PiAyNDsKICAgICAgICBTVUJfTUlYXzNbeF0gPSB0OwoKICAgICAgICAvLyBDb21wdXRlIGludiBzdWIgYnl0ZXMsIGludiBtaXggY29sdW1ucyB0YWJsZXMKICAgICAgICB2YXIgdCA9IHg4ICogMHgxMDEwMTAxIF4geDQgKiAweDEwMDAxIF4geDIgKiAweDEwMSBeIHggKiAweDEwMTAxMDA7CiAgICAgICAgSU5WX1NVQl9NSVhfMFtzeF0gPSB0IDw8IDI0IHwgdCA+Pj4gODsKICAgICAgICBJTlZfU1VCX01JWF8xW3N4XSA9IHQgPDwgMTYgfCB0ID4+PiAxNjsKICAgICAgICBJTlZfU1VCX01JWF8yW3N4XSA9IHQgPDwgOCB8IHQgPj4+IDI0OwogICAgICAgIElOVl9TVUJfTUlYXzNbc3hdID0gdDsKCiAgICAgICAgLy8gQ29tcHV0ZSBuZXh0IGNvdW50ZXIKICAgICAgICBpZiAoIXgpIHsKICAgICAgICAgIHggPSB4aSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHggPSB4MiBeIGRbZFtkW3g4IF4geDJdXV07CiAgICAgICAgICB4aSBePSBkW2RbeGldXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pKCk7CgogICAgLy8gUHJlY29tcHV0ZWQgUmNvbiBsb29rdXAKICAgIHZhciBSQ09OID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZdOwoKICAgIC8qKg0KICAgICAqIEFFUyBibG9jayBjaXBoZXIgYWxnb3JpdGhtLg0KICAgICAqLwogICAgdmFyIEFFUyA9IENfYWxnby5BRVMgPSBCbG9ja0NpcGhlci5leHRlbmQoewogICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNraXAgcmVzZXQgb2YgblJvdW5kcyBoYXMgYmVlbiBzZXQgYmVmb3JlIGFuZCBrZXkgZGlkIG5vdCBjaGFuZ2UKICAgICAgICBpZiAodGhpcy5fblJvdW5kcyAmJiB0aGlzLl9rZXlQcmlvclJlc2V0ID09PSB0aGlzLl9rZXkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXlQcmlvclJlc2V0ID0gdGhpcy5fa2V5OwogICAgICAgIHZhciBrZXlXb3JkcyA9IGtleS53b3JkczsKICAgICAgICB2YXIga2V5U2l6ZSA9IGtleS5zaWdCeXRlcyAvIDQ7CgogICAgICAgIC8vIENvbXB1dGUgbnVtYmVyIG9mIHJvdW5kcwogICAgICAgIHZhciBuUm91bmRzID0gdGhpcy5fblJvdW5kcyA9IGtleVNpemUgKyA2OwoKICAgICAgICAvLyBDb21wdXRlIG51bWJlciBvZiBrZXkgc2NoZWR1bGUgcm93cwogICAgICAgIHZhciBrc1Jvd3MgPSAoblJvdW5kcyArIDEpICogNDsKCiAgICAgICAgLy8gQ29tcHV0ZSBrZXkgc2NoZWR1bGUKICAgICAgICB2YXIga2V5U2NoZWR1bGUgPSB0aGlzLl9rZXlTY2hlZHVsZSA9IFtdOwogICAgICAgIGZvciAodmFyIGtzUm93ID0gMDsga3NSb3cgPCBrc1Jvd3M7IGtzUm93KyspIHsKICAgICAgICAgIGlmIChrc1JvdyA8IGtleVNpemUpIHsKICAgICAgICAgICAga2V5U2NoZWR1bGVba3NSb3ddID0ga2V5V29yZHNba3NSb3ddOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHQgPSBrZXlTY2hlZHVsZVtrc1JvdyAtIDFdOwogICAgICAgICAgICBpZiAoIShrc1JvdyAlIGtleVNpemUpKSB7CiAgICAgICAgICAgICAgLy8gUm90IHdvcmQKICAgICAgICAgICAgICB0ID0gdCA8PCA4IHwgdCA+Pj4gMjQ7CgogICAgICAgICAgICAgIC8vIFN1YiB3b3JkCiAgICAgICAgICAgICAgdCA9IFNCT1hbdCA+Pj4gMjRdIDw8IDI0IHwgU0JPWFt0ID4+PiAxNiAmIDB4ZmZdIDw8IDE2IHwgU0JPWFt0ID4+PiA4ICYgMHhmZl0gPDwgOCB8IFNCT1hbdCAmIDB4ZmZdOwoKICAgICAgICAgICAgICAvLyBNaXggUmNvbgogICAgICAgICAgICAgIHQgXj0gUkNPTltrc1JvdyAvIGtleVNpemUgfCAwXSA8PCAyNDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlTaXplID4gNiAmJiBrc1JvdyAlIGtleVNpemUgPT0gNCkgewogICAgICAgICAgICAgIC8vIFN1YiB3b3JkCiAgICAgICAgICAgICAgdCA9IFNCT1hbdCA+Pj4gMjRdIDw8IDI0IHwgU0JPWFt0ID4+PiAxNiAmIDB4ZmZdIDw8IDE2IHwgU0JPWFt0ID4+PiA4ICYgMHhmZl0gPDwgOCB8IFNCT1hbdCAmIDB4ZmZdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGtleVNjaGVkdWxlW2tzUm93XSA9IGtleVNjaGVkdWxlW2tzUm93IC0ga2V5U2l6ZV0gXiB0OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ29tcHV0ZSBpbnYga2V5IHNjaGVkdWxlCiAgICAgICAgdmFyIGludktleVNjaGVkdWxlID0gdGhpcy5faW52S2V5U2NoZWR1bGUgPSBbXTsKICAgICAgICBmb3IgKHZhciBpbnZLc1JvdyA9IDA7IGludktzUm93IDwga3NSb3dzOyBpbnZLc1JvdysrKSB7CiAgICAgICAgICB2YXIga3NSb3cgPSBrc1Jvd3MgLSBpbnZLc1JvdzsKICAgICAgICAgIGlmIChpbnZLc1JvdyAlIDQpIHsKICAgICAgICAgICAgdmFyIHQgPSBrZXlTY2hlZHVsZVtrc1Jvd107CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgdCA9IGtleVNjaGVkdWxlW2tzUm93IC0gNF07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW52S3NSb3cgPCA0IHx8IGtzUm93IDw9IDQpIHsKICAgICAgICAgICAgaW52S2V5U2NoZWR1bGVbaW52S3NSb3ddID0gdDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludktleVNjaGVkdWxlW2ludktzUm93XSA9IElOVl9TVUJfTUlYXzBbU0JPWFt0ID4+PiAyNF1dIF4gSU5WX1NVQl9NSVhfMVtTQk9YW3QgPj4+IDE2ICYgMHhmZl1dIF4gSU5WX1NVQl9NSVhfMltTQk9YW3QgPj4+IDggJiAweGZmXV0gXiBJTlZfU1VCX01JWF8zW1NCT1hbdCAmIDB4ZmZdXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGVuY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewogICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2tleVNjaGVkdWxlLCBTVUJfTUlYXzAsIFNVQl9NSVhfMSwgU1VCX01JWF8yLCBTVUJfTUlYXzMsIFNCT1gpOwogICAgICB9LAogICAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKICAgICAgICAvLyBTd2FwIDJuZCBhbmQgNHRoIHJvd3MKICAgICAgICB2YXIgdCA9IE1bb2Zmc2V0ICsgMV07CiAgICAgICAgTVtvZmZzZXQgKyAxXSA9IE1bb2Zmc2V0ICsgM107CiAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQ7CiAgICAgICAgdGhpcy5fZG9DcnlwdEJsb2NrKE0sIG9mZnNldCwgdGhpcy5faW52S2V5U2NoZWR1bGUsIElOVl9TVUJfTUlYXzAsIElOVl9TVUJfTUlYXzEsIElOVl9TVUJfTUlYXzIsIElOVl9TVUJfTUlYXzMsIElOVl9TQk9YKTsKCiAgICAgICAgLy8gSW52IHN3YXAgMm5kIGFuZCA0dGggcm93cwogICAgICAgIHZhciB0ID0gTVtvZmZzZXQgKyAxXTsKICAgICAgICBNW29mZnNldCArIDFdID0gTVtvZmZzZXQgKyAzXTsKICAgICAgICBNW29mZnNldCArIDNdID0gdDsKICAgICAgfSwKICAgICAgX2RvQ3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCwga2V5U2NoZWR1bGUsIFNVQl9NSVhfMCwgU1VCX01JWF8xLCBTVUJfTUlYXzIsIFNVQl9NSVhfMywgU0JPWCkgewogICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgdmFyIG5Sb3VuZHMgPSB0aGlzLl9uUm91bmRzOwoKICAgICAgICAvLyBHZXQgaW5wdXQsIGFkZCByb3VuZCBrZXkKICAgICAgICB2YXIgczAgPSBNW29mZnNldF0gXiBrZXlTY2hlZHVsZVswXTsKICAgICAgICB2YXIgczEgPSBNW29mZnNldCArIDFdIF4ga2V5U2NoZWR1bGVbMV07CiAgICAgICAgdmFyIHMyID0gTVtvZmZzZXQgKyAyXSBeIGtleVNjaGVkdWxlWzJdOwogICAgICAgIHZhciBzMyA9IE1bb2Zmc2V0ICsgM10gXiBrZXlTY2hlZHVsZVszXTsKCiAgICAgICAgLy8gS2V5IHNjaGVkdWxlIHJvdyBjb3VudGVyCiAgICAgICAgdmFyIGtzUm93ID0gNDsKCiAgICAgICAgLy8gUm91bmRzCiAgICAgICAgZm9yICh2YXIgcm91bmQgPSAxOyByb3VuZCA8IG5Sb3VuZHM7IHJvdW5kKyspIHsKICAgICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgbWl4IGNvbHVtbnMsIGFkZCByb3VuZCBrZXkKICAgICAgICAgIHZhciB0MCA9IFNVQl9NSVhfMFtzMCA+Pj4gMjRdIF4gU1VCX01JWF8xW3MxID4+PiAxNiAmIDB4ZmZdIF4gU1VCX01JWF8yW3MyID4+PiA4ICYgMHhmZl0gXiBTVUJfTUlYXzNbczMgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdOwogICAgICAgICAgdmFyIHQxID0gU1VCX01JWF8wW3MxID4+PiAyNF0gXiBTVUJfTUlYXzFbczIgPj4+IDE2ICYgMHhmZl0gXiBTVUJfTUlYXzJbczMgPj4+IDggJiAweGZmXSBeIFNVQl9NSVhfM1tzMCAmIDB4ZmZdIF4ga2V5U2NoZWR1bGVba3NSb3crK107CiAgICAgICAgICB2YXIgdDIgPSBTVUJfTUlYXzBbczIgPj4+IDI0XSBeIFNVQl9NSVhfMVtzMyA+Pj4gMTYgJiAweGZmXSBeIFNVQl9NSVhfMltzMCA+Pj4gOCAmIDB4ZmZdIF4gU1VCX01JWF8zW3MxICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTsKICAgICAgICAgIHZhciB0MyA9IFNVQl9NSVhfMFtzMyA+Pj4gMjRdIF4gU1VCX01JWF8xW3MwID4+PiAxNiAmIDB4ZmZdIF4gU1VCX01JWF8yW3MxID4+PiA4ICYgMHhmZl0gXiBTVUJfTUlYXzNbczIgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdOwoKICAgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQogICAgICAgICAgczAgPSB0MDsKICAgICAgICAgIHMxID0gdDE7CiAgICAgICAgICBzMiA9IHQyOwogICAgICAgICAgczMgPSB0MzsKICAgICAgICB9CgogICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgYWRkIHJvdW5kIGtleQogICAgICAgIHZhciB0MCA9IChTQk9YW3MwID4+PiAyNF0gPDwgMjQgfCBTQk9YW3MxID4+PiAxNiAmIDB4ZmZdIDw8IDE2IHwgU0JPWFtzMiA+Pj4gOCAmIDB4ZmZdIDw8IDggfCBTQk9YW3MzICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107CiAgICAgICAgdmFyIHQxID0gKFNCT1hbczEgPj4+IDI0XSA8PCAyNCB8IFNCT1hbczIgPj4+IDE2ICYgMHhmZl0gPDwgMTYgfCBTQk9YW3MzID4+PiA4ICYgMHhmZl0gPDwgOCB8IFNCT1hbczAgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTsKICAgICAgICB2YXIgdDIgPSAoU0JPWFtzMiA+Pj4gMjRdIDw8IDI0IHwgU0JPWFtzMyA+Pj4gMTYgJiAweGZmXSA8PCAxNiB8IFNCT1hbczAgPj4+IDggJiAweGZmXSA8PCA4IHwgU0JPWFtzMSAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdOwogICAgICAgIHZhciB0MyA9IChTQk9YW3MzID4+PiAyNF0gPDwgMjQgfCBTQk9YW3MwID4+PiAxNiAmIDB4ZmZdIDw8IDE2IHwgU0JPWFtzMSA+Pj4gOCAmIDB4ZmZdIDw8IDggfCBTQk9YW3MyICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107CgogICAgICAgIC8vIFNldCBvdXRwdXQKICAgICAgICBNW29mZnNldF0gPSB0MDsKICAgICAgICBNW29mZnNldCArIDFdID0gdDE7CiAgICAgICAgTVtvZmZzZXQgKyAyXSA9IHQyOwogICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0MzsKICAgICAgfSwKICAgICAga2V5U2l6ZTogMjU2IC8gMzIKICAgIH0pOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7DQogICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpOw0KICAgICAqLwogICAgQy5BRVMgPSBCbG9ja0NpcGhlci5fY3JlYXRlSGVscGVyKEFFUyk7CiAgfSkoKTsKICAoZnVuY3Rpb24gKCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5OwogICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXI7CiAgICB2YXIgQ19hbGdvID0gQy5hbGdvOwoKICAgIC8vIFBlcm11dGVkIENob2ljZSAxIGNvbnN0YW50cwogICAgdmFyIFBDMSA9IFs1NywgNDksIDQxLCAzMywgMjUsIDE3LCA5LCAxLCA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LCAxMCwgMiwgNTksIDUxLCA0MywgMzUsIDI3LCAxOSwgMTEsIDMsIDYwLCA1MiwgNDQsIDM2LCA2MywgNTUsIDQ3LCAzOSwgMzEsIDIzLCAxNSwgNywgNjIsIDU0LCA0NiwgMzgsIDMwLCAyMiwgMTQsIDYsIDYxLCA1MywgNDUsIDM3LCAyOSwgMjEsIDEzLCA1LCAyOCwgMjAsIDEyLCA0XTsKCiAgICAvLyBQZXJtdXRlZCBDaG9pY2UgMiBjb25zdGFudHMKICAgIHZhciBQQzIgPSBbMTQsIDE3LCAxMSwgMjQsIDEsIDUsIDMsIDI4LCAxNSwgNiwgMjEsIDEwLCAyMywgMTksIDEyLCA0LCAyNiwgOCwgMTYsIDcsIDI3LCAyMCwgMTMsIDIsIDQxLCA1MiwgMzEsIDM3LCA0NywgNTUsIDMwLCA0MCwgNTEsIDQ1LCAzMywgNDgsIDQ0LCA0OSwgMzksIDU2LCAzNCwgNTMsIDQ2LCA0MiwgNTAsIDM2LCAyOSwgMzJdOwoKICAgIC8vIEN1bXVsYXRpdmUgYml0IHNoaWZ0IGNvbnN0YW50cwogICAgdmFyIEJJVF9TSElGVFMgPSBbMSwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI4XTsKCiAgICAvLyBTQk9YZXMgYW5kIHJvdW5kIHBlcm11dGF0aW9uIGNvbnN0YW50cwogICAgdmFyIFNCT1hfUCA9IFt7CiAgICAgIDB4MDogMHg4MDgyMDAsCiAgICAgIDB4MTAwMDAwMDA6IDB4ODAwMCwKICAgICAgMHgyMDAwMDAwMDogMHg4MDgwMDIsCiAgICAgIDB4MzAwMDAwMDA6IDB4MiwKICAgICAgMHg0MDAwMDAwMDogMHgyMDAsCiAgICAgIDB4NTAwMDAwMDA6IDB4ODA4MjAyLAogICAgICAweDYwMDAwMDAwOiAweDgwMDIwMiwKICAgICAgMHg3MDAwMDAwMDogMHg4MDAwMDAsCiAgICAgIDB4ODAwMDAwMDA6IDB4MjAyLAogICAgICAweDkwMDAwMDAwOiAweDgwMDIwMCwKICAgICAgMHhhMDAwMDAwMDogMHg4MjAwLAogICAgICAweGIwMDAwMDAwOiAweDgwODAwMCwKICAgICAgMHhjMDAwMDAwMDogMHg4MDAyLAogICAgICAweGQwMDAwMDAwOiAweDgwMDAwMiwKICAgICAgMHhlMDAwMDAwMDogMHgwLAogICAgICAweGYwMDAwMDAwOiAweDgyMDIsCiAgICAgIDB4ODAwMDAwMDogMHgwLAogICAgICAweDE4MDAwMDAwOiAweDgwODIwMiwKICAgICAgMHgyODAwMDAwMDogMHg4MjAyLAogICAgICAweDM4MDAwMDAwOiAweDgwMDAsCiAgICAgIDB4NDgwMDAwMDA6IDB4ODA4MjAwLAogICAgICAweDU4MDAwMDAwOiAweDIwMCwKICAgICAgMHg2ODAwMDAwMDogMHg4MDgwMDIsCiAgICAgIDB4NzgwMDAwMDA6IDB4MiwKICAgICAgMHg4ODAwMDAwMDogMHg4MDAyMDAsCiAgICAgIDB4OTgwMDAwMDA6IDB4ODIwMCwKICAgICAgMHhhODAwMDAwMDogMHg4MDgwMDAsCiAgICAgIDB4YjgwMDAwMDA6IDB4ODAwMjAyLAogICAgICAweGM4MDAwMDAwOiAweDgwMDAwMiwKICAgICAgMHhkODAwMDAwMDogMHg4MDAyLAogICAgICAweGU4MDAwMDAwOiAweDIwMiwKICAgICAgMHhmODAwMDAwMDogMHg4MDAwMDAsCiAgICAgIDB4MTogMHg4MDAwLAogICAgICAweDEwMDAwMDAxOiAweDIsCiAgICAgIDB4MjAwMDAwMDE6IDB4ODA4MjAwLAogICAgICAweDMwMDAwMDAxOiAweDgwMDAwMCwKICAgICAgMHg0MDAwMDAwMTogMHg4MDgwMDIsCiAgICAgIDB4NTAwMDAwMDE6IDB4ODIwMCwKICAgICAgMHg2MDAwMDAwMTogMHgyMDAsCiAgICAgIDB4NzAwMDAwMDE6IDB4ODAwMjAyLAogICAgICAweDgwMDAwMDAxOiAweDgwODIwMiwKICAgICAgMHg5MDAwMDAwMTogMHg4MDgwMDAsCiAgICAgIDB4YTAwMDAwMDE6IDB4ODAwMDAyLAogICAgICAweGIwMDAwMDAxOiAweDgyMDIsCiAgICAgIDB4YzAwMDAwMDE6IDB4MjAyLAogICAgICAweGQwMDAwMDAxOiAweDgwMDIwMCwKICAgICAgMHhlMDAwMDAwMTogMHg4MDAyLAogICAgICAweGYwMDAwMDAxOiAweDAsCiAgICAgIDB4ODAwMDAwMTogMHg4MDgyMDIsCiAgICAgIDB4MTgwMDAwMDE6IDB4ODA4MDAwLAogICAgICAweDI4MDAwMDAxOiAweDgwMDAwMCwKICAgICAgMHgzODAwMDAwMTogMHgyMDAsCiAgICAgIDB4NDgwMDAwMDE6IDB4ODAwMCwKICAgICAgMHg1ODAwMDAwMTogMHg4MDAwMDIsCiAgICAgIDB4NjgwMDAwMDE6IDB4MiwKICAgICAgMHg3ODAwMDAwMTogMHg4MjAyLAogICAgICAweDg4MDAwMDAxOiAweDgwMDIsCiAgICAgIDB4OTgwMDAwMDE6IDB4ODAwMjAyLAogICAgICAweGE4MDAwMDAxOiAweDIwMiwKICAgICAgMHhiODAwMDAwMTogMHg4MDgyMDAsCiAgICAgIDB4YzgwMDAwMDE6IDB4ODAwMjAwLAogICAgICAweGQ4MDAwMDAxOiAweDAsCiAgICAgIDB4ZTgwMDAwMDE6IDB4ODIwMCwKICAgICAgMHhmODAwMDAwMTogMHg4MDgwMDIKICAgIH0sIHsKICAgICAgMHgwOiAweDQwMDg0MDEwLAogICAgICAweDEwMDAwMDA6IDB4NDAwMCwKICAgICAgMHgyMDAwMDAwOiAweDgwMDAwLAogICAgICAweDMwMDAwMDA6IDB4NDAwODAwMTAsCiAgICAgIDB4NDAwMDAwMDogMHg0MDAwMDAxMCwKICAgICAgMHg1MDAwMDAwOiAweDQwMDg0MDAwLAogICAgICAweDYwMDAwMDA6IDB4NDAwMDQwMDAsCiAgICAgIDB4NzAwMDAwMDogMHgxMCwKICAgICAgMHg4MDAwMDAwOiAweDg0MDAwLAogICAgICAweDkwMDAwMDA6IDB4NDAwMDQwMTAsCiAgICAgIDB4YTAwMDAwMDogMHg0MDAwMDAwMCwKICAgICAgMHhiMDAwMDAwOiAweDg0MDEwLAogICAgICAweGMwMDAwMDA6IDB4ODAwMTAsCiAgICAgIDB4ZDAwMDAwMDogMHgwLAogICAgICAweGUwMDAwMDA6IDB4NDAxMCwKICAgICAgMHhmMDAwMDAwOiAweDQwMDgwMDAwLAogICAgICAweDgwMDAwMDogMHg0MDAwNDAwMCwKICAgICAgMHgxODAwMDAwOiAweDg0MDEwLAogICAgICAweDI4MDAwMDA6IDB4MTAsCiAgICAgIDB4MzgwMDAwMDogMHg0MDAwNDAxMCwKICAgICAgMHg0ODAwMDAwOiAweDQwMDg0MDEwLAogICAgICAweDU4MDAwMDA6IDB4NDAwMDAwMDAsCiAgICAgIDB4NjgwMDAwMDogMHg4MDAwMCwKICAgICAgMHg3ODAwMDAwOiAweDQwMDgwMDEwLAogICAgICAweDg4MDAwMDA6IDB4ODAwMTAsCiAgICAgIDB4OTgwMDAwMDogMHgwLAogICAgICAweGE4MDAwMDA6IDB4NDAwMCwKICAgICAgMHhiODAwMDAwOiAweDQwMDgwMDAwLAogICAgICAweGM4MDAwMDA6IDB4NDAwMDAwMTAsCiAgICAgIDB4ZDgwMDAwMDogMHg4NDAwMCwKICAgICAgMHhlODAwMDAwOiAweDQwMDg0MDAwLAogICAgICAweGY4MDAwMDA6IDB4NDAxMCwKICAgICAgMHgxMDAwMDAwMDogMHgwLAogICAgICAweDExMDAwMDAwOiAweDQwMDgwMDEwLAogICAgICAweDEyMDAwMDAwOiAweDQwMDA0MDEwLAogICAgICAweDEzMDAwMDAwOiAweDQwMDg0MDAwLAogICAgICAweDE0MDAwMDAwOiAweDQwMDgwMDAwLAogICAgICAweDE1MDAwMDAwOiAweDEwLAogICAgICAweDE2MDAwMDAwOiAweDg0MDEwLAogICAgICAweDE3MDAwMDAwOiAweDQwMDAsCiAgICAgIDB4MTgwMDAwMDA6IDB4NDAxMCwKICAgICAgMHgxOTAwMDAwMDogMHg4MDAwMCwKICAgICAgMHgxYTAwMDAwMDogMHg4MDAxMCwKICAgICAgMHgxYjAwMDAwMDogMHg0MDAwMDAxMCwKICAgICAgMHgxYzAwMDAwMDogMHg4NDAwMCwKICAgICAgMHgxZDAwMDAwMDogMHg0MDAwNDAwMCwKICAgICAgMHgxZTAwMDAwMDogMHg0MDAwMDAwMCwKICAgICAgMHgxZjAwMDAwMDogMHg0MDA4NDAxMCwKICAgICAgMHgxMDgwMDAwMDogMHg4NDAxMCwKICAgICAgMHgxMTgwMDAwMDogMHg4MDAwMCwKICAgICAgMHgxMjgwMDAwMDogMHg0MDA4MDAwMCwKICAgICAgMHgxMzgwMDAwMDogMHg0MDAwLAogICAgICAweDE0ODAwMDAwOiAweDQwMDA0MDAwLAogICAgICAweDE1ODAwMDAwOiAweDQwMDg0MDEwLAogICAgICAweDE2ODAwMDAwOiAweDEwLAogICAgICAweDE3ODAwMDAwOiAweDQwMDAwMDAwLAogICAgICAweDE4ODAwMDAwOiAweDQwMDg0MDAwLAogICAgICAweDE5ODAwMDAwOiAweDQwMDAwMDEwLAogICAgICAweDFhODAwMDAwOiAweDQwMDA0MDEwLAogICAgICAweDFiODAwMDAwOiAweDgwMDEwLAogICAgICAweDFjODAwMDAwOiAweDAsCiAgICAgIDB4MWQ4MDAwMDA6IDB4NDAxMCwKICAgICAgMHgxZTgwMDAwMDogMHg0MDA4MDAxMCwKICAgICAgMHgxZjgwMDAwMDogMHg4NDAwMAogICAgfSwgewogICAgICAweDA6IDB4MTA0LAogICAgICAweDEwMDAwMDogMHgwLAogICAgICAweDIwMDAwMDogMHg0MDAwMTAwLAogICAgICAweDMwMDAwMDogMHgxMDEwNCwKICAgICAgMHg0MDAwMDA6IDB4MTAwMDQsCiAgICAgIDB4NTAwMDAwOiAweDQwMDAwMDQsCiAgICAgIDB4NjAwMDAwOiAweDQwMTAxMDQsCiAgICAgIDB4NzAwMDAwOiAweDQwMTAwMDAsCiAgICAgIDB4ODAwMDAwOiAweDQwMDAwMDAsCiAgICAgIDB4OTAwMDAwOiAweDQwMTAxMDAsCiAgICAgIDB4YTAwMDAwOiAweDEwMTAwLAogICAgICAweGIwMDAwMDogMHg0MDEwMDA0LAogICAgICAweGMwMDAwMDogMHg0MDAwMTA0LAogICAgICAweGQwMDAwMDogMHgxMDAwMCwKICAgICAgMHhlMDAwMDA6IDB4NCwKICAgICAgMHhmMDAwMDA6IDB4MTAwLAogICAgICAweDgwMDAwOiAweDQwMTAxMDAsCiAgICAgIDB4MTgwMDAwOiAweDQwMTAwMDQsCiAgICAgIDB4MjgwMDAwOiAweDAsCiAgICAgIDB4MzgwMDAwOiAweDQwMDAxMDAsCiAgICAgIDB4NDgwMDAwOiAweDQwMDAwMDQsCiAgICAgIDB4NTgwMDAwOiAweDEwMDAwLAogICAgICAweDY4MDAwMDogMHgxMDAwNCwKICAgICAgMHg3ODAwMDA6IDB4MTA0LAogICAgICAweDg4MDAwMDogMHg0LAogICAgICAweDk4MDAwMDogMHgxMDAsCiAgICAgIDB4YTgwMDAwOiAweDQwMTAwMDAsCiAgICAgIDB4YjgwMDAwOiAweDEwMTA0LAogICAgICAweGM4MDAwMDogMHgxMDEwMCwKICAgICAgMHhkODAwMDA6IDB4NDAwMDEwNCwKICAgICAgMHhlODAwMDA6IDB4NDAxMDEwNCwKICAgICAgMHhmODAwMDA6IDB4NDAwMDAwMCwKICAgICAgMHgxMDAwMDAwOiAweDQwMTAxMDAsCiAgICAgIDB4MTEwMDAwMDogMHgxMDAwNCwKICAgICAgMHgxMjAwMDAwOiAweDEwMDAwLAogICAgICAweDEzMDAwMDA6IDB4NDAwMDEwMCwKICAgICAgMHgxNDAwMDAwOiAweDEwMCwKICAgICAgMHgxNTAwMDAwOiAweDQwMTAxMDQsCiAgICAgIDB4MTYwMDAwMDogMHg0MDAwMDA0LAogICAgICAweDE3MDAwMDA6IDB4MCwKICAgICAgMHgxODAwMDAwOiAweDQwMDAxMDQsCiAgICAgIDB4MTkwMDAwMDogMHg0MDAwMDAwLAogICAgICAweDFhMDAwMDA6IDB4NCwKICAgICAgMHgxYjAwMDAwOiAweDEwMTAwLAogICAgICAweDFjMDAwMDA6IDB4NDAxMDAwMCwKICAgICAgMHgxZDAwMDAwOiAweDEwNCwKICAgICAgMHgxZTAwMDAwOiAweDEwMTA0LAogICAgICAweDFmMDAwMDA6IDB4NDAxMDAwNCwKICAgICAgMHgxMDgwMDAwOiAweDQwMDAwMDAsCiAgICAgIDB4MTE4MDAwMDogMHgxMDQsCiAgICAgIDB4MTI4MDAwMDogMHg0MDEwMTAwLAogICAgICAweDEzODAwMDA6IDB4MCwKICAgICAgMHgxNDgwMDAwOiAweDEwMDA0LAogICAgICAweDE1ODAwMDA6IDB4NDAwMDEwMCwKICAgICAgMHgxNjgwMDAwOiAweDEwMCwKICAgICAgMHgxNzgwMDAwOiAweDQwMTAwMDQsCiAgICAgIDB4MTg4MDAwMDogMHgxMDAwMCwKICAgICAgMHgxOTgwMDAwOiAweDQwMTAxMDQsCiAgICAgIDB4MWE4MDAwMDogMHgxMDEwNCwKICAgICAgMHgxYjgwMDAwOiAweDQwMDAwMDQsCiAgICAgIDB4MWM4MDAwMDogMHg0MDAwMTA0LAogICAgICAweDFkODAwMDA6IDB4NDAxMDAwMCwKICAgICAgMHgxZTgwMDAwOiAweDQsCiAgICAgIDB4MWY4MDAwMDogMHgxMDEwMAogICAgfSwgewogICAgICAweDA6IDB4ODA0MDEwMDAsCiAgICAgIDB4MTAwMDA6IDB4ODAwMDEwNDAsCiAgICAgIDB4MjAwMDA6IDB4NDAxMDQwLAogICAgICAweDMwMDAwOiAweDgwNDAwMDAwLAogICAgICAweDQwMDAwOiAweDAsCiAgICAgIDB4NTAwMDA6IDB4NDAxMDAwLAogICAgICAweDYwMDAwOiAweDgwMDAwMDQwLAogICAgICAweDcwMDAwOiAweDQwMDA0MCwKICAgICAgMHg4MDAwMDogMHg4MDAwMDAwMCwKICAgICAgMHg5MDAwMDogMHg0MDAwMDAsCiAgICAgIDB4YTAwMDA6IDB4NDAsCiAgICAgIDB4YjAwMDA6IDB4ODAwMDEwMDAsCiAgICAgIDB4YzAwMDA6IDB4ODA0MDAwNDAsCiAgICAgIDB4ZDAwMDA6IDB4MTA0MCwKICAgICAgMHhlMDAwMDogMHgxMDAwLAogICAgICAweGYwMDAwOiAweDgwNDAxMDQwLAogICAgICAweDgwMDA6IDB4ODAwMDEwNDAsCiAgICAgIDB4MTgwMDA6IDB4NDAsCiAgICAgIDB4MjgwMDA6IDB4ODA0MDAwNDAsCiAgICAgIDB4MzgwMDA6IDB4ODAwMDEwMDAsCiAgICAgIDB4NDgwMDA6IDB4NDAxMDAwLAogICAgICAweDU4MDAwOiAweDgwNDAxMDQwLAogICAgICAweDY4MDAwOiAweDAsCiAgICAgIDB4NzgwMDA6IDB4ODA0MDAwMDAsCiAgICAgIDB4ODgwMDA6IDB4MTAwMCwKICAgICAgMHg5ODAwMDogMHg4MDQwMTAwMCwKICAgICAgMHhhODAwMDogMHg0MDAwMDAsCiAgICAgIDB4YjgwMDA6IDB4MTA0MCwKICAgICAgMHhjODAwMDogMHg4MDAwMDAwMCwKICAgICAgMHhkODAwMDogMHg0MDAwNDAsCiAgICAgIDB4ZTgwMDA6IDB4NDAxMDQwLAogICAgICAweGY4MDAwOiAweDgwMDAwMDQwLAogICAgICAweDEwMDAwMDogMHg0MDAwNDAsCiAgICAgIDB4MTEwMDAwOiAweDQwMTAwMCwKICAgICAgMHgxMjAwMDA6IDB4ODAwMDAwNDAsCiAgICAgIDB4MTMwMDAwOiAweDAsCiAgICAgIDB4MTQwMDAwOiAweDEwNDAsCiAgICAgIDB4MTUwMDAwOiAweDgwNDAwMDQwLAogICAgICAweDE2MDAwMDogMHg4MDQwMTAwMCwKICAgICAgMHgxNzAwMDA6IDB4ODAwMDEwNDAsCiAgICAgIDB4MTgwMDAwOiAweDgwNDAxMDQwLAogICAgICAweDE5MDAwMDogMHg4MDAwMDAwMCwKICAgICAgMHgxYTAwMDA6IDB4ODA0MDAwMDAsCiAgICAgIDB4MWIwMDAwOiAweDQwMTA0MCwKICAgICAgMHgxYzAwMDA6IDB4ODAwMDEwMDAsCiAgICAgIDB4MWQwMDAwOiAweDQwMDAwMCwKICAgICAgMHgxZTAwMDA6IDB4NDAsCiAgICAgIDB4MWYwMDAwOiAweDEwMDAsCiAgICAgIDB4MTA4MDAwOiAweDgwNDAwMDAwLAogICAgICAweDExODAwMDogMHg4MDQwMTA0MCwKICAgICAgMHgxMjgwMDA6IDB4MCwKICAgICAgMHgxMzgwMDA6IDB4NDAxMDAwLAogICAgICAweDE0ODAwMDogMHg0MDAwNDAsCiAgICAgIDB4MTU4MDAwOiAweDgwMDAwMDAwLAogICAgICAweDE2ODAwMDogMHg4MDAwMTA0MCwKICAgICAgMHgxNzgwMDA6IDB4NDAsCiAgICAgIDB4MTg4MDAwOiAweDgwMDAwMDQwLAogICAgICAweDE5ODAwMDogMHgxMDAwLAogICAgICAweDFhODAwMDogMHg4MDAwMTAwMCwKICAgICAgMHgxYjgwMDA6IDB4ODA0MDAwNDAsCiAgICAgIDB4MWM4MDAwOiAweDEwNDAsCiAgICAgIDB4MWQ4MDAwOiAweDgwNDAxMDAwLAogICAgICAweDFlODAwMDogMHg0MDAwMDAsCiAgICAgIDB4MWY4MDAwOiAweDQwMTA0MAogICAgfSwgewogICAgICAweDA6IDB4ODAsCiAgICAgIDB4MTAwMDogMHgxMDQwMDAwLAogICAgICAweDIwMDA6IDB4NDAwMDAsCiAgICAgIDB4MzAwMDogMHgyMDAwMDAwMCwKICAgICAgMHg0MDAwOiAweDIwMDQwMDgwLAogICAgICAweDUwMDA6IDB4MTAwMDA4MCwKICAgICAgMHg2MDAwOiAweDIxMDAwMDgwLAogICAgICAweDcwMDA6IDB4NDAwODAsCiAgICAgIDB4ODAwMDogMHgxMDAwMDAwLAogICAgICAweDkwMDA6IDB4MjAwNDAwMDAsCiAgICAgIDB4YTAwMDogMHgyMDAwMDA4MCwKICAgICAgMHhiMDAwOiAweDIxMDQwMDgwLAogICAgICAweGMwMDA6IDB4MjEwNDAwMDAsCiAgICAgIDB4ZDAwMDogMHgwLAogICAgICAweGUwMDA6IDB4MTA0MDA4MCwKICAgICAgMHhmMDAwOiAweDIxMDAwMDAwLAogICAgICAweDgwMDogMHgxMDQwMDgwLAogICAgICAweDE4MDA6IDB4MjEwMDAwODAsCiAgICAgIDB4MjgwMDogMHg4MCwKICAgICAgMHgzODAwOiAweDEwNDAwMDAsCiAgICAgIDB4NDgwMDogMHg0MDAwMCwKICAgICAgMHg1ODAwOiAweDIwMDQwMDgwLAogICAgICAweDY4MDA6IDB4MjEwNDAwMDAsCiAgICAgIDB4NzgwMDogMHgyMDAwMDAwMCwKICAgICAgMHg4ODAwOiAweDIwMDQwMDAwLAogICAgICAweDk4MDA6IDB4MCwKICAgICAgMHhhODAwOiAweDIxMDQwMDgwLAogICAgICAweGI4MDA6IDB4MTAwMDA4MCwKICAgICAgMHhjODAwOiAweDIwMDAwMDgwLAogICAgICAweGQ4MDA6IDB4MjEwMDAwMDAsCiAgICAgIDB4ZTgwMDogMHgxMDAwMDAwLAogICAgICAweGY4MDA6IDB4NDAwODAsCiAgICAgIDB4MTAwMDA6IDB4NDAwMDAsCiAgICAgIDB4MTEwMDA6IDB4ODAsCiAgICAgIDB4MTIwMDA6IDB4MjAwMDAwMDAsCiAgICAgIDB4MTMwMDA6IDB4MjEwMDAwODAsCiAgICAgIDB4MTQwMDA6IDB4MTAwMDA4MCwKICAgICAgMHgxNTAwMDogMHgyMTA0MDAwMCwKICAgICAgMHgxNjAwMDogMHgyMDA0MDA4MCwKICAgICAgMHgxNzAwMDogMHgxMDAwMDAwLAogICAgICAweDE4MDAwOiAweDIxMDQwMDgwLAogICAgICAweDE5MDAwOiAweDIxMDAwMDAwLAogICAgICAweDFhMDAwOiAweDEwNDAwMDAsCiAgICAgIDB4MWIwMDA6IDB4MjAwNDAwMDAsCiAgICAgIDB4MWMwMDA6IDB4NDAwODAsCiAgICAgIDB4MWQwMDA6IDB4MjAwMDAwODAsCiAgICAgIDB4MWUwMDA6IDB4MCwKICAgICAgMHgxZjAwMDogMHgxMDQwMDgwLAogICAgICAweDEwODAwOiAweDIxMDAwMDgwLAogICAgICAweDExODAwOiAweDEwMDAwMDAsCiAgICAgIDB4MTI4MDA6IDB4MTA0MDAwMCwKICAgICAgMHgxMzgwMDogMHgyMDA0MDA4MCwKICAgICAgMHgxNDgwMDogMHgyMDAwMDAwMCwKICAgICAgMHgxNTgwMDogMHgxMDQwMDgwLAogICAgICAweDE2ODAwOiAweDgwLAogICAgICAweDE3ODAwOiAweDIxMDQwMDAwLAogICAgICAweDE4ODAwOiAweDQwMDgwLAogICAgICAweDE5ODAwOiAweDIxMDQwMDgwLAogICAgICAweDFhODAwOiAweDAsCiAgICAgIDB4MWI4MDA6IDB4MjEwMDAwMDAsCiAgICAgIDB4MWM4MDA6IDB4MTAwMDA4MCwKICAgICAgMHgxZDgwMDogMHg0MDAwMCwKICAgICAgMHgxZTgwMDogMHgyMDA0MDAwMCwKICAgICAgMHgxZjgwMDogMHgyMDAwMDA4MAogICAgfSwgewogICAgICAweDA6IDB4MTAwMDAwMDgsCiAgICAgIDB4MTAwOiAweDIwMDAsCiAgICAgIDB4MjAwOiAweDEwMjAwMDAwLAogICAgICAweDMwMDogMHgxMDIwMjAwOCwKICAgICAgMHg0MDA6IDB4MTAwMDIwMDAsCiAgICAgIDB4NTAwOiAweDIwMDAwMCwKICAgICAgMHg2MDA6IDB4MjAwMDA4LAogICAgICAweDcwMDogMHgxMDAwMDAwMCwKICAgICAgMHg4MDA6IDB4MCwKICAgICAgMHg5MDA6IDB4MTAwMDIwMDgsCiAgICAgIDB4YTAwOiAweDIwMjAwMCwKICAgICAgMHhiMDA6IDB4OCwKICAgICAgMHhjMDA6IDB4MTAyMDAwMDgsCiAgICAgIDB4ZDAwOiAweDIwMjAwOCwKICAgICAgMHhlMDA6IDB4MjAwOCwKICAgICAgMHhmMDA6IDB4MTAyMDIwMDAsCiAgICAgIDB4ODA6IDB4MTAyMDAwMDAsCiAgICAgIDB4MTgwOiAweDEwMjAyMDA4LAogICAgICAweDI4MDogMHg4LAogICAgICAweDM4MDogMHgyMDAwMDAsCiAgICAgIDB4NDgwOiAweDIwMjAwOCwKICAgICAgMHg1ODA6IDB4MTAwMDAwMDgsCiAgICAgIDB4NjgwOiAweDEwMDAyMDAwLAogICAgICAweDc4MDogMHgyMDA4LAogICAgICAweDg4MDogMHgyMDAwMDgsCiAgICAgIDB4OTgwOiAweDIwMDAsCiAgICAgIDB4YTgwOiAweDEwMDAyMDA4LAogICAgICAweGI4MDogMHgxMDIwMDAwOCwKICAgICAgMHhjODA6IDB4MCwKICAgICAgMHhkODA6IDB4MTAyMDIwMDAsCiAgICAgIDB4ZTgwOiAweDIwMjAwMCwKICAgICAgMHhmODA6IDB4MTAwMDAwMDAsCiAgICAgIDB4MTAwMDogMHgxMDAwMjAwMCwKICAgICAgMHgxMTAwOiAweDEwMjAwMDA4LAogICAgICAweDEyMDA6IDB4MTAyMDIwMDgsCiAgICAgIDB4MTMwMDogMHgyMDA4LAogICAgICAweDE0MDA6IDB4MjAwMDAwLAogICAgICAweDE1MDA6IDB4MTAwMDAwMDAsCiAgICAgIDB4MTYwMDogMHgxMDAwMDAwOCwKICAgICAgMHgxNzAwOiAweDIwMjAwMCwKICAgICAgMHgxODAwOiAweDIwMjAwOCwKICAgICAgMHgxOTAwOiAweDAsCiAgICAgIDB4MWEwMDogMHg4LAogICAgICAweDFiMDA6IDB4MTAyMDAwMDAsCiAgICAgIDB4MWMwMDogMHgyMDAwLAogICAgICAweDFkMDA6IDB4MTAwMDIwMDgsCiAgICAgIDB4MWUwMDogMHgxMDIwMjAwMCwKICAgICAgMHgxZjAwOiAweDIwMDAwOCwKICAgICAgMHgxMDgwOiAweDgsCiAgICAgIDB4MTE4MDogMHgyMDIwMDAsCiAgICAgIDB4MTI4MDogMHgyMDAwMDAsCiAgICAgIDB4MTM4MDogMHgxMDAwMDAwOCwKICAgICAgMHgxNDgwOiAweDEwMDAyMDAwLAogICAgICAweDE1ODA6IDB4MjAwOCwKICAgICAgMHgxNjgwOiAweDEwMjAyMDA4LAogICAgICAweDE3ODA6IDB4MTAyMDAwMDAsCiAgICAgIDB4MTg4MDogMHgxMDIwMjAwMCwKICAgICAgMHgxOTgwOiAweDEwMjAwMDA4LAogICAgICAweDFhODA6IDB4MjAwMCwKICAgICAgMHgxYjgwOiAweDIwMjAwOCwKICAgICAgMHgxYzgwOiAweDIwMDAwOCwKICAgICAgMHgxZDgwOiAweDAsCiAgICAgIDB4MWU4MDogMHgxMDAwMDAwMCwKICAgICAgMHgxZjgwOiAweDEwMDAyMDA4CiAgICB9LCB7CiAgICAgIDB4MDogMHgxMDAwMDAsCiAgICAgIDB4MTA6IDB4MjAwMDQwMSwKICAgICAgMHgyMDogMHg0MDAsCiAgICAgIDB4MzA6IDB4MTAwNDAxLAogICAgICAweDQwOiAweDIxMDA0MDEsCiAgICAgIDB4NTA6IDB4MCwKICAgICAgMHg2MDogMHgxLAogICAgICAweDcwOiAweDIxMDAwMDEsCiAgICAgIDB4ODA6IDB4MjAwMDQwMCwKICAgICAgMHg5MDogMHgxMDAwMDEsCiAgICAgIDB4YTA6IDB4MjAwMDAwMSwKICAgICAgMHhiMDogMHgyMTAwNDAwLAogICAgICAweGMwOiAweDIxMDAwMDAsCiAgICAgIDB4ZDA6IDB4NDAxLAogICAgICAweGUwOiAweDEwMDQwMCwKICAgICAgMHhmMDogMHgyMDAwMDAwLAogICAgICAweDg6IDB4MjEwMDAwMSwKICAgICAgMHgxODogMHgwLAogICAgICAweDI4OiAweDIwMDA0MDEsCiAgICAgIDB4Mzg6IDB4MjEwMDQwMCwKICAgICAgMHg0ODogMHgxMDAwMDAsCiAgICAgIDB4NTg6IDB4MjAwMDAwMSwKICAgICAgMHg2ODogMHgyMDAwMDAwLAogICAgICAweDc4OiAweDQwMSwKICAgICAgMHg4ODogMHgxMDA0MDEsCiAgICAgIDB4OTg6IDB4MjAwMDQwMCwKICAgICAgMHhhODogMHgyMTAwMDAwLAogICAgICAweGI4OiAweDEwMDAwMSwKICAgICAgMHhjODogMHg0MDAsCiAgICAgIDB4ZDg6IDB4MjEwMDQwMSwKICAgICAgMHhlODogMHgxLAogICAgICAweGY4OiAweDEwMDQwMCwKICAgICAgMHgxMDA6IDB4MjAwMDAwMCwKICAgICAgMHgxMTA6IDB4MTAwMDAwLAogICAgICAweDEyMDogMHgyMDAwNDAxLAogICAgICAweDEzMDogMHgyMTAwMDAxLAogICAgICAweDE0MDogMHgxMDAwMDEsCiAgICAgIDB4MTUwOiAweDIwMDA0MDAsCiAgICAgIDB4MTYwOiAweDIxMDA0MDAsCiAgICAgIDB4MTcwOiAweDEwMDQwMSwKICAgICAgMHgxODA6IDB4NDAxLAogICAgICAweDE5MDogMHgyMTAwNDAxLAogICAgICAweDFhMDogMHgxMDA0MDAsCiAgICAgIDB4MWIwOiAweDEsCiAgICAgIDB4MWMwOiAweDAsCiAgICAgIDB4MWQwOiAweDIxMDAwMDAsCiAgICAgIDB4MWUwOiAweDIwMDAwMDEsCiAgICAgIDB4MWYwOiAweDQwMCwKICAgICAgMHgxMDg6IDB4MTAwNDAwLAogICAgICAweDExODogMHgyMDAwNDAxLAogICAgICAweDEyODogMHgyMTAwMDAxLAogICAgICAweDEzODogMHgxLAogICAgICAweDE0ODogMHgyMDAwMDAwLAogICAgICAweDE1ODogMHgxMDAwMDAsCiAgICAgIDB4MTY4OiAweDQwMSwKICAgICAgMHgxNzg6IDB4MjEwMDQwMCwKICAgICAgMHgxODg6IDB4MjAwMDAwMSwKICAgICAgMHgxOTg6IDB4MjEwMDAwMCwKICAgICAgMHgxYTg6IDB4MCwKICAgICAgMHgxYjg6IDB4MjEwMDQwMSwKICAgICAgMHgxYzg6IDB4MTAwNDAxLAogICAgICAweDFkODogMHg0MDAsCiAgICAgIDB4MWU4OiAweDIwMDA0MDAsCiAgICAgIDB4MWY4OiAweDEwMDAwMQogICAgfSwgewogICAgICAweDA6IDB4ODAwMDgyMCwKICAgICAgMHgxOiAweDIwMDAwLAogICAgICAweDI6IDB4ODAwMDAwMCwKICAgICAgMHgzOiAweDIwLAogICAgICAweDQ6IDB4MjAwMjAsCiAgICAgIDB4NTogMHg4MDIwODIwLAogICAgICAweDY6IDB4ODAyMDgwMCwKICAgICAgMHg3OiAweDgwMCwKICAgICAgMHg4OiAweDgwMjAwMDAsCiAgICAgIDB4OTogMHg4MDAwODAwLAogICAgICAweGE6IDB4MjA4MDAsCiAgICAgIDB4YjogMHg4MDIwMDIwLAogICAgICAweGM6IDB4ODIwLAogICAgICAweGQ6IDB4MCwKICAgICAgMHhlOiAweDgwMDAwMjAsCiAgICAgIDB4ZjogMHgyMDgyMCwKICAgICAgMHg4MDAwMDAwMDogMHg4MDAsCiAgICAgIDB4ODAwMDAwMDE6IDB4ODAyMDgyMCwKICAgICAgMHg4MDAwMDAwMjogMHg4MDAwODIwLAogICAgICAweDgwMDAwMDAzOiAweDgwMDAwMDAsCiAgICAgIDB4ODAwMDAwMDQ6IDB4ODAyMDAwMCwKICAgICAgMHg4MDAwMDAwNTogMHgyMDgwMCwKICAgICAgMHg4MDAwMDAwNjogMHgyMDgyMCwKICAgICAgMHg4MDAwMDAwNzogMHgyMCwKICAgICAgMHg4MDAwMDAwODogMHg4MDAwMDIwLAogICAgICAweDgwMDAwMDA5OiAweDgyMCwKICAgICAgMHg4MDAwMDAwYTogMHgyMDAyMCwKICAgICAgMHg4MDAwMDAwYjogMHg4MDIwODAwLAogICAgICAweDgwMDAwMDBjOiAweDAsCiAgICAgIDB4ODAwMDAwMGQ6IDB4ODAyMDAyMCwKICAgICAgMHg4MDAwMDAwZTogMHg4MDAwODAwLAogICAgICAweDgwMDAwMDBmOiAweDIwMDAwLAogICAgICAweDEwOiAweDIwODIwLAogICAgICAweDExOiAweDgwMjA4MDAsCiAgICAgIDB4MTI6IDB4MjAsCiAgICAgIDB4MTM6IDB4ODAwLAogICAgICAweDE0OiAweDgwMDA4MDAsCiAgICAgIDB4MTU6IDB4ODAwMDAyMCwKICAgICAgMHgxNjogMHg4MDIwMDIwLAogICAgICAweDE3OiAweDIwMDAwLAogICAgICAweDE4OiAweDAsCiAgICAgIDB4MTk6IDB4MjAwMjAsCiAgICAgIDB4MWE6IDB4ODAyMDAwMCwKICAgICAgMHgxYjogMHg4MDAwODIwLAogICAgICAweDFjOiAweDgwMjA4MjAsCiAgICAgIDB4MWQ6IDB4MjA4MDAsCiAgICAgIDB4MWU6IDB4ODIwLAogICAgICAweDFmOiAweDgwMDAwMDAsCiAgICAgIDB4ODAwMDAwMTA6IDB4MjAwMDAsCiAgICAgIDB4ODAwMDAwMTE6IDB4ODAwLAogICAgICAweDgwMDAwMDEyOiAweDgwMjAwMjAsCiAgICAgIDB4ODAwMDAwMTM6IDB4MjA4MjAsCiAgICAgIDB4ODAwMDAwMTQ6IDB4MjAsCiAgICAgIDB4ODAwMDAwMTU6IDB4ODAyMDAwMCwKICAgICAgMHg4MDAwMDAxNjogMHg4MDAwMDAwLAogICAgICAweDgwMDAwMDE3OiAweDgwMDA4MjAsCiAgICAgIDB4ODAwMDAwMTg6IDB4ODAyMDgyMCwKICAgICAgMHg4MDAwMDAxOTogMHg4MDAwMDIwLAogICAgICAweDgwMDAwMDFhOiAweDgwMDA4MDAsCiAgICAgIDB4ODAwMDAwMWI6IDB4MCwKICAgICAgMHg4MDAwMDAxYzogMHgyMDgwMCwKICAgICAgMHg4MDAwMDAxZDogMHg4MjAsCiAgICAgIDB4ODAwMDAwMWU6IDB4MjAwMjAsCiAgICAgIDB4ODAwMDAwMWY6IDB4ODAyMDgwMAogICAgfV07CgogICAgLy8gTWFza3MgdGhhdCBzZWxlY3QgdGhlIFNCT1ggaW5wdXQKICAgIHZhciBTQk9YX01BU0sgPSBbMHhmODAwMDAwMSwgMHgxZjgwMDAwMCwgMHgwMWY4MDAwMCwgMHgwMDFmODAwMCwgMHgwMDAxZjgwMCwgMHgwMDAwMWY4MCwgMHgwMDAwMDFmOCwgMHg4MDAwMDAxZl07CgogICAgLyoqDQogICAgICogREVTIGJsb2NrIGNpcGhlciBhbGdvcml0aG0uDQogICAgICovCiAgICB2YXIgREVTID0gQ19hbGdvLkRFUyA9IEJsb2NrQ2lwaGVyLmV4dGVuZCh7CiAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgdmFyIGtleSA9IHRoaXMuX2tleTsKICAgICAgICB2YXIga2V5V29yZHMgPSBrZXkud29yZHM7CgogICAgICAgIC8vIFNlbGVjdCA1NiBiaXRzIGFjY29yZGluZyB0byBQQzEKICAgICAgICB2YXIga2V5Qml0cyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTY7IGkrKykgewogICAgICAgICAgdmFyIGtleUJpdFBvcyA9IFBDMVtpXSAtIDE7CiAgICAgICAgICBrZXlCaXRzW2ldID0ga2V5V29yZHNba2V5Qml0UG9zID4+PiA1XSA+Pj4gMzEgLSBrZXlCaXRQb3MgJSAzMiAmIDE7CiAgICAgICAgfQoKICAgICAgICAvLyBBc3NlbWJsZSAxNiBzdWJrZXlzCiAgICAgICAgdmFyIHN1YktleXMgPSB0aGlzLl9zdWJLZXlzID0gW107CiAgICAgICAgZm9yICh2YXIgblN1YktleSA9IDA7IG5TdWJLZXkgPCAxNjsgblN1YktleSsrKSB7CiAgICAgICAgICAvLyBDcmVhdGUgc3Via2V5CiAgICAgICAgICB2YXIgc3ViS2V5ID0gc3ViS2V5c1tuU3ViS2V5XSA9IFtdOwoKICAgICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgICB2YXIgYml0U2hpZnQgPSBCSVRfU0hJRlRTW25TdWJLZXldOwoKICAgICAgICAgIC8vIFNlbGVjdCA0OCBiaXRzIGFjY29yZGluZyB0byBQQzIKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjQ7IGkrKykgewogICAgICAgICAgICAvLyBTZWxlY3QgZnJvbSB0aGUgbGVmdCAyOCBrZXkgYml0cwogICAgICAgICAgICBzdWJLZXlbaSAvIDYgfCAwXSB8PSBrZXlCaXRzWyhQQzJbaV0gLSAxICsgYml0U2hpZnQpICUgMjhdIDw8IDMxIC0gaSAlIDY7CgogICAgICAgICAgICAvLyBTZWxlY3QgZnJvbSB0aGUgcmlnaHQgMjgga2V5IGJpdHMKICAgICAgICAgICAgc3ViS2V5WzQgKyAoaSAvIDYgfCAwKV0gfD0ga2V5Qml0c1syOCArIChQQzJbaSArIDI0XSAtIDEgKyBiaXRTaGlmdCkgJSAyOF0gPDwgMzEgLSBpICUgNjsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBTaW5jZSBlYWNoIHN1YmtleSBpcyBhcHBsaWVkIHRvIGFuIGV4cGFuZGVkIDMyLWJpdCBpbnB1dCwKICAgICAgICAgIC8vIHRoZSBzdWJrZXkgY2FuIGJlIGJyb2tlbiBpbnRvIDggdmFsdWVzIHNjYWxlZCB0byAzMi1iaXRzLAogICAgICAgICAgLy8gd2hpY2ggYWxsb3dzIHRoZSBrZXkgdG8gYmUgdXNlZCB3aXRob3V0IGV4cGFuc2lvbgogICAgICAgICAgc3ViS2V5WzBdID0gc3ViS2V5WzBdIDw8IDEgfCBzdWJLZXlbMF0gPj4+IDMxOwogICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA3OyBpKyspIHsKICAgICAgICAgICAgc3ViS2V5W2ldID0gc3ViS2V5W2ldID4+PiAoaSAtIDEpICogNCArIDM7CiAgICAgICAgICB9CiAgICAgICAgICBzdWJLZXlbN10gPSBzdWJLZXlbN10gPDwgNSB8IHN1YktleVs3XSA+Pj4gMjc7CiAgICAgICAgfQoKICAgICAgICAvLyBDb21wdXRlIGludmVyc2Ugc3Via2V5cwogICAgICAgIHZhciBpbnZTdWJLZXlzID0gdGhpcy5faW52U3ViS2V5cyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICAgaW52U3ViS2V5c1tpXSA9IHN1YktleXNbMTUgLSBpXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGVuY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewogICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX3N1YktleXMpOwogICAgICB9LAogICAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKICAgICAgICB0aGlzLl9kb0NyeXB0QmxvY2soTSwgb2Zmc2V0LCB0aGlzLl9pbnZTdWJLZXlzKTsKICAgICAgfSwKICAgICAgX2RvQ3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCwgc3ViS2V5cykgewogICAgICAgIC8vIEdldCBpbnB1dAogICAgICAgIHRoaXMuX2xCbG9jayA9IE1bb2Zmc2V0XTsKICAgICAgICB0aGlzLl9yQmxvY2sgPSBNW29mZnNldCArIDFdOwoKICAgICAgICAvLyBJbml0aWFsIHBlcm11dGF0aW9uCiAgICAgICAgZXhjaGFuZ2VMUi5jYWxsKHRoaXMsIDQsIDB4MGYwZjBmMGYpOwogICAgICAgIGV4Y2hhbmdlTFIuY2FsbCh0aGlzLCAxNiwgMHgwMDAwZmZmZik7CiAgICAgICAgZXhjaGFuZ2VSTC5jYWxsKHRoaXMsIDIsIDB4MzMzMzMzMzMpOwogICAgICAgIGV4Y2hhbmdlUkwuY2FsbCh0aGlzLCA4LCAweDAwZmYwMGZmKTsKICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgMSwgMHg1NTU1NTU1NSk7CgogICAgICAgIC8vIFJvdW5kcwogICAgICAgIGZvciAodmFyIHJvdW5kID0gMDsgcm91bmQgPCAxNjsgcm91bmQrKykgewogICAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgICB2YXIgc3ViS2V5ID0gc3ViS2V5c1tyb3VuZF07CiAgICAgICAgICB2YXIgbEJsb2NrID0gdGhpcy5fbEJsb2NrOwogICAgICAgICAgdmFyIHJCbG9jayA9IHRoaXMuX3JCbG9jazsKCiAgICAgICAgICAvLyBGZWlzdGVsIGZ1bmN0aW9uCiAgICAgICAgICB2YXIgZiA9IDA7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgICAgICBmIHw9IFNCT1hfUFtpXVsoKHJCbG9jayBeIHN1YktleVtpXSkgJiBTQk9YX01BU0tbaV0pID4+PiAwXTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2xCbG9jayA9IHJCbG9jazsKICAgICAgICAgIHRoaXMuX3JCbG9jayA9IGxCbG9jayBeIGY7CiAgICAgICAgfQoKICAgICAgICAvLyBVbmRvIHN3YXAgZnJvbSBsYXN0IHJvdW5kCiAgICAgICAgdmFyIHQgPSB0aGlzLl9sQmxvY2s7CiAgICAgICAgdGhpcy5fbEJsb2NrID0gdGhpcy5fckJsb2NrOwogICAgICAgIHRoaXMuX3JCbG9jayA9IHQ7CgogICAgICAgIC8vIEZpbmFsIHBlcm11dGF0aW9uCiAgICAgICAgZXhjaGFuZ2VMUi5jYWxsKHRoaXMsIDEsIDB4NTU1NTU1NTUpOwogICAgICAgIGV4Y2hhbmdlUkwuY2FsbCh0aGlzLCA4LCAweDAwZmYwMGZmKTsKICAgICAgICBleGNoYW5nZVJMLmNhbGwodGhpcywgMiwgMHgzMzMzMzMzMyk7CiAgICAgICAgZXhjaGFuZ2VMUi5jYWxsKHRoaXMsIDE2LCAweDAwMDBmZmZmKTsKICAgICAgICBleGNoYW5nZUxSLmNhbGwodGhpcywgNCwgMHgwZjBmMGYwZik7CgogICAgICAgIC8vIFNldCBvdXRwdXQKICAgICAgICBNW29mZnNldF0gPSB0aGlzLl9sQmxvY2s7CiAgICAgICAgTVtvZmZzZXQgKyAxXSA9IHRoaXMuX3JCbG9jazsKICAgICAgfSwKICAgICAga2V5U2l6ZTogNjQgLyAzMiwKICAgICAgaXZTaXplOiA2NCAvIDMyLAogICAgICBibG9ja1NpemU6IDY0IC8gMzIKICAgIH0pOwoKICAgIC8vIFN3YXAgYml0cyBhY3Jvc3MgdGhlIGxlZnQgYW5kIHJpZ2h0IHdvcmRzCiAgICBmdW5jdGlvbiBleGNoYW5nZUxSKG9mZnNldCwgbWFzaykgewogICAgICB2YXIgdCA9ICh0aGlzLl9sQmxvY2sgPj4+IG9mZnNldCBeIHRoaXMuX3JCbG9jaykgJiBtYXNrOwogICAgICB0aGlzLl9yQmxvY2sgXj0gdDsKICAgICAgdGhpcy5fbEJsb2NrIF49IHQgPDwgb2Zmc2V0OwogICAgfQogICAgZnVuY3Rpb24gZXhjaGFuZ2VSTChvZmZzZXQsIG1hc2spIHsKICAgICAgdmFyIHQgPSAodGhpcy5fckJsb2NrID4+PiBvZmZzZXQgXiB0aGlzLl9sQmxvY2spICYgbWFzazsKICAgICAgdGhpcy5fbEJsb2NrIF49IHQ7CiAgICAgIHRoaXMuX3JCbG9jayBePSB0IDw8IG9mZnNldDsKICAgIH0KCiAgICAvKioNCiAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICoNCiAgICAgKiBAZXhhbXBsZQ0KICAgICAqDQogICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuREVTLmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpOw0KICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLkRFUy5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTsNCiAgICAgKi8KICAgIEMuREVTID0gQmxvY2tDaXBoZXIuX2NyZWF0ZUhlbHBlcihERVMpOwoKICAgIC8qKg0KICAgICAqIFRyaXBsZS1ERVMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobS4NCiAgICAgKi8KICAgIHZhciBUcmlwbGVERVMgPSBDX2FsZ28uVHJpcGxlREVTID0gQmxvY2tDaXBoZXIuZXh0ZW5kKHsKICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5OwogICAgICAgIHZhciBrZXlXb3JkcyA9IGtleS53b3JkczsKCiAgICAgICAgLy8gQ3JlYXRlIERFUyBpbnN0YW5jZXMKICAgICAgICB0aGlzLl9kZXMxID0gREVTLmNyZWF0ZUVuY3J5cHRvcihXb3JkQXJyYXkuY3JlYXRlKGtleVdvcmRzLnNsaWNlKDAsIDIpKSk7CiAgICAgICAgdGhpcy5fZGVzMiA9IERFUy5jcmVhdGVFbmNyeXB0b3IoV29yZEFycmF5LmNyZWF0ZShrZXlXb3Jkcy5zbGljZSgyLCA0KSkpOwogICAgICAgIHRoaXMuX2RlczMgPSBERVMuY3JlYXRlRW5jcnlwdG9yKFdvcmRBcnJheS5jcmVhdGUoa2V5V29yZHMuc2xpY2UoNCwgNikpKTsKICAgICAgfSwKICAgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7CiAgICAgICAgdGhpcy5fZGVzMS5lbmNyeXB0QmxvY2soTSwgb2Zmc2V0KTsKICAgICAgICB0aGlzLl9kZXMyLmRlY3J5cHRCbG9jayhNLCBvZmZzZXQpOwogICAgICAgIHRoaXMuX2RlczMuZW5jcnlwdEJsb2NrKE0sIG9mZnNldCk7CiAgICAgIH0sCiAgICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewogICAgICAgIHRoaXMuX2RlczMuZGVjcnlwdEJsb2NrKE0sIG9mZnNldCk7CiAgICAgICAgdGhpcy5fZGVzMi5lbmNyeXB0QmxvY2soTSwgb2Zmc2V0KTsKICAgICAgICB0aGlzLl9kZXMxLmRlY3J5cHRCbG9jayhNLCBvZmZzZXQpOwogICAgICB9LAogICAgICBrZXlTaXplOiAxOTIgLyAzMiwKICAgICAgaXZTaXplOiA2NCAvIDMyLAogICAgICBibG9ja1NpemU6IDY0IC8gMzIKICAgIH0pOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5UcmlwbGVERVMuZW5jcnlwdChtZXNzYWdlLCBrZXksIGNmZyk7DQogICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpOw0KICAgICAqLwogICAgQy5UcmlwbGVERVMgPSBCbG9ja0NpcGhlci5fY3JlYXRlSGVscGVyKFRyaXBsZURFUyk7CiAgfSkoKTsKICAoZnVuY3Rpb24gKCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyOwogICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCiAgICAvKioNCiAgICAgKiBSQzQgc3RyZWFtIGNpcGhlciBhbGdvcml0aG0uDQogICAgICovCiAgICB2YXIgUkM0ID0gQ19hbGdvLlJDNCA9IFN0cmVhbUNpcGhlci5leHRlbmQoewogICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBrZXkgPSB0aGlzLl9rZXk7CiAgICAgICAgdmFyIGtleVdvcmRzID0ga2V5LndvcmRzOwogICAgICAgIHZhciBrZXlTaWdCeXRlcyA9IGtleS5zaWdCeXRlczsKCiAgICAgICAgLy8gSW5pdCBzYm94CiAgICAgICAgdmFyIFMgPSB0aGlzLl9TID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICAgU1tpXSA9IGk7CiAgICAgICAgfQoKICAgICAgICAvLyBLZXkgc2V0dXAKICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICAgdmFyIGtleUJ5dGVJbmRleCA9IGkgJSBrZXlTaWdCeXRlczsKICAgICAgICAgIHZhciBrZXlCeXRlID0ga2V5V29yZHNba2V5Qnl0ZUluZGV4ID4+PiAyXSA+Pj4gMjQgLSBrZXlCeXRlSW5kZXggJSA0ICogOCAmIDB4ZmY7CiAgICAgICAgICBqID0gKGogKyBTW2ldICsga2V5Qnl0ZSkgJSAyNTY7CgogICAgICAgICAgLy8gU3dhcAogICAgICAgICAgdmFyIHQgPSBTW2ldOwogICAgICAgICAgU1tpXSA9IFNbal07CiAgICAgICAgICBTW2pdID0gdDsKICAgICAgICB9CgogICAgICAgIC8vIENvdW50ZXJzCiAgICAgICAgdGhpcy5faSA9IHRoaXMuX2ogPSAwOwogICAgICB9LAogICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKICAgICAgICBNW29mZnNldF0gXj0gZ2VuZXJhdGVLZXlzdHJlYW1Xb3JkLmNhbGwodGhpcyk7CiAgICAgIH0sCiAgICAgIGtleVNpemU6IDI1NiAvIDMyLAogICAgICBpdlNpemU6IDAKICAgIH0pOwogICAgZnVuY3Rpb24gZ2VuZXJhdGVLZXlzdHJlYW1Xb3JkKCkgewogICAgICAvLyBTaG9ydGN1dHMKICAgICAgdmFyIFMgPSB0aGlzLl9TOwogICAgICB2YXIgaSA9IHRoaXMuX2k7CiAgICAgIHZhciBqID0gdGhpcy5fajsKCiAgICAgIC8vIEdlbmVyYXRlIGtleXN0cmVhbSB3b3JkCiAgICAgIHZhciBrZXlzdHJlYW1Xb3JkID0gMDsKICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCA0OyBuKyspIHsKICAgICAgICBpID0gKGkgKyAxKSAlIDI1NjsKICAgICAgICBqID0gKGogKyBTW2ldKSAlIDI1NjsKCiAgICAgICAgLy8gU3dhcAogICAgICAgIHZhciB0ID0gU1tpXTsKICAgICAgICBTW2ldID0gU1tqXTsKICAgICAgICBTW2pdID0gdDsKICAgICAgICBrZXlzdHJlYW1Xb3JkIHw9IFNbKFNbaV0gKyBTW2pdKSAlIDI1Nl0gPDwgMjQgLSBuICogODsKICAgICAgfQoKICAgICAgLy8gVXBkYXRlIGNvdW50ZXJzCiAgICAgIHRoaXMuX2kgPSBpOwogICAgICB0aGlzLl9qID0gajsKICAgICAgcmV0dXJuIGtleXN0cmVhbVdvcmQ7CiAgICB9CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLg0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLlJDNC5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTsNCiAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5SQzQuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7DQogICAgICovCiAgICBDLlJDNCA9IFN0cmVhbUNpcGhlci5fY3JlYXRlSGVscGVyKFJDNCk7CgogICAgLyoqDQogICAgICogTW9kaWZpZWQgUkM0IHN0cmVhbSBjaXBoZXIgYWxnb3JpdGhtLg0KICAgICAqLwogICAgdmFyIFJDNERyb3AgPSBDX2FsZ28uUkM0RHJvcCA9IFJDNC5leHRlbmQoewogICAgICAvKioNCiAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy4NCiAgICAgICAqDQogICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gZHJvcCBUaGUgbnVtYmVyIG9mIGtleXN0cmVhbSB3b3JkcyB0byBkcm9wLiBEZWZhdWx0IDE5Mg0KICAgICAgICovCiAgICAgIGNmZzogUkM0LmNmZy5leHRlbmQoewogICAgICAgIGRyb3A6IDE5MgogICAgICB9KSwKICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICBSQzQuX2RvUmVzZXQuY2FsbCh0aGlzKTsKCiAgICAgICAgLy8gRHJvcAogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmNmZy5kcm9wOyBpID4gMDsgaS0tKSB7CiAgICAgICAgICBnZW5lcmF0ZUtleXN0cmVhbVdvcmQuY2FsbCh0aGlzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKg0KICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS4NCiAgICAgKg0KICAgICAqIEBleGFtcGxlDQogICAgICoNCiAgICAgKiAgICAgdmFyIGNpcGhlcnRleHQgPSBDcnlwdG9KUy5SQzREcm9wLmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpOw0KICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLlJDNERyb3AuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7DQogICAgICovCiAgICBDLlJDNERyb3AgPSBTdHJlYW1DaXBoZXIuX2NyZWF0ZUhlbHBlcihSQzREcm9wKTsKICB9KSgpOwoKICAvKiogQHByZXNlcnZlDQogICAqIENvdW50ZXIgYmxvY2sgbW9kZSBjb21wYXRpYmxlIHdpdGggIERyIEJyaWFuIEdsYWRtYW4gZmlsZWVuYy5jDQogICAqIGRlcml2ZWQgZnJvbSBDcnlwdG9KUy5tb2RlLkNUUg0KICAgKiBKYW4gSHJ1YnkgamhydWJ5LndlYkBnbWFpbC5jb20NCiAgICovCiAgQ3J5cHRvSlMubW9kZS5DVFJHbGFkbWFuID0gZnVuY3Rpb24gKCkgewogICAgdmFyIENUUkdsYWRtYW4gPSBDcnlwdG9KUy5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpOwogICAgZnVuY3Rpb24gaW5jV29yZCh3b3JkKSB7CiAgICAgIGlmICgod29yZCA+PiAyNCAmIDB4ZmYpID09PSAweGZmKSB7CiAgICAgICAgLy9vdmVyZmxvdwogICAgICAgIHZhciBiMSA9IHdvcmQgPj4gMTYgJiAweGZmOwogICAgICAgIHZhciBiMiA9IHdvcmQgPj4gOCAmIDB4ZmY7CiAgICAgICAgdmFyIGIzID0gd29yZCAmIDB4ZmY7CiAgICAgICAgaWYgKGIxID09PSAweGZmKQogICAgICAgICAgLy8gb3ZlcmZsb3cgYjEKICAgICAgICAgIHsKICAgICAgICAgICAgYjEgPSAwOwogICAgICAgICAgICBpZiAoYjIgPT09IDB4ZmYpIHsKICAgICAgICAgICAgICBiMiA9IDA7CiAgICAgICAgICAgICAgaWYgKGIzID09PSAweGZmKSB7CiAgICAgICAgICAgICAgICBiMyA9IDA7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICsrYjM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICsrYjI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICArK2IxOwogICAgICAgIH0KICAgICAgICB3b3JkID0gMDsKICAgICAgICB3b3JkICs9IGIxIDw8IDE2OwogICAgICAgIHdvcmQgKz0gYjIgPDwgODsKICAgICAgICB3b3JkICs9IGIzOwogICAgICB9IGVsc2UgewogICAgICAgIHdvcmQgKz0gMHgwMSA8PCAyNDsKICAgICAgfQogICAgICByZXR1cm4gd29yZDsKICAgIH0KICAgIGZ1bmN0aW9uIGluY0NvdW50ZXIoY291bnRlcikgewogICAgICBpZiAoKGNvdW50ZXJbMF0gPSBpbmNXb3JkKGNvdW50ZXJbMF0pKSA9PT0gMCkgewogICAgICAgIC8vIGVuY3JfZGF0YSBpbiBmaWxlZW5jLmMgZnJvbSAgRHIgQnJpYW4gR2xhZG1hbidzIGNvdW50cyBvbmx5IHdpdGggRFdPUkQgaiA8IDgKICAgICAgICBjb3VudGVyWzFdID0gaW5jV29yZChjb3VudGVyWzFdKTsKICAgICAgfQogICAgICByZXR1cm4gY291bnRlcjsKICAgIH0KICAgIHZhciBFbmNyeXB0b3IgPSBDVFJHbGFkbWFuLkVuY3J5cHRvciA9IENUUkdsYWRtYW4uZXh0ZW5kKHsKICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7CiAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7CiAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7CiAgICAgICAgdmFyIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyOwoKICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW0KICAgICAgICBpZiAoaXYpIHsKICAgICAgICAgIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyID0gaXYuc2xpY2UoMCk7CgogICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2NrcwogICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGluY0NvdW50ZXIoY291bnRlcik7CiAgICAgICAgdmFyIGtleXN0cmVhbSA9IGNvdW50ZXIuc2xpY2UoMCk7CiAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayhrZXlzdHJlYW0sIDApOwoKICAgICAgICAvLyBFbmNyeXB0CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewogICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0ga2V5c3RyZWFtW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBDVFJHbGFkbWFuLkRlY3J5cHRvciA9IEVuY3J5cHRvcjsKICAgIHJldHVybiBDVFJHbGFkbWFuOwogIH0oKTsKICAoZnVuY3Rpb24gKCkgewogICAgLy8gU2hvcnRjdXRzCiAgICB2YXIgQyA9IENyeXB0b0pTOwogICAgdmFyIENfbGliID0gQy5saWI7CiAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyOwogICAgdmFyIENfYWxnbyA9IEMuYWxnbzsKCiAgICAvLyBSZXVzYWJsZSBvYmplY3RzCiAgICB2YXIgUyA9IFtdOwogICAgdmFyIENfID0gW107CiAgICB2YXIgRyA9IFtdOwoKICAgIC8qKg0KICAgICAqIFJhYmJpdCBzdHJlYW0gY2lwaGVyIGFsZ29yaXRobQ0KICAgICAqLwogICAgdmFyIFJhYmJpdCA9IENfYWxnby5SYWJiaXQgPSBTdHJlYW1DaXBoZXIuZXh0ZW5kKHsKICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgSyA9IHRoaXMuX2tleS53b3JkczsKICAgICAgICB2YXIgaXYgPSB0aGlzLmNmZy5pdjsKCiAgICAgICAgLy8gU3dhcCBlbmRpYW4KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgS1tpXSA9IChLW2ldIDw8IDggfCBLW2ldID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKEtbaV0gPDwgMjQgfCBLW2ldID4+PiA4KSAmIDB4ZmYwMGZmMDA7CiAgICAgICAgfQoKICAgICAgICAvLyBHZW5lcmF0ZSBpbml0aWFsIHN0YXRlIHZhbHVlcwogICAgICAgIHZhciBYID0gdGhpcy5fWCA9IFtLWzBdLCBLWzNdIDw8IDE2IHwgS1syXSA+Pj4gMTYsIEtbMV0sIEtbMF0gPDwgMTYgfCBLWzNdID4+PiAxNiwgS1syXSwgS1sxXSA8PCAxNiB8IEtbMF0gPj4+IDE2LCBLWzNdLCBLWzJdIDw8IDE2IHwgS1sxXSA+Pj4gMTZdOwoKICAgICAgICAvLyBHZW5lcmF0ZSBpbml0aWFsIGNvdW50ZXIgdmFsdWVzCiAgICAgICAgdmFyIEMgPSB0aGlzLl9DID0gW0tbMl0gPDwgMTYgfCBLWzJdID4+PiAxNiwgS1swXSAmIDB4ZmZmZjAwMDAgfCBLWzFdICYgMHgwMDAwZmZmZiwgS1szXSA8PCAxNiB8IEtbM10gPj4+IDE2LCBLWzFdICYgMHhmZmZmMDAwMCB8IEtbMl0gJiAweDAwMDBmZmZmLCBLWzBdIDw8IDE2IHwgS1swXSA+Pj4gMTYsIEtbMl0gJiAweGZmZmYwMDAwIHwgS1szXSAmIDB4MDAwMGZmZmYsIEtbMV0gPDwgMTYgfCBLWzFdID4+PiAxNiwgS1szXSAmIDB4ZmZmZjAwMDAgfCBLWzBdICYgMHgwMDAwZmZmZl07CgogICAgICAgIC8vIENhcnJ5IGJpdAogICAgICAgIHRoaXMuX2IgPSAwOwoKICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0gZm91ciB0aW1lcwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTsKICAgICAgICB9CgogICAgICAgIC8vIE1vZGlmeSB0aGUgY291bnRlcnMKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgICAgQ1tpXSBePSBYW2kgKyA0ICYgN107CiAgICAgICAgfQoKICAgICAgICAvLyBJViBzZXR1cAogICAgICAgIGlmIChpdikgewogICAgICAgICAgLy8gU2hvcnRjdXRzCiAgICAgICAgICB2YXIgSVYgPSBpdi53b3JkczsKICAgICAgICAgIHZhciBJVl8wID0gSVZbMF07CiAgICAgICAgICB2YXIgSVZfMSA9IElWWzFdOwoKICAgICAgICAgIC8vIEdlbmVyYXRlIGZvdXIgc3VidmVjdG9ycwogICAgICAgICAgdmFyIGkwID0gKElWXzAgPDwgOCB8IElWXzAgPj4+IDI0KSAmIDB4MDBmZjAwZmYgfCAoSVZfMCA8PCAyNCB8IElWXzAgPj4+IDgpICYgMHhmZjAwZmYwMDsKICAgICAgICAgIHZhciBpMiA9IChJVl8xIDw8IDggfCBJVl8xID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKElWXzEgPDwgMjQgfCBJVl8xID4+PiA4KSAmIDB4ZmYwMGZmMDA7CiAgICAgICAgICB2YXIgaTEgPSBpMCA+Pj4gMTYgfCBpMiAmIDB4ZmZmZjAwMDA7CiAgICAgICAgICB2YXIgaTMgPSBpMiA8PCAxNiB8IGkwICYgMHgwMDAwZmZmZjsKCiAgICAgICAgICAvLyBNb2RpZnkgY291bnRlciB2YWx1ZXMKICAgICAgICAgIENbMF0gXj0gaTA7CiAgICAgICAgICBDWzFdIF49IGkxOwogICAgICAgICAgQ1syXSBePSBpMjsKICAgICAgICAgIENbM10gXj0gaTM7CiAgICAgICAgICBDWzRdIF49IGkwOwogICAgICAgICAgQ1s1XSBePSBpMTsKICAgICAgICAgIENbNl0gXj0gaTI7CiAgICAgICAgICBDWzddIF49IGkzOwoKICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHN5c3RlbSBmb3VyIHRpbWVzCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkgewogICAgICAgIC8vIFNob3J0Y3V0CiAgICAgICAgdmFyIFggPSB0aGlzLl9YOwoKICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0KICAgICAgICBuZXh0U3RhdGUuY2FsbCh0aGlzKTsKCiAgICAgICAgLy8gR2VuZXJhdGUgZm91ciBrZXlzdHJlYW0gd29yZHMKICAgICAgICBTWzBdID0gWFswXSBeIFhbNV0gPj4+IDE2IF4gWFszXSA8PCAxNjsKICAgICAgICBTWzFdID0gWFsyXSBeIFhbN10gPj4+IDE2IF4gWFs1XSA8PCAxNjsKICAgICAgICBTWzJdID0gWFs0XSBeIFhbMV0gPj4+IDE2IF4gWFs3XSA8PCAxNjsKICAgICAgICBTWzNdID0gWFs2XSBeIFhbM10gPj4+IDE2IF4gWFsxXSA8PCAxNjsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgLy8gU3dhcCBlbmRpYW4KICAgICAgICAgIFNbaV0gPSAoU1tpXSA8PCA4IHwgU1tpXSA+Pj4gMjQpICYgMHgwMGZmMDBmZiB8IChTW2ldIDw8IDI0IHwgU1tpXSA+Pj4gOCkgJiAweGZmMDBmZjAwOwoKICAgICAgICAgIC8vIEVuY3J5cHQKICAgICAgICAgIE1bb2Zmc2V0ICsgaV0gXj0gU1tpXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGJsb2NrU2l6ZTogMTI4IC8gMzIsCiAgICAgIGl2U2l6ZTogNjQgLyAzMgogICAgfSk7CiAgICBmdW5jdGlvbiBuZXh0U3RhdGUoKSB7CiAgICAgIC8vIFNob3J0Y3V0cwogICAgICB2YXIgWCA9IHRoaXMuX1g7CiAgICAgIHZhciBDID0gdGhpcy5fQzsKCiAgICAgIC8vIFNhdmUgb2xkIGNvdW50ZXIgdmFsdWVzCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgICAgQ19baV0gPSBDW2ldOwogICAgICB9CgogICAgICAvLyBDYWxjdWxhdGUgbmV3IGNvdW50ZXIgdmFsdWVzCiAgICAgIENbMF0gPSBDWzBdICsgMHg0ZDM0ZDM0ZCArIHRoaXMuX2IgfCAwOwogICAgICBDWzFdID0gQ1sxXSArIDB4ZDM0ZDM0ZDMgKyAoQ1swXSA+Pj4gMCA8IENfWzBdID4+PiAwID8gMSA6IDApIHwgMDsKICAgICAgQ1syXSA9IENbMl0gKyAweDM0ZDM0ZDM0ICsgKENbMV0gPj4+IDAgPCBDX1sxXSA+Pj4gMCA/IDEgOiAwKSB8IDA7CiAgICAgIENbM10gPSBDWzNdICsgMHg0ZDM0ZDM0ZCArIChDWzJdID4+PiAwIDwgQ19bMl0gPj4+IDAgPyAxIDogMCkgfCAwOwogICAgICBDWzRdID0gQ1s0XSArIDB4ZDM0ZDM0ZDMgKyAoQ1szXSA+Pj4gMCA8IENfWzNdID4+PiAwID8gMSA6IDApIHwgMDsKICAgICAgQ1s1XSA9IENbNV0gKyAweDM0ZDM0ZDM0ICsgKENbNF0gPj4+IDAgPCBDX1s0XSA+Pj4gMCA/IDEgOiAwKSB8IDA7CiAgICAgIENbNl0gPSBDWzZdICsgMHg0ZDM0ZDM0ZCArIChDWzVdID4+PiAwIDwgQ19bNV0gPj4+IDAgPyAxIDogMCkgfCAwOwogICAgICBDWzddID0gQ1s3XSArIDB4ZDM0ZDM0ZDMgKyAoQ1s2XSA+Pj4gMCA8IENfWzZdID4+PiAwID8gMSA6IDApIHwgMDsKICAgICAgdGhpcy5fYiA9IENbN10gPj4+IDAgPCBDX1s3XSA+Pj4gMCA/IDEgOiAwOwoKICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBnLXZhbHVlcwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgIHZhciBneCA9IFhbaV0gKyBDW2ldOwoKICAgICAgICAvLyBDb25zdHJ1Y3QgaGlnaCBhbmQgbG93IGFyZ3VtZW50IGZvciBzcXVhcmluZwogICAgICAgIHZhciBnYSA9IGd4ICYgMHhmZmZmOwogICAgICAgIHZhciBnYiA9IGd4ID4+PiAxNjsKCiAgICAgICAgLy8gQ2FsY3VsYXRlIGhpZ2ggYW5kIGxvdyByZXN1bHQgb2Ygc3F1YXJpbmcKICAgICAgICB2YXIgZ2ggPSAoKGdhICogZ2EgPj4+IDE3KSArIGdhICogZ2IgPj4+IDE1KSArIGdiICogZ2I7CiAgICAgICAgdmFyIGdsID0gKChneCAmIDB4ZmZmZjAwMDApICogZ3ggfCAwKSArICgoZ3ggJiAweDAwMDBmZmZmKSAqIGd4IHwgMCk7CgogICAgICAgIC8vIEhpZ2ggWE9SIGxvdwogICAgICAgIEdbaV0gPSBnaCBeIGdsOwogICAgICB9CgogICAgICAvLyBDYWxjdWxhdGUgbmV3IHN0YXRlIHZhbHVlcwogICAgICBYWzBdID0gR1swXSArIChHWzddIDw8IDE2IHwgR1s3XSA+Pj4gMTYpICsgKEdbNl0gPDwgMTYgfCBHWzZdID4+PiAxNikgfCAwOwogICAgICBYWzFdID0gR1sxXSArIChHWzBdIDw8IDggfCBHWzBdID4+PiAyNCkgKyBHWzddIHwgMDsKICAgICAgWFsyXSA9IEdbMl0gKyAoR1sxXSA8PCAxNiB8IEdbMV0gPj4+IDE2KSArIChHWzBdIDw8IDE2IHwgR1swXSA+Pj4gMTYpIHwgMDsKICAgICAgWFszXSA9IEdbM10gKyAoR1syXSA8PCA4IHwgR1syXSA+Pj4gMjQpICsgR1sxXSB8IDA7CiAgICAgIFhbNF0gPSBHWzRdICsgKEdbM10gPDwgMTYgfCBHWzNdID4+PiAxNikgKyAoR1syXSA8PCAxNiB8IEdbMl0gPj4+IDE2KSB8IDA7CiAgICAgIFhbNV0gPSBHWzVdICsgKEdbNF0gPDwgOCB8IEdbNF0gPj4+IDI0KSArIEdbM10gfCAwOwogICAgICBYWzZdID0gR1s2XSArIChHWzVdIDw8IDE2IHwgR1s1XSA+Pj4gMTYpICsgKEdbNF0gPDwgMTYgfCBHWzRdID4+PiAxNikgfCAwOwogICAgICBYWzddID0gR1s3XSArIChHWzZdIDw8IDggfCBHWzZdID4+PiAyNCkgKyBHWzVdIHwgMDsKICAgIH0KCiAgICAvKioNCiAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbnMgdG8gdGhlIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuDQogICAgICoNCiAgICAgKiBAZXhhbXBsZQ0KICAgICAqDQogICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuUmFiYml0LmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpOw0KICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLlJhYmJpdC5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTsNCiAgICAgKi8KICAgIEMuUmFiYml0ID0gU3RyZWFtQ2lwaGVyLl9jcmVhdGVIZWxwZXIoUmFiYml0KTsKICB9KSgpOwoKICAvKioNCiAgICogQ291bnRlciBibG9jayBtb2RlLg0KICAgKi8KICBDcnlwdG9KUy5tb2RlLkNUUiA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBDVFIgPSBDcnlwdG9KUy5saWIuQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpOwogICAgdmFyIEVuY3J5cHRvciA9IENUUi5FbmNyeXB0b3IgPSBDVFIuZXh0ZW5kKHsKICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkgewogICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7CiAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7CiAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7CiAgICAgICAgdmFyIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyOwoKICAgICAgICAvLyBHZW5lcmF0ZSBrZXlzdHJlYW0KICAgICAgICBpZiAoaXYpIHsKICAgICAgICAgIGNvdW50ZXIgPSB0aGlzLl9jb3VudGVyID0gaXYuc2xpY2UoMCk7CgogICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2NrcwogICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIHZhciBrZXlzdHJlYW0gPSBjb3VudGVyLnNsaWNlKDApOwogICAgICAgIGNpcGhlci5lbmNyeXB0QmxvY2soa2V5c3RyZWFtLCAwKTsKCiAgICAgICAgLy8gSW5jcmVtZW50IGNvdW50ZXIKICAgICAgICBjb3VudGVyW2Jsb2NrU2l6ZSAtIDFdID0gY291bnRlcltibG9ja1NpemUgLSAxXSArIDEgfCAwOwoKICAgICAgICAvLyBFbmNyeXB0CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewogICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0ga2V5c3RyZWFtW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBDVFIuRGVjcnlwdG9yID0gRW5jcnlwdG9yOwogICAgcmV0dXJuIENUUjsKICB9KCk7CiAgKGZ1bmN0aW9uICgpIHsKICAgIC8vIFNob3J0Y3V0cwogICAgdmFyIEMgPSBDcnlwdG9KUzsKICAgIHZhciBDX2xpYiA9IEMubGliOwogICAgdmFyIFN0cmVhbUNpcGhlciA9IENfbGliLlN0cmVhbUNpcGhlcjsKICAgIHZhciBDX2FsZ28gPSBDLmFsZ287CgogICAgLy8gUmV1c2FibGUgb2JqZWN0cwogICAgdmFyIFMgPSBbXTsKICAgIHZhciBDXyA9IFtdOwogICAgdmFyIEcgPSBbXTsKCiAgICAvKioNCiAgICAgKiBSYWJiaXQgc3RyZWFtIGNpcGhlciBhbGdvcml0aG0uDQogICAgICoNCiAgICAgKiBUaGlzIGlzIGEgbGVnYWN5IHZlcnNpb24gdGhhdCBuZWdsZWN0ZWQgdG8gY29udmVydCB0aGUga2V5IHRvIGxpdHRsZS1lbmRpYW4uDQogICAgICogVGhpcyBlcnJvciBkb2Vzbid0IGFmZmVjdCB0aGUgY2lwaGVyJ3Mgc2VjdXJpdHksDQogICAgICogYnV0IGl0IGRvZXMgYWZmZWN0IGl0cyBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zLg0KICAgICAqLwogICAgdmFyIFJhYmJpdExlZ2FjeSA9IENfYWxnby5SYWJiaXRMZWdhY3kgPSBTdHJlYW1DaXBoZXIuZXh0ZW5kKHsKICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBTaG9ydGN1dHMKICAgICAgICB2YXIgSyA9IHRoaXMuX2tleS53b3JkczsKICAgICAgICB2YXIgaXYgPSB0aGlzLmNmZy5pdjsKCiAgICAgICAgLy8gR2VuZXJhdGUgaW5pdGlhbCBzdGF0ZSB2YWx1ZXMKICAgICAgICB2YXIgWCA9IHRoaXMuX1ggPSBbS1swXSwgS1szXSA8PCAxNiB8IEtbMl0gPj4+IDE2LCBLWzFdLCBLWzBdIDw8IDE2IHwgS1szXSA+Pj4gMTYsIEtbMl0sIEtbMV0gPDwgMTYgfCBLWzBdID4+PiAxNiwgS1szXSwgS1syXSA8PCAxNiB8IEtbMV0gPj4+IDE2XTsKCiAgICAgICAgLy8gR2VuZXJhdGUgaW5pdGlhbCBjb3VudGVyIHZhbHVlcwogICAgICAgIHZhciBDID0gdGhpcy5fQyA9IFtLWzJdIDw8IDE2IHwgS1syXSA+Pj4gMTYsIEtbMF0gJiAweGZmZmYwMDAwIHwgS1sxXSAmIDB4MDAwMGZmZmYsIEtbM10gPDwgMTYgfCBLWzNdID4+PiAxNiwgS1sxXSAmIDB4ZmZmZjAwMDAgfCBLWzJdICYgMHgwMDAwZmZmZiwgS1swXSA8PCAxNiB8IEtbMF0gPj4+IDE2LCBLWzJdICYgMHhmZmZmMDAwMCB8IEtbM10gJiAweDAwMDBmZmZmLCBLWzFdIDw8IDE2IHwgS1sxXSA+Pj4gMTYsIEtbM10gJiAweGZmZmYwMDAwIHwgS1swXSAmIDB4MDAwMGZmZmZdOwoKICAgICAgICAvLyBDYXJyeSBiaXQKICAgICAgICB0aGlzLl9iID0gMDsKCiAgICAgICAgLy8gSXRlcmF0ZSB0aGUgc3lzdGVtIGZvdXIgdGltZXMKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7CiAgICAgICAgfQoKICAgICAgICAvLyBNb2RpZnkgdGhlIGNvdW50ZXJzCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgIENbaV0gXj0gWFtpICsgNCAmIDddOwogICAgICAgIH0KCiAgICAgICAgLy8gSVYgc2V0dXAKICAgICAgICBpZiAoaXYpIHsKICAgICAgICAgIC8vIFNob3J0Y3V0cwogICAgICAgICAgdmFyIElWID0gaXYud29yZHM7CiAgICAgICAgICB2YXIgSVZfMCA9IElWWzBdOwogICAgICAgICAgdmFyIElWXzEgPSBJVlsxXTsKCiAgICAgICAgICAvLyBHZW5lcmF0ZSBmb3VyIHN1YnZlY3RvcnMKICAgICAgICAgIHZhciBpMCA9IChJVl8wIDw8IDggfCBJVl8wID4+PiAyNCkgJiAweDAwZmYwMGZmIHwgKElWXzAgPDwgMjQgfCBJVl8wID4+PiA4KSAmIDB4ZmYwMGZmMDA7CiAgICAgICAgICB2YXIgaTIgPSAoSVZfMSA8PCA4IHwgSVZfMSA+Pj4gMjQpICYgMHgwMGZmMDBmZiB8IChJVl8xIDw8IDI0IHwgSVZfMSA+Pj4gOCkgJiAweGZmMDBmZjAwOwogICAgICAgICAgdmFyIGkxID0gaTAgPj4+IDE2IHwgaTIgJiAweGZmZmYwMDAwOwogICAgICAgICAgdmFyIGkzID0gaTIgPDwgMTYgfCBpMCAmIDB4MDAwMGZmZmY7CgogICAgICAgICAgLy8gTW9kaWZ5IGNvdW50ZXIgdmFsdWVzCiAgICAgICAgICBDWzBdIF49IGkwOwogICAgICAgICAgQ1sxXSBePSBpMTsKICAgICAgICAgIENbMl0gXj0gaTI7CiAgICAgICAgICBDWzNdIF49IGkzOwogICAgICAgICAgQ1s0XSBePSBpMDsKICAgICAgICAgIENbNV0gXj0gaTE7CiAgICAgICAgICBDWzZdIF49IGkyOwogICAgICAgICAgQ1s3XSBePSBpMzsKCiAgICAgICAgICAvLyBJdGVyYXRlIHRoZSBzeXN0ZW0gZm91ciB0aW1lcwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBfZG9Qcm9jZXNzQmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHsKICAgICAgICAvLyBTaG9ydGN1dAogICAgICAgIHZhciBYID0gdGhpcy5fWDsKCiAgICAgICAgLy8gSXRlcmF0ZSB0aGUgc3lzdGVtCiAgICAgICAgbmV4dFN0YXRlLmNhbGwodGhpcyk7CgogICAgICAgIC8vIEdlbmVyYXRlIGZvdXIga2V5c3RyZWFtIHdvcmRzCiAgICAgICAgU1swXSA9IFhbMF0gXiBYWzVdID4+PiAxNiBeIFhbM10gPDwgMTY7CiAgICAgICAgU1sxXSA9IFhbMl0gXiBYWzddID4+PiAxNiBeIFhbNV0gPDwgMTY7CiAgICAgICAgU1syXSA9IFhbNF0gXiBYWzFdID4+PiAxNiBeIFhbN10gPDwgMTY7CiAgICAgICAgU1szXSA9IFhbNl0gXiBYWzNdID4+PiAxNiBeIFhbMV0gPDwgMTY7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIC8vIFN3YXAgZW5kaWFuCiAgICAgICAgICBTW2ldID0gKFNbaV0gPDwgOCB8IFNbaV0gPj4+IDI0KSAmIDB4MDBmZjAwZmYgfCAoU1tpXSA8PCAyNCB8IFNbaV0gPj4+IDgpICYgMHhmZjAwZmYwMDsKCiAgICAgICAgICAvLyBFbmNyeXB0CiAgICAgICAgICBNW29mZnNldCArIGldIF49IFNbaV07CiAgICAgICAgfQogICAgICB9LAogICAgICBibG9ja1NpemU6IDEyOCAvIDMyLAogICAgICBpdlNpemU6IDY0IC8gMzIKICAgIH0pOwogICAgZnVuY3Rpb24gbmV4dFN0YXRlKCkgewogICAgICAvLyBTaG9ydGN1dHMKICAgICAgdmFyIFggPSB0aGlzLl9YOwogICAgICB2YXIgQyA9IHRoaXMuX0M7CgogICAgICAvLyBTYXZlIG9sZCBjb3VudGVyIHZhbHVlcwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgIENfW2ldID0gQ1tpXTsKICAgICAgfQoKICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBjb3VudGVyIHZhbHVlcwogICAgICBDWzBdID0gQ1swXSArIDB4NGQzNGQzNGQgKyB0aGlzLl9iIHwgMDsKICAgICAgQ1sxXSA9IENbMV0gKyAweGQzNGQzNGQzICsgKENbMF0gPj4+IDAgPCBDX1swXSA+Pj4gMCA/IDEgOiAwKSB8IDA7CiAgICAgIENbMl0gPSBDWzJdICsgMHgzNGQzNGQzNCArIChDWzFdID4+PiAwIDwgQ19bMV0gPj4+IDAgPyAxIDogMCkgfCAwOwogICAgICBDWzNdID0gQ1szXSArIDB4NGQzNGQzNGQgKyAoQ1syXSA+Pj4gMCA8IENfWzJdID4+PiAwID8gMSA6IDApIHwgMDsKICAgICAgQ1s0XSA9IENbNF0gKyAweGQzNGQzNGQzICsgKENbM10gPj4+IDAgPCBDX1szXSA+Pj4gMCA/IDEgOiAwKSB8IDA7CiAgICAgIENbNV0gPSBDWzVdICsgMHgzNGQzNGQzNCArIChDWzRdID4+PiAwIDwgQ19bNF0gPj4+IDAgPyAxIDogMCkgfCAwOwogICAgICBDWzZdID0gQ1s2XSArIDB4NGQzNGQzNGQgKyAoQ1s1XSA+Pj4gMCA8IENfWzVdID4+PiAwID8gMSA6IDApIHwgMDsKICAgICAgQ1s3XSA9IENbN10gKyAweGQzNGQzNGQzICsgKENbNl0gPj4+IDAgPCBDX1s2XSA+Pj4gMCA/IDEgOiAwKSB8IDA7CiAgICAgIHRoaXMuX2IgPSBDWzddID4+PiAwIDwgQ19bN10gPj4+IDAgPyAxIDogMDsKCiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZy12YWx1ZXMKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICB2YXIgZ3ggPSBYW2ldICsgQ1tpXTsKCiAgICAgICAgLy8gQ29uc3RydWN0IGhpZ2ggYW5kIGxvdyBhcmd1bWVudCBmb3Igc3F1YXJpbmcKICAgICAgICB2YXIgZ2EgPSBneCAmIDB4ZmZmZjsKICAgICAgICB2YXIgZ2IgPSBneCA+Pj4gMTY7CgogICAgICAgIC8vIENhbGN1bGF0ZSBoaWdoIGFuZCBsb3cgcmVzdWx0IG9mIHNxdWFyaW5nCiAgICAgICAgdmFyIGdoID0gKChnYSAqIGdhID4+PiAxNykgKyBnYSAqIGdiID4+PiAxNSkgKyBnYiAqIGdiOwogICAgICAgIHZhciBnbCA9ICgoZ3ggJiAweGZmZmYwMDAwKSAqIGd4IHwgMCkgKyAoKGd4ICYgMHgwMDAwZmZmZikgKiBneCB8IDApOwoKICAgICAgICAvLyBIaWdoIFhPUiBsb3cKICAgICAgICBHW2ldID0gZ2ggXiBnbDsKICAgICAgfQoKICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzdGF0ZSB2YWx1ZXMKICAgICAgWFswXSA9IEdbMF0gKyAoR1s3XSA8PCAxNiB8IEdbN10gPj4+IDE2KSArIChHWzZdIDw8IDE2IHwgR1s2XSA+Pj4gMTYpIHwgMDsKICAgICAgWFsxXSA9IEdbMV0gKyAoR1swXSA8PCA4IHwgR1swXSA+Pj4gMjQpICsgR1s3XSB8IDA7CiAgICAgIFhbMl0gPSBHWzJdICsgKEdbMV0gPDwgMTYgfCBHWzFdID4+PiAxNikgKyAoR1swXSA8PCAxNiB8IEdbMF0gPj4+IDE2KSB8IDA7CiAgICAgIFhbM10gPSBHWzNdICsgKEdbMl0gPDwgOCB8IEdbMl0gPj4+IDI0KSArIEdbMV0gfCAwOwogICAgICBYWzRdID0gR1s0XSArIChHWzNdIDw8IDE2IHwgR1szXSA+Pj4gMTYpICsgKEdbMl0gPDwgMTYgfCBHWzJdID4+PiAxNikgfCAwOwogICAgICBYWzVdID0gR1s1XSArIChHWzRdIDw8IDggfCBHWzRdID4+PiAyNCkgKyBHWzNdIHwgMDsKICAgICAgWFs2XSA9IEdbNl0gKyAoR1s1XSA8PCAxNiB8IEdbNV0gPj4+IDE2KSArIChHWzRdIDw8IDE2IHwgR1s0XSA+Pj4gMTYpIHwgMDsKICAgICAgWFs3XSA9IEdbN10gKyAoR1s2XSA8PCA4IHwgR1s2XSA+Pj4gMjQpICsgR1s1XSB8IDA7CiAgICB9CgogICAgLyoqDQogICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLg0KICAgICAqDQogICAgICogQGV4YW1wbGUNCiAgICAgKg0KICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLlJhYmJpdExlZ2FjeS5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTsNCiAgICAgKiAgICAgdmFyIHBsYWludGV4dCAgPSBDcnlwdG9KUy5SYWJiaXRMZWdhY3kuZGVjcnlwdChjaXBoZXJ0ZXh0LCBrZXksIGNmZyk7DQogICAgICovCiAgICBDLlJhYmJpdExlZ2FjeSA9IFN0cmVhbUNpcGhlci5fY3JlYXRlSGVscGVyKFJhYmJpdExlZ2FjeSk7CiAgfSkoKTsKCiAgLyoqDQogICAqIFplcm8gcGFkZGluZyBzdHJhdGVneS4NCiAgICovCiAgQ3J5cHRvSlMucGFkLlplcm9QYWRkaW5nID0gewogICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7CiAgICAgIC8vIFNob3J0Y3V0CiAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7CgogICAgICAvLyBQYWQKICAgICAgZGF0YS5jbGFtcCgpOwogICAgICBkYXRhLnNpZ0J5dGVzICs9IGJsb2NrU2l6ZUJ5dGVzIC0gKGRhdGEuc2lnQnl0ZXMgJSBibG9ja1NpemVCeXRlcyB8fCBibG9ja1NpemVCeXRlcyk7CiAgICB9LAogICAgdW5wYWQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIC8vIFNob3J0Y3V0CiAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzOwoKICAgICAgLy8gVW5wYWQKICAgICAgdmFyIGkgPSBkYXRhLnNpZ0J5dGVzIC0gMTsKICAgICAgd2hpbGUgKCEoZGF0YVdvcmRzW2kgPj4+IDJdID4+PiAyNCAtIGkgJSA0ICogOCAmIDB4ZmYpKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIGRhdGEuc2lnQnl0ZXMgPSBpICsgMTsKICAgIH0KICB9OwogIHJldHVybiBDcnlwdG9KUzsKfSk7"},{"version":3,"names":["root","factory","exports","module","define","amd","CryptoJS","Math","undefined","create","Object","F","obj","subtype","prototype","C","C_lib","lib","Base","extend","overrides","mixIn","hasOwnProperty","init","$super","apply","arguments","instance","properties","propertyName","toString","clone","WordArray","words","sigBytes","length","encoder","Hex","stringify","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","i","thatByte","ceil","call","slice","random","nBytes","r","m_w","m_z","mask","result","rcache","_r","push","C_enc","enc","hexChars","bite","join","parse","hexStr","hexStrLength","parseInt","substr","Latin1","latin1Chars","String","fromCharCode","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","e","Error","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","data","_process","doFlush","dataWords","dataSigBytes","blockSize","blockSizeBytes","nBlocksReady","max","_minBufferSize","nWordsReady","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","Hasher","cfg","_doReset","update","messageUpdate","finalize","hash","_doFinalize","_createHelper","hasher","message","_createHmacHelper","key","C_algo","HMAC","algo","Base64","map","_map","base64Chars","byte1","byte2","byte3","triplet","j","charAt","paddingChar","base64Str","base64StrLength","reverseMap","_reverseMap","paddingIndex","indexOf","parseLoop","bits1","bits2","T","abs","sin","MD5","_hash","M","offset_i","M_offset_i","H","M_offset_0","M_offset_1","M_offset_2","M_offset_3","M_offset_4","M_offset_5","M_offset_6","M_offset_7","M_offset_8","M_offset_9","M_offset_10","M_offset_11","M_offset_12","M_offset_13","M_offset_14","M_offset_15","a","b","c","d","FF","GG","HH","II","nBitsTotal","nBitsLeft","nBitsTotalH","floor","nBitsTotalL","H_i","x","s","t","n","HmacMD5","W","SHA1","HmacSHA1","K","isPrime","sqrtN","sqrt","factor","getFractionalBits","nPrime","pow","SHA256","f","g","h","gamma0x","gamma0","gamma1x","gamma1","ch","maj","sigma0","sigma1","t1","t2","HmacSHA256","Utf16BE","Utf16","utf16Chars","codePoint","utf16Str","utf16StrLength","Utf16LE","swapEndian","word","ArrayBuffer","superInit","subInit","typedArray","Uint8Array","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","buffer","byteOffset","byteLength","typedArrayByteLength","_zl","_zr","_sl","_sr","_hl","_hr","RIPEMD160","hl","hr","zl","zr","sl","sr","al","bl","cl","dl","el","ar","br","cr","dr","er","f1","f2","f3","f4","f5","rotl","y","z","HmacRIPEMD160","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","hmac","PBKDF2","keySize","iterations","compute","password","salt","derivedKey","blockIndex","derivedKeyWords","blockIndexWords","block","blockWords","blockWordsLength","intermediate","intermediateWords","EvpKDF","SHA224","HmacSHA224","X32WordArray","C_x64","x64","X64Word","Word","high","low","X64WordArray","toX32","x64Words","x64WordsLength","x32Words","x64Word","wordsLength","RHO_OFFSETS","PI_INDEXES","ROUND_CONSTANTS","newX","newY","LFSR","roundConstantMsw","roundConstantLsw","bitPosition","SHA3","outputLength","state","_state","nBlockSizeLanes","M2i","M2i1","lane","round","tMsw","tLsw","Tx","Tx4","Tx1","Tx1Msw","Tx1Lsw","laneIndex","laneMsw","laneLsw","rhoOffset","TPiLane","T0","state0","TLane","Tx1Lane","Tx2Lane","roundConstant","blockSizeBits","outputLengthBytes","outputLengthLanes","hashWords","HmacSHA3","X64Word_create","SHA512","H0","H1","H2","H3","H4","H5","H6","H7","H0h","H0l","H1h","H1l","H2h","H2l","H3h","H3l","H4h","H4l","H5h","H5l","H6h","H6l","H7h","H7l","ah","bh","dh","eh","fh","fl","gh","gl","hh","Wi","Wih","Wil","gamma0xh","gamma0xl","gamma0h","gamma0l","gamma1xh","gamma1xl","gamma1h","gamma1l","Wi7","Wi7h","Wi7l","Wi16","Wi16h","Wi16l","chh","chl","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Ki","Kih","Kil","t1l","t1h","t2l","t2h","HmacSHA512","SHA384","HmacSHA384","Cipher","createEncryptor","_ENC_XFORM_MODE","createDecryptor","_DEC_XFORM_MODE","xformMode","_xformMode","_key","process","dataUpdate","finalProcessedData","ivSize","selectCipherStrategy","PasswordBasedCipher","SerializableCipher","cipher","encrypt","decrypt","ciphertext","StreamCipher","finalProcessedBlocks","C_mode","mode","BlockCipherMode","iv","Encryptor","Decryptor","_cipher","_iv","CBC","processBlock","xorBlock","encryptBlock","_prevBlock","thisBlock","decryptBlock","C_pad","pad","Pkcs7","nPaddingBytes","paddingWord","paddingWords","padding","unpad","BlockCipher","modeCreator","_mode","__creator","CipherParams","cipherParams","formatter","C_format","format","OpenSSLFormatter","OpenSSL","openSSLStr","ciphertextWords","encryptor","cipherCfg","algorithm","_parse","plaintext","C_kdf","kdf","OpenSSLKdf","execute","derivedParams","CFB","generateKeystreamAndEncrypt","keystream","ECB","AnsiX923","lastBytePos","Iso10126","Iso97971","ZeroPadding","OFB","_keystream","NoPadding","HexFormatter","input","SBOX","INV_SBOX","SUB_MIX_0","SUB_MIX_1","SUB_MIX_2","SUB_MIX_3","INV_SUB_MIX_0","INV_SUB_MIX_1","INV_SUB_MIX_2","INV_SUB_MIX_3","xi","sx","x2","x4","x8","RCON","AES","_nRounds","_keyPriorReset","keyWords","nRounds","ksRows","keySchedule","_keySchedule","ksRow","invKeySchedule","_invKeySchedule","invKsRow","_doCryptBlock","s0","s1","s2","s3","t0","t3","PC1","PC2","BIT_SHIFTS","SBOX_P","SBOX_MASK","DES","keyBits","keyBitPos","subKeys","_subKeys","nSubKey","subKey","bitShift","invSubKeys","_invSubKeys","_lBlock","_rBlock","exchangeLR","exchangeRL","lBlock","rBlock","TripleDES","_des1","_des2","_des3","RC4","keySigBytes","S","_S","keyByteIndex","keyByte","_i","_j","generateKeystreamWord","keystreamWord","RC4Drop","drop","CTRGladman","incWord","b1","b2","b3","incCounter","counter","_counter","C_","G","Rabbit","X","_X","_C","_b","nextState","IV","IV_0","IV_1","i0","i2","i1","i3","gx","ga","gb","CTR","RabbitLegacy"],"sources":["D:/code/vue/front/src/common/cryptojs.js"],"sourcesContent":[";\r\n(function(root, factory) {\r\n\tif (typeof exports === \"object\") {\r\n\t\t// CommonJS\r\n\t\tmodule.exports = exports = factory();\r\n\t} else if (typeof define === \"function\" && define.amd) {\r\n\t\t// AMD\r\n\t\tdefine([], factory);\r\n\t} else {\r\n\t\t// Global (browser)\r\n\t\troot.CryptoJS = factory();\r\n\t}\r\n}(this, function() {\r\n\r\n\t/**\r\n\t * CryptoJS core components.\r\n\t */\r\n\tvar CryptoJS = CryptoJS || (function(Math, undefined) {\r\n\t\t/*\r\n\t\t * Local polyfil of Object.create\r\n\t\t */\r\n\t\tvar create = Object.create || (function() {\r\n\t\t\tfunction F() {};\r\n\r\n\t\t\treturn function(obj) {\r\n\t\t\t\tvar subtype;\r\n\r\n\t\t\t\tF.prototype = obj;\r\n\r\n\t\t\t\tsubtype = new F();\r\n\r\n\t\t\t\tF.prototype = null;\r\n\r\n\t\t\t\treturn subtype;\r\n\t\t\t};\r\n\t\t}())\r\n\r\n\t\t/**\r\n\t\t * CryptoJS namespace.\r\n\t\t */\r\n\t\tvar C = {};\r\n\r\n\t\t/**\r\n\t\t * Library namespace.\r\n\t\t */\r\n\t\tvar C_lib = C.lib = {};\r\n\r\n\t\t/**\r\n\t\t * Base object for prototypal inheritance.\r\n\t\t */\r\n\t\tvar Base = C_lib.Base = (function() {\r\n\r\n\r\n\t\t\treturn {\r\n\t\t\t\t/**\r\n\t\t\t\t * Creates a new object that inherits from this object.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {Object} overrides Properties to copy into the new object.\r\n\t\t\t\t *\r\n\t\t\t\t * @return {Object} The new object.\r\n\t\t\t\t *\r\n\t\t\t\t * @static\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t *\r\n\t\t\t\t * var MyType = CryptoJS.lib.Base.extend({\r\n\t\t\t\t * field: 'value',\r\n\t\t\t\t *\r\n\t\t\t\t * method: function () {\r\n\t\t\t\t * }\r\n\t\t\t\t * });\r\n\t\t\t\t */\r\n\t\t\t\textend: function(overrides) {\r\n\t\t\t\t\t// Spawn\r\n\t\t\t\t\tvar subtype = create(this);\r\n\r\n\t\t\t\t\t// Augment\r\n\t\t\t\t\tif (overrides) {\r\n\t\t\t\t\t\tsubtype.mixIn(overrides);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Create default initializer\r\n\t\t\t\t\tif (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\r\n\t\t\t\t\t\tsubtype.init = function() {\r\n\t\t\t\t\t\t\tsubtype.$super.init.apply(this, arguments);\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Initializer's prototype is the subtype object\r\n\t\t\t\t\tsubtype.init.prototype = subtype;\r\n\r\n\t\t\t\t\t// Reference supertype\r\n\t\t\t\t\tsubtype.$super = this;\r\n\r\n\t\t\t\t\treturn subtype;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Extends this object and runs the init method.\r\n\t\t\t\t * Arguments to create() will be passed to init().\r\n\t\t\t\t *\r\n\t\t\t\t * @return {Object} The new object.\r\n\t\t\t\t *\r\n\t\t\t\t * @static\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t *\r\n\t\t\t\t * var instance = MyType.create();\r\n\t\t\t\t */\r\n\t\t\t\tcreate: function() {\r\n\t\t\t\t\tvar instance = this.extend();\r\n\t\t\t\t\tinstance.init.apply(instance, arguments);\r\n\r\n\t\t\t\t\treturn instance;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Initializes a newly created object.\r\n\t\t\t\t * Override this method to add some logic when your objects are created.\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t *\r\n\t\t\t\t * var MyType = CryptoJS.lib.Base.extend({\r\n\t\t\t\t * init: function () {\r\n\t\t\t\t * // ...\r\n\t\t\t\t * }\r\n\t\t\t\t * });\r\n\t\t\t\t */\r\n\t\t\t\tinit: function() {},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Copies properties into this object.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {Object} properties The properties to mix in.\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t *\r\n\t\t\t\t * MyType.mixIn({\r\n\t\t\t\t * field: 'value'\r\n\t\t\t\t * });\r\n\t\t\t\t */\r\n\t\t\t\tmixIn: function(properties) {\r\n\t\t\t\t\tfor (var propertyName in properties) {\r\n\t\t\t\t\t\tif (properties.hasOwnProperty(propertyName)) {\r\n\t\t\t\t\t\t\tthis[propertyName] = properties[propertyName];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// IE won't copy toString using the loop above\r\n\t\t\t\t\tif (properties.hasOwnProperty('toString')) {\r\n\t\t\t\t\t\tthis.toString = properties.toString;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Creates a copy of this object.\r\n\t\t\t\t *\r\n\t\t\t\t * @return {Object} The clone.\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t *\r\n\t\t\t\t * var clone = instance.clone();\r\n\t\t\t\t */\r\n\t\t\t\tclone: function() {\r\n\t\t\t\t\treturn this.init.prototype.extend(this);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}());\r\n\r\n\t\t/**\r\n\t\t * An array of 32-bit words.\r\n\t\t *\r\n\t\t * @property {Array} words The array of 32-bit words.\r\n\t\t * @property {number} sigBytes The number of significant bytes in this word array.\r\n\t\t */\r\n\t\tvar WordArray = C_lib.WordArray = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created word array.\r\n\t\t\t *\r\n\t\t\t * @param {Array} words (Optional) An array of 32-bit words.\r\n\t\t\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.lib.WordArray.create();\r\n\t\t\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\r\n\t\t\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\r\n\t\t\t */\r\n\t\t\tinit: function(words, sigBytes) {\r\n\t\t\t\twords = this.words = words || [];\r\n\r\n\t\t\t\tif (sigBytes != undefined) {\r\n\t\t\t\t\tthis.sigBytes = sigBytes;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.sigBytes = words.length * 4;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts this word array to a string.\r\n\t\t\t *\r\n\t\t\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\r\n\t\t\t *\r\n\t\t\t * @return {string} The stringified word array.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var string = wordArray + '';\r\n\t\t\t * var string = wordArray.toString();\r\n\t\t\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\r\n\t\t\t */\r\n\t\t\ttoString: function(encoder) {\r\n\t\t\t\treturn (encoder || Hex).stringify(this);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Concatenates a word array to this word array.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} wordArray The word array to append.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} This word array.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * wordArray1.concat(wordArray2);\r\n\t\t\t */\r\n\t\t\tconcat: function(wordArray) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar thisWords = this.words;\r\n\t\t\t\tvar thatWords = wordArray.words;\r\n\t\t\t\tvar thisSigBytes = this.sigBytes;\r\n\t\t\t\tvar thatSigBytes = wordArray.sigBytes;\r\n\r\n\t\t\t\t// Clamp excess bits\r\n\t\t\t\tthis.clamp();\r\n\r\n\t\t\t\t// Concat\r\n\t\t\t\tif (thisSigBytes % 4) {\r\n\t\t\t\t\t// Copy one byte at a time\r\n\t\t\t\t\tfor (var i = 0; i < thatSigBytes; i++) {\r\n\t\t\t\t\t\tvar thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n\t\t\t\t\t\tthisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((\r\n\t\t\t\t\t\t\tthisSigBytes + i) % 4) * 8);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Copy one word at a time\r\n\t\t\t\t\tfor (var i = 0; i < thatSigBytes; i += 4) {\r\n\t\t\t\t\t\tthisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.sigBytes += thatSigBytes;\r\n\r\n\t\t\t\t// Chainable\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Removes insignificant bits.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * wordArray.clamp();\r\n\t\t\t */\r\n\t\t\tclamp: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar words = this.words;\r\n\t\t\t\tvar sigBytes = this.sigBytes;\r\n\r\n\t\t\t\t// Clamp\r\n\t\t\t\twords[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\r\n\t\t\t\twords.length = Math.ceil(sigBytes / 4);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates a copy of this word array.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The clone.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var clone = wordArray.clone();\r\n\t\t\t */\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Base.clone.call(this);\r\n\t\t\t\tclone.words = this.words.slice(0);\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates a word array filled with random bytes.\r\n\t\t\t *\r\n\t\t\t * @param {number} nBytes The number of random bytes to generate.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The random word array.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.lib.WordArray.random(16);\r\n\t\t\t */\r\n\t\t\trandom: function(nBytes) {\r\n\t\t\t\tvar words = [];\r\n\r\n\t\t\t\tvar r = (function(m_w) {\r\n\t\t\t\t\tvar m_w = m_w;\r\n\t\t\t\t\tvar m_z = 0x3ade68b1;\r\n\t\t\t\t\tvar mask = 0xffffffff;\r\n\r\n\t\t\t\t\treturn function() {\r\n\t\t\t\t\t\tm_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\r\n\t\t\t\t\t\tm_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\r\n\t\t\t\t\t\tvar result = ((m_z << 0x10) + m_w) & mask;\r\n\t\t\t\t\t\tresult /= 0x100000000;\r\n\t\t\t\t\t\tresult += 0.5;\r\n\t\t\t\t\t\treturn result * (Math.random() > .5 ? 1 : -1);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tfor (var i = 0, rcache; i < nBytes; i += 4) {\r\n\t\t\t\t\tvar _r = r((rcache || Math.random()) * 0x100000000);\r\n\r\n\t\t\t\t\trcache = _r() * 0x3ade67b7;\r\n\t\t\t\t\twords.push((_r() * 0x100000000) | 0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new WordArray.init(words, nBytes);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Encoder namespace.\r\n\t\t */\r\n\t\tvar C_enc = C.enc = {};\r\n\r\n\t\t/**\r\n\t\t * Hex encoding strategy.\r\n\t\t */\r\n\t\tvar Hex = C_enc.Hex = {\r\n\t\t\t/**\r\n\t\t\t * Converts a word array to a hex string.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} wordArray The word array.\r\n\t\t\t *\r\n\t\t\t * @return {string} The hex string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\r\n\t\t\t */\r\n\t\t\tstringify: function(wordArray) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar words = wordArray.words;\r\n\t\t\t\tvar sigBytes = wordArray.sigBytes;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar hexChars = [];\r\n\t\t\t\tfor (var i = 0; i < sigBytes; i++) {\r\n\t\t\t\t\tvar bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n\t\t\t\t\thexChars.push((bite >>> 4).toString(16));\r\n\t\t\t\t\thexChars.push((bite & 0x0f).toString(16));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn hexChars.join('');\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts a hex string to a word array.\r\n\t\t\t *\r\n\t\t\t * @param {string} hexStr The hex string.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The word array.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\r\n\t\t\t */\r\n\t\t\tparse: function(hexStr) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar hexStrLength = hexStr.length;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar words = [];\r\n\t\t\t\tfor (var i = 0; i < hexStrLength; i += 2) {\r\n\t\t\t\t\twords[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new WordArray.init(words, hexStrLength / 2);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Latin1 encoding strategy.\r\n\t\t */\r\n\t\tvar Latin1 = C_enc.Latin1 = {\r\n\t\t\t/**\r\n\t\t\t * Converts a word array to a Latin1 string.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} wordArray The word array.\r\n\t\t\t *\r\n\t\t\t * @return {string} The Latin1 string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\r\n\t\t\t */\r\n\t\t\tstringify: function(wordArray) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar words = wordArray.words;\r\n\t\t\t\tvar sigBytes = wordArray.sigBytes;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar latin1Chars = [];\r\n\t\t\t\tfor (var i = 0; i < sigBytes; i++) {\r\n\t\t\t\t\tvar bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n\t\t\t\t\tlatin1Chars.push(String.fromCharCode(bite));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn latin1Chars.join('');\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts a Latin1 string to a word array.\r\n\t\t\t *\r\n\t\t\t * @param {string} latin1Str The Latin1 string.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The word array.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\r\n\t\t\t */\r\n\t\t\tparse: function(latin1Str) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar latin1StrLength = latin1Str.length;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar words = [];\r\n\t\t\t\tfor (var i = 0; i < latin1StrLength; i++) {\r\n\t\t\t\t\twords[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn new WordArray.init(words, latin1StrLength);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * UTF-8 encoding strategy.\r\n\t\t */\r\n\t\tvar Utf8 = C_enc.Utf8 = {\r\n\t\t\t/**\r\n\t\t\t * Converts a word array to a UTF-8 string.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} wordArray The word array.\r\n\t\t\t *\r\n\t\t\t * @return {string} The UTF-8 string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\r\n\t\t\t */\r\n\t\t\tstringify: function(wordArray) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn decodeURIComponent(escape(Latin1.stringify(wordArray)));\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tthrow new Error('Malformed UTF-8 data');\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts a UTF-8 string to a word array.\r\n\t\t\t *\r\n\t\t\t * @param {string} utf8Str The UTF-8 string.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The word array.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\r\n\t\t\t */\r\n\t\t\tparse: function(utf8Str) {\r\n\t\t\t\treturn Latin1.parse(unescape(encodeURIComponent(utf8Str)));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Abstract buffered block algorithm template.\r\n\t\t *\r\n\t\t * The property blockSize must be implemented in a concrete subtype.\r\n\t\t *\r\n\t\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\r\n\t\t */\r\n\t\tvar BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Resets this block algorithm's data buffer to its initial state.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * bufferedBlockAlgorithm.reset();\r\n\t\t\t */\r\n\t\t\treset: function() {\r\n\t\t\t\t// Initial values\r\n\t\t\t\tthis._data = new WordArray.init();\r\n\t\t\t\tthis._nDataBytes = 0;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Adds new data to this block algorithm's buffer.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * bufferedBlockAlgorithm._append('data');\r\n\t\t\t * bufferedBlockAlgorithm._append(wordArray);\r\n\t\t\t */\r\n\t\t\t_append: function(data) {\r\n\t\t\t\t// Convert string to WordArray, else assume WordArray already\r\n\t\t\t\tif (typeof data == 'string') {\r\n\t\t\t\t\tdata = Utf8.parse(data);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Append\r\n\t\t\t\tthis._data.concat(data);\r\n\t\t\t\tthis._nDataBytes += data.sigBytes;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Processes available data blocks.\r\n\t\t\t *\r\n\t\t\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\r\n\t\t\t *\r\n\t\t\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The processed data.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var processedData = bufferedBlockAlgorithm._process();\r\n\t\t\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\r\n\t\t\t */\r\n\t\t\t_process: function(doFlush) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar data = this._data;\r\n\t\t\t\tvar dataWords = data.words;\r\n\t\t\t\tvar dataSigBytes = data.sigBytes;\r\n\t\t\t\tvar blockSize = this.blockSize;\r\n\t\t\t\tvar blockSizeBytes = blockSize * 4;\r\n\r\n\t\t\t\t// Count blocks ready\r\n\t\t\t\tvar nBlocksReady = dataSigBytes / blockSizeBytes;\r\n\t\t\t\tif (doFlush) {\r\n\t\t\t\t\t// Round up to include partial blocks\r\n\t\t\t\t\tnBlocksReady = Math.ceil(nBlocksReady);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Round down to include only full blocks,\r\n\t\t\t\t\t// less the number of blocks that must remain in the buffer\r\n\t\t\t\t\tnBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Count words ready\r\n\t\t\t\tvar nWordsReady = nBlocksReady * blockSize;\r\n\r\n\t\t\t\t// Count bytes ready\r\n\t\t\t\tvar nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\r\n\r\n\t\t\t\t// Process blocks\r\n\t\t\t\tif (nWordsReady) {\r\n\t\t\t\t\tfor (var offset = 0; offset < nWordsReady; offset += blockSize) {\r\n\t\t\t\t\t\t// Perform concrete-algorithm logic\r\n\t\t\t\t\t\tthis._doProcessBlock(dataWords, offset);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Remove processed words\r\n\t\t\t\t\tvar processedWords = dataWords.splice(0, nWordsReady);\r\n\t\t\t\t\tdata.sigBytes -= nBytesReady;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Return processed words\r\n\t\t\t\treturn new WordArray.init(processedWords, nBytesReady);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates a copy of this object.\r\n\t\t\t *\r\n\t\t\t * @return {Object} The clone.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var clone = bufferedBlockAlgorithm.clone();\r\n\t\t\t */\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Base.clone.call(this);\r\n\t\t\t\tclone._data = this._data.clone();\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t},\r\n\r\n\t\t\t_minBufferSize: 0\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Abstract hasher template.\r\n\t\t *\r\n\t\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\r\n\t\t */\r\n\t\tvar Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t */\r\n\t\t\tcfg: Base.extend(),\r\n\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created hasher.\r\n\t\t\t *\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var hasher = CryptoJS.algo.SHA256.create();\r\n\t\t\t */\r\n\t\t\tinit: function(cfg) {\r\n\t\t\t\t// Apply config defaults\r\n\t\t\t\tthis.cfg = this.cfg.extend(cfg);\r\n\r\n\t\t\t\t// Set initial values\r\n\t\t\t\tthis.reset();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Resets this hasher to its initial state.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * hasher.reset();\r\n\t\t\t */\r\n\t\t\treset: function() {\r\n\t\t\t\t// Reset data buffer\r\n\t\t\t\tBufferedBlockAlgorithm.reset.call(this);\r\n\r\n\t\t\t\t// Perform concrete-hasher logic\r\n\t\t\t\tthis._doReset();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Updates this hasher with a message.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} messageUpdate The message to append.\r\n\t\t\t *\r\n\t\t\t * @return {Hasher} This hasher.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * hasher.update('message');\r\n\t\t\t * hasher.update(wordArray);\r\n\t\t\t */\r\n\t\t\tupdate: function(messageUpdate) {\r\n\t\t\t\t// Append\r\n\t\t\t\tthis._append(messageUpdate);\r\n\r\n\t\t\t\t// Update the hash\r\n\t\t\t\tthis._process();\r\n\r\n\t\t\t\t// Chainable\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Finalizes the hash computation.\r\n\t\t\t * Note that the finalize operation is effectively a destructive, read-once operation.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The hash.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var hash = hasher.finalize();\r\n\t\t\t * var hash = hasher.finalize('message');\r\n\t\t\t * var hash = hasher.finalize(wordArray);\r\n\t\t\t */\r\n\t\t\tfinalize: function(messageUpdate) {\r\n\t\t\t\t// Final message update\r\n\t\t\t\tif (messageUpdate) {\r\n\t\t\t\t\tthis._append(messageUpdate);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Perform concrete-hasher logic\r\n\t\t\t\tvar hash = this._doFinalize();\r\n\r\n\t\t\t\treturn hash;\r\n\t\t\t},\r\n\r\n\t\t\tblockSize: 512 / 32,\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates a shortcut function to a hasher's object interface.\r\n\t\t\t *\r\n\t\t\t * @param {Hasher} hasher The hasher to create a helper for.\r\n\t\t\t *\r\n\t\t\t * @return {Function} The shortcut function.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\r\n\t\t\t */\r\n\t\t\t_createHelper: function(hasher) {\r\n\t\t\t\treturn function(message, cfg) {\r\n\t\t\t\t\treturn new hasher.init(cfg).finalize(message);\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates a shortcut function to the HMAC's object interface.\r\n\t\t\t *\r\n\t\t\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\r\n\t\t\t *\r\n\t\t\t * @return {Function} The shortcut function.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\r\n\t\t\t */\r\n\t\t\t_createHmacHelper: function(hasher) {\r\n\t\t\t\treturn function(message, key) {\r\n\t\t\t\t\treturn new C_algo.HMAC.init(hasher, key).finalize(message);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Algorithm namespace.\r\n\t\t */\r\n\t\tvar C_algo = C.algo = {};\r\n\r\n\t\treturn C;\r\n\t}(Math));\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar C_enc = C.enc;\r\n\r\n\t\t/**\r\n\t\t * Base64 encoding strategy.\r\n\t\t */\r\n\t\tvar Base64 = C_enc.Base64 = {\r\n\t\t\t/**\r\n\t\t\t * Converts a word array to a Base64 string.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} wordArray The word array.\r\n\t\t\t *\r\n\t\t\t * @return {string} The Base64 string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var base64String = CryptoJS.enc.Base64.stringify(wordArray);\r\n\t\t\t */\r\n\t\t\tstringify: function(wordArray) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar words = wordArray.words;\r\n\t\t\t\tvar sigBytes = wordArray.sigBytes;\r\n\t\t\t\tvar map = this._map;\r\n\r\n\t\t\t\t// Clamp excess bits\r\n\t\t\t\twordArray.clamp();\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar base64Chars = [];\r\n\t\t\t\tfor (var i = 0; i < sigBytes; i += 3) {\r\n\t\t\t\t\tvar byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n\t\t\t\t\tvar byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\r\n\t\t\t\t\tvar byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\r\n\r\n\t\t\t\t\tvar triplet = (byte1 << 16) | (byte2 << 8) | byte3;\r\n\r\n\t\t\t\t\tfor (var j = 0;\r\n\t\t\t\t\t\t(j < 4) && (i + j * 0.75 < sigBytes); j++) {\r\n\t\t\t\t\t\tbase64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tvar paddingChar = map.charAt(64);\r\n\t\t\t\tif (paddingChar) {\r\n\t\t\t\t\twhile (base64Chars.length % 4) {\r\n\t\t\t\t\t\tbase64Chars.push(paddingChar);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn base64Chars.join('');\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts a Base64 string to a word array.\r\n\t\t\t *\r\n\t\t\t * @param {string} base64Str The Base64 string.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The word array.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.enc.Base64.parse(base64String);\r\n\t\t\t */\r\n\t\t\tparse: function(base64Str) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar base64StrLength = base64Str.length;\r\n\t\t\t\tvar map = this._map;\r\n\t\t\t\tvar reverseMap = this._reverseMap;\r\n\r\n\t\t\t\tif (!reverseMap) {\r\n\t\t\t\t\treverseMap = this._reverseMap = [];\r\n\t\t\t\t\tfor (var j = 0; j < map.length; j++) {\r\n\t\t\t\t\t\treverseMap[map.charCodeAt(j)] = j;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Ignore padding\r\n\t\t\t\tvar paddingChar = map.charAt(64);\r\n\t\t\t\tif (paddingChar) {\r\n\t\t\t\t\tvar paddingIndex = base64Str.indexOf(paddingChar);\r\n\t\t\t\t\tif (paddingIndex !== -1) {\r\n\t\t\t\t\t\tbase64StrLength = paddingIndex;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\treturn parseLoop(base64Str, base64StrLength, reverseMap);\r\n\r\n\t\t\t},\r\n\r\n\t\t\t_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\r\n\t\t};\r\n\r\n\t\tfunction parseLoop(base64Str, base64StrLength, reverseMap) {\r\n\t\t\tvar words = [];\r\n\t\t\tvar nBytes = 0;\r\n\t\t\tfor (var i = 0; i < base64StrLength; i++) {\r\n\t\t\t\tif (i % 4) {\r\n\t\t\t\t\tvar bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\r\n\t\t\t\t\tvar bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\r\n\t\t\t\t\twords[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);\r\n\t\t\t\t\tnBytes++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn WordArray.create(words, nBytes);\r\n\t\t}\r\n\t}());\r\n\r\n\r\n\t(function(Math) {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar Hasher = C_lib.Hasher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Constants table\r\n\t\tvar T = [];\r\n\r\n\t\t// Compute constants\r\n\t\t(function() {\r\n\t\t\tfor (var i = 0; i < 64; i++) {\r\n\t\t\t\tT[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\r\n\t\t\t}\r\n\t\t}());\r\n\r\n\t\t/**\r\n\t\t * MD5 hash algorithm.\r\n\t\t */\r\n\t\tvar MD5 = C_algo.MD5 = Hasher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tthis._hash = new WordArray.init([\r\n\t\t\t\t\t0x67452301, 0xefcdab89,\r\n\t\t\t\t\t0x98badcfe, 0x10325476\r\n\t\t\t\t]);\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\t// Swap endian\r\n\t\t\t\tfor (var i = 0; i < 16; i++) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar offset_i = offset + i;\r\n\t\t\t\t\tvar M_offset_i = M[offset_i];\r\n\r\n\t\t\t\t\tM[offset_i] = (\r\n\t\t\t\t\t\t(((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar H = this._hash.words;\r\n\r\n\t\t\t\tvar M_offset_0 = M[offset + 0];\r\n\t\t\t\tvar M_offset_1 = M[offset + 1];\r\n\t\t\t\tvar M_offset_2 = M[offset + 2];\r\n\t\t\t\tvar M_offset_3 = M[offset + 3];\r\n\t\t\t\tvar M_offset_4 = M[offset + 4];\r\n\t\t\t\tvar M_offset_5 = M[offset + 5];\r\n\t\t\t\tvar M_offset_6 = M[offset + 6];\r\n\t\t\t\tvar M_offset_7 = M[offset + 7];\r\n\t\t\t\tvar M_offset_8 = M[offset + 8];\r\n\t\t\t\tvar M_offset_9 = M[offset + 9];\r\n\t\t\t\tvar M_offset_10 = M[offset + 10];\r\n\t\t\t\tvar M_offset_11 = M[offset + 11];\r\n\t\t\t\tvar M_offset_12 = M[offset + 12];\r\n\t\t\t\tvar M_offset_13 = M[offset + 13];\r\n\t\t\t\tvar M_offset_14 = M[offset + 14];\r\n\t\t\t\tvar M_offset_15 = M[offset + 15];\r\n\r\n\t\t\t\t// Working varialbes\r\n\t\t\t\tvar a = H[0];\r\n\t\t\t\tvar b = H[1];\r\n\t\t\t\tvar c = H[2];\r\n\t\t\t\tvar d = H[3];\r\n\r\n\t\t\t\t// Computation\r\n\t\t\t\ta = FF(a, b, c, d, M_offset_0, 7, T[0]);\r\n\t\t\t\td = FF(d, a, b, c, M_offset_1, 12, T[1]);\r\n\t\t\t\tc = FF(c, d, a, b, M_offset_2, 17, T[2]);\r\n\t\t\t\tb = FF(b, c, d, a, M_offset_3, 22, T[3]);\r\n\t\t\t\ta = FF(a, b, c, d, M_offset_4, 7, T[4]);\r\n\t\t\t\td = FF(d, a, b, c, M_offset_5, 12, T[5]);\r\n\t\t\t\tc = FF(c, d, a, b, M_offset_6, 17, T[6]);\r\n\t\t\t\tb = FF(b, c, d, a, M_offset_7, 22, T[7]);\r\n\t\t\t\ta = FF(a, b, c, d, M_offset_8, 7, T[8]);\r\n\t\t\t\td = FF(d, a, b, c, M_offset_9, 12, T[9]);\r\n\t\t\t\tc = FF(c, d, a, b, M_offset_10, 17, T[10]);\r\n\t\t\t\tb = FF(b, c, d, a, M_offset_11, 22, T[11]);\r\n\t\t\t\ta = FF(a, b, c, d, M_offset_12, 7, T[12]);\r\n\t\t\t\td = FF(d, a, b, c, M_offset_13, 12, T[13]);\r\n\t\t\t\tc = FF(c, d, a, b, M_offset_14, 17, T[14]);\r\n\t\t\t\tb = FF(b, c, d, a, M_offset_15, 22, T[15]);\r\n\r\n\t\t\t\ta = GG(a, b, c, d, M_offset_1, 5, T[16]);\r\n\t\t\t\td = GG(d, a, b, c, M_offset_6, 9, T[17]);\r\n\t\t\t\tc = GG(c, d, a, b, M_offset_11, 14, T[18]);\r\n\t\t\t\tb = GG(b, c, d, a, M_offset_0, 20, T[19]);\r\n\t\t\t\ta = GG(a, b, c, d, M_offset_5, 5, T[20]);\r\n\t\t\t\td = GG(d, a, b, c, M_offset_10, 9, T[21]);\r\n\t\t\t\tc = GG(c, d, a, b, M_offset_15, 14, T[22]);\r\n\t\t\t\tb = GG(b, c, d, a, M_offset_4, 20, T[23]);\r\n\t\t\t\ta = GG(a, b, c, d, M_offset_9, 5, T[24]);\r\n\t\t\t\td = GG(d, a, b, c, M_offset_14, 9, T[25]);\r\n\t\t\t\tc = GG(c, d, a, b, M_offset_3, 14, T[26]);\r\n\t\t\t\tb = GG(b, c, d, a, M_offset_8, 20, T[27]);\r\n\t\t\t\ta = GG(a, b, c, d, M_offset_13, 5, T[28]);\r\n\t\t\t\td = GG(d, a, b, c, M_offset_2, 9, T[29]);\r\n\t\t\t\tc = GG(c, d, a, b, M_offset_7, 14, T[30]);\r\n\t\t\t\tb = GG(b, c, d, a, M_offset_12, 20, T[31]);\r\n\r\n\t\t\t\ta = HH(a, b, c, d, M_offset_5, 4, T[32]);\r\n\t\t\t\td = HH(d, a, b, c, M_offset_8, 11, T[33]);\r\n\t\t\t\tc = HH(c, d, a, b, M_offset_11, 16, T[34]);\r\n\t\t\t\tb = HH(b, c, d, a, M_offset_14, 23, T[35]);\r\n\t\t\t\ta = HH(a, b, c, d, M_offset_1, 4, T[36]);\r\n\t\t\t\td = HH(d, a, b, c, M_offset_4, 11, T[37]);\r\n\t\t\t\tc = HH(c, d, a, b, M_offset_7, 16, T[38]);\r\n\t\t\t\tb = HH(b, c, d, a, M_offset_10, 23, T[39]);\r\n\t\t\t\ta = HH(a, b, c, d, M_offset_13, 4, T[40]);\r\n\t\t\t\td = HH(d, a, b, c, M_offset_0, 11, T[41]);\r\n\t\t\t\tc = HH(c, d, a, b, M_offset_3, 16, T[42]);\r\n\t\t\t\tb = HH(b, c, d, a, M_offset_6, 23, T[43]);\r\n\t\t\t\ta = HH(a, b, c, d, M_offset_9, 4, T[44]);\r\n\t\t\t\td = HH(d, a, b, c, M_offset_12, 11, T[45]);\r\n\t\t\t\tc = HH(c, d, a, b, M_offset_15, 16, T[46]);\r\n\t\t\t\tb = HH(b, c, d, a, M_offset_2, 23, T[47]);\r\n\r\n\t\t\t\ta = II(a, b, c, d, M_offset_0, 6, T[48]);\r\n\t\t\t\td = II(d, a, b, c, M_offset_7, 10, T[49]);\r\n\t\t\t\tc = II(c, d, a, b, M_offset_14, 15, T[50]);\r\n\t\t\t\tb = II(b, c, d, a, M_offset_5, 21, T[51]);\r\n\t\t\t\ta = II(a, b, c, d, M_offset_12, 6, T[52]);\r\n\t\t\t\td = II(d, a, b, c, M_offset_3, 10, T[53]);\r\n\t\t\t\tc = II(c, d, a, b, M_offset_10, 15, T[54]);\r\n\t\t\t\tb = II(b, c, d, a, M_offset_1, 21, T[55]);\r\n\t\t\t\ta = II(a, b, c, d, M_offset_8, 6, T[56]);\r\n\t\t\t\td = II(d, a, b, c, M_offset_15, 10, T[57]);\r\n\t\t\t\tc = II(c, d, a, b, M_offset_6, 15, T[58]);\r\n\t\t\t\tb = II(b, c, d, a, M_offset_13, 21, T[59]);\r\n\t\t\t\ta = II(a, b, c, d, M_offset_4, 6, T[60]);\r\n\t\t\t\td = II(d, a, b, c, M_offset_11, 10, T[61]);\r\n\t\t\t\tc = II(c, d, a, b, M_offset_2, 15, T[62]);\r\n\t\t\t\tb = II(b, c, d, a, M_offset_9, 21, T[63]);\r\n\r\n\t\t\t\t// Intermediate hash value\r\n\t\t\t\tH[0] = (H[0] + a) | 0;\r\n\t\t\t\tH[1] = (H[1] + b) | 0;\r\n\t\t\t\tH[2] = (H[2] + c) | 0;\r\n\t\t\t\tH[3] = (H[3] + d) | 0;\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar data = this._data;\r\n\t\t\t\tvar dataWords = data.words;\r\n\r\n\t\t\t\tvar nBitsTotal = this._nDataBytes * 8;\r\n\t\t\t\tvar nBitsLeft = data.sigBytes * 8;\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tdataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n\r\n\t\t\t\tvar nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\r\n\t\t\t\tvar nBitsTotalL = nBitsTotal;\r\n\t\t\t\tdataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\r\n\t\t\t\t\t(((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t(((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\r\n\t\t\t\t);\r\n\t\t\t\tdataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\r\n\t\t\t\t\t(((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t(((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\r\n\t\t\t\t);\r\n\r\n\t\t\t\tdata.sigBytes = (dataWords.length + 1) * 4;\r\n\r\n\t\t\t\t// Hash final blocks\r\n\t\t\t\tthis._process();\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar hash = this._hash;\r\n\t\t\t\tvar H = hash.words;\r\n\r\n\t\t\t\t// Swap endian\r\n\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\t// Shortcut\r\n\t\t\t\t\tvar H_i = H[i];\r\n\r\n\t\t\t\t\tH[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Return final computed hash\r\n\t\t\t\treturn hash;\r\n\t\t\t},\r\n\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Hasher.clone.call(this);\r\n\t\t\t\tclone._hash = this._hash.clone();\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tfunction FF(a, b, c, d, x, s, t) {\r\n\t\t\tvar n = a + ((b & c) | (~b & d)) + x + t;\r\n\t\t\treturn ((n << s) | (n >>> (32 - s))) + b;\r\n\t\t}\r\n\r\n\t\tfunction GG(a, b, c, d, x, s, t) {\r\n\t\t\tvar n = a + ((b & d) | (c & ~d)) + x + t;\r\n\t\t\treturn ((n << s) | (n >>> (32 - s))) + b;\r\n\t\t}\r\n\r\n\t\tfunction HH(a, b, c, d, x, s, t) {\r\n\t\t\tvar n = a + (b ^ c ^ d) + x + t;\r\n\t\t\treturn ((n << s) | (n >>> (32 - s))) + b;\r\n\t\t}\r\n\r\n\t\tfunction II(a, b, c, d, x, s, t) {\r\n\t\t\tvar n = a + (c ^ (b | ~d)) + x + t;\r\n\t\t\treturn ((n << s) | (n >>> (32 - s))) + b;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.MD5('message');\r\n\t\t * var hash = CryptoJS.MD5(wordArray);\r\n\t\t */\r\n\t\tC.MD5 = Hasher._createHelper(MD5);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacMD5(message, key);\r\n\t\t */\r\n\t\tC.HmacMD5 = Hasher._createHmacHelper(MD5);\r\n\t}(Math));\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar Hasher = C_lib.Hasher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Reusable object\r\n\t\tvar W = [];\r\n\r\n\t\t/**\r\n\t\t * SHA-1 hash algorithm.\r\n\t\t */\r\n\t\tvar SHA1 = C_algo.SHA1 = Hasher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tthis._hash = new WordArray.init([\r\n\t\t\t\t\t0x67452301, 0xefcdab89,\r\n\t\t\t\t\t0x98badcfe, 0x10325476,\r\n\t\t\t\t\t0xc3d2e1f0\r\n\t\t\t\t]);\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar H = this._hash.words;\r\n\r\n\t\t\t\t// Working variables\r\n\t\t\t\tvar a = H[0];\r\n\t\t\t\tvar b = H[1];\r\n\t\t\t\tvar c = H[2];\r\n\t\t\t\tvar d = H[3];\r\n\t\t\t\tvar e = H[4];\r\n\r\n\t\t\t\t// Computation\r\n\t\t\t\tfor (var i = 0; i < 80; i++) {\r\n\t\t\t\t\tif (i < 16) {\r\n\t\t\t\t\t\tW[i] = M[offset + i] | 0;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\r\n\t\t\t\t\t\tW[i] = (n << 1) | (n >>> 31);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar t = ((a << 5) | (a >>> 27)) + e + W[i];\r\n\t\t\t\t\tif (i < 20) {\r\n\t\t\t\t\t\tt += ((b & c) | (~b & d)) + 0x5a827999;\r\n\t\t\t\t\t} else if (i < 40) {\r\n\t\t\t\t\t\tt += (b ^ c ^ d) + 0x6ed9eba1;\r\n\t\t\t\t\t} else if (i < 60) {\r\n\t\t\t\t\t\tt += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\r\n\t\t\t\t\t} else /* if (i < 80) */ {\r\n\t\t\t\t\t\tt += (b ^ c ^ d) - 0x359d3e2a;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\te = d;\r\n\t\t\t\t\td = c;\r\n\t\t\t\t\tc = (b << 30) | (b >>> 2);\r\n\t\t\t\t\tb = a;\r\n\t\t\t\t\ta = t;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Intermediate hash value\r\n\t\t\t\tH[0] = (H[0] + a) | 0;\r\n\t\t\t\tH[1] = (H[1] + b) | 0;\r\n\t\t\t\tH[2] = (H[2] + c) | 0;\r\n\t\t\t\tH[3] = (H[3] + d) | 0;\r\n\t\t\t\tH[4] = (H[4] + e) | 0;\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar data = this._data;\r\n\t\t\t\tvar dataWords = data.words;\r\n\r\n\t\t\t\tvar nBitsTotal = this._nDataBytes * 8;\r\n\t\t\t\tvar nBitsLeft = data.sigBytes * 8;\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tdataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n\t\t\t\tdataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal /\r\n\t\t\t\t\t0x100000000);\r\n\t\t\t\tdataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\r\n\t\t\t\tdata.sigBytes = dataWords.length * 4;\r\n\r\n\t\t\t\t// Hash final blocks\r\n\t\t\t\tthis._process();\r\n\r\n\t\t\t\t// Return final computed hash\r\n\t\t\t\treturn this._hash;\r\n\t\t\t},\r\n\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Hasher.clone.call(this);\r\n\t\t\t\tclone._hash = this._hash.clone();\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.SHA1('message');\r\n\t\t * var hash = CryptoJS.SHA1(wordArray);\r\n\t\t */\r\n\t\tC.SHA1 = Hasher._createHelper(SHA1);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacSHA1(message, key);\r\n\t\t */\r\n\t\tC.HmacSHA1 = Hasher._createHmacHelper(SHA1);\r\n\t}());\r\n\r\n\r\n\t(function(Math) {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar Hasher = C_lib.Hasher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Initialization and round constants tables\r\n\t\tvar H = [];\r\n\t\tvar K = [];\r\n\r\n\t\t// Compute constants\r\n\t\t(function() {\r\n\t\t\tfunction isPrime(n) {\r\n\t\t\t\tvar sqrtN = Math.sqrt(n);\r\n\t\t\t\tfor (var factor = 2; factor <= sqrtN; factor++) {\r\n\t\t\t\t\tif (!(n % factor)) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\tfunction getFractionalBits(n) {\r\n\t\t\t\treturn ((n - (n | 0)) * 0x100000000) | 0;\r\n\t\t\t}\r\n\r\n\t\t\tvar n = 2;\r\n\t\t\tvar nPrime = 0;\r\n\t\t\twhile (nPrime < 64) {\r\n\t\t\t\tif (isPrime(n)) {\r\n\t\t\t\t\tif (nPrime < 8) {\r\n\t\t\t\t\t\tH[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\r\n\t\t\t\t\t}\r\n\t\t\t\t\tK[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\r\n\r\n\t\t\t\t\tnPrime++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tn++;\r\n\t\t\t}\r\n\t\t}());\r\n\r\n\t\t// Reusable object\r\n\t\tvar W = [];\r\n\r\n\t\t/**\r\n\t\t * SHA-256 hash algorithm.\r\n\t\t */\r\n\t\tvar SHA256 = C_algo.SHA256 = Hasher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tthis._hash = new WordArray.init(H.slice(0));\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar H = this._hash.words;\r\n\r\n\t\t\t\t// Working variables\r\n\t\t\t\tvar a = H[0];\r\n\t\t\t\tvar b = H[1];\r\n\t\t\t\tvar c = H[2];\r\n\t\t\t\tvar d = H[3];\r\n\t\t\t\tvar e = H[4];\r\n\t\t\t\tvar f = H[5];\r\n\t\t\t\tvar g = H[6];\r\n\t\t\t\tvar h = H[7];\r\n\r\n\t\t\t\t// Computation\r\n\t\t\t\tfor (var i = 0; i < 64; i++) {\r\n\t\t\t\t\tif (i < 16) {\r\n\t\t\t\t\t\tW[i] = M[offset + i] | 0;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar gamma0x = W[i - 15];\r\n\t\t\t\t\t\tvar gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\r\n\t\t\t\t\t\t\t((gamma0x << 14) | (gamma0x >>> 18)) ^\r\n\t\t\t\t\t\t\t(gamma0x >>> 3);\r\n\r\n\t\t\t\t\t\tvar gamma1x = W[i - 2];\r\n\t\t\t\t\t\tvar gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\r\n\t\t\t\t\t\t\t((gamma1x << 13) | (gamma1x >>> 19)) ^\r\n\t\t\t\t\t\t\t(gamma1x >>> 10);\r\n\r\n\t\t\t\t\t\tW[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar ch = (e & f) ^ (~e & g);\r\n\t\t\t\t\tvar maj = (a & b) ^ (a & c) ^ (b & c);\r\n\r\n\t\t\t\t\tvar sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a <<\r\n\t\t\t\t\t\t10) | (a >>> 22));\r\n\t\t\t\t\tvar sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e <<\r\n\t\t\t\t\t\t7) | (e >>> 25));\r\n\r\n\t\t\t\t\tvar t1 = h + sigma1 + ch + K[i] + W[i];\r\n\t\t\t\t\tvar t2 = sigma0 + maj;\r\n\r\n\t\t\t\t\th = g;\r\n\t\t\t\t\tg = f;\r\n\t\t\t\t\tf = e;\r\n\t\t\t\t\te = (d + t1) | 0;\r\n\t\t\t\t\td = c;\r\n\t\t\t\t\tc = b;\r\n\t\t\t\t\tb = a;\r\n\t\t\t\t\ta = (t1 + t2) | 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Intermediate hash value\r\n\t\t\t\tH[0] = (H[0] + a) | 0;\r\n\t\t\t\tH[1] = (H[1] + b) | 0;\r\n\t\t\t\tH[2] = (H[2] + c) | 0;\r\n\t\t\t\tH[3] = (H[3] + d) | 0;\r\n\t\t\t\tH[4] = (H[4] + e) | 0;\r\n\t\t\t\tH[5] = (H[5] + f) | 0;\r\n\t\t\t\tH[6] = (H[6] + g) | 0;\r\n\t\t\t\tH[7] = (H[7] + h) | 0;\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar data = this._data;\r\n\t\t\t\tvar dataWords = data.words;\r\n\r\n\t\t\t\tvar nBitsTotal = this._nDataBytes * 8;\r\n\t\t\t\tvar nBitsLeft = data.sigBytes * 8;\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tdataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n\t\t\t\tdataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal /\r\n\t\t\t\t\t0x100000000);\r\n\t\t\t\tdataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\r\n\t\t\t\tdata.sigBytes = dataWords.length * 4;\r\n\r\n\t\t\t\t// Hash final blocks\r\n\t\t\t\tthis._process();\r\n\r\n\t\t\t\t// Return final computed hash\r\n\t\t\t\treturn this._hash;\r\n\t\t\t},\r\n\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Hasher.clone.call(this);\r\n\t\t\t\tclone._hash = this._hash.clone();\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.SHA256('message');\r\n\t\t * var hash = CryptoJS.SHA256(wordArray);\r\n\t\t */\r\n\t\tC.SHA256 = Hasher._createHelper(SHA256);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacSHA256(message, key);\r\n\t\t */\r\n\t\tC.HmacSHA256 = Hasher._createHmacHelper(SHA256);\r\n\t}(Math));\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar C_enc = C.enc;\r\n\r\n\t\t/**\r\n\t\t * UTF-16 BE encoding strategy.\r\n\t\t */\r\n\t\tvar Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\r\n\t\t\t/**\r\n\t\t\t * Converts a word array to a UTF-16 BE string.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} wordArray The word array.\r\n\t\t\t *\r\n\t\t\t * @return {string} The UTF-16 BE string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\r\n\t\t\t */\r\n\t\t\tstringify: function(wordArray) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar words = wordArray.words;\r\n\t\t\t\tvar sigBytes = wordArray.sigBytes;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar utf16Chars = [];\r\n\t\t\t\tfor (var i = 0; i < sigBytes; i += 2) {\r\n\t\t\t\t\tvar codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\r\n\t\t\t\t\tutf16Chars.push(String.fromCharCode(codePoint));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn utf16Chars.join('');\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts a UTF-16 BE string to a word array.\r\n\t\t\t *\r\n\t\t\t * @param {string} utf16Str The UTF-16 BE string.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The word array.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\r\n\t\t\t */\r\n\t\t\tparse: function(utf16Str) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar utf16StrLength = utf16Str.length;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar words = [];\r\n\t\t\t\tfor (var i = 0; i < utf16StrLength; i++) {\r\n\t\t\t\t\twords[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn WordArray.create(words, utf16StrLength * 2);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * UTF-16 LE encoding strategy.\r\n\t\t */\r\n\t\tC_enc.Utf16LE = {\r\n\t\t\t/**\r\n\t\t\t * Converts a word array to a UTF-16 LE string.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} wordArray The word array.\r\n\t\t\t *\r\n\t\t\t * @return {string} The UTF-16 LE string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\r\n\t\t\t */\r\n\t\t\tstringify: function(wordArray) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar words = wordArray.words;\r\n\t\t\t\tvar sigBytes = wordArray.sigBytes;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar utf16Chars = [];\r\n\t\t\t\tfor (var i = 0; i < sigBytes; i += 2) {\r\n\t\t\t\t\tvar codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\r\n\t\t\t\t\tutf16Chars.push(String.fromCharCode(codePoint));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn utf16Chars.join('');\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts a UTF-16 LE string to a word array.\r\n\t\t\t *\r\n\t\t\t * @param {string} utf16Str The UTF-16 LE string.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The word array.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\r\n\t\t\t */\r\n\t\t\tparse: function(utf16Str) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar utf16StrLength = utf16Str.length;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar words = [];\r\n\t\t\t\tfor (var i = 0; i < utf16StrLength; i++) {\r\n\t\t\t\t\twords[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn WordArray.create(words, utf16StrLength * 2);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tfunction swapEndian(word) {\r\n\t\t\treturn ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\r\n\t\t}\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Check if typed arrays are supported\r\n\t\tif (typeof ArrayBuffer != 'function') {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\r\n\t\t// Reference original init\r\n\t\tvar superInit = WordArray.init;\r\n\r\n\t\t// Augment WordArray.init to handle typed arrays\r\n\t\tvar subInit = WordArray.init = function(typedArray) {\r\n\t\t\t// Convert buffers to uint8\r\n\t\t\tif (typedArray instanceof ArrayBuffer) {\r\n\t\t\t\ttypedArray = new Uint8Array(typedArray);\r\n\t\t\t}\r\n\r\n\t\t\t// Convert other array views to uint8\r\n\t\t\tif (\r\n\t\t\t\ttypedArray instanceof Int8Array ||\r\n\t\t\t\t(typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\r\n\t\t\t\ttypedArray instanceof Int16Array ||\r\n\t\t\t\ttypedArray instanceof Uint16Array ||\r\n\t\t\t\ttypedArray instanceof Int32Array ||\r\n\t\t\t\ttypedArray instanceof Uint32Array ||\r\n\t\t\t\ttypedArray instanceof Float32Array ||\r\n\t\t\t\ttypedArray instanceof Float64Array\r\n\t\t\t) {\r\n\t\t\t\ttypedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray\r\n\t\t\t\t\t.byteLength);\r\n\t\t\t}\r\n\r\n\t\t\t// Handle Uint8Array\r\n\t\t\tif (typedArray instanceof Uint8Array) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar typedArrayByteLength = typedArray.byteLength;\r\n\r\n\t\t\t\t// Extract bytes\r\n\t\t\t\tvar words = [];\r\n\t\t\t\tfor (var i = 0; i < typedArrayByteLength; i++) {\r\n\t\t\t\t\twords[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Initialize this word array\r\n\t\t\t\tsuperInit.call(this, words, typedArrayByteLength);\r\n\t\t\t} else {\r\n\t\t\t\t// Else call normal init\r\n\t\t\t\tsuperInit.apply(this, arguments);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tsubInit.prototype = WordArray;\r\n\t}());\r\n\r\n\r\n\t/** @preserve\r\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\r\n\r\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\r\n\r\n\t - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\r\n\t - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\r\n\r\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\t*/\r\n\r\n\t(function(Math) {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar Hasher = C_lib.Hasher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Constants table\r\n\t\tvar _zl = WordArray.create([\r\n\t\t\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\r\n\t\t\t7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\r\n\t\t\t3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\r\n\t\t\t1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\r\n\t\t\t4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13\r\n\t\t]);\r\n\t\tvar _zr = WordArray.create([\r\n\t\t\t5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\r\n\t\t\t6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\r\n\t\t\t15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\r\n\t\t\t8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\r\n\t\t\t12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11\r\n\t\t]);\r\n\t\tvar _sl = WordArray.create([\r\n\t\t\t11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\r\n\t\t\t7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\r\n\t\t\t11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\r\n\t\t\t11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\r\n\t\t\t9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6\r\n\t\t]);\r\n\t\tvar _sr = WordArray.create([\r\n\t\t\t8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\r\n\t\t\t9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\r\n\t\t\t9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\r\n\t\t\t15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\r\n\t\t\t8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11\r\n\t\t]);\r\n\r\n\t\tvar _hl = WordArray.create([0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\r\n\t\tvar _hr = WordArray.create([0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\r\n\r\n\t\t/**\r\n\t\t * RIPEMD160 hash algorithm.\r\n\t\t */\r\n\t\tvar RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tthis._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476,\r\n\t\t\t\t\t0xC3D2E1F0\r\n\t\t\t\t]);\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\r\n\t\t\t\t// Swap endian\r\n\t\t\t\tfor (var i = 0; i < 16; i++) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar offset_i = offset + i;\r\n\t\t\t\t\tvar M_offset_i = M[offset_i];\r\n\r\n\t\t\t\t\t// Swap\r\n\t\t\t\t\tM[offset_i] = (\r\n\t\t\t\t\t\t(((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar H = this._hash.words;\r\n\t\t\t\tvar hl = _hl.words;\r\n\t\t\t\tvar hr = _hr.words;\r\n\t\t\t\tvar zl = _zl.words;\r\n\t\t\t\tvar zr = _zr.words;\r\n\t\t\t\tvar sl = _sl.words;\r\n\t\t\t\tvar sr = _sr.words;\r\n\r\n\t\t\t\t// Working variables\r\n\t\t\t\tvar al, bl, cl, dl, el;\r\n\t\t\t\tvar ar, br, cr, dr, er;\r\n\r\n\t\t\t\tar = al = H[0];\r\n\t\t\t\tbr = bl = H[1];\r\n\t\t\t\tcr = cl = H[2];\r\n\t\t\t\tdr = dl = H[3];\r\n\t\t\t\ter = el = H[4];\r\n\t\t\t\t// Computation\r\n\t\t\t\tvar t;\r\n\t\t\t\tfor (var i = 0; i < 80; i += 1) {\r\n\t\t\t\t\tt = (al + M[offset + zl[i]]) | 0;\r\n\t\t\t\t\tif (i < 16) {\r\n\t\t\t\t\t\tt += f1(bl, cl, dl) + hl[0];\r\n\t\t\t\t\t} else if (i < 32) {\r\n\t\t\t\t\t\tt += f2(bl, cl, dl) + hl[1];\r\n\t\t\t\t\t} else if (i < 48) {\r\n\t\t\t\t\t\tt += f3(bl, cl, dl) + hl[2];\r\n\t\t\t\t\t} else if (i < 64) {\r\n\t\t\t\t\t\tt += f4(bl, cl, dl) + hl[3];\r\n\t\t\t\t\t} else { // if (i<80) {\r\n\t\t\t\t\t\tt += f5(bl, cl, dl) + hl[4];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tt = t | 0;\r\n\t\t\t\t\tt = rotl(t, sl[i]);\r\n\t\t\t\t\tt = (t + el) | 0;\r\n\t\t\t\t\tal = el;\r\n\t\t\t\t\tel = dl;\r\n\t\t\t\t\tdl = rotl(cl, 10);\r\n\t\t\t\t\tcl = bl;\r\n\t\t\t\t\tbl = t;\r\n\r\n\t\t\t\t\tt = (ar + M[offset + zr[i]]) | 0;\r\n\t\t\t\t\tif (i < 16) {\r\n\t\t\t\t\t\tt += f5(br, cr, dr) + hr[0];\r\n\t\t\t\t\t} else if (i < 32) {\r\n\t\t\t\t\t\tt += f4(br, cr, dr) + hr[1];\r\n\t\t\t\t\t} else if (i < 48) {\r\n\t\t\t\t\t\tt += f3(br, cr, dr) + hr[2];\r\n\t\t\t\t\t} else if (i < 64) {\r\n\t\t\t\t\t\tt += f2(br, cr, dr) + hr[3];\r\n\t\t\t\t\t} else { // if (i<80) {\r\n\t\t\t\t\t\tt += f1(br, cr, dr) + hr[4];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tt = t | 0;\r\n\t\t\t\t\tt = rotl(t, sr[i]);\r\n\t\t\t\t\tt = (t + er) | 0;\r\n\t\t\t\t\tar = er;\r\n\t\t\t\t\ter = dr;\r\n\t\t\t\t\tdr = rotl(cr, 10);\r\n\t\t\t\t\tcr = br;\r\n\t\t\t\t\tbr = t;\r\n\t\t\t\t}\r\n\t\t\t\t// Intermediate hash value\r\n\t\t\t\tt = (H[1] + cl + dr) | 0;\r\n\t\t\t\tH[1] = (H[2] + dl + er) | 0;\r\n\t\t\t\tH[2] = (H[3] + el + ar) | 0;\r\n\t\t\t\tH[3] = (H[4] + al + br) | 0;\r\n\t\t\t\tH[4] = (H[0] + bl + cr) | 0;\r\n\t\t\t\tH[0] = t;\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar data = this._data;\r\n\t\t\t\tvar dataWords = data.words;\r\n\r\n\t\t\t\tvar nBitsTotal = this._nDataBytes * 8;\r\n\t\t\t\tvar nBitsLeft = data.sigBytes * 8;\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tdataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n\t\t\t\tdataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\r\n\t\t\t\t\t(((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t(((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)\r\n\t\t\t\t);\r\n\t\t\t\tdata.sigBytes = (dataWords.length + 1) * 4;\r\n\r\n\t\t\t\t// Hash final blocks\r\n\t\t\t\tthis._process();\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar hash = this._hash;\r\n\t\t\t\tvar H = hash.words;\r\n\r\n\t\t\t\t// Swap endian\r\n\t\t\t\tfor (var i = 0; i < 5; i++) {\r\n\t\t\t\t\t// Shortcut\r\n\t\t\t\t\tvar H_i = H[i];\r\n\r\n\t\t\t\t\t// Swap\r\n\t\t\t\t\tH[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Return final computed hash\r\n\t\t\t\treturn hash;\r\n\t\t\t},\r\n\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Hasher.clone.call(this);\r\n\t\t\t\tclone._hash = this._hash.clone();\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\r\n\t\tfunction f1(x, y, z) {\r\n\t\t\treturn ((x) ^ (y) ^ (z));\r\n\r\n\t\t}\r\n\r\n\t\tfunction f2(x, y, z) {\r\n\t\t\treturn (((x) & (y)) | ((~x) & (z)));\r\n\t\t}\r\n\r\n\t\tfunction f3(x, y, z) {\r\n\t\t\treturn (((x) | (~(y))) ^ (z));\r\n\t\t}\r\n\r\n\t\tfunction f4(x, y, z) {\r\n\t\t\treturn (((x) & (z)) | ((y) & (~(z))));\r\n\t\t}\r\n\r\n\t\tfunction f5(x, y, z) {\r\n\t\t\treturn ((x) ^ ((y) | (~(z))));\r\n\r\n\t\t}\r\n\r\n\t\tfunction rotl(x, n) {\r\n\t\t\treturn (x << n) | (x >>> (32 - n));\r\n\t\t}\r\n\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.RIPEMD160('message');\r\n\t\t * var hash = CryptoJS.RIPEMD160(wordArray);\r\n\t\t */\r\n\t\tC.RIPEMD160 = Hasher._createHelper(RIPEMD160);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacRIPEMD160(message, key);\r\n\t\t */\r\n\t\tC.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\r\n\t}(Math));\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar Base = C_lib.Base;\r\n\t\tvar C_enc = C.enc;\r\n\t\tvar Utf8 = C_enc.Utf8;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t/**\r\n\t\t * HMAC algorithm.\r\n\t\t */\r\n\t\tvar HMAC = C_algo.HMAC = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created HMAC.\r\n\t\t\t *\r\n\t\t\t * @param {Hasher} hasher The hash algorithm to use.\r\n\t\t\t * @param {WordArray|string} key The secret key.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\r\n\t\t\t */\r\n\t\t\tinit: function(hasher, key) {\r\n\t\t\t\t// Init hasher\r\n\t\t\t\thasher = this._hasher = new hasher.init();\r\n\r\n\t\t\t\t// Convert string to WordArray, else assume WordArray already\r\n\t\t\t\tif (typeof key == 'string') {\r\n\t\t\t\t\tkey = Utf8.parse(key);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar hasherBlockSize = hasher.blockSize;\r\n\t\t\t\tvar hasherBlockSizeBytes = hasherBlockSize * 4;\r\n\r\n\t\t\t\t// Allow arbitrary length keys\r\n\t\t\t\tif (key.sigBytes > hasherBlockSizeBytes) {\r\n\t\t\t\t\tkey = hasher.finalize(key);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Clamp excess bits\r\n\t\t\t\tkey.clamp();\r\n\r\n\t\t\t\t// Clone key for inner and outer pads\r\n\t\t\t\tvar oKey = this._oKey = key.clone();\r\n\t\t\t\tvar iKey = this._iKey = key.clone();\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar oKeyWords = oKey.words;\r\n\t\t\t\tvar iKeyWords = iKey.words;\r\n\r\n\t\t\t\t// XOR keys with pad constants\r\n\t\t\t\tfor (var i = 0; i < hasherBlockSize; i++) {\r\n\t\t\t\t\toKeyWords[i] ^= 0x5c5c5c5c;\r\n\t\t\t\t\tiKeyWords[i] ^= 0x36363636;\r\n\t\t\t\t}\r\n\t\t\t\toKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\r\n\r\n\t\t\t\t// Set initial values\r\n\t\t\t\tthis.reset();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Resets this HMAC to its initial state.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * hmacHasher.reset();\r\n\t\t\t */\r\n\t\t\treset: function() {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar hasher = this._hasher;\r\n\r\n\t\t\t\t// Reset\r\n\t\t\t\thasher.reset();\r\n\t\t\t\thasher.update(this._iKey);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Updates this HMAC with a message.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} messageUpdate The message to append.\r\n\t\t\t *\r\n\t\t\t * @return {HMAC} This HMAC instance.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * hmacHasher.update('message');\r\n\t\t\t * hmacHasher.update(wordArray);\r\n\t\t\t */\r\n\t\t\tupdate: function(messageUpdate) {\r\n\t\t\t\tthis._hasher.update(messageUpdate);\r\n\r\n\t\t\t\t// Chainable\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Finalizes the HMAC computation.\r\n\t\t\t * Note that the finalize operation is effectively a destructive, read-once operation.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The HMAC.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var hmac = hmacHasher.finalize();\r\n\t\t\t * var hmac = hmacHasher.finalize('message');\r\n\t\t\t * var hmac = hmacHasher.finalize(wordArray);\r\n\t\t\t */\r\n\t\t\tfinalize: function(messageUpdate) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar hasher = this._hasher;\r\n\r\n\t\t\t\t// Compute HMAC\r\n\t\t\t\tvar innerHash = hasher.finalize(messageUpdate);\r\n\t\t\t\thasher.reset();\r\n\t\t\t\tvar hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\r\n\r\n\t\t\t\treturn hmac;\r\n\t\t\t}\r\n\t\t});\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar Base = C_lib.Base;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar C_algo = C.algo;\r\n\t\tvar SHA1 = C_algo.SHA1;\r\n\t\tvar HMAC = C_algo.HMAC;\r\n\r\n\t\t/**\r\n\t\t * Password-Based Key Derivation Function 2 algorithm.\r\n\t\t */\r\n\t\tvar PBKDF2 = C_algo.PBKDF2 = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\r\n\t\t\t * @property {Hasher} hasher The hasher to use. Default: SHA1\r\n\t\t\t * @property {number} iterations The number of iterations to perform. Default: 1\r\n\t\t\t */\r\n\t\t\tcfg: Base.extend({\r\n\t\t\t\tkeySize: 128 / 32,\r\n\t\t\t\thasher: SHA1,\r\n\t\t\t\titerations: 1\r\n\t\t\t}),\r\n\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created key derivation function.\r\n\t\t\t *\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var kdf = CryptoJS.algo.PBKDF2.create();\r\n\t\t\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\r\n\t\t\t * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\r\n\t\t\t */\r\n\t\t\tinit: function(cfg) {\r\n\t\t\t\tthis.cfg = this.cfg.extend(cfg);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Computes the Password-Based Key Derivation Function 2.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} password The password.\r\n\t\t\t * @param {WordArray|string} salt A salt.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The derived key.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var key = kdf.compute(password, salt);\r\n\t\t\t */\r\n\t\t\tcompute: function(password, salt) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar cfg = this.cfg;\r\n\r\n\t\t\t\t// Init HMAC\r\n\t\t\t\tvar hmac = HMAC.create(cfg.hasher, password);\r\n\r\n\t\t\t\t// Initial values\r\n\t\t\t\tvar derivedKey = WordArray.create();\r\n\t\t\t\tvar blockIndex = WordArray.create([0x00000001]);\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar derivedKeyWords = derivedKey.words;\r\n\t\t\t\tvar blockIndexWords = blockIndex.words;\r\n\t\t\t\tvar keySize = cfg.keySize;\r\n\t\t\t\tvar iterations = cfg.iterations;\r\n\r\n\t\t\t\t// Generate key\r\n\t\t\t\twhile (derivedKeyWords.length < keySize) {\r\n\t\t\t\t\tvar block = hmac.update(salt).finalize(blockIndex);\r\n\t\t\t\t\thmac.reset();\r\n\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar blockWords = block.words;\r\n\t\t\t\t\tvar blockWordsLength = blockWords.length;\r\n\r\n\t\t\t\t\t// Iterations\r\n\t\t\t\t\tvar intermediate = block;\r\n\t\t\t\t\tfor (var i = 1; i < iterations; i++) {\r\n\t\t\t\t\t\tintermediate = hmac.finalize(intermediate);\r\n\t\t\t\t\t\thmac.reset();\r\n\r\n\t\t\t\t\t\t// Shortcut\r\n\t\t\t\t\t\tvar intermediateWords = intermediate.words;\r\n\r\n\t\t\t\t\t\t// XOR intermediate with block\r\n\t\t\t\t\t\tfor (var j = 0; j < blockWordsLength; j++) {\r\n\t\t\t\t\t\t\tblockWords[j] ^= intermediateWords[j];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tderivedKey.concat(block);\r\n\t\t\t\t\tblockIndexWords[0]++;\r\n\t\t\t\t}\r\n\t\t\t\tderivedKey.sigBytes = keySize * 4;\r\n\r\n\t\t\t\treturn derivedKey;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Computes the Password-Based Key Derivation Function 2.\r\n\t\t *\r\n\t\t * @param {WordArray|string} password The password.\r\n\t\t * @param {WordArray|string} salt A salt.\r\n\t\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\r\n\t\t *\r\n\t\t * @return {WordArray} The derived key.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var key = CryptoJS.PBKDF2(password, salt);\r\n\t\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\r\n\t\t * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\r\n\t\t */\r\n\t\tC.PBKDF2 = function(password, salt, cfg) {\r\n\t\t\treturn PBKDF2.create(cfg).compute(password, salt);\r\n\t\t};\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar Base = C_lib.Base;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar C_algo = C.algo;\r\n\t\tvar MD5 = C_algo.MD5;\r\n\r\n\t\t/**\r\n\t\t * This key derivation function is meant to conform with EVP_BytesToKey.\r\n\t\t * www.openssl.org/docs/crypto/EVP_BytesToKey.html\r\n\t\t */\r\n\t\tvar EvpKDF = C_algo.EvpKDF = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\r\n\t\t\t * @property {Hasher} hasher The hash algorithm to use. Default: MD5\r\n\t\t\t * @property {number} iterations The number of iterations to perform. Default: 1\r\n\t\t\t */\r\n\t\t\tcfg: Base.extend({\r\n\t\t\t\tkeySize: 128 / 32,\r\n\t\t\t\thasher: MD5,\r\n\t\t\t\titerations: 1\r\n\t\t\t}),\r\n\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created key derivation function.\r\n\t\t\t *\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var kdf = CryptoJS.algo.EvpKDF.create();\r\n\t\t\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\r\n\t\t\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\r\n\t\t\t */\r\n\t\t\tinit: function(cfg) {\r\n\t\t\t\tthis.cfg = this.cfg.extend(cfg);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Derives a key from a password.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} password The password.\r\n\t\t\t * @param {WordArray|string} salt A salt.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The derived key.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var key = kdf.compute(password, salt);\r\n\t\t\t */\r\n\t\t\tcompute: function(password, salt) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar cfg = this.cfg;\r\n\r\n\t\t\t\t// Init hasher\r\n\t\t\t\tvar hasher = cfg.hasher.create();\r\n\r\n\t\t\t\t// Initial values\r\n\t\t\t\tvar derivedKey = WordArray.create();\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar derivedKeyWords = derivedKey.words;\r\n\t\t\t\tvar keySize = cfg.keySize;\r\n\t\t\t\tvar iterations = cfg.iterations;\r\n\r\n\t\t\t\t// Generate key\r\n\t\t\t\twhile (derivedKeyWords.length < keySize) {\r\n\t\t\t\t\tif (block) {\r\n\t\t\t\t\t\thasher.update(block);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar block = hasher.update(password).finalize(salt);\r\n\t\t\t\t\thasher.reset();\r\n\r\n\t\t\t\t\t// Iterations\r\n\t\t\t\t\tfor (var i = 1; i < iterations; i++) {\r\n\t\t\t\t\t\tblock = hasher.finalize(block);\r\n\t\t\t\t\t\thasher.reset();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tderivedKey.concat(block);\r\n\t\t\t\t}\r\n\t\t\t\tderivedKey.sigBytes = keySize * 4;\r\n\r\n\t\t\t\treturn derivedKey;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Derives a key from a password.\r\n\t\t *\r\n\t\t * @param {WordArray|string} password The password.\r\n\t\t * @param {WordArray|string} salt A salt.\r\n\t\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\r\n\t\t *\r\n\t\t * @return {WordArray} The derived key.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var key = CryptoJS.EvpKDF(password, salt);\r\n\t\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\r\n\t\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\r\n\t\t */\r\n\t\tC.EvpKDF = function(password, salt, cfg) {\r\n\t\t\treturn EvpKDF.create(cfg).compute(password, salt);\r\n\t\t};\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar C_algo = C.algo;\r\n\t\tvar SHA256 = C_algo.SHA256;\r\n\r\n\t\t/**\r\n\t\t * SHA-224 hash algorithm.\r\n\t\t */\r\n\t\tvar SHA224 = C_algo.SHA224 = SHA256.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tthis._hash = new WordArray.init([\r\n\t\t\t\t\t0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\r\n\t\t\t\t\t0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\r\n\t\t\t\t]);\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\tvar hash = SHA256._doFinalize.call(this);\r\n\r\n\t\t\t\thash.sigBytes -= 4;\r\n\r\n\t\t\t\treturn hash;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.SHA224('message');\r\n\t\t * var hash = CryptoJS.SHA224(wordArray);\r\n\t\t */\r\n\t\tC.SHA224 = SHA256._createHelper(SHA224);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacSHA224(message, key);\r\n\t\t */\r\n\t\tC.HmacSHA224 = SHA256._createHmacHelper(SHA224);\r\n\t}());\r\n\r\n\r\n\t(function(undefined) {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar Base = C_lib.Base;\r\n\t\tvar X32WordArray = C_lib.WordArray;\r\n\r\n\t\t/**\r\n\t\t * x64 namespace.\r\n\t\t */\r\n\t\tvar C_x64 = C.x64 = {};\r\n\r\n\t\t/**\r\n\t\t * A 64-bit word.\r\n\t\t */\r\n\t\tvar X64Word = C_x64.Word = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created 64-bit word.\r\n\t\t\t *\r\n\t\t\t * @param {number} high The high 32 bits.\r\n\t\t\t * @param {number} low The low 32 bits.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\r\n\t\t\t */\r\n\t\t\tinit: function(high, low) {\r\n\t\t\t\tthis.high = high;\r\n\t\t\t\tthis.low = low;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * Bitwise NOTs this word.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after negating.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var negated = x64Word.not();\r\n\t\t\t */\r\n\t\t\t// not: function () {\r\n\t\t\t// var high = ~this.high;\r\n\t\t\t// var low = ~this.low;\r\n\r\n\t\t\t// return X64Word.create(high, low);\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Bitwise ANDs this word with the passed word.\r\n\t\t\t *\r\n\t\t\t * @param {X64Word} word The x64-Word to AND with this word.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after ANDing.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var anded = x64Word.and(anotherX64Word);\r\n\t\t\t */\r\n\t\t\t// and: function (word) {\r\n\t\t\t// var high = this.high & word.high;\r\n\t\t\t// var low = this.low & word.low;\r\n\r\n\t\t\t// return X64Word.create(high, low);\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Bitwise ORs this word with the passed word.\r\n\t\t\t *\r\n\t\t\t * @param {X64Word} word The x64-Word to OR with this word.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after ORing.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var ored = x64Word.or(anotherX64Word);\r\n\t\t\t */\r\n\t\t\t// or: function (word) {\r\n\t\t\t// var high = this.high | word.high;\r\n\t\t\t// var low = this.low | word.low;\r\n\r\n\t\t\t// return X64Word.create(high, low);\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Bitwise XORs this word with the passed word.\r\n\t\t\t *\r\n\t\t\t * @param {X64Word} word The x64-Word to XOR with this word.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after XORing.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var xored = x64Word.xor(anotherX64Word);\r\n\t\t\t */\r\n\t\t\t// xor: function (word) {\r\n\t\t\t// var high = this.high ^ word.high;\r\n\t\t\t// var low = this.low ^ word.low;\r\n\r\n\t\t\t// return X64Word.create(high, low);\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Shifts this word n bits to the left.\r\n\t\t\t *\r\n\t\t\t * @param {number} n The number of bits to shift.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after shifting.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var shifted = x64Word.shiftL(25);\r\n\t\t\t */\r\n\t\t\t// shiftL: function (n) {\r\n\t\t\t// if (n < 32) {\r\n\t\t\t// var high = (this.high << n) | (this.low >>> (32 - n));\r\n\t\t\t// var low = this.low << n;\r\n\t\t\t// } else {\r\n\t\t\t// var high = this.low << (n - 32);\r\n\t\t\t// var low = 0;\r\n\t\t\t// }\r\n\r\n\t\t\t// return X64Word.create(high, low);\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Shifts this word n bits to the right.\r\n\t\t\t *\r\n\t\t\t * @param {number} n The number of bits to shift.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after shifting.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var shifted = x64Word.shiftR(7);\r\n\t\t\t */\r\n\t\t\t// shiftR: function (n) {\r\n\t\t\t// if (n < 32) {\r\n\t\t\t// var low = (this.low >>> n) | (this.high << (32 - n));\r\n\t\t\t// var high = this.high >>> n;\r\n\t\t\t// } else {\r\n\t\t\t// var low = this.high >>> (n - 32);\r\n\t\t\t// var high = 0;\r\n\t\t\t// }\r\n\r\n\t\t\t// return X64Word.create(high, low);\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Rotates this word n bits to the left.\r\n\t\t\t *\r\n\t\t\t * @param {number} n The number of bits to rotate.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after rotating.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var rotated = x64Word.rotL(25);\r\n\t\t\t */\r\n\t\t\t// rotL: function (n) {\r\n\t\t\t// return this.shiftL(n).or(this.shiftR(64 - n));\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Rotates this word n bits to the right.\r\n\t\t\t *\r\n\t\t\t * @param {number} n The number of bits to rotate.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after rotating.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var rotated = x64Word.rotR(7);\r\n\t\t\t */\r\n\t\t\t// rotR: function (n) {\r\n\t\t\t// return this.shiftR(n).or(this.shiftL(64 - n));\r\n\t\t\t// },\r\n\r\n\t\t\t/**\r\n\t\t\t * Adds this word with the passed word.\r\n\t\t\t *\r\n\t\t\t * @param {X64Word} word The x64-Word to add with this word.\r\n\t\t\t *\r\n\t\t\t * @return {X64Word} A new x64-Word object after adding.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var added = x64Word.add(anotherX64Word);\r\n\t\t\t */\r\n\t\t\t// add: function (word) {\r\n\t\t\t// var low = (this.low + word.low) | 0;\r\n\t\t\t// var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\r\n\t\t\t// var high = (this.high + word.high + carry) | 0;\r\n\r\n\t\t\t// return X64Word.create(high, low);\r\n\t\t\t// }\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * An array of 64-bit words.\r\n\t\t *\r\n\t\t * @property {Array} words The array of CryptoJS.x64.Word objects.\r\n\t\t * @property {number} sigBytes The number of significant bytes in this word array.\r\n\t\t */\r\n\t\tvar X64WordArray = C_x64.WordArray = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created word array.\r\n\t\t\t *\r\n\t\t\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\r\n\t\t\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.x64.WordArray.create();\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.x64.WordArray.create([\r\n\t\t\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n\t\t\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n\t\t\t * ]);\r\n\t\t\t *\r\n\t\t\t * var wordArray = CryptoJS.x64.WordArray.create([\r\n\t\t\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n\t\t\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n\t\t\t * ], 10);\r\n\t\t\t */\r\n\t\t\tinit: function(words, sigBytes) {\r\n\t\t\t\twords = this.words = words || [];\r\n\r\n\t\t\t\tif (sigBytes != undefined) {\r\n\t\t\t\t\tthis.sigBytes = sigBytes;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.sigBytes = words.length * 8;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts this 64-bit word array to a 32-bit word array.\r\n\t\t\t *\r\n\t\t\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var x32WordArray = x64WordArray.toX32();\r\n\t\t\t */\r\n\t\t\ttoX32: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar x64Words = this.words;\r\n\t\t\t\tvar x64WordsLength = x64Words.length;\r\n\r\n\t\t\t\t// Convert\r\n\t\t\t\tvar x32Words = [];\r\n\t\t\t\tfor (var i = 0; i < x64WordsLength; i++) {\r\n\t\t\t\t\tvar x64Word = x64Words[i];\r\n\t\t\t\t\tx32Words.push(x64Word.high);\r\n\t\t\t\t\tx32Words.push(x64Word.low);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn X32WordArray.create(x32Words, this.sigBytes);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates a copy of this word array.\r\n\t\t\t *\r\n\t\t\t * @return {X64WordArray} The clone.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var clone = x64WordArray.clone();\r\n\t\t\t */\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Base.clone.call(this);\r\n\r\n\t\t\t\t// Clone \"words\" array\r\n\t\t\t\tvar words = clone.words = this.words.slice(0);\r\n\r\n\t\t\t\t// Clone each X64Word object\r\n\t\t\t\tvar wordsLength = words.length;\r\n\t\t\t\tfor (var i = 0; i < wordsLength; i++) {\r\n\t\t\t\t\twords[i] = words[i].clone();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t}\r\n\t\t});\r\n\t}());\r\n\r\n\r\n\t(function(Math) {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar Hasher = C_lib.Hasher;\r\n\t\tvar C_x64 = C.x64;\r\n\t\tvar X64Word = C_x64.Word;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Constants tables\r\n\t\tvar RHO_OFFSETS = [];\r\n\t\tvar PI_INDEXES = [];\r\n\t\tvar ROUND_CONSTANTS = [];\r\n\r\n\t\t// Compute Constants\r\n\t\t(function() {\r\n\t\t\t// Compute rho offset constants\r\n\t\t\tvar x = 1,\r\n\t\t\t\ty = 0;\r\n\t\t\tfor (var t = 0; t < 24; t++) {\r\n\t\t\t\tRHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\r\n\r\n\t\t\t\tvar newX = y % 5;\r\n\t\t\t\tvar newY = (2 * x + 3 * y) % 5;\r\n\t\t\t\tx = newX;\r\n\t\t\t\ty = newY;\r\n\t\t\t}\r\n\r\n\t\t\t// Compute pi index constants\r\n\t\t\tfor (var x = 0; x < 5; x++) {\r\n\t\t\t\tfor (var y = 0; y < 5; y++) {\r\n\t\t\t\t\tPI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Compute round constants\r\n\t\t\tvar LFSR = 0x01;\r\n\t\t\tfor (var i = 0; i < 24; i++) {\r\n\t\t\t\tvar roundConstantMsw = 0;\r\n\t\t\t\tvar roundConstantLsw = 0;\r\n\r\n\t\t\t\tfor (var j = 0; j < 7; j++) {\r\n\t\t\t\t\tif (LFSR & 0x01) {\r\n\t\t\t\t\t\tvar bitPosition = (1 << j) - 1;\r\n\t\t\t\t\t\tif (bitPosition < 32) {\r\n\t\t\t\t\t\t\troundConstantLsw ^= 1 << bitPosition;\r\n\t\t\t\t\t\t} else /* if (bitPosition >= 32) */ {\r\n\t\t\t\t\t\t\troundConstantMsw ^= 1 << (bitPosition - 32);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Compute next LFSR\r\n\t\t\t\t\tif (LFSR & 0x80) {\r\n\t\t\t\t\t\t// Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\r\n\t\t\t\t\t\tLFSR = (LFSR << 1) ^ 0x71;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tLFSR <<= 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\r\n\t\t\t}\r\n\t\t}());\r\n\r\n\t\t// Reusable objects for temporary values\r\n\t\tvar T = [];\r\n\t\t(function() {\r\n\t\t\tfor (var i = 0; i < 25; i++) {\r\n\t\t\t\tT[i] = X64Word.create();\r\n\t\t\t}\r\n\t\t}());\r\n\r\n\t\t/**\r\n\t\t * SHA-3 hash algorithm.\r\n\t\t */\r\n\t\tvar SHA3 = C_algo.SHA3 = Hasher.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {number} outputLength\r\n\t\t\t * The desired number of bits in the output hash.\r\n\t\t\t * Only values permitted are: 224, 256, 384, 512.\r\n\t\t\t * Default: 512\r\n\t\t\t */\r\n\t\t\tcfg: Hasher.cfg.extend({\r\n\t\t\t\toutputLength: 512\r\n\t\t\t}),\r\n\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tvar state = this._state = []\r\n\t\t\t\tfor (var i = 0; i < 25; i++) {\r\n\t\t\t\t\tstate[i] = new X64Word.init();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar state = this._state;\r\n\t\t\t\tvar nBlockSizeLanes = this.blockSize / 2;\r\n\r\n\t\t\t\t// Absorb\r\n\t\t\t\tfor (var i = 0; i < nBlockSizeLanes; i++) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar M2i = M[offset + 2 * i];\r\n\t\t\t\t\tvar M2i1 = M[offset + 2 * i + 1];\r\n\r\n\t\t\t\t\t// Swap endian\r\n\t\t\t\t\tM2i = (\r\n\t\t\t\t\t\t(((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)\r\n\t\t\t\t\t);\r\n\t\t\t\t\tM2i1 = (\r\n\t\t\t\t\t\t(((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\t// Absorb message into state\r\n\t\t\t\t\tvar lane = state[i];\r\n\t\t\t\t\tlane.high ^= M2i1;\r\n\t\t\t\t\tlane.low ^= M2i;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Rounds\r\n\t\t\t\tfor (var round = 0; round < 24; round++) {\r\n\t\t\t\t\t// Theta\r\n\t\t\t\t\tfor (var x = 0; x < 5; x++) {\r\n\t\t\t\t\t\t// Mix column lanes\r\n\t\t\t\t\t\tvar tMsw = 0,\r\n\t\t\t\t\t\t\ttLsw = 0;\r\n\t\t\t\t\t\tfor (var y = 0; y < 5; y++) {\r\n\t\t\t\t\t\t\tvar lane = state[x + 5 * y];\r\n\t\t\t\t\t\t\ttMsw ^= lane.high;\r\n\t\t\t\t\t\t\ttLsw ^= lane.low;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Temporary values\r\n\t\t\t\t\t\tvar Tx = T[x];\r\n\t\t\t\t\t\tTx.high = tMsw;\r\n\t\t\t\t\t\tTx.low = tLsw;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (var x = 0; x < 5; x++) {\r\n\t\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\t\tvar Tx4 = T[(x + 4) % 5];\r\n\t\t\t\t\t\tvar Tx1 = T[(x + 1) % 5];\r\n\t\t\t\t\t\tvar Tx1Msw = Tx1.high;\r\n\t\t\t\t\t\tvar Tx1Lsw = Tx1.low;\r\n\r\n\t\t\t\t\t\t// Mix surrounding columns\r\n\t\t\t\t\t\tvar tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\r\n\t\t\t\t\t\tvar tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\r\n\t\t\t\t\t\tfor (var y = 0; y < 5; y++) {\r\n\t\t\t\t\t\t\tvar lane = state[x + 5 * y];\r\n\t\t\t\t\t\t\tlane.high ^= tMsw;\r\n\t\t\t\t\t\t\tlane.low ^= tLsw;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Rho Pi\r\n\t\t\t\t\tfor (var laneIndex = 1; laneIndex < 25; laneIndex++) {\r\n\t\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\t\tvar lane = state[laneIndex];\r\n\t\t\t\t\t\tvar laneMsw = lane.high;\r\n\t\t\t\t\t\tvar laneLsw = lane.low;\r\n\t\t\t\t\t\tvar rhoOffset = RHO_OFFSETS[laneIndex];\r\n\r\n\t\t\t\t\t\t// Rotate lanes\r\n\t\t\t\t\t\tif (rhoOffset < 32) {\r\n\t\t\t\t\t\t\tvar tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\r\n\t\t\t\t\t\t\tvar tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\r\n\t\t\t\t\t\t} else /* if (rhoOffset >= 32) */ {\r\n\t\t\t\t\t\t\tvar tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 -\r\n\t\t\t\t\t\t\t\trhoOffset));\r\n\t\t\t\t\t\t\tvar tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 -\r\n\t\t\t\t\t\t\t\trhoOffset));\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Transpose lanes\r\n\t\t\t\t\t\tvar TPiLane = T[PI_INDEXES[laneIndex]];\r\n\t\t\t\t\t\tTPiLane.high = tMsw;\r\n\t\t\t\t\t\tTPiLane.low = tLsw;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Rho pi at x = y = 0\r\n\t\t\t\t\tvar T0 = T[0];\r\n\t\t\t\t\tvar state0 = state[0];\r\n\t\t\t\t\tT0.high = state0.high;\r\n\t\t\t\t\tT0.low = state0.low;\r\n\r\n\t\t\t\t\t// Chi\r\n\t\t\t\t\tfor (var x = 0; x < 5; x++) {\r\n\t\t\t\t\t\tfor (var y = 0; y < 5; y++) {\r\n\t\t\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\t\t\tvar laneIndex = x + 5 * y;\r\n\t\t\t\t\t\t\tvar lane = state[laneIndex];\r\n\t\t\t\t\t\t\tvar TLane = T[laneIndex];\r\n\t\t\t\t\t\t\tvar Tx1Lane = T[((x + 1) % 5) + 5 * y];\r\n\t\t\t\t\t\t\tvar Tx2Lane = T[((x + 2) % 5) + 5 * y];\r\n\r\n\t\t\t\t\t\t\t// Mix rows\r\n\t\t\t\t\t\t\tlane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\r\n\t\t\t\t\t\t\tlane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Iota\r\n\t\t\t\t\tvar lane = state[0];\r\n\t\t\t\t\tvar roundConstant = ROUND_CONSTANTS[round];\r\n\t\t\t\t\tlane.high ^= roundConstant.high;\r\n\t\t\t\t\tlane.low ^= roundConstant.low;;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar data = this._data;\r\n\t\t\t\tvar dataWords = data.words;\r\n\t\t\t\tvar nBitsTotal = this._nDataBytes * 8;\r\n\t\t\t\tvar nBitsLeft = data.sigBytes * 8;\r\n\t\t\t\tvar blockSizeBits = this.blockSize * 32;\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tdataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\r\n\t\t\t\tdataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) -\r\n\t\t\t\t\t1] |= 0x80;\r\n\t\t\t\tdata.sigBytes = dataWords.length * 4;\r\n\r\n\t\t\t\t// Hash final blocks\r\n\t\t\t\tthis._process();\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar state = this._state;\r\n\t\t\t\tvar outputLengthBytes = this.cfg.outputLength / 8;\r\n\t\t\t\tvar outputLengthLanes = outputLengthBytes / 8;\r\n\r\n\t\t\t\t// Squeeze\r\n\t\t\t\tvar hashWords = [];\r\n\t\t\t\tfor (var i = 0; i < outputLengthLanes; i++) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar lane = state[i];\r\n\t\t\t\t\tvar laneMsw = lane.high;\r\n\t\t\t\t\tvar laneLsw = lane.low;\r\n\r\n\t\t\t\t\t// Swap endian\r\n\t\t\t\t\tlaneMsw = (\r\n\t\t\t\t\t\t(((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)\r\n\t\t\t\t\t);\r\n\t\t\t\t\tlaneLsw = (\r\n\t\t\t\t\t\t(((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\t// Squeeze state to retrieve hash\r\n\t\t\t\t\thashWords.push(laneLsw);\r\n\t\t\t\t\thashWords.push(laneMsw);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Return final computed hash\r\n\t\t\t\treturn new WordArray.init(hashWords, outputLengthBytes);\r\n\t\t\t},\r\n\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Hasher.clone.call(this);\r\n\r\n\t\t\t\tvar state = clone._state = this._state.slice(0);\r\n\t\t\t\tfor (var i = 0; i < 25; i++) {\r\n\t\t\t\t\tstate[i] = state[i].clone();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.SHA3('message');\r\n\t\t * var hash = CryptoJS.SHA3(wordArray);\r\n\t\t */\r\n\t\tC.SHA3 = Hasher._createHelper(SHA3);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacSHA3(message, key);\r\n\t\t */\r\n\t\tC.HmacSHA3 = Hasher._createHmacHelper(SHA3);\r\n\t}(Math));\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar Hasher = C_lib.Hasher;\r\n\t\tvar C_x64 = C.x64;\r\n\t\tvar X64Word = C_x64.Word;\r\n\t\tvar X64WordArray = C_x64.WordArray;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\tfunction X64Word_create() {\r\n\t\t\treturn X64Word.create.apply(X64Word, arguments);\r\n\t\t}\r\n\r\n\t\t// Constants\r\n\t\tvar K = [\r\n\t\t\tX64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\r\n\t\t\tX64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\r\n\t\t\tX64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\r\n\t\t\tX64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\r\n\t\t\tX64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\r\n\t\t\tX64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\r\n\t\t\tX64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\r\n\t\t\tX64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\r\n\t\t\tX64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\r\n\t\t\tX64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\r\n\t\t\tX64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\r\n\t\t\tX64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\r\n\t\t\tX64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\r\n\t\t\tX64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\r\n\t\t\tX64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\r\n\t\t\tX64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\r\n\t\t\tX64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\r\n\t\t\tX64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\r\n\t\t\tX64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\r\n\t\t\tX64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\r\n\t\t\tX64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\r\n\t\t\tX64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\r\n\t\t\tX64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\r\n\t\t\tX64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\r\n\t\t\tX64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\r\n\t\t\tX64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\r\n\t\t\tX64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\r\n\t\t\tX64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\r\n\t\t\tX64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\r\n\t\t\tX64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\r\n\t\t\tX64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\r\n\t\t\tX64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\r\n\t\t\tX64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\r\n\t\t\tX64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\r\n\t\t\tX64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\r\n\t\t\tX64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\r\n\t\t\tX64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\r\n\t\t\tX64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\r\n\t\t\tX64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\r\n\t\t\tX64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\r\n\t\t];\r\n\r\n\t\t// Reusable objects\r\n\t\tvar W = [];\r\n\t\t(function() {\r\n\t\t\tfor (var i = 0; i < 80; i++) {\r\n\t\t\t\tW[i] = X64Word_create();\r\n\t\t\t}\r\n\t\t}());\r\n\r\n\t\t/**\r\n\t\t * SHA-512 hash algorithm.\r\n\t\t */\r\n\t\tvar SHA512 = C_algo.SHA512 = Hasher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tthis._hash = new X64WordArray.init([\r\n\t\t\t\t\tnew X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(\r\n\t\t\t\t\t\t0xbb67ae85, 0x84caa73b),\r\n\t\t\t\t\tnew X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(\r\n\t\t\t\t\t\t0xa54ff53a, 0x5f1d36f1),\r\n\t\t\t\t\tnew X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(\r\n\t\t\t\t\t\t0x9b05688c, 0x2b3e6c1f),\r\n\t\t\t\t\tnew X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(\r\n\t\t\t\t\t\t0x5be0cd19, 0x137e2179)\r\n\t\t\t\t]);\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar H = this._hash.words;\r\n\r\n\t\t\t\tvar H0 = H[0];\r\n\t\t\t\tvar H1 = H[1];\r\n\t\t\t\tvar H2 = H[2];\r\n\t\t\t\tvar H3 = H[3];\r\n\t\t\t\tvar H4 = H[4];\r\n\t\t\t\tvar H5 = H[5];\r\n\t\t\t\tvar H6 = H[6];\r\n\t\t\t\tvar H7 = H[7];\r\n\r\n\t\t\t\tvar H0h = H0.high;\r\n\t\t\t\tvar H0l = H0.low;\r\n\t\t\t\tvar H1h = H1.high;\r\n\t\t\t\tvar H1l = H1.low;\r\n\t\t\t\tvar H2h = H2.high;\r\n\t\t\t\tvar H2l = H2.low;\r\n\t\t\t\tvar H3h = H3.high;\r\n\t\t\t\tvar H3l = H3.low;\r\n\t\t\t\tvar H4h = H4.high;\r\n\t\t\t\tvar H4l = H4.low;\r\n\t\t\t\tvar H5h = H5.high;\r\n\t\t\t\tvar H5l = H5.low;\r\n\t\t\t\tvar H6h = H6.high;\r\n\t\t\t\tvar H6l = H6.low;\r\n\t\t\t\tvar H7h = H7.high;\r\n\t\t\t\tvar H7l = H7.low;\r\n\r\n\t\t\t\t// Working variables\r\n\t\t\t\tvar ah = H0h;\r\n\t\t\t\tvar al = H0l;\r\n\t\t\t\tvar bh = H1h;\r\n\t\t\t\tvar bl = H1l;\r\n\t\t\t\tvar ch = H2h;\r\n\t\t\t\tvar cl = H2l;\r\n\t\t\t\tvar dh = H3h;\r\n\t\t\t\tvar dl = H3l;\r\n\t\t\t\tvar eh = H4h;\r\n\t\t\t\tvar el = H4l;\r\n\t\t\t\tvar fh = H5h;\r\n\t\t\t\tvar fl = H5l;\r\n\t\t\t\tvar gh = H6h;\r\n\t\t\t\tvar gl = H6l;\r\n\t\t\t\tvar hh = H7h;\r\n\t\t\t\tvar hl = H7l;\r\n\r\n\t\t\t\t// Rounds\r\n\t\t\t\tfor (var i = 0; i < 80; i++) {\r\n\t\t\t\t\t// Shortcut\r\n\t\t\t\t\tvar Wi = W[i];\r\n\r\n\t\t\t\t\t// Extend message\r\n\t\t\t\t\tif (i < 16) {\r\n\t\t\t\t\t\tvar Wih = Wi.high = M[offset + i * 2] | 0;\r\n\t\t\t\t\t\tvar Wil = Wi.low = M[offset + i * 2 + 1] | 0;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// Gamma0\r\n\t\t\t\t\t\tvar gamma0x = W[i - 15];\r\n\t\t\t\t\t\tvar gamma0xh = gamma0x.high;\r\n\t\t\t\t\t\tvar gamma0xl = gamma0x.low;\r\n\t\t\t\t\t\tvar gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>>\r\n\t\t\t\t\t\t\t8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\r\n\t\t\t\t\t\tvar gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>>\r\n\t\t\t\t\t\t\t8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\r\n\r\n\t\t\t\t\t\t// Gamma1\r\n\t\t\t\t\t\tvar gamma1x = W[i - 2];\r\n\t\t\t\t\t\tvar gamma1xh = gamma1x.high;\r\n\t\t\t\t\t\tvar gamma1xl = gamma1x.low;\r\n\t\t\t\t\t\tvar gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh <<\r\n\t\t\t\t\t\t\t3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\r\n\t\t\t\t\t\tvar gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl <<\r\n\t\t\t\t\t\t\t3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\r\n\r\n\t\t\t\t\t\t// W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\r\n\t\t\t\t\t\tvar Wi7 = W[i - 7];\r\n\t\t\t\t\t\tvar Wi7h = Wi7.high;\r\n\t\t\t\t\t\tvar Wi7l = Wi7.low;\r\n\r\n\t\t\t\t\t\tvar Wi16 = W[i - 16];\r\n\t\t\t\t\t\tvar Wi16h = Wi16.high;\r\n\t\t\t\t\t\tvar Wi16l = Wi16.low;\r\n\r\n\t\t\t\t\t\tvar Wil = gamma0l + Wi7l;\r\n\t\t\t\t\t\tvar Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\r\n\t\t\t\t\t\tvar Wil = Wil + gamma1l;\r\n\t\t\t\t\t\tvar Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\r\n\t\t\t\t\t\tvar Wil = Wil + Wi16l;\r\n\t\t\t\t\t\tvar Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\r\n\r\n\t\t\t\t\t\tWi.high = Wih;\r\n\t\t\t\t\t\tWi.low = Wil;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar chh = (eh & fh) ^ (~eh & gh);\r\n\t\t\t\t\tvar chl = (el & fl) ^ (~el & gl);\r\n\t\t\t\t\tvar majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\r\n\t\t\t\t\tvar majl = (al & bl) ^ (al & cl) ^ (bl & cl);\r\n\r\n\t\t\t\t\tvar sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((\r\n\t\t\t\t\t\tah << 25) | (al >>> 7));\r\n\t\t\t\t\tvar sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((\r\n\t\t\t\t\t\tal << 25) | (ah >>> 7));\r\n\t\t\t\t\tvar sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((\r\n\t\t\t\t\t\teh << 23) | (el >>> 9));\r\n\t\t\t\t\tvar sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((\r\n\t\t\t\t\t\tel << 23) | (eh >>> 9));\r\n\r\n\t\t\t\t\t// t1 = h + sigma1 + ch + K[i] + W[i]\r\n\t\t\t\t\tvar Ki = K[i];\r\n\t\t\t\t\tvar Kih = Ki.high;\r\n\t\t\t\t\tvar Kil = Ki.low;\r\n\r\n\t\t\t\t\tvar t1l = hl + sigma1l;\r\n\t\t\t\t\tvar t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\r\n\t\t\t\t\tvar t1l = t1l + chl;\r\n\t\t\t\t\tvar t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\r\n\t\t\t\t\tvar t1l = t1l + Kil;\r\n\t\t\t\t\tvar t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\r\n\t\t\t\t\tvar t1l = t1l + Wil;\r\n\t\t\t\t\tvar t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\r\n\r\n\t\t\t\t\t// t2 = sigma0 + maj\r\n\t\t\t\t\tvar t2l = sigma0l + majl;\r\n\t\t\t\t\tvar t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\r\n\r\n\t\t\t\t\t// Update working variables\r\n\t\t\t\t\thh = gh;\r\n\t\t\t\t\thl = gl;\r\n\t\t\t\t\tgh = fh;\r\n\t\t\t\t\tgl = fl;\r\n\t\t\t\t\tfh = eh;\r\n\t\t\t\t\tfl = el;\r\n\t\t\t\t\tel = (dl + t1l) | 0;\r\n\t\t\t\t\teh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\r\n\t\t\t\t\tdh = ch;\r\n\t\t\t\t\tdl = cl;\r\n\t\t\t\t\tch = bh;\r\n\t\t\t\t\tcl = bl;\r\n\t\t\t\t\tbh = ah;\r\n\t\t\t\t\tbl = al;\r\n\t\t\t\t\tal = (t1l + t2l) | 0;\r\n\t\t\t\t\tah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Intermediate hash value\r\n\t\t\t\tH0l = H0.low = (H0l + al);\r\n\t\t\t\tH0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\r\n\t\t\t\tH1l = H1.low = (H1l + bl);\r\n\t\t\t\tH1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\r\n\t\t\t\tH2l = H2.low = (H2l + cl);\r\n\t\t\t\tH2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\r\n\t\t\t\tH3l = H3.low = (H3l + dl);\r\n\t\t\t\tH3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\r\n\t\t\t\tH4l = H4.low = (H4l + el);\r\n\t\t\t\tH4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\r\n\t\t\t\tH5l = H5.low = (H5l + fl);\r\n\t\t\t\tH5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\r\n\t\t\t\tH6l = H6.low = (H6l + gl);\r\n\t\t\t\tH6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\r\n\t\t\t\tH7l = H7.low = (H7l + hl);\r\n\t\t\t\tH7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar data = this._data;\r\n\t\t\t\tvar dataWords = data.words;\r\n\r\n\t\t\t\tvar nBitsTotal = this._nDataBytes * 8;\r\n\t\t\t\tvar nBitsLeft = data.sigBytes * 8;\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tdataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n\t\t\t\tdataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal /\r\n\t\t\t\t\t0x100000000);\r\n\t\t\t\tdataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\r\n\t\t\t\tdata.sigBytes = dataWords.length * 4;\r\n\r\n\t\t\t\t// Hash final blocks\r\n\t\t\t\tthis._process();\r\n\r\n\t\t\t\t// Convert hash to 32-bit word array before returning\r\n\t\t\t\tvar hash = this._hash.toX32();\r\n\r\n\t\t\t\t// Return final computed hash\r\n\t\t\t\treturn hash;\r\n\t\t\t},\r\n\r\n\t\t\tclone: function() {\r\n\t\t\t\tvar clone = Hasher.clone.call(this);\r\n\t\t\t\tclone._hash = this._hash.clone();\r\n\r\n\t\t\t\treturn clone;\r\n\t\t\t},\r\n\r\n\t\t\tblockSize: 1024 / 32\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.SHA512('message');\r\n\t\t * var hash = CryptoJS.SHA512(wordArray);\r\n\t\t */\r\n\t\tC.SHA512 = Hasher._createHelper(SHA512);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacSHA512(message, key);\r\n\t\t */\r\n\t\tC.HmacSHA512 = Hasher._createHmacHelper(SHA512);\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_x64 = C.x64;\r\n\t\tvar X64Word = C_x64.Word;\r\n\t\tvar X64WordArray = C_x64.WordArray;\r\n\t\tvar C_algo = C.algo;\r\n\t\tvar SHA512 = C_algo.SHA512;\r\n\r\n\t\t/**\r\n\t\t * SHA-384 hash algorithm.\r\n\t\t */\r\n\t\tvar SHA384 = C_algo.SHA384 = SHA512.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tthis._hash = new X64WordArray.init([\r\n\t\t\t\t\tnew X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(\r\n\t\t\t\t\t\t0x629a292a, 0x367cd507),\r\n\t\t\t\t\tnew X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(\r\n\t\t\t\t\t\t0x152fecd8, 0xf70e5939),\r\n\t\t\t\t\tnew X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(\r\n\t\t\t\t\t\t0x8eb44a87, 0x68581511),\r\n\t\t\t\t\tnew X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(\r\n\t\t\t\t\t\t0x47b5481d, 0xbefa4fa4)\r\n\t\t\t\t]);\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\tvar hash = SHA512._doFinalize.call(this);\r\n\r\n\t\t\t\thash.sigBytes -= 16;\r\n\r\n\t\t\t\treturn hash;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the hasher's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t *\r\n\t\t * @return {WordArray} The hash.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hash = CryptoJS.SHA384('message');\r\n\t\t * var hash = CryptoJS.SHA384(wordArray);\r\n\t\t */\r\n\t\tC.SHA384 = SHA512._createHelper(SHA384);\r\n\r\n\t\t/**\r\n\t\t * Shortcut function to the HMAC's object interface.\r\n\t\t *\r\n\t\t * @param {WordArray|string} message The message to hash.\r\n\t\t * @param {WordArray|string} key The secret key.\r\n\t\t *\r\n\t\t * @return {WordArray} The HMAC.\r\n\t\t *\r\n\t\t * @static\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var hmac = CryptoJS.HmacSHA384(message, key);\r\n\t\t */\r\n\t\tC.HmacSHA384 = SHA512._createHmacHelper(SHA384);\r\n\t}());\r\n\r\n\r\n\t/**\r\n\t * Cipher core components.\r\n\t */\r\n\tCryptoJS.lib.Cipher || (function(undefined) {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar Base = C_lib.Base;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\r\n\t\tvar C_enc = C.enc;\r\n\t\tvar Utf8 = C_enc.Utf8;\r\n\t\tvar Base64 = C_enc.Base64;\r\n\t\tvar C_algo = C.algo;\r\n\t\tvar EvpKDF = C_algo.EvpKDF;\r\n\r\n\t\t/**\r\n\t\t * Abstract base cipher template.\r\n\t\t *\r\n\t\t * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\r\n\t\t * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\r\n\t\t * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\r\n\t\t * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\r\n\t\t */\r\n\t\tvar Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {WordArray} iv The IV to use for this operation.\r\n\t\t\t */\r\n\t\t\tcfg: Base.extend(),\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates this cipher in encryption mode.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} key The key.\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n\t\t\t *\r\n\t\t\t * @return {Cipher} A cipher instance.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\r\n\t\t\t */\r\n\t\t\tcreateEncryptor: function(key, cfg) {\r\n\t\t\t\treturn this.create(this._ENC_XFORM_MODE, key, cfg);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates this cipher in decryption mode.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} key The key.\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n\t\t\t *\r\n\t\t\t * @return {Cipher} A cipher instance.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\r\n\t\t\t */\r\n\t\t\tcreateDecryptor: function(key, cfg) {\r\n\t\t\t\treturn this.create(this._DEC_XFORM_MODE, key, cfg);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created cipher.\r\n\t\t\t *\r\n\t\t\t * @param {number} xformMode Either the encryption or decryption transormation mode constant.\r\n\t\t\t * @param {WordArray} key The key.\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\r\n\t\t\t */\r\n\t\t\tinit: function(xformMode, key, cfg) {\r\n\t\t\t\t// Apply config defaults\r\n\t\t\t\tthis.cfg = this.cfg.extend(cfg);\r\n\r\n\t\t\t\t// Store transform mode and key\r\n\t\t\t\tthis._xformMode = xformMode;\r\n\t\t\t\tthis._key = key;\r\n\r\n\t\t\t\t// Set initial values\r\n\t\t\t\tthis.reset();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Resets this cipher to its initial state.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * cipher.reset();\r\n\t\t\t */\r\n\t\t\treset: function() {\r\n\t\t\t\t// Reset data buffer\r\n\t\t\t\tBufferedBlockAlgorithm.reset.call(this);\r\n\r\n\t\t\t\t// Perform concrete-cipher logic\r\n\t\t\t\tthis._doReset();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Adds data to be encrypted or decrypted.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The data after processing.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var encrypted = cipher.process('data');\r\n\t\t\t * var encrypted = cipher.process(wordArray);\r\n\t\t\t */\r\n\t\t\tprocess: function(dataUpdate) {\r\n\t\t\t\t// Append\r\n\t\t\t\tthis._append(dataUpdate);\r\n\r\n\t\t\t\t// Process available blocks\r\n\t\t\t\treturn this._process();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Finalizes the encryption or decryption process.\r\n\t\t\t * Note that the finalize operation is effectively a destructive, read-once operation.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The data after final processing.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var encrypted = cipher.finalize();\r\n\t\t\t * var encrypted = cipher.finalize('data');\r\n\t\t\t * var encrypted = cipher.finalize(wordArray);\r\n\t\t\t */\r\n\t\t\tfinalize: function(dataUpdate) {\r\n\t\t\t\t// Final data update\r\n\t\t\t\tif (dataUpdate) {\r\n\t\t\t\t\tthis._append(dataUpdate);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Perform concrete-cipher logic\r\n\t\t\t\tvar finalProcessedData = this._doFinalize();\r\n\r\n\t\t\t\treturn finalProcessedData;\r\n\t\t\t},\r\n\r\n\t\t\tkeySize: 128 / 32,\r\n\r\n\t\t\tivSize: 128 / 32,\r\n\r\n\t\t\t_ENC_XFORM_MODE: 1,\r\n\r\n\t\t\t_DEC_XFORM_MODE: 2,\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates shortcut functions to a cipher's object interface.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher The cipher to create a helper for.\r\n\t\t\t *\r\n\t\t\t * @return {Object} An object with encrypt and decrypt shortcut functions.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\r\n\t\t\t */\r\n\t\t\t_createHelper: (function() {\r\n\t\t\t\tfunction selectCipherStrategy(key) {\r\n\t\t\t\t\tif (typeof key == 'string') {\r\n\t\t\t\t\t\treturn PasswordBasedCipher;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn SerializableCipher;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn function(cipher) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tencrypt: function(message, key, cfg) {\r\n\t\t\t\t\t\t\treturn selectCipherStrategy(key).encrypt(cipher,\r\n\t\t\t\t\t\t\t\tmessage, key, cfg);\r\n\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\tdecrypt: function(ciphertext, key, cfg) {\r\n\t\t\t\t\t\t\treturn selectCipherStrategy(key).decrypt(cipher,\r\n\t\t\t\t\t\t\t\tciphertext, key, cfg);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t};\r\n\t\t\t}())\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Abstract base stream cipher template.\r\n\t\t *\r\n\t\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\r\n\t\t */\r\n\t\tvar StreamCipher = C_lib.StreamCipher = Cipher.extend({\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Process partial blocks\r\n\t\t\t\tvar finalProcessedBlocks = this._process(!!'flush');\r\n\r\n\t\t\t\treturn finalProcessedBlocks;\r\n\t\t\t},\r\n\r\n\t\t\tblockSize: 1\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Mode namespace.\r\n\t\t */\r\n\t\tvar C_mode = C.mode = {};\r\n\r\n\t\t/**\r\n\t\t * Abstract base block cipher mode template.\r\n\t\t */\r\n\t\tvar BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Creates this mode for encryption.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher A block cipher instance.\r\n\t\t\t * @param {Array} iv The IV words.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\r\n\t\t\t */\r\n\t\t\tcreateEncryptor: function(cipher, iv) {\r\n\t\t\t\treturn this.Encryptor.create(cipher, iv);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Creates this mode for decryption.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher A block cipher instance.\r\n\t\t\t * @param {Array} iv The IV words.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\r\n\t\t\t */\r\n\t\t\tcreateDecryptor: function(cipher, iv) {\r\n\t\t\t\treturn this.Decryptor.create(cipher, iv);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created mode.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher A block cipher instance.\r\n\t\t\t * @param {Array} iv The IV words.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\r\n\t\t\t */\r\n\t\t\tinit: function(cipher, iv) {\r\n\t\t\t\tthis._cipher = cipher;\r\n\t\t\t\tthis._iv = iv;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Cipher Block Chaining mode.\r\n\t\t */\r\n\t\tvar CBC = C_mode.CBC = (function() {\r\n\t\t\t/**\r\n\t\t\t * Abstract base CBC mode.\r\n\t\t\t */\r\n\t\t\tvar CBC = BlockCipherMode.extend();\r\n\r\n\t\t\t/**\r\n\t\t\t * CBC encryptor.\r\n\t\t\t */\r\n\t\t\tCBC.Encryptor = CBC.extend({\r\n\t\t\t\t/**\r\n\t\t\t\t * Processes the data block at offset.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {Array} words The data words to operate on.\r\n\t\t\t\t * @param {number} offset The offset where the block starts.\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t *\r\n\t\t\t\t * mode.processBlock(data.words, offset);\r\n\t\t\t\t */\r\n\t\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar cipher = this._cipher;\r\n\t\t\t\t\tvar blockSize = cipher.blockSize;\r\n\r\n\t\t\t\t\t// XOR and encrypt\r\n\t\t\t\t\txorBlock.call(this, words, offset, blockSize);\r\n\t\t\t\t\tcipher.encryptBlock(words, offset);\r\n\r\n\t\t\t\t\t// Remember this block to use with next block\r\n\t\t\t\t\tthis._prevBlock = words.slice(offset, offset + blockSize);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t/**\r\n\t\t\t * CBC decryptor.\r\n\t\t\t */\r\n\t\t\tCBC.Decryptor = CBC.extend({\r\n\t\t\t\t/**\r\n\t\t\t\t * Processes the data block at offset.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {Array} words The data words to operate on.\r\n\t\t\t\t * @param {number} offset The offset where the block starts.\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t *\r\n\t\t\t\t * mode.processBlock(data.words, offset);\r\n\t\t\t\t */\r\n\t\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar cipher = this._cipher;\r\n\t\t\t\t\tvar blockSize = cipher.blockSize;\r\n\r\n\t\t\t\t\t// Remember this block to use with next block\r\n\t\t\t\t\tvar thisBlock = words.slice(offset, offset + blockSize);\r\n\r\n\t\t\t\t\t// Decrypt and XOR\r\n\t\t\t\t\tcipher.decryptBlock(words, offset);\r\n\t\t\t\t\txorBlock.call(this, words, offset, blockSize);\r\n\r\n\t\t\t\t\t// This block becomes the previous block\r\n\t\t\t\t\tthis._prevBlock = thisBlock;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tfunction xorBlock(words, offset, blockSize) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar iv = this._iv;\r\n\r\n\t\t\t\t// Choose mixing block\r\n\t\t\t\tif (iv) {\r\n\t\t\t\t\tvar block = iv;\r\n\r\n\t\t\t\t\t// Remove IV for subsequent blocks\r\n\t\t\t\t\tthis._iv = undefined;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar block = this._prevBlock;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// XOR blocks\r\n\t\t\t\tfor (var i = 0; i < blockSize; i++) {\r\n\t\t\t\t\twords[offset + i] ^= block[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn CBC;\r\n\t\t}());\r\n\r\n\t\t/**\r\n\t\t * Padding namespace.\r\n\t\t */\r\n\t\tvar C_pad = C.pad = {};\r\n\r\n\t\t/**\r\n\t\t * PKCS #5/7 padding strategy.\r\n\t\t */\r\n\t\tvar Pkcs7 = C_pad.Pkcs7 = {\r\n\t\t\t/**\r\n\t\t\t * Pads data using the algorithm defined in PKCS #5/7.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} data The data to pad.\r\n\t\t\t * @param {number} blockSize The multiple that the data should be padded to.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\r\n\t\t\t */\r\n\t\t\tpad: function(data, blockSize) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar blockSizeBytes = blockSize * 4;\r\n\r\n\t\t\t\t// Count padding bytes\r\n\t\t\t\tvar nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\r\n\r\n\t\t\t\t// Create padding word\r\n\t\t\t\tvar paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (\r\n\t\t\t\t\tnPaddingBytes << 8) | nPaddingBytes;\r\n\r\n\t\t\t\t// Create padding\r\n\t\t\t\tvar paddingWords = [];\r\n\t\t\t\tfor (var i = 0; i < nPaddingBytes; i += 4) {\r\n\t\t\t\t\tpaddingWords.push(paddingWord);\r\n\t\t\t\t}\r\n\t\t\t\tvar padding = WordArray.create(paddingWords, nPaddingBytes);\r\n\r\n\t\t\t\t// Add padding\r\n\t\t\t\tdata.concat(padding);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\r\n\t\t\t *\r\n\t\t\t * @param {WordArray} data The data to unpad.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * CryptoJS.pad.Pkcs7.unpad(wordArray);\r\n\t\t\t */\r\n\t\t\tunpad: function(data) {\r\n\t\t\t\t// Get number of padding bytes from last byte\r\n\t\t\t\tvar nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\r\n\r\n\t\t\t\t// Remove padding\r\n\t\t\t\tdata.sigBytes -= nPaddingBytes;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Abstract base block cipher template.\r\n\t\t *\r\n\t\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\r\n\t\t */\r\n\t\tvar BlockCipher = C_lib.BlockCipher = Cipher.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {Mode} mode The block mode to use. Default: CBC\r\n\t\t\t * @property {Padding} padding The padding strategy to use. Default: Pkcs7\r\n\t\t\t */\r\n\t\t\tcfg: Cipher.cfg.extend({\r\n\t\t\t\tmode: CBC,\r\n\t\t\t\tpadding: Pkcs7\r\n\t\t\t}),\r\n\r\n\t\t\treset: function() {\r\n\t\t\t\t// Reset cipher\r\n\t\t\t\tCipher.reset.call(this);\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar cfg = this.cfg;\r\n\t\t\t\tvar iv = cfg.iv;\r\n\t\t\t\tvar mode = cfg.mode;\r\n\r\n\t\t\t\t// Reset block mode\r\n\t\t\t\tif (this._xformMode == this._ENC_XFORM_MODE) {\r\n\t\t\t\t\tvar modeCreator = mode.createEncryptor;\r\n\t\t\t\t} else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n\t\t\t\t\tvar modeCreator = mode.createDecryptor;\r\n\t\t\t\t\t// Keep at least one block in the buffer for unpadding\r\n\t\t\t\t\tthis._minBufferSize = 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._mode && this._mode.__creator == modeCreator) {\r\n\t\t\t\t\tthis._mode.init(this, iv && iv.words);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._mode = modeCreator.call(mode, this, iv && iv.words);\r\n\t\t\t\t\tthis._mode.__creator = modeCreator;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(words, offset) {\r\n\t\t\t\tthis._mode.processBlock(words, offset);\r\n\t\t\t},\r\n\r\n\t\t\t_doFinalize: function() {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar padding = this.cfg.padding;\r\n\r\n\t\t\t\t// Finalize\r\n\t\t\t\tif (this._xformMode == this._ENC_XFORM_MODE) {\r\n\t\t\t\t\t// Pad data\r\n\t\t\t\t\tpadding.pad(this._data, this.blockSize);\r\n\r\n\t\t\t\t\t// Process final blocks\r\n\t\t\t\t\tvar finalProcessedBlocks = this._process(!!'flush');\r\n\t\t\t\t} else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n\t\t\t\t\t// Process final blocks\r\n\t\t\t\t\tvar finalProcessedBlocks = this._process(!!'flush');\r\n\r\n\t\t\t\t\t// Unpad data\r\n\t\t\t\t\tpadding.unpad(finalProcessedBlocks);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn finalProcessedBlocks;\r\n\t\t\t},\r\n\r\n\t\t\tblockSize: 128 / 32\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * A collection of cipher parameters.\r\n\t\t *\r\n\t\t * @property {WordArray} ciphertext The raw ciphertext.\r\n\t\t * @property {WordArray} key The key to this ciphertext.\r\n\t\t * @property {WordArray} iv The IV used in the ciphering operation.\r\n\t\t * @property {WordArray} salt The salt used with a key derivation function.\r\n\t\t * @property {Cipher} algorithm The cipher algorithm.\r\n\t\t * @property {Mode} mode The block mode used in the ciphering operation.\r\n\t\t * @property {Padding} padding The padding scheme used in the ciphering operation.\r\n\t\t * @property {number} blockSize The block size of the cipher.\r\n\t\t * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\r\n\t\t */\r\n\t\tvar CipherParams = C_lib.CipherParams = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Initializes a newly created cipher params object.\r\n\t\t\t *\r\n\t\t\t * @param {Object} cipherParams An object with any of the possible cipher parameters.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var cipherParams = CryptoJS.lib.CipherParams.create({\r\n\t\t\t * ciphertext: ciphertextWordArray,\r\n\t\t\t * key: keyWordArray,\r\n\t\t\t * iv: ivWordArray,\r\n\t\t\t * salt: saltWordArray,\r\n\t\t\t * algorithm: CryptoJS.algo.AES,\r\n\t\t\t * mode: CryptoJS.mode.CBC,\r\n\t\t\t * padding: CryptoJS.pad.PKCS7,\r\n\t\t\t * blockSize: 4,\r\n\t\t\t * formatter: CryptoJS.format.OpenSSL\r\n\t\t\t * });\r\n\t\t\t */\r\n\t\t\tinit: function(cipherParams) {\r\n\t\t\t\tthis.mixIn(cipherParams);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts this cipher params object to a string.\r\n\t\t\t *\r\n\t\t\t * @param {Format} formatter (Optional) The formatting strategy to use.\r\n\t\t\t *\r\n\t\t\t * @return {string} The stringified cipher params.\r\n\t\t\t *\r\n\t\t\t * @throws Error If neither the formatter nor the default formatter is set.\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var string = cipherParams + '';\r\n\t\t\t * var string = cipherParams.toString();\r\n\t\t\t * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\r\n\t\t\t */\r\n\t\t\ttoString: function(formatter) {\r\n\t\t\t\treturn (formatter || this.formatter).stringify(this);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Format namespace.\r\n\t\t */\r\n\t\tvar C_format = C.format = {};\r\n\r\n\t\t/**\r\n\t\t * OpenSSL formatting strategy.\r\n\t\t */\r\n\t\tvar OpenSSLFormatter = C_format.OpenSSL = {\r\n\t\t\t/**\r\n\t\t\t * Converts a cipher params object to an OpenSSL-compatible string.\r\n\t\t\t *\r\n\t\t\t * @param {CipherParams} cipherParams The cipher params object.\r\n\t\t\t *\r\n\t\t\t * @return {string} The OpenSSL-compatible string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\r\n\t\t\t */\r\n\t\t\tstringify: function(cipherParams) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar ciphertext = cipherParams.ciphertext;\r\n\t\t\t\tvar salt = cipherParams.salt;\r\n\r\n\t\t\t\t// Format\r\n\t\t\t\tif (salt) {\r\n\t\t\t\t\tvar wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt)\r\n\t\t\t\t\t\t.concat(ciphertext);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar wordArray = ciphertext;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn wordArray.toString(Base64);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts an OpenSSL-compatible string to a cipher params object.\r\n\t\t\t *\r\n\t\t\t * @param {string} openSSLStr The OpenSSL-compatible string.\r\n\t\t\t *\r\n\t\t\t * @return {CipherParams} The cipher params object.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\r\n\t\t\t */\r\n\t\t\tparse: function(openSSLStr) {\r\n\t\t\t\t// Parse base64\r\n\t\t\t\tvar ciphertext = Base64.parse(openSSLStr);\r\n\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar ciphertextWords = ciphertext.words;\r\n\r\n\t\t\t\t// Test for salt\r\n\t\t\t\tif (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\r\n\t\t\t\t\t// Extract salt\r\n\t\t\t\t\tvar salt = WordArray.create(ciphertextWords.slice(2, 4));\r\n\r\n\t\t\t\t\t// Remove salt from ciphertext\r\n\t\t\t\t\tciphertextWords.splice(0, 4);\r\n\t\t\t\t\tciphertext.sigBytes -= 16;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn CipherParams.create({\r\n\t\t\t\t\tciphertext: ciphertext,\r\n\t\t\t\t\tsalt: salt\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * A cipher wrapper that returns ciphertext as a serializable cipher params object.\r\n\t\t */\r\n\t\tvar SerializableCipher = C_lib.SerializableCipher = Base.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\r\n\t\t\t */\r\n\t\t\tcfg: Base.extend({\r\n\t\t\t\tformat: OpenSSLFormatter\r\n\t\t\t}),\r\n\r\n\t\t\t/**\r\n\t\t\t * Encrypts a message.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher The cipher algorithm to use.\r\n\t\t\t * @param {WordArray|string} message The message to encrypt.\r\n\t\t\t * @param {WordArray} key The key.\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n\t\t\t *\r\n\t\t\t * @return {CipherParams} A cipher params object.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\r\n\t\t\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\r\n\t\t\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n\t\t\t */\r\n\t\t\tencrypt: function(cipher, message, key, cfg) {\r\n\t\t\t\t// Apply config defaults\r\n\t\t\t\tcfg = this.cfg.extend(cfg);\r\n\r\n\t\t\t\t// Encrypt\r\n\t\t\t\tvar encryptor = cipher.createEncryptor(key, cfg);\r\n\t\t\t\tvar ciphertext = encryptor.finalize(message);\r\n\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar cipherCfg = encryptor.cfg;\r\n\r\n\t\t\t\t// Create and return serializable cipher params\r\n\t\t\t\treturn CipherParams.create({\r\n\t\t\t\t\tciphertext: ciphertext,\r\n\t\t\t\t\tkey: key,\r\n\t\t\t\t\tiv: cipherCfg.iv,\r\n\t\t\t\t\talgorithm: cipher,\r\n\t\t\t\t\tmode: cipherCfg.mode,\r\n\t\t\t\t\tpadding: cipherCfg.padding,\r\n\t\t\t\t\tblockSize: cipher.blockSize,\r\n\t\t\t\t\tformatter: cfg.format\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Decrypts serialized ciphertext.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher The cipher algorithm to use.\r\n\t\t\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n\t\t\t * @param {WordArray} key The key.\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The plaintext.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n\t\t\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n\t\t\t */\r\n\t\t\tdecrypt: function(cipher, ciphertext, key, cfg) {\r\n\t\t\t\t// Apply config defaults\r\n\t\t\t\tcfg = this.cfg.extend(cfg);\r\n\r\n\t\t\t\t// Convert string to CipherParams\r\n\t\t\t\tciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n\t\t\t\t// Decrypt\r\n\t\t\t\tvar plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext\r\n\t\t\t\t\t.ciphertext);\r\n\r\n\t\t\t\treturn plaintext;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts serialized ciphertext to CipherParams,\r\n\t\t\t * else assumed CipherParams already and returns ciphertext unchanged.\r\n\t\t\t *\r\n\t\t\t * @param {CipherParams|string} ciphertext The ciphertext.\r\n\t\t\t * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\r\n\t\t\t *\r\n\t\t\t * @return {CipherParams} The unserialized ciphertext.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\r\n\t\t\t */\r\n\t\t\t_parse: function(ciphertext, format) {\r\n\t\t\t\tif (typeof ciphertext == 'string') {\r\n\t\t\t\t\treturn format.parse(ciphertext, this);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn ciphertext;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Key derivation function namespace.\r\n\t\t */\r\n\t\tvar C_kdf = C.kdf = {};\r\n\r\n\t\t/**\r\n\t\t * OpenSSL key derivation function.\r\n\t\t */\r\n\t\tvar OpenSSLKdf = C_kdf.OpenSSL = {\r\n\t\t\t/**\r\n\t\t\t * Derives a key and IV from a password.\r\n\t\t\t *\r\n\t\t\t * @param {string} password The password to derive from.\r\n\t\t\t * @param {number} keySize The size in words of the key to generate.\r\n\t\t\t * @param {number} ivSize The size in words of the IV to generate.\r\n\t\t\t * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\r\n\t\t\t *\r\n\t\t\t * @return {CipherParams} A cipher params object with the key, IV, and salt.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\r\n\t\t\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\r\n\t\t\t */\r\n\t\t\texecute: function(password, keySize, ivSize, salt) {\r\n\t\t\t\t// Generate random salt\r\n\t\t\t\tif (!salt) {\r\n\t\t\t\t\tsalt = WordArray.random(64 / 8);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Derive key and IV\r\n\t\t\t\tvar key = EvpKDF.create({\r\n\t\t\t\t\tkeySize: keySize + ivSize\r\n\t\t\t\t}).compute(password, salt);\r\n\r\n\t\t\t\t// Separate key and IV\r\n\t\t\t\tvar iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\r\n\t\t\t\tkey.sigBytes = keySize * 4;\r\n\r\n\t\t\t\t// Return params\r\n\t\t\t\treturn CipherParams.create({\r\n\t\t\t\t\tkey: key,\r\n\t\t\t\t\tiv: iv,\r\n\t\t\t\t\tsalt: salt\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * A serializable cipher wrapper that derives the key from a password,\r\n\t\t * and returns ciphertext as a serializable cipher params object.\r\n\t\t */\r\n\t\tvar PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\r\n\t\t\t */\r\n\t\t\tcfg: SerializableCipher.cfg.extend({\r\n\t\t\t\tkdf: OpenSSLKdf\r\n\t\t\t}),\r\n\r\n\t\t\t/**\r\n\t\t\t * Encrypts a message using a password.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher The cipher algorithm to use.\r\n\t\t\t * @param {WordArray|string} message The message to encrypt.\r\n\t\t\t * @param {string} password The password.\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n\t\t\t *\r\n\t\t\t * @return {CipherParams} A cipher params object.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\r\n\t\t\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\r\n\t\t\t */\r\n\t\t\tencrypt: function(cipher, message, password, cfg) {\r\n\t\t\t\t// Apply config defaults\r\n\t\t\t\tcfg = this.cfg.extend(cfg);\r\n\r\n\t\t\t\t// Derive key and other params\r\n\t\t\t\tvar derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher\r\n\t\t\t\t.ivSize);\r\n\r\n\t\t\t\t// Add IV to config\r\n\t\t\t\tcfg.iv = derivedParams.iv;\r\n\r\n\t\t\t\t// Encrypt\r\n\t\t\t\tvar ciphertext = SerializableCipher.encrypt.call(this, cipher, message,\r\n\t\t\t\t\tderivedParams.key, cfg);\r\n\r\n\t\t\t\t// Mix in derived params\r\n\t\t\t\tciphertext.mixIn(derivedParams);\r\n\r\n\t\t\t\treturn ciphertext;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Decrypts serialized ciphertext using a password.\r\n\t\t\t *\r\n\t\t\t * @param {Cipher} cipher The cipher algorithm to use.\r\n\t\t\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n\t\t\t * @param {string} password The password.\r\n\t\t\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n\t\t\t *\r\n\t\t\t * @return {WordArray} The plaintext.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\r\n\t\t\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\r\n\t\t\t */\r\n\t\t\tdecrypt: function(cipher, ciphertext, password, cfg) {\r\n\t\t\t\t// Apply config defaults\r\n\t\t\t\tcfg = this.cfg.extend(cfg);\r\n\r\n\t\t\t\t// Convert string to CipherParams\r\n\t\t\t\tciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n\t\t\t\t// Derive key and other params\r\n\t\t\t\tvar derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize,\r\n\t\t\t\t\tciphertext.salt);\r\n\r\n\t\t\t\t// Add IV to config\r\n\t\t\t\tcfg.iv = derivedParams.iv;\r\n\r\n\t\t\t\t// Decrypt\r\n\t\t\t\tvar plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext,\r\n\t\t\t\t\tderivedParams.key, cfg);\r\n\r\n\t\t\t\treturn plaintext;\r\n\t\t\t}\r\n\t\t});\r\n\t}());\r\n\r\n\r\n\t/**\r\n\t * Cipher Feedback block mode.\r\n\t */\r\n\tCryptoJS.mode.CFB = (function() {\r\n\t\tvar CFB = CryptoJS.lib.BlockCipherMode.extend();\r\n\r\n\t\tCFB.Encryptor = CFB.extend({\r\n\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar cipher = this._cipher;\r\n\t\t\t\tvar blockSize = cipher.blockSize;\r\n\r\n\t\t\t\tgenerateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\r\n\r\n\t\t\t\t// Remember this block to use with next block\r\n\t\t\t\tthis._prevBlock = words.slice(offset, offset + blockSize);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tCFB.Decryptor = CFB.extend({\r\n\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar cipher = this._cipher;\r\n\t\t\t\tvar blockSize = cipher.blockSize;\r\n\r\n\t\t\t\t// Remember this block to use with next block\r\n\t\t\t\tvar thisBlock = words.slice(offset, offset + blockSize);\r\n\r\n\t\t\t\tgenerateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\r\n\r\n\t\t\t\t// This block becomes the previous block\r\n\t\t\t\tthis._prevBlock = thisBlock;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tfunction generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\r\n\t\t\t// Shortcut\r\n\t\t\tvar iv = this._iv;\r\n\r\n\t\t\t// Generate keystream\r\n\t\t\tif (iv) {\r\n\t\t\t\tvar keystream = iv.slice(0);\r\n\r\n\t\t\t\t// Remove IV for subsequent blocks\r\n\t\t\t\tthis._iv = undefined;\r\n\t\t\t} else {\r\n\t\t\t\tvar keystream = this._prevBlock;\r\n\t\t\t}\r\n\t\t\tcipher.encryptBlock(keystream, 0);\r\n\r\n\t\t\t// Encrypt\r\n\t\t\tfor (var i = 0; i < blockSize; i++) {\r\n\t\t\t\twords[offset + i] ^= keystream[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn CFB;\r\n\t}());\r\n\r\n\r\n\t/**\r\n\t * Electronic Codebook block mode.\r\n\t */\r\n\tCryptoJS.mode.ECB = (function() {\r\n\t\tvar ECB = CryptoJS.lib.BlockCipherMode.extend();\r\n\r\n\t\tECB.Encryptor = ECB.extend({\r\n\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\tthis._cipher.encryptBlock(words, offset);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tECB.Decryptor = ECB.extend({\r\n\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\tthis._cipher.decryptBlock(words, offset);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn ECB;\r\n\t}());\r\n\r\n\r\n\t/**\r\n\t * ANSI X.923 padding strategy.\r\n\t */\r\n\tCryptoJS.pad.AnsiX923 = {\r\n\t\tpad: function(data, blockSize) {\r\n\t\t\t// Shortcuts\r\n\t\t\tvar dataSigBytes = data.sigBytes;\r\n\t\t\tvar blockSizeBytes = blockSize * 4;\r\n\r\n\t\t\t// Count padding bytes\r\n\t\t\tvar nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\r\n\r\n\t\t\t// Compute last byte position\r\n\t\t\tvar lastBytePos = dataSigBytes + nPaddingBytes - 1;\r\n\r\n\t\t\t// Pad\r\n\t\t\tdata.clamp();\r\n\t\t\tdata.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\r\n\t\t\tdata.sigBytes += nPaddingBytes;\r\n\t\t},\r\n\r\n\t\tunpad: function(data) {\r\n\t\t\t// Get number of padding bytes from last byte\r\n\t\t\tvar nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\r\n\r\n\t\t\t// Remove padding\r\n\t\t\tdata.sigBytes -= nPaddingBytes;\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * ISO 10126 padding strategy.\r\n\t */\r\n\tCryptoJS.pad.Iso10126 = {\r\n\t\tpad: function(data, blockSize) {\r\n\t\t\t// Shortcut\r\n\t\t\tvar blockSizeBytes = blockSize * 4;\r\n\r\n\t\t\t// Count padding bytes\r\n\t\t\tvar nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\r\n\r\n\t\t\t// Pad\r\n\t\t\tdata.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\r\n\t\t\tconcat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\r\n\t\t},\r\n\r\n\t\tunpad: function(data) {\r\n\t\t\t// Get number of padding bytes from last byte\r\n\t\t\tvar nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\r\n\r\n\t\t\t// Remove padding\r\n\t\t\tdata.sigBytes -= nPaddingBytes;\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * ISO/IEC 9797-1 Padding Method 2.\r\n\t */\r\n\tCryptoJS.pad.Iso97971 = {\r\n\t\tpad: function(data, blockSize) {\r\n\t\t\t// Add 0x80 byte\r\n\t\t\tdata.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\r\n\r\n\t\t\t// Zero pad the rest\r\n\t\t\tCryptoJS.pad.ZeroPadding.pad(data, blockSize);\r\n\t\t},\r\n\r\n\t\tunpad: function(data) {\r\n\t\t\t// Remove zero padding\r\n\t\t\tCryptoJS.pad.ZeroPadding.unpad(data);\r\n\r\n\t\t\t// Remove one more byte -- the 0x80 byte\r\n\t\t\tdata.sigBytes--;\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * Output Feedback block mode.\r\n\t */\r\n\tCryptoJS.mode.OFB = (function() {\r\n\t\tvar OFB = CryptoJS.lib.BlockCipherMode.extend();\r\n\r\n\t\tvar Encryptor = OFB.Encryptor = OFB.extend({\r\n\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar cipher = this._cipher\r\n\t\t\t\tvar blockSize = cipher.blockSize;\r\n\t\t\t\tvar iv = this._iv;\r\n\t\t\t\tvar keystream = this._keystream;\r\n\r\n\t\t\t\t// Generate keystream\r\n\t\t\t\tif (iv) {\r\n\t\t\t\t\tkeystream = this._keystream = iv.slice(0);\r\n\r\n\t\t\t\t\t// Remove IV for subsequent blocks\r\n\t\t\t\t\tthis._iv = undefined;\r\n\t\t\t\t}\r\n\t\t\t\tcipher.encryptBlock(keystream, 0);\r\n\r\n\t\t\t\t// Encrypt\r\n\t\t\t\tfor (var i = 0; i < blockSize; i++) {\r\n\t\t\t\t\twords[offset + i] ^= keystream[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tOFB.Decryptor = Encryptor;\r\n\r\n\t\treturn OFB;\r\n\t}());\r\n\r\n\r\n\t/**\r\n\t * A noop padding strategy.\r\n\t */\r\n\tCryptoJS.pad.NoPadding = {\r\n\t\tpad: function() {},\r\n\r\n\t\tunpad: function() {}\r\n\t};\r\n\r\n\r\n\t(function(undefined) {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar CipherParams = C_lib.CipherParams;\r\n\t\tvar C_enc = C.enc;\r\n\t\tvar Hex = C_enc.Hex;\r\n\t\tvar C_format = C.format;\r\n\r\n\t\tvar HexFormatter = C_format.Hex = {\r\n\t\t\t/**\r\n\t\t\t * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\r\n\t\t\t *\r\n\t\t\t * @param {CipherParams} cipherParams The cipher params object.\r\n\t\t\t *\r\n\t\t\t * @return {string} The hexadecimally encoded string.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var hexString = CryptoJS.format.Hex.stringify(cipherParams);\r\n\t\t\t */\r\n\t\t\tstringify: function(cipherParams) {\r\n\t\t\t\treturn cipherParams.ciphertext.toString(Hex);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Converts a hexadecimally encoded ciphertext string to a cipher params object.\r\n\t\t\t *\r\n\t\t\t * @param {string} input The hexadecimally encoded string.\r\n\t\t\t *\r\n\t\t\t * @return {CipherParams} The cipher params object.\r\n\t\t\t *\r\n\t\t\t * @static\r\n\t\t\t *\r\n\t\t\t * @example\r\n\t\t\t *\r\n\t\t\t * var cipherParams = CryptoJS.format.Hex.parse(hexString);\r\n\t\t\t */\r\n\t\t\tparse: function(input) {\r\n\t\t\t\tvar ciphertext = Hex.parse(input);\r\n\t\t\t\treturn CipherParams.create({\r\n\t\t\t\t\tciphertext: ciphertext\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar BlockCipher = C_lib.BlockCipher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Lookup tables\r\n\t\tvar SBOX = [];\r\n\t\tvar INV_SBOX = [];\r\n\t\tvar SUB_MIX_0 = [];\r\n\t\tvar SUB_MIX_1 = [];\r\n\t\tvar SUB_MIX_2 = [];\r\n\t\tvar SUB_MIX_3 = [];\r\n\t\tvar INV_SUB_MIX_0 = [];\r\n\t\tvar INV_SUB_MIX_1 = [];\r\n\t\tvar INV_SUB_MIX_2 = [];\r\n\t\tvar INV_SUB_MIX_3 = [];\r\n\r\n\t\t// Compute lookup tables\r\n\t\t(function() {\r\n\t\t\t// Compute double table\r\n\t\t\tvar d = [];\r\n\t\t\tfor (var i = 0; i < 256; i++) {\r\n\t\t\t\tif (i < 128) {\r\n\t\t\t\t\td[i] = i << 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\td[i] = (i << 1) ^ 0x11b;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Walk GF(2^8)\r\n\t\t\tvar x = 0;\r\n\t\t\tvar xi = 0;\r\n\t\t\tfor (var i = 0; i < 256; i++) {\r\n\t\t\t\t// Compute sbox\r\n\t\t\t\tvar sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\r\n\t\t\t\tsx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\r\n\t\t\t\tSBOX[x] = sx;\r\n\t\t\t\tINV_SBOX[sx] = x;\r\n\r\n\t\t\t\t// Compute multiplication\r\n\t\t\t\tvar x2 = d[x];\r\n\t\t\t\tvar x4 = d[x2];\r\n\t\t\t\tvar x8 = d[x4];\r\n\r\n\t\t\t\t// Compute sub bytes, mix columns tables\r\n\t\t\t\tvar t = (d[sx] * 0x101) ^ (sx * 0x1010100);\r\n\t\t\t\tSUB_MIX_0[x] = (t << 24) | (t >>> 8);\r\n\t\t\t\tSUB_MIX_1[x] = (t << 16) | (t >>> 16);\r\n\t\t\t\tSUB_MIX_2[x] = (t << 8) | (t >>> 24);\r\n\t\t\t\tSUB_MIX_3[x] = t;\r\n\r\n\t\t\t\t// Compute inv sub bytes, inv mix columns tables\r\n\t\t\t\tvar t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\r\n\t\t\t\tINV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\r\n\t\t\t\tINV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\r\n\t\t\t\tINV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\r\n\t\t\t\tINV_SUB_MIX_3[sx] = t;\r\n\r\n\t\t\t\t// Compute next counter\r\n\t\t\t\tif (!x) {\r\n\t\t\t\t\tx = xi = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tx = x2 ^ d[d[d[x8 ^ x2]]];\r\n\t\t\t\t\txi ^= d[d[xi]];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}());\r\n\r\n\t\t// Precomputed Rcon lookup\r\n\t\tvar RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\r\n\r\n\t\t/**\r\n\t\t * AES block cipher algorithm.\r\n\t\t */\r\n\t\tvar AES = C_algo.AES = BlockCipher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\t// Skip reset of nRounds has been set before and key did not change\r\n\t\t\t\tif (this._nRounds && this._keyPriorReset === this._key) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar key = this._keyPriorReset = this._key;\r\n\t\t\t\tvar keyWords = key.words;\r\n\t\t\t\tvar keySize = key.sigBytes / 4;\r\n\r\n\t\t\t\t// Compute number of rounds\r\n\t\t\t\tvar nRounds = this._nRounds = keySize + 6;\r\n\r\n\t\t\t\t// Compute number of key schedule rows\r\n\t\t\t\tvar ksRows = (nRounds + 1) * 4;\r\n\r\n\t\t\t\t// Compute key schedule\r\n\t\t\t\tvar keySchedule = this._keySchedule = [];\r\n\t\t\t\tfor (var ksRow = 0; ksRow < ksRows; ksRow++) {\r\n\t\t\t\t\tif (ksRow < keySize) {\r\n\t\t\t\t\t\tkeySchedule[ksRow] = keyWords[ksRow];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar t = keySchedule[ksRow - 1];\r\n\r\n\t\t\t\t\t\tif (!(ksRow % keySize)) {\r\n\t\t\t\t\t\t\t// Rot word\r\n\t\t\t\t\t\t\tt = (t << 8) | (t >>> 24);\r\n\r\n\t\t\t\t\t\t\t// Sub word\r\n\t\t\t\t\t\t\tt = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (\r\n\t\t\t\t\t\t\t\tSBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n\r\n\t\t\t\t\t\t\t// Mix Rcon\r\n\t\t\t\t\t\t\tt ^= RCON[(ksRow / keySize) | 0] << 24;\r\n\t\t\t\t\t\t} else if (keySize > 6 && ksRow % keySize == 4) {\r\n\t\t\t\t\t\t\t// Sub word\r\n\t\t\t\t\t\t\tt = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (\r\n\t\t\t\t\t\t\t\tSBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tkeySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Compute inv key schedule\r\n\t\t\t\tvar invKeySchedule = this._invKeySchedule = [];\r\n\t\t\t\tfor (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\r\n\t\t\t\t\tvar ksRow = ksRows - invKsRow;\r\n\r\n\t\t\t\t\tif (invKsRow % 4) {\r\n\t\t\t\t\t\tvar t = keySchedule[ksRow];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar t = keySchedule[ksRow - 4];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (invKsRow < 4 || ksRow <= 4) {\r\n\t\t\t\t\t\tinvKeySchedule[invKsRow] = t;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tinvKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^\r\n\t\t\t\t\t\t\tINV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\r\n\t\t\t\t\t\t\tINV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t &\r\n\t\t\t\t\t\t\t\t0xff]];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tencryptBlock: function(M, offset) {\r\n\t\t\t\tthis._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1,\r\n\t\t\t\t\tSUB_MIX_2, SUB_MIX_3, SBOX);\r\n\t\t\t},\r\n\r\n\t\t\tdecryptBlock: function(M, offset) {\r\n\t\t\t\t// Swap 2nd and 4th rows\r\n\t\t\t\tvar t = M[offset + 1];\r\n\t\t\t\tM[offset + 1] = M[offset + 3];\r\n\t\t\t\tM[offset + 3] = t;\r\n\r\n\t\t\t\tthis._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0,\r\n\t\t\t\t\tINV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\r\n\r\n\t\t\t\t// Inv swap 2nd and 4th rows\r\n\t\t\t\tvar t = M[offset + 1];\r\n\t\t\t\tM[offset + 1] = M[offset + 3];\r\n\t\t\t\tM[offset + 3] = t;\r\n\t\t\t},\r\n\r\n\t\t\t_doCryptBlock: function(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2,\r\n\t\t\t\tSUB_MIX_3, SBOX) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar nRounds = this._nRounds;\r\n\r\n\t\t\t\t// Get input, add round key\r\n\t\t\t\tvar s0 = M[offset] ^ keySchedule[0];\r\n\t\t\t\tvar s1 = M[offset + 1] ^ keySchedule[1];\r\n\t\t\t\tvar s2 = M[offset + 2] ^ keySchedule[2];\r\n\t\t\t\tvar s3 = M[offset + 3] ^ keySchedule[3];\r\n\r\n\t\t\t\t// Key schedule row counter\r\n\t\t\t\tvar ksRow = 4;\r\n\r\n\t\t\t\t// Rounds\r\n\t\t\t\tfor (var round = 1; round < nRounds; round++) {\r\n\t\t\t\t\t// Shift rows, sub bytes, mix columns, add round key\r\n\t\t\t\t\tvar t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(\r\n\t\t\t\t\t\ts2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\r\n\t\t\t\t\tvar t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(\r\n\t\t\t\t\t\ts3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\r\n\t\t\t\t\tvar t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(\r\n\t\t\t\t\t\ts0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\r\n\t\t\t\t\tvar t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(\r\n\t\t\t\t\t\ts1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\r\n\r\n\t\t\t\t\t// Update state\r\n\t\t\t\t\ts0 = t0;\r\n\t\t\t\t\ts1 = t1;\r\n\t\t\t\t\ts2 = t2;\r\n\t\t\t\t\ts3 = t3;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Shift rows, sub bytes, add round key\r\n\t\t\t\tvar t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(\r\n\t\t\t\t\ts2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\r\n\t\t\t\tvar t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(\r\n\t\t\t\t\ts3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\r\n\t\t\t\tvar t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(\r\n\t\t\t\t\ts0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\r\n\t\t\t\tvar t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(\r\n\t\t\t\t\ts1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\r\n\r\n\t\t\t\t// Set output\r\n\t\t\t\tM[offset] = t0;\r\n\t\t\t\tM[offset + 1] = t1;\r\n\t\t\t\tM[offset + 2] = t2;\r\n\t\t\t\tM[offset + 3] = t3;\r\n\t\t\t},\r\n\r\n\t\t\tkeySize: 256 / 32\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut functions to the cipher's object interface.\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\r\n\t\t * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\r\n\t\t */\r\n\t\tC.AES = BlockCipher._createHelper(AES);\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar WordArray = C_lib.WordArray;\r\n\t\tvar BlockCipher = C_lib.BlockCipher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Permuted Choice 1 constants\r\n\t\tvar PC1 = [\r\n\t\t\t57, 49, 41, 33, 25, 17, 9, 1,\r\n\t\t\t58, 50, 42, 34, 26, 18, 10, 2,\r\n\t\t\t59, 51, 43, 35, 27, 19, 11, 3,\r\n\t\t\t60, 52, 44, 36, 63, 55, 47, 39,\r\n\t\t\t31, 23, 15, 7, 62, 54, 46, 38,\r\n\t\t\t30, 22, 14, 6, 61, 53, 45, 37,\r\n\t\t\t29, 21, 13, 5, 28, 20, 12, 4\r\n\t\t];\r\n\r\n\t\t// Permuted Choice 2 constants\r\n\t\tvar PC2 = [\r\n\t\t\t14, 17, 11, 24, 1, 5,\r\n\t\t\t3, 28, 15, 6, 21, 10,\r\n\t\t\t23, 19, 12, 4, 26, 8,\r\n\t\t\t16, 7, 27, 20, 13, 2,\r\n\t\t\t41, 52, 31, 37, 47, 55,\r\n\t\t\t30, 40, 51, 45, 33, 48,\r\n\t\t\t44, 49, 39, 56, 34, 53,\r\n\t\t\t46, 42, 50, 36, 29, 32\r\n\t\t];\r\n\r\n\t\t// Cumulative bit shift constants\r\n\t\tvar BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\r\n\r\n\t\t// SBOXes and round permutation constants\r\n\t\tvar SBOX_P = [{\r\n\t\t\t\t0x0: 0x808200,\r\n\t\t\t\t0x10000000: 0x8000,\r\n\t\t\t\t0x20000000: 0x808002,\r\n\t\t\t\t0x30000000: 0x2,\r\n\t\t\t\t0x40000000: 0x200,\r\n\t\t\t\t0x50000000: 0x808202,\r\n\t\t\t\t0x60000000: 0x800202,\r\n\t\t\t\t0x70000000: 0x800000,\r\n\t\t\t\t0x80000000: 0x202,\r\n\t\t\t\t0x90000000: 0x800200,\r\n\t\t\t\t0xa0000000: 0x8200,\r\n\t\t\t\t0xb0000000: 0x808000,\r\n\t\t\t\t0xc0000000: 0x8002,\r\n\t\t\t\t0xd0000000: 0x800002,\r\n\t\t\t\t0xe0000000: 0x0,\r\n\t\t\t\t0xf0000000: 0x8202,\r\n\t\t\t\t0x8000000: 0x0,\r\n\t\t\t\t0x18000000: 0x808202,\r\n\t\t\t\t0x28000000: 0x8202,\r\n\t\t\t\t0x38000000: 0x8000,\r\n\t\t\t\t0x48000000: 0x808200,\r\n\t\t\t\t0x58000000: 0x200,\r\n\t\t\t\t0x68000000: 0x808002,\r\n\t\t\t\t0x78000000: 0x2,\r\n\t\t\t\t0x88000000: 0x800200,\r\n\t\t\t\t0x98000000: 0x8200,\r\n\t\t\t\t0xa8000000: 0x808000,\r\n\t\t\t\t0xb8000000: 0x800202,\r\n\t\t\t\t0xc8000000: 0x800002,\r\n\t\t\t\t0xd8000000: 0x8002,\r\n\t\t\t\t0xe8000000: 0x202,\r\n\t\t\t\t0xf8000000: 0x800000,\r\n\t\t\t\t0x1: 0x8000,\r\n\t\t\t\t0x10000001: 0x2,\r\n\t\t\t\t0x20000001: 0x808200,\r\n\t\t\t\t0x30000001: 0x800000,\r\n\t\t\t\t0x40000001: 0x808002,\r\n\t\t\t\t0x50000001: 0x8200,\r\n\t\t\t\t0x60000001: 0x200,\r\n\t\t\t\t0x70000001: 0x800202,\r\n\t\t\t\t0x80000001: 0x808202,\r\n\t\t\t\t0x90000001: 0x808000,\r\n\t\t\t\t0xa0000001: 0x800002,\r\n\t\t\t\t0xb0000001: 0x8202,\r\n\t\t\t\t0xc0000001: 0x202,\r\n\t\t\t\t0xd0000001: 0x800200,\r\n\t\t\t\t0xe0000001: 0x8002,\r\n\t\t\t\t0xf0000001: 0x0,\r\n\t\t\t\t0x8000001: 0x808202,\r\n\t\t\t\t0x18000001: 0x808000,\r\n\t\t\t\t0x28000001: 0x800000,\r\n\t\t\t\t0x38000001: 0x200,\r\n\t\t\t\t0x48000001: 0x8000,\r\n\t\t\t\t0x58000001: 0x800002,\r\n\t\t\t\t0x68000001: 0x2,\r\n\t\t\t\t0x78000001: 0x8202,\r\n\t\t\t\t0x88000001: 0x8002,\r\n\t\t\t\t0x98000001: 0x800202,\r\n\t\t\t\t0xa8000001: 0x202,\r\n\t\t\t\t0xb8000001: 0x808200,\r\n\t\t\t\t0xc8000001: 0x800200,\r\n\t\t\t\t0xd8000001: 0x0,\r\n\t\t\t\t0xe8000001: 0x8200,\r\n\t\t\t\t0xf8000001: 0x808002\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t0x0: 0x40084010,\r\n\t\t\t\t0x1000000: 0x4000,\r\n\t\t\t\t0x2000000: 0x80000,\r\n\t\t\t\t0x3000000: 0x40080010,\r\n\t\t\t\t0x4000000: 0x40000010,\r\n\t\t\t\t0x5000000: 0x40084000,\r\n\t\t\t\t0x6000000: 0x40004000,\r\n\t\t\t\t0x7000000: 0x10,\r\n\t\t\t\t0x8000000: 0x84000,\r\n\t\t\t\t0x9000000: 0x40004010,\r\n\t\t\t\t0xa000000: 0x40000000,\r\n\t\t\t\t0xb000000: 0x84010,\r\n\t\t\t\t0xc000000: 0x80010,\r\n\t\t\t\t0xd000000: 0x0,\r\n\t\t\t\t0xe000000: 0x4010,\r\n\t\t\t\t0xf000000: 0x40080000,\r\n\t\t\t\t0x800000: 0x40004000,\r\n\t\t\t\t0x1800000: 0x84010,\r\n\t\t\t\t0x2800000: 0x10,\r\n\t\t\t\t0x3800000: 0x40004010,\r\n\t\t\t\t0x4800000: 0x40084010,\r\n\t\t\t\t0x5800000: 0x40000000,\r\n\t\t\t\t0x6800000: 0x80000,\r\n\t\t\t\t0x7800000: 0x40080010,\r\n\t\t\t\t0x8800000: 0x80010,\r\n\t\t\t\t0x9800000: 0x0,\r\n\t\t\t\t0xa800000: 0x4000,\r\n\t\t\t\t0xb800000: 0x40080000,\r\n\t\t\t\t0xc800000: 0x40000010,\r\n\t\t\t\t0xd800000: 0x84000,\r\n\t\t\t\t0xe800000: 0x40084000,\r\n\t\t\t\t0xf800000: 0x4010,\r\n\t\t\t\t0x10000000: 0x0,\r\n\t\t\t\t0x11000000: 0x40080010,\r\n\t\t\t\t0x12000000: 0x40004010,\r\n\t\t\t\t0x13000000: 0x40084000,\r\n\t\t\t\t0x14000000: 0x40080000,\r\n\t\t\t\t0x15000000: 0x10,\r\n\t\t\t\t0x16000000: 0x84010,\r\n\t\t\t\t0x17000000: 0x4000,\r\n\t\t\t\t0x18000000: 0x4010,\r\n\t\t\t\t0x19000000: 0x80000,\r\n\t\t\t\t0x1a000000: 0x80010,\r\n\t\t\t\t0x1b000000: 0x40000010,\r\n\t\t\t\t0x1c000000: 0x84000,\r\n\t\t\t\t0x1d000000: 0x40004000,\r\n\t\t\t\t0x1e000000: 0x40000000,\r\n\t\t\t\t0x1f000000: 0x40084010,\r\n\t\t\t\t0x10800000: 0x84010,\r\n\t\t\t\t0x11800000: 0x80000,\r\n\t\t\t\t0x12800000: 0x40080000,\r\n\t\t\t\t0x13800000: 0x4000,\r\n\t\t\t\t0x14800000: 0x40004000,\r\n\t\t\t\t0x15800000: 0x40084010,\r\n\t\t\t\t0x16800000: 0x10,\r\n\t\t\t\t0x17800000: 0x40000000,\r\n\t\t\t\t0x18800000: 0x40084000,\r\n\t\t\t\t0x19800000: 0x40000010,\r\n\t\t\t\t0x1a800000: 0x40004010,\r\n\t\t\t\t0x1b800000: 0x80010,\r\n\t\t\t\t0x1c800000: 0x0,\r\n\t\t\t\t0x1d800000: 0x4010,\r\n\t\t\t\t0x1e800000: 0x40080010,\r\n\t\t\t\t0x1f800000: 0x84000\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t0x0: 0x104,\r\n\t\t\t\t0x100000: 0x0,\r\n\t\t\t\t0x200000: 0x4000100,\r\n\t\t\t\t0x300000: 0x10104,\r\n\t\t\t\t0x400000: 0x10004,\r\n\t\t\t\t0x500000: 0x4000004,\r\n\t\t\t\t0x600000: 0x4010104,\r\n\t\t\t\t0x700000: 0x4010000,\r\n\t\t\t\t0x800000: 0x4000000,\r\n\t\t\t\t0x900000: 0x4010100,\r\n\t\t\t\t0xa00000: 0x10100,\r\n\t\t\t\t0xb00000: 0x4010004,\r\n\t\t\t\t0xc00000: 0x4000104,\r\n\t\t\t\t0xd00000: 0x10000,\r\n\t\t\t\t0xe00000: 0x4,\r\n\t\t\t\t0xf00000: 0x100,\r\n\t\t\t\t0x80000: 0x4010100,\r\n\t\t\t\t0x180000: 0x4010004,\r\n\t\t\t\t0x280000: 0x0,\r\n\t\t\t\t0x380000: 0x4000100,\r\n\t\t\t\t0x480000: 0x4000004,\r\n\t\t\t\t0x580000: 0x10000,\r\n\t\t\t\t0x680000: 0x10004,\r\n\t\t\t\t0x780000: 0x104,\r\n\t\t\t\t0x880000: 0x4,\r\n\t\t\t\t0x980000: 0x100,\r\n\t\t\t\t0xa80000: 0x4010000,\r\n\t\t\t\t0xb80000: 0x10104,\r\n\t\t\t\t0xc80000: 0x10100,\r\n\t\t\t\t0xd80000: 0x4000104,\r\n\t\t\t\t0xe80000: 0x4010104,\r\n\t\t\t\t0xf80000: 0x4000000,\r\n\t\t\t\t0x1000000: 0x4010100,\r\n\t\t\t\t0x1100000: 0x10004,\r\n\t\t\t\t0x1200000: 0x10000,\r\n\t\t\t\t0x1300000: 0x4000100,\r\n\t\t\t\t0x1400000: 0x100,\r\n\t\t\t\t0x1500000: 0x4010104,\r\n\t\t\t\t0x1600000: 0x4000004,\r\n\t\t\t\t0x1700000: 0x0,\r\n\t\t\t\t0x1800000: 0x4000104,\r\n\t\t\t\t0x1900000: 0x4000000,\r\n\t\t\t\t0x1a00000: 0x4,\r\n\t\t\t\t0x1b00000: 0x10100,\r\n\t\t\t\t0x1c00000: 0x4010000,\r\n\t\t\t\t0x1d00000: 0x104,\r\n\t\t\t\t0x1e00000: 0x10104,\r\n\t\t\t\t0x1f00000: 0x4010004,\r\n\t\t\t\t0x1080000: 0x4000000,\r\n\t\t\t\t0x1180000: 0x104,\r\n\t\t\t\t0x1280000: 0x4010100,\r\n\t\t\t\t0x1380000: 0x0,\r\n\t\t\t\t0x1480000: 0x10004,\r\n\t\t\t\t0x1580000: 0x4000100,\r\n\t\t\t\t0x1680000: 0x100,\r\n\t\t\t\t0x1780000: 0x4010004,\r\n\t\t\t\t0x1880000: 0x10000,\r\n\t\t\t\t0x1980000: 0x4010104,\r\n\t\t\t\t0x1a80000: 0x10104,\r\n\t\t\t\t0x1b80000: 0x4000004,\r\n\t\t\t\t0x1c80000: 0x4000104,\r\n\t\t\t\t0x1d80000: 0x4010000,\r\n\t\t\t\t0x1e80000: 0x4,\r\n\t\t\t\t0x1f80000: 0x10100\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t0x0: 0x80401000,\r\n\t\t\t\t0x10000: 0x80001040,\r\n\t\t\t\t0x20000: 0x401040,\r\n\t\t\t\t0x30000: 0x80400000,\r\n\t\t\t\t0x40000: 0x0,\r\n\t\t\t\t0x50000: 0x401000,\r\n\t\t\t\t0x60000: 0x80000040,\r\n\t\t\t\t0x70000: 0x400040,\r\n\t\t\t\t0x80000: 0x80000000,\r\n\t\t\t\t0x90000: 0x400000,\r\n\t\t\t\t0xa0000: 0x40,\r\n\t\t\t\t0xb0000: 0x80001000,\r\n\t\t\t\t0xc0000: 0x80400040,\r\n\t\t\t\t0xd0000: 0x1040,\r\n\t\t\t\t0xe0000: 0x1000,\r\n\t\t\t\t0xf0000: 0x80401040,\r\n\t\t\t\t0x8000: 0x80001040,\r\n\t\t\t\t0x18000: 0x40,\r\n\t\t\t\t0x28000: 0x80400040,\r\n\t\t\t\t0x38000: 0x80001000,\r\n\t\t\t\t0x48000: 0x401000,\r\n\t\t\t\t0x58000: 0x80401040,\r\n\t\t\t\t0x68000: 0x0,\r\n\t\t\t\t0x78000: 0x80400000,\r\n\t\t\t\t0x88000: 0x1000,\r\n\t\t\t\t0x98000: 0x80401000,\r\n\t\t\t\t0xa8000: 0x400000,\r\n\t\t\t\t0xb8000: 0x1040,\r\n\t\t\t\t0xc8000: 0x80000000,\r\n\t\t\t\t0xd8000: 0x400040,\r\n\t\t\t\t0xe8000: 0x401040,\r\n\t\t\t\t0xf8000: 0x80000040,\r\n\t\t\t\t0x100000: 0x400040,\r\n\t\t\t\t0x110000: 0x401000,\r\n\t\t\t\t0x120000: 0x80000040,\r\n\t\t\t\t0x130000: 0x0,\r\n\t\t\t\t0x140000: 0x1040,\r\n\t\t\t\t0x150000: 0x80400040,\r\n\t\t\t\t0x160000: 0x80401000,\r\n\t\t\t\t0x170000: 0x80001040,\r\n\t\t\t\t0x180000: 0x80401040,\r\n\t\t\t\t0x190000: 0x80000000,\r\n\t\t\t\t0x1a0000: 0x80400000,\r\n\t\t\t\t0x1b0000: 0x401040,\r\n\t\t\t\t0x1c0000: 0x80001000,\r\n\t\t\t\t0x1d0000: 0x400000,\r\n\t\t\t\t0x1e0000: 0x40,\r\n\t\t\t\t0x1f0000: 0x1000,\r\n\t\t\t\t0x108000: 0x80400000,\r\n\t\t\t\t0x118000: 0x80401040,\r\n\t\t\t\t0x128000: 0x0,\r\n\t\t\t\t0x138000: 0x401000,\r\n\t\t\t\t0x148000: 0x400040,\r\n\t\t\t\t0x158000: 0x80000000,\r\n\t\t\t\t0x168000: 0x80001040,\r\n\t\t\t\t0x178000: 0x40,\r\n\t\t\t\t0x188000: 0x80000040,\r\n\t\t\t\t0x198000: 0x1000,\r\n\t\t\t\t0x1a8000: 0x80001000,\r\n\t\t\t\t0x1b8000: 0x80400040,\r\n\t\t\t\t0x1c8000: 0x1040,\r\n\t\t\t\t0x1d8000: 0x80401000,\r\n\t\t\t\t0x1e8000: 0x400000,\r\n\t\t\t\t0x1f8000: 0x401040\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t0x0: 0x80,\r\n\t\t\t\t0x1000: 0x1040000,\r\n\t\t\t\t0x2000: 0x40000,\r\n\t\t\t\t0x3000: 0x20000000,\r\n\t\t\t\t0x4000: 0x20040080,\r\n\t\t\t\t0x5000: 0x1000080,\r\n\t\t\t\t0x6000: 0x21000080,\r\n\t\t\t\t0x7000: 0x40080,\r\n\t\t\t\t0x8000: 0x1000000,\r\n\t\t\t\t0x9000: 0x20040000,\r\n\t\t\t\t0xa000: 0x20000080,\r\n\t\t\t\t0xb000: 0x21040080,\r\n\t\t\t\t0xc000: 0x21040000,\r\n\t\t\t\t0xd000: 0x0,\r\n\t\t\t\t0xe000: 0x1040080,\r\n\t\t\t\t0xf000: 0x21000000,\r\n\t\t\t\t0x800: 0x1040080,\r\n\t\t\t\t0x1800: 0x21000080,\r\n\t\t\t\t0x2800: 0x80,\r\n\t\t\t\t0x3800: 0x1040000,\r\n\t\t\t\t0x4800: 0x40000,\r\n\t\t\t\t0x5800: 0x20040080,\r\n\t\t\t\t0x6800: 0x21040000,\r\n\t\t\t\t0x7800: 0x20000000,\r\n\t\t\t\t0x8800: 0x20040000,\r\n\t\t\t\t0x9800: 0x0,\r\n\t\t\t\t0xa800: 0x21040080,\r\n\t\t\t\t0xb800: 0x1000080,\r\n\t\t\t\t0xc800: 0x20000080,\r\n\t\t\t\t0xd800: 0x21000000,\r\n\t\t\t\t0xe800: 0x1000000,\r\n\t\t\t\t0xf800: 0x40080,\r\n\t\t\t\t0x10000: 0x40000,\r\n\t\t\t\t0x11000: 0x80,\r\n\t\t\t\t0x12000: 0x20000000,\r\n\t\t\t\t0x13000: 0x21000080,\r\n\t\t\t\t0x14000: 0x1000080,\r\n\t\t\t\t0x15000: 0x21040000,\r\n\t\t\t\t0x16000: 0x20040080,\r\n\t\t\t\t0x17000: 0x1000000,\r\n\t\t\t\t0x18000: 0x21040080,\r\n\t\t\t\t0x19000: 0x21000000,\r\n\t\t\t\t0x1a000: 0x1040000,\r\n\t\t\t\t0x1b000: 0x20040000,\r\n\t\t\t\t0x1c000: 0x40080,\r\n\t\t\t\t0x1d000: 0x20000080,\r\n\t\t\t\t0x1e000: 0x0,\r\n\t\t\t\t0x1f000: 0x1040080,\r\n\t\t\t\t0x10800: 0x21000080,\r\n\t\t\t\t0x11800: 0x1000000,\r\n\t\t\t\t0x12800: 0x1040000,\r\n\t\t\t\t0x13800: 0x20040080,\r\n\t\t\t\t0x14800: 0x20000000,\r\n\t\t\t\t0x15800: 0x1040080,\r\n\t\t\t\t0x16800: 0x80,\r\n\t\t\t\t0x17800: 0x21040000,\r\n\t\t\t\t0x18800: 0x40080,\r\n\t\t\t\t0x19800: 0x21040080,\r\n\t\t\t\t0x1a800: 0x0,\r\n\t\t\t\t0x1b800: 0x21000000,\r\n\t\t\t\t0x1c800: 0x1000080,\r\n\t\t\t\t0x1d800: 0x40000,\r\n\t\t\t\t0x1e800: 0x20040000,\r\n\t\t\t\t0x1f800: 0x20000080\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t0x0: 0x10000008,\r\n\t\t\t\t0x100: 0x2000,\r\n\t\t\t\t0x200: 0x10200000,\r\n\t\t\t\t0x300: 0x10202008,\r\n\t\t\t\t0x400: 0x10002000,\r\n\t\t\t\t0x500: 0x200000,\r\n\t\t\t\t0x600: 0x200008,\r\n\t\t\t\t0x700: 0x10000000,\r\n\t\t\t\t0x800: 0x0,\r\n\t\t\t\t0x900: 0x10002008,\r\n\t\t\t\t0xa00: 0x202000,\r\n\t\t\t\t0xb00: 0x8,\r\n\t\t\t\t0xc00: 0x10200008,\r\n\t\t\t\t0xd00: 0x202008,\r\n\t\t\t\t0xe00: 0x2008,\r\n\t\t\t\t0xf00: 0x10202000,\r\n\t\t\t\t0x80: 0x10200000,\r\n\t\t\t\t0x180: 0x10202008,\r\n\t\t\t\t0x280: 0x8,\r\n\t\t\t\t0x380: 0x200000,\r\n\t\t\t\t0x480: 0x202008,\r\n\t\t\t\t0x580: 0x10000008,\r\n\t\t\t\t0x680: 0x10002000,\r\n\t\t\t\t0x780: 0x2008,\r\n\t\t\t\t0x880: 0x200008,\r\n\t\t\t\t0x980: 0x2000,\r\n\t\t\t\t0xa80: 0x10002008,\r\n\t\t\t\t0xb80: 0x10200008,\r\n\t\t\t\t0xc80: 0x0,\r\n\t\t\t\t0xd80: 0x10202000,\r\n\t\t\t\t0xe80: 0x202000,\r\n\t\t\t\t0xf80: 0x10000000,\r\n\t\t\t\t0x1000: 0x10002000,\r\n\t\t\t\t0x1100: 0x10200008,\r\n\t\t\t\t0x1200: 0x10202008,\r\n\t\t\t\t0x1300: 0x2008,\r\n\t\t\t\t0x1400: 0x200000,\r\n\t\t\t\t0x1500: 0x10000000,\r\n\t\t\t\t0x1600: 0x10000008,\r\n\t\t\t\t0x1700: 0x202000,\r\n\t\t\t\t0x1800: 0x202008,\r\n\t\t\t\t0x1900: 0x0,\r\n\t\t\t\t0x1a00: 0x8,\r\n\t\t\t\t0x1b00: 0x10200000,\r\n\t\t\t\t0x1c00: 0x2000,\r\n\t\t\t\t0x1d00: 0x10002008,\r\n\t\t\t\t0x1e00: 0x10202000,\r\n\t\t\t\t0x1f00: 0x200008,\r\n\t\t\t\t0x1080: 0x8,\r\n\t\t\t\t0x1180: 0x202000,\r\n\t\t\t\t0x1280: 0x200000,\r\n\t\t\t\t0x1380: 0x10000008,\r\n\t\t\t\t0x1480: 0x10002000,\r\n\t\t\t\t0x1580: 0x2008,\r\n\t\t\t\t0x1680: 0x10202008,\r\n\t\t\t\t0x1780: 0x10200000,\r\n\t\t\t\t0x1880: 0x10202000,\r\n\t\t\t\t0x1980: 0x10200008,\r\n\t\t\t\t0x1a80: 0x2000,\r\n\t\t\t\t0x1b80: 0x202008,\r\n\t\t\t\t0x1c80: 0x200008,\r\n\t\t\t\t0x1d80: 0x0,\r\n\t\t\t\t0x1e80: 0x10000000,\r\n\t\t\t\t0x1f80: 0x10002008\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t0x0: 0x100000,\r\n\t\t\t\t0x10: 0x2000401,\r\n\t\t\t\t0x20: 0x400,\r\n\t\t\t\t0x30: 0x100401,\r\n\t\t\t\t0x40: 0x2100401,\r\n\t\t\t\t0x50: 0x0,\r\n\t\t\t\t0x60: 0x1,\r\n\t\t\t\t0x70: 0x2100001,\r\n\t\t\t\t0x80: 0x2000400,\r\n\t\t\t\t0x90: 0x100001,\r\n\t\t\t\t0xa0: 0x2000001,\r\n\t\t\t\t0xb0: 0x2100400,\r\n\t\t\t\t0xc0: 0x2100000,\r\n\t\t\t\t0xd0: 0x401,\r\n\t\t\t\t0xe0: 0x100400,\r\n\t\t\t\t0xf0: 0x2000000,\r\n\t\t\t\t0x8: 0x2100001,\r\n\t\t\t\t0x18: 0x0,\r\n\t\t\t\t0x28: 0x2000401,\r\n\t\t\t\t0x38: 0x2100400,\r\n\t\t\t\t0x48: 0x100000,\r\n\t\t\t\t0x58: 0x2000001,\r\n\t\t\t\t0x68: 0x2000000,\r\n\t\t\t\t0x78: 0x401,\r\n\t\t\t\t0x88: 0x100401,\r\n\t\t\t\t0x98: 0x2000400,\r\n\t\t\t\t0xa8: 0x2100000,\r\n\t\t\t\t0xb8: 0x100001,\r\n\t\t\t\t0xc8: 0x400,\r\n\t\t\t\t0xd8: 0x2100401,\r\n\t\t\t\t0xe8: 0x1,\r\n\t\t\t\t0xf8: 0x100400,\r\n\t\t\t\t0x100: 0x2000000,\r\n\t\t\t\t0x110: 0x100000,\r\n\t\t\t\t0x120: 0x2000401,\r\n\t\t\t\t0x130: 0x2100001,\r\n\t\t\t\t0x140: 0x100001,\r\n\t\t\t\t0x150: 0x2000400,\r\n\t\t\t\t0x160: 0x2100400,\r\n\t\t\t\t0x170: 0x100401,\r\n\t\t\t\t0x180: 0x401,\r\n\t\t\t\t0x190: 0x2100401,\r\n\t\t\t\t0x1a0: 0x100400,\r\n\t\t\t\t0x1b0: 0x1,\r\n\t\t\t\t0x1c0: 0x0,\r\n\t\t\t\t0x1d0: 0x2100000,\r\n\t\t\t\t0x1e0: 0x2000001,\r\n\t\t\t\t0x1f0: 0x400,\r\n\t\t\t\t0x108: 0x100400,\r\n\t\t\t\t0x118: 0x2000401,\r\n\t\t\t\t0x128: 0x2100001,\r\n\t\t\t\t0x138: 0x1,\r\n\t\t\t\t0x148: 0x2000000,\r\n\t\t\t\t0x158: 0x100000,\r\n\t\t\t\t0x168: 0x401,\r\n\t\t\t\t0x178: 0x2100400,\r\n\t\t\t\t0x188: 0x2000001,\r\n\t\t\t\t0x198: 0x2100000,\r\n\t\t\t\t0x1a8: 0x0,\r\n\t\t\t\t0x1b8: 0x2100401,\r\n\t\t\t\t0x1c8: 0x100401,\r\n\t\t\t\t0x1d8: 0x400,\r\n\t\t\t\t0x1e8: 0x2000400,\r\n\t\t\t\t0x1f8: 0x100001\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t0x0: 0x8000820,\r\n\t\t\t\t0x1: 0x20000,\r\n\t\t\t\t0x2: 0x8000000,\r\n\t\t\t\t0x3: 0x20,\r\n\t\t\t\t0x4: 0x20020,\r\n\t\t\t\t0x5: 0x8020820,\r\n\t\t\t\t0x6: 0x8020800,\r\n\t\t\t\t0x7: 0x800,\r\n\t\t\t\t0x8: 0x8020000,\r\n\t\t\t\t0x9: 0x8000800,\r\n\t\t\t\t0xa: 0x20800,\r\n\t\t\t\t0xb: 0x8020020,\r\n\t\t\t\t0xc: 0x820,\r\n\t\t\t\t0xd: 0x0,\r\n\t\t\t\t0xe: 0x8000020,\r\n\t\t\t\t0xf: 0x20820,\r\n\t\t\t\t0x80000000: 0x800,\r\n\t\t\t\t0x80000001: 0x8020820,\r\n\t\t\t\t0x80000002: 0x8000820,\r\n\t\t\t\t0x80000003: 0x8000000,\r\n\t\t\t\t0x80000004: 0x8020000,\r\n\t\t\t\t0x80000005: 0x20800,\r\n\t\t\t\t0x80000006: 0x20820,\r\n\t\t\t\t0x80000007: 0x20,\r\n\t\t\t\t0x80000008: 0x8000020,\r\n\t\t\t\t0x80000009: 0x820,\r\n\t\t\t\t0x8000000a: 0x20020,\r\n\t\t\t\t0x8000000b: 0x8020800,\r\n\t\t\t\t0x8000000c: 0x0,\r\n\t\t\t\t0x8000000d: 0x8020020,\r\n\t\t\t\t0x8000000e: 0x8000800,\r\n\t\t\t\t0x8000000f: 0x20000,\r\n\t\t\t\t0x10: 0x20820,\r\n\t\t\t\t0x11: 0x8020800,\r\n\t\t\t\t0x12: 0x20,\r\n\t\t\t\t0x13: 0x800,\r\n\t\t\t\t0x14: 0x8000800,\r\n\t\t\t\t0x15: 0x8000020,\r\n\t\t\t\t0x16: 0x8020020,\r\n\t\t\t\t0x17: 0x20000,\r\n\t\t\t\t0x18: 0x0,\r\n\t\t\t\t0x19: 0x20020,\r\n\t\t\t\t0x1a: 0x8020000,\r\n\t\t\t\t0x1b: 0x8000820,\r\n\t\t\t\t0x1c: 0x8020820,\r\n\t\t\t\t0x1d: 0x20800,\r\n\t\t\t\t0x1e: 0x820,\r\n\t\t\t\t0x1f: 0x8000000,\r\n\t\t\t\t0x80000010: 0x20000,\r\n\t\t\t\t0x80000011: 0x800,\r\n\t\t\t\t0x80000012: 0x8020020,\r\n\t\t\t\t0x80000013: 0x20820,\r\n\t\t\t\t0x80000014: 0x20,\r\n\t\t\t\t0x80000015: 0x8020000,\r\n\t\t\t\t0x80000016: 0x8000000,\r\n\t\t\t\t0x80000017: 0x8000820,\r\n\t\t\t\t0x80000018: 0x8020820,\r\n\t\t\t\t0x80000019: 0x8000020,\r\n\t\t\t\t0x8000001a: 0x8000800,\r\n\t\t\t\t0x8000001b: 0x0,\r\n\t\t\t\t0x8000001c: 0x20800,\r\n\t\t\t\t0x8000001d: 0x820,\r\n\t\t\t\t0x8000001e: 0x20020,\r\n\t\t\t\t0x8000001f: 0x8020800\r\n\t\t\t}\r\n\t\t];\r\n\r\n\t\t// Masks that select the SBOX input\r\n\t\tvar SBOX_MASK = [\r\n\t\t\t0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\r\n\t\t\t0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\r\n\t\t];\r\n\r\n\t\t/**\r\n\t\t * DES block cipher algorithm.\r\n\t\t */\r\n\t\tvar DES = C_algo.DES = BlockCipher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar key = this._key;\r\n\t\t\t\tvar keyWords = key.words;\r\n\r\n\t\t\t\t// Select 56 bits according to PC1\r\n\t\t\t\tvar keyBits = [];\r\n\t\t\t\tfor (var i = 0; i < 56; i++) {\r\n\t\t\t\t\tvar keyBitPos = PC1[i] - 1;\r\n\t\t\t\t\tkeyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Assemble 16 subkeys\r\n\t\t\t\tvar subKeys = this._subKeys = [];\r\n\t\t\t\tfor (var nSubKey = 0; nSubKey < 16; nSubKey++) {\r\n\t\t\t\t\t// Create subkey\r\n\t\t\t\t\tvar subKey = subKeys[nSubKey] = [];\r\n\r\n\t\t\t\t\t// Shortcut\r\n\t\t\t\t\tvar bitShift = BIT_SHIFTS[nSubKey];\r\n\r\n\t\t\t\t\t// Select 48 bits according to PC2\r\n\t\t\t\t\tfor (var i = 0; i < 24; i++) {\r\n\t\t\t\t\t\t// Select from the left 28 key bits\r\n\t\t\t\t\t\tsubKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 -\r\n\t\t\t\t\t\t\ti % 6);\r\n\r\n\t\t\t\t\t\t// Select from the right 28 key bits\r\n\t\t\t\t\t\tsubKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) +\r\n\t\t\t\t\t\t\tbitShift) % 28)] << (31 - i % 6);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Since each subkey is applied to an expanded 32-bit input,\r\n\t\t\t\t\t// the subkey can be broken into 8 values scaled to 32-bits,\r\n\t\t\t\t\t// which allows the key to be used without expansion\r\n\t\t\t\t\tsubKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\r\n\t\t\t\t\tfor (var i = 1; i < 7; i++) {\r\n\t\t\t\t\t\tsubKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsubKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Compute inverse subkeys\r\n\t\t\t\tvar invSubKeys = this._invSubKeys = [];\r\n\t\t\t\tfor (var i = 0; i < 16; i++) {\r\n\t\t\t\t\tinvSubKeys[i] = subKeys[15 - i];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tencryptBlock: function(M, offset) {\r\n\t\t\t\tthis._doCryptBlock(M, offset, this._subKeys);\r\n\t\t\t},\r\n\r\n\t\t\tdecryptBlock: function(M, offset) {\r\n\t\t\t\tthis._doCryptBlock(M, offset, this._invSubKeys);\r\n\t\t\t},\r\n\r\n\t\t\t_doCryptBlock: function(M, offset, subKeys) {\r\n\t\t\t\t// Get input\r\n\t\t\t\tthis._lBlock = M[offset];\r\n\t\t\t\tthis._rBlock = M[offset + 1];\r\n\r\n\t\t\t\t// Initial permutation\r\n\t\t\t\texchangeLR.call(this, 4, 0x0f0f0f0f);\r\n\t\t\t\texchangeLR.call(this, 16, 0x0000ffff);\r\n\t\t\t\texchangeRL.call(this, 2, 0x33333333);\r\n\t\t\t\texchangeRL.call(this, 8, 0x00ff00ff);\r\n\t\t\t\texchangeLR.call(this, 1, 0x55555555);\r\n\r\n\t\t\t\t// Rounds\r\n\t\t\t\tfor (var round = 0; round < 16; round++) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar subKey = subKeys[round];\r\n\t\t\t\t\tvar lBlock = this._lBlock;\r\n\t\t\t\t\tvar rBlock = this._rBlock;\r\n\r\n\t\t\t\t\t// Feistel function\r\n\t\t\t\t\tvar f = 0;\r\n\t\t\t\t\tfor (var i = 0; i < 8; i++) {\r\n\t\t\t\t\t\tf |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._lBlock = rBlock;\r\n\t\t\t\t\tthis._rBlock = lBlock ^ f;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Undo swap from last round\r\n\t\t\t\tvar t = this._lBlock;\r\n\t\t\t\tthis._lBlock = this._rBlock;\r\n\t\t\t\tthis._rBlock = t;\r\n\r\n\t\t\t\t// Final permutation\r\n\t\t\t\texchangeLR.call(this, 1, 0x55555555);\r\n\t\t\t\texchangeRL.call(this, 8, 0x00ff00ff);\r\n\t\t\t\texchangeRL.call(this, 2, 0x33333333);\r\n\t\t\t\texchangeLR.call(this, 16, 0x0000ffff);\r\n\t\t\t\texchangeLR.call(this, 4, 0x0f0f0f0f);\r\n\r\n\t\t\t\t// Set output\r\n\t\t\t\tM[offset] = this._lBlock;\r\n\t\t\t\tM[offset + 1] = this._rBlock;\r\n\t\t\t},\r\n\r\n\t\t\tkeySize: 64 / 32,\r\n\r\n\t\t\tivSize: 64 / 32,\r\n\r\n\t\t\tblockSize: 64 / 32\r\n\t\t});\r\n\r\n\t\t// Swap bits across the left and right words\r\n\t\tfunction exchangeLR(offset, mask) {\r\n\t\t\tvar t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\r\n\t\t\tthis._rBlock ^= t;\r\n\t\t\tthis._lBlock ^= t << offset;\r\n\t\t}\r\n\r\n\t\tfunction exchangeRL(offset, mask) {\r\n\t\t\tvar t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\r\n\t\t\tthis._lBlock ^= t;\r\n\t\t\tthis._rBlock ^= t << offset;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Shortcut functions to the cipher's object interface.\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\r\n\t\t * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);\r\n\t\t */\r\n\t\tC.DES = BlockCipher._createHelper(DES);\r\n\r\n\t\t/**\r\n\t\t * Triple-DES block cipher algorithm.\r\n\t\t */\r\n\t\tvar TripleDES = C_algo.TripleDES = BlockCipher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar key = this._key;\r\n\t\t\t\tvar keyWords = key.words;\r\n\r\n\t\t\t\t// Create DES instances\r\n\t\t\t\tthis._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));\r\n\t\t\t\tthis._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));\r\n\t\t\t\tthis._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));\r\n\t\t\t},\r\n\r\n\t\t\tencryptBlock: function(M, offset) {\r\n\t\t\t\tthis._des1.encryptBlock(M, offset);\r\n\t\t\t\tthis._des2.decryptBlock(M, offset);\r\n\t\t\t\tthis._des3.encryptBlock(M, offset);\r\n\t\t\t},\r\n\r\n\t\t\tdecryptBlock: function(M, offset) {\r\n\t\t\t\tthis._des3.decryptBlock(M, offset);\r\n\t\t\t\tthis._des2.encryptBlock(M, offset);\r\n\t\t\t\tthis._des1.decryptBlock(M, offset);\r\n\t\t\t},\r\n\r\n\t\t\tkeySize: 192 / 32,\r\n\r\n\t\t\tivSize: 64 / 32,\r\n\r\n\t\t\tblockSize: 64 / 32\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut functions to the cipher's object interface.\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\r\n\t\t * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\r\n\t\t */\r\n\t\tC.TripleDES = BlockCipher._createHelper(TripleDES);\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar StreamCipher = C_lib.StreamCipher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t/**\r\n\t\t * RC4 stream cipher algorithm.\r\n\t\t */\r\n\t\tvar RC4 = C_algo.RC4 = StreamCipher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar key = this._key;\r\n\t\t\t\tvar keyWords = key.words;\r\n\t\t\t\tvar keySigBytes = key.sigBytes;\r\n\r\n\t\t\t\t// Init sbox\r\n\t\t\t\tvar S = this._S = [];\r\n\t\t\t\tfor (var i = 0; i < 256; i++) {\r\n\t\t\t\t\tS[i] = i;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Key setup\r\n\t\t\t\tfor (var i = 0, j = 0; i < 256; i++) {\r\n\t\t\t\t\tvar keyByteIndex = i % keySigBytes;\r\n\t\t\t\t\tvar keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) *\r\n\t\t\t\t\t\t8)) & 0xff;\r\n\r\n\t\t\t\t\tj = (j + S[i] + keyByte) % 256;\r\n\r\n\t\t\t\t\t// Swap\r\n\t\t\t\t\tvar t = S[i];\r\n\t\t\t\t\tS[i] = S[j];\r\n\t\t\t\t\tS[j] = t;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Counters\r\n\t\t\t\tthis._i = this._j = 0;\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\tM[offset] ^= generateKeystreamWord.call(this);\r\n\t\t\t},\r\n\r\n\t\t\tkeySize: 256 / 32,\r\n\r\n\t\t\tivSize: 0\r\n\t\t});\r\n\r\n\t\tfunction generateKeystreamWord() {\r\n\t\t\t// Shortcuts\r\n\t\t\tvar S = this._S;\r\n\t\t\tvar i = this._i;\r\n\t\t\tvar j = this._j;\r\n\r\n\t\t\t// Generate keystream word\r\n\t\t\tvar keystreamWord = 0;\r\n\t\t\tfor (var n = 0; n < 4; n++) {\r\n\t\t\t\ti = (i + 1) % 256;\r\n\t\t\t\tj = (j + S[i]) % 256;\r\n\r\n\t\t\t\t// Swap\r\n\t\t\t\tvar t = S[i];\r\n\t\t\t\tS[i] = S[j];\r\n\t\t\t\tS[j] = t;\r\n\r\n\t\t\t\tkeystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\r\n\t\t\t}\r\n\r\n\t\t\t// Update counters\r\n\t\t\tthis._i = i;\r\n\t\t\tthis._j = j;\r\n\r\n\t\t\treturn keystreamWord;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Shortcut functions to the cipher's object interface.\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\r\n\t\t * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\r\n\t\t */\r\n\t\tC.RC4 = StreamCipher._createHelper(RC4);\r\n\r\n\t\t/**\r\n\t\t * Modified RC4 stream cipher algorithm.\r\n\t\t */\r\n\t\tvar RC4Drop = C_algo.RC4Drop = RC4.extend({\r\n\t\t\t/**\r\n\t\t\t * Configuration options.\r\n\t\t\t *\r\n\t\t\t * @property {number} drop The number of keystream words to drop. Default 192\r\n\t\t\t */\r\n\t\t\tcfg: RC4.cfg.extend({\r\n\t\t\t\tdrop: 192\r\n\t\t\t}),\r\n\r\n\t\t\t_doReset: function() {\r\n\t\t\t\tRC4._doReset.call(this);\r\n\r\n\t\t\t\t// Drop\r\n\t\t\t\tfor (var i = this.cfg.drop; i > 0; i--) {\r\n\t\t\t\t\tgenerateKeystreamWord.call(this);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Shortcut functions to the cipher's object interface.\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\r\n\t\t * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\r\n\t\t */\r\n\t\tC.RC4Drop = StreamCipher._createHelper(RC4Drop);\r\n\t}());\r\n\r\n\r\n\t/** @preserve\r\n\t * Counter block mode compatible with Dr Brian Gladman fileenc.c\r\n\t * derived from CryptoJS.mode.CTR\r\n\t * Jan Hruby jhruby.web@gmail.com\r\n\t */\r\n\tCryptoJS.mode.CTRGladman = (function() {\r\n\t\tvar CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\r\n\r\n\t\tfunction incWord(word) {\r\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\r\n\t\t\t\tvar b1 = (word >> 16) & 0xff;\r\n\t\t\t\tvar b2 = (word >> 8) & 0xff;\r\n\t\t\t\tvar b3 = word & 0xff;\r\n\r\n\t\t\t\tif (b1 === 0xff) // overflow b1\r\n\t\t\t\t{\r\n\t\t\t\t\tb1 = 0;\r\n\t\t\t\t\tif (b2 === 0xff) {\r\n\t\t\t\t\t\tb2 = 0;\r\n\t\t\t\t\t\tif (b3 === 0xff) {\r\n\t\t\t\t\t\t\tb3 = 0;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t++b3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t++b2;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t++b1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tword = 0;\r\n\t\t\t\tword += (b1 << 16);\r\n\t\t\t\tword += (b2 << 8);\r\n\t\t\t\tword += b3;\r\n\t\t\t} else {\r\n\t\t\t\tword += (0x01 << 24);\r\n\t\t\t}\r\n\t\t\treturn word;\r\n\t\t}\r\n\r\n\t\tfunction incCounter(counter) {\r\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0) {\r\n\t\t\t\t// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8\r\n\t\t\t\tcounter[1] = incWord(counter[1]);\r\n\t\t\t}\r\n\t\t\treturn counter;\r\n\t\t}\r\n\r\n\t\tvar Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\r\n\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar cipher = this._cipher\r\n\t\t\t\tvar blockSize = cipher.blockSize;\r\n\t\t\t\tvar iv = this._iv;\r\n\t\t\t\tvar counter = this._counter;\r\n\r\n\t\t\t\t// Generate keystream\r\n\t\t\t\tif (iv) {\r\n\t\t\t\t\tcounter = this._counter = iv.slice(0);\r\n\r\n\t\t\t\t\t// Remove IV for subsequent blocks\r\n\t\t\t\t\tthis._iv = undefined;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tincCounter(counter);\r\n\r\n\t\t\t\tvar keystream = counter.slice(0);\r\n\t\t\t\tcipher.encryptBlock(keystream, 0);\r\n\r\n\t\t\t\t// Encrypt\r\n\t\t\t\tfor (var i = 0; i < blockSize; i++) {\r\n\t\t\t\t\twords[offset + i] ^= keystream[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tCTRGladman.Decryptor = Encryptor;\r\n\r\n\t\treturn CTRGladman;\r\n\t}());\r\n\r\n\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar StreamCipher = C_lib.StreamCipher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Reusable objects\r\n\t\tvar S = [];\r\n\t\tvar C_ = [];\r\n\t\tvar G = [];\r\n\r\n\t\t/**\r\n\t\t * Rabbit stream cipher algorithm\r\n\t\t */\r\n\t\tvar Rabbit = C_algo.Rabbit = StreamCipher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar K = this._key.words;\r\n\t\t\t\tvar iv = this.cfg.iv;\r\n\r\n\t\t\t\t// Swap endian\r\n\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\tK[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Generate initial state values\r\n\t\t\t\tvar X = this._X = [\r\n\t\t\t\t\tK[0], (K[3] << 16) | (K[2] >>> 16),\r\n\t\t\t\t\tK[1], (K[0] << 16) | (K[3] >>> 16),\r\n\t\t\t\t\tK[2], (K[1] << 16) | (K[0] >>> 16),\r\n\t\t\t\t\tK[3], (K[2] << 16) | (K[1] >>> 16)\r\n\t\t\t\t];\r\n\r\n\t\t\t\t// Generate initial counter values\r\n\t\t\t\tvar C = this._C = [\r\n\t\t\t\t\t(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\r\n\t\t\t\t\t(K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\r\n\t\t\t\t\t(K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\r\n\t\t\t\t\t(K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\r\n\t\t\t\t];\r\n\r\n\t\t\t\t// Carry bit\r\n\t\t\t\tthis._b = 0;\r\n\r\n\t\t\t\t// Iterate the system four times\r\n\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\tnextState.call(this);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Modify the counters\r\n\t\t\t\tfor (var i = 0; i < 8; i++) {\r\n\t\t\t\t\tC[i] ^= X[(i + 4) & 7];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// IV setup\r\n\t\t\t\tif (iv) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar IV = iv.words;\r\n\t\t\t\t\tvar IV_0 = IV[0];\r\n\t\t\t\t\tvar IV_1 = IV[1];\r\n\r\n\t\t\t\t\t// Generate four subvectors\r\n\t\t\t\t\tvar i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (\r\n\t\t\t\t\t\tIV_0 >>> 8)) & 0xff00ff00);\r\n\t\t\t\t\tvar i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (\r\n\t\t\t\t\t\tIV_1 >>> 8)) & 0xff00ff00);\r\n\t\t\t\t\tvar i1 = (i0 >>> 16) | (i2 & 0xffff0000);\r\n\t\t\t\t\tvar i3 = (i2 << 16) | (i0 & 0x0000ffff);\r\n\r\n\t\t\t\t\t// Modify counter values\r\n\t\t\t\t\tC[0] ^= i0;\r\n\t\t\t\t\tC[1] ^= i1;\r\n\t\t\t\t\tC[2] ^= i2;\r\n\t\t\t\t\tC[3] ^= i3;\r\n\t\t\t\t\tC[4] ^= i0;\r\n\t\t\t\t\tC[5] ^= i1;\r\n\t\t\t\t\tC[6] ^= i2;\r\n\t\t\t\t\tC[7] ^= i3;\r\n\r\n\t\t\t\t\t// Iterate the system four times\r\n\t\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\t\tnextState.call(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar X = this._X;\r\n\r\n\t\t\t\t// Iterate the system\r\n\t\t\t\tnextState.call(this);\r\n\r\n\t\t\t\t// Generate four keystream words\r\n\t\t\t\tS[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\r\n\t\t\t\tS[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\r\n\t\t\t\tS[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\r\n\t\t\t\tS[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\r\n\r\n\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\t// Swap endian\r\n\t\t\t\t\tS[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\r\n\r\n\t\t\t\t\t// Encrypt\r\n\t\t\t\t\tM[offset + i] ^= S[i];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tblockSize: 128 / 32,\r\n\r\n\t\t\tivSize: 64 / 32\r\n\t\t});\r\n\r\n\t\tfunction nextState() {\r\n\t\t\t// Shortcuts\r\n\t\t\tvar X = this._X;\r\n\t\t\tvar C = this._C;\r\n\r\n\t\t\t// Save old counter values\r\n\t\t\tfor (var i = 0; i < 8; i++) {\r\n\t\t\t\tC_[i] = C[i];\r\n\t\t\t}\r\n\r\n\t\t\t// Calculate new counter values\r\n\t\t\tC[0] = (C[0] + 0x4d34d34d + this._b) | 0;\r\n\t\t\tC[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tthis._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\r\n\r\n\t\t\t// Calculate the g-values\r\n\t\t\tfor (var i = 0; i < 8; i++) {\r\n\t\t\t\tvar gx = X[i] + C[i];\r\n\r\n\t\t\t\t// Construct high and low argument for squaring\r\n\t\t\t\tvar ga = gx & 0xffff;\r\n\t\t\t\tvar gb = gx >>> 16;\r\n\r\n\t\t\t\t// Calculate high and low result of squaring\r\n\t\t\t\tvar gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\r\n\t\t\t\tvar gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\r\n\r\n\t\t\t\t// High XOR low\r\n\t\t\t\tG[i] = gh ^ gl;\r\n\t\t\t}\r\n\r\n\t\t\t// Calculate new state values\r\n\t\t\tX[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\r\n\t\t\tX[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\r\n\t\t\tX[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\r\n\t\t\tX[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\r\n\t\t\tX[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\r\n\t\t\tX[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\r\n\t\t\tX[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\r\n\t\t\tX[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Shortcut functions to the cipher's object interface.\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\r\n\t\t * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\r\n\t\t */\r\n\t\tC.Rabbit = StreamCipher._createHelper(Rabbit);\r\n\t}());\r\n\r\n\r\n\t/**\r\n\t * Counter block mode.\r\n\t */\r\n\tCryptoJS.mode.CTR = (function() {\r\n\t\tvar CTR = CryptoJS.lib.BlockCipherMode.extend();\r\n\r\n\t\tvar Encryptor = CTR.Encryptor = CTR.extend({\r\n\t\t\tprocessBlock: function(words, offset) {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar cipher = this._cipher\r\n\t\t\t\tvar blockSize = cipher.blockSize;\r\n\t\t\t\tvar iv = this._iv;\r\n\t\t\t\tvar counter = this._counter;\r\n\r\n\t\t\t\t// Generate keystream\r\n\t\t\t\tif (iv) {\r\n\t\t\t\t\tcounter = this._counter = iv.slice(0);\r\n\r\n\t\t\t\t\t// Remove IV for subsequent blocks\r\n\t\t\t\t\tthis._iv = undefined;\r\n\t\t\t\t}\r\n\t\t\t\tvar keystream = counter.slice(0);\r\n\t\t\t\tcipher.encryptBlock(keystream, 0);\r\n\r\n\t\t\t\t// Increment counter\r\n\t\t\t\tcounter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\r\n\r\n\t\t\t\t// Encrypt\r\n\t\t\t\tfor (var i = 0; i < blockSize; i++) {\r\n\t\t\t\t\twords[offset + i] ^= keystream[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tCTR.Decryptor = Encryptor;\r\n\r\n\t\treturn CTR;\r\n\t}());\r\n\r\n\r\n\t(function() {\r\n\t\t// Shortcuts\r\n\t\tvar C = CryptoJS;\r\n\t\tvar C_lib = C.lib;\r\n\t\tvar StreamCipher = C_lib.StreamCipher;\r\n\t\tvar C_algo = C.algo;\r\n\r\n\t\t// Reusable objects\r\n\t\tvar S = [];\r\n\t\tvar C_ = [];\r\n\t\tvar G = [];\r\n\r\n\t\t/**\r\n\t\t * Rabbit stream cipher algorithm.\r\n\t\t *\r\n\t\t * This is a legacy version that neglected to convert the key to little-endian.\r\n\t\t * This error doesn't affect the cipher's security,\r\n\t\t * but it does affect its compatibility with other implementations.\r\n\t\t */\r\n\t\tvar RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\r\n\t\t\t_doReset: function() {\r\n\t\t\t\t// Shortcuts\r\n\t\t\t\tvar K = this._key.words;\r\n\t\t\t\tvar iv = this.cfg.iv;\r\n\r\n\t\t\t\t// Generate initial state values\r\n\t\t\t\tvar X = this._X = [\r\n\t\t\t\t\tK[0], (K[3] << 16) | (K[2] >>> 16),\r\n\t\t\t\t\tK[1], (K[0] << 16) | (K[3] >>> 16),\r\n\t\t\t\t\tK[2], (K[1] << 16) | (K[0] >>> 16),\r\n\t\t\t\t\tK[3], (K[2] << 16) | (K[1] >>> 16)\r\n\t\t\t\t];\r\n\r\n\t\t\t\t// Generate initial counter values\r\n\t\t\t\tvar C = this._C = [\r\n\t\t\t\t\t(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\r\n\t\t\t\t\t(K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\r\n\t\t\t\t\t(K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\r\n\t\t\t\t\t(K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\r\n\t\t\t\t];\r\n\r\n\t\t\t\t// Carry bit\r\n\t\t\t\tthis._b = 0;\r\n\r\n\t\t\t\t// Iterate the system four times\r\n\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\tnextState.call(this);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Modify the counters\r\n\t\t\t\tfor (var i = 0; i < 8; i++) {\r\n\t\t\t\t\tC[i] ^= X[(i + 4) & 7];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// IV setup\r\n\t\t\t\tif (iv) {\r\n\t\t\t\t\t// Shortcuts\r\n\t\t\t\t\tvar IV = iv.words;\r\n\t\t\t\t\tvar IV_0 = IV[0];\r\n\t\t\t\t\tvar IV_1 = IV[1];\r\n\r\n\t\t\t\t\t// Generate four subvectors\r\n\t\t\t\t\tvar i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (\r\n\t\t\t\t\t\tIV_0 >>> 8)) & 0xff00ff00);\r\n\t\t\t\t\tvar i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (\r\n\t\t\t\t\t\tIV_1 >>> 8)) & 0xff00ff00);\r\n\t\t\t\t\tvar i1 = (i0 >>> 16) | (i2 & 0xffff0000);\r\n\t\t\t\t\tvar i3 = (i2 << 16) | (i0 & 0x0000ffff);\r\n\r\n\t\t\t\t\t// Modify counter values\r\n\t\t\t\t\tC[0] ^= i0;\r\n\t\t\t\t\tC[1] ^= i1;\r\n\t\t\t\t\tC[2] ^= i2;\r\n\t\t\t\t\tC[3] ^= i3;\r\n\t\t\t\t\tC[4] ^= i0;\r\n\t\t\t\t\tC[5] ^= i1;\r\n\t\t\t\t\tC[6] ^= i2;\r\n\t\t\t\t\tC[7] ^= i3;\r\n\r\n\t\t\t\t\t// Iterate the system four times\r\n\t\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\t\tnextState.call(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t_doProcessBlock: function(M, offset) {\r\n\t\t\t\t// Shortcut\r\n\t\t\t\tvar X = this._X;\r\n\r\n\t\t\t\t// Iterate the system\r\n\t\t\t\tnextState.call(this);\r\n\r\n\t\t\t\t// Generate four keystream words\r\n\t\t\t\tS[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\r\n\t\t\t\tS[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\r\n\t\t\t\tS[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\r\n\t\t\t\tS[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\r\n\r\n\t\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\t\t// Swap endian\r\n\t\t\t\t\tS[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |\r\n\t\t\t\t\t\t(((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);\r\n\r\n\t\t\t\t\t// Encrypt\r\n\t\t\t\t\tM[offset + i] ^= S[i];\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tblockSize: 128 / 32,\r\n\r\n\t\t\tivSize: 64 / 32\r\n\t\t});\r\n\r\n\t\tfunction nextState() {\r\n\t\t\t// Shortcuts\r\n\t\t\tvar X = this._X;\r\n\t\t\tvar C = this._C;\r\n\r\n\t\t\t// Save old counter values\r\n\t\t\tfor (var i = 0; i < 8; i++) {\r\n\t\t\t\tC_[i] = C[i];\r\n\t\t\t}\r\n\r\n\t\t\t// Calculate new counter values\r\n\t\t\tC[0] = (C[0] + 0x4d34d34d + this._b) | 0;\r\n\t\t\tC[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tC[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\r\n\t\t\tthis._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\r\n\r\n\t\t\t// Calculate the g-values\r\n\t\t\tfor (var i = 0; i < 8; i++) {\r\n\t\t\t\tvar gx = X[i] + C[i];\r\n\r\n\t\t\t\t// Construct high and low argument for squaring\r\n\t\t\t\tvar ga = gx & 0xffff;\r\n\t\t\t\tvar gb = gx >>> 16;\r\n\r\n\t\t\t\t// Calculate high and low result of squaring\r\n\t\t\t\tvar gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\r\n\t\t\t\tvar gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\r\n\r\n\t\t\t\t// High XOR low\r\n\t\t\t\tG[i] = gh ^ gl;\r\n\t\t\t}\r\n\r\n\t\t\t// Calculate new state values\r\n\t\t\tX[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\r\n\t\t\tX[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;\r\n\t\t\tX[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\r\n\t\t\tX[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;\r\n\t\t\tX[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\r\n\t\t\tX[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;\r\n\t\t\tX[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\r\n\t\t\tX[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Shortcut functions to the cipher's object interface.\r\n\t\t *\r\n\t\t * @example\r\n\t\t *\r\n\t\t * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\r\n\t\t * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\r\n\t\t */\r\n\t\tC.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\r\n\t}());\r\n\r\n\r\n\t/**\r\n\t * Zero padding strategy.\r\n\t */\r\n\tCryptoJS.pad.ZeroPadding = {\r\n\t\tpad: function(data, blockSize) {\r\n\t\t\t// Shortcut\r\n\t\t\tvar blockSizeBytes = blockSize * 4;\r\n\r\n\t\t\t// Pad\r\n\t\t\tdata.clamp();\r\n\t\t\tdata.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\r\n\t\t},\r\n\r\n\t\tunpad: function(data) {\r\n\t\t\t// Shortcut\r\n\t\t\tvar dataWords = data.words;\r\n\r\n\t\t\t// Unpad\r\n\t\t\tvar i = data.sigBytes - 1;\r\n\t\t\twhile (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\r\n\t\t\t\ti--;\r\n\t\t\t}\r\n\t\t\tdata.sigBytes = i + 1;\r\n\t\t}\r\n\t};\r\n\r\n\r\n\treturn CryptoJS;\r\n\r\n}));"],"mappings":"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F,WAAW,CAAClE,IAAI,CAAC,IAAI,CAAC;QAExCiE,IAAI,CAAChF,QAAQ,IAAI,CAAC;QAElB,OAAOgF,IAAI;MACZ;IACD,CAAC,CAAC;;IAEF;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACEnG,CAAC,CAAC4R,MAAM,GAAGpG,MAAM,CAACnF,aAAa,CAACuL,MAAM,CAAC;;IAEvC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACE5R,CAAC,CAAC6R,UAAU,GAAGrG,MAAM,CAAChF,iBAAiB,CAACoL,MAAM,CAAC;EAChD,CAAC,EAAC,CAAC;EAGF,WAASnS,SAAS,EAAE;IACpB;IACA,IAAIO,CAAC,GAAGT,QAAQ;IAChB,IAAIU,KAAK,GAAGD,CAAC,CAACE,GAAG;IACjB,IAAIC,IAAI,GAAGF,KAAK,CAACE,IAAI;IACrB,IAAI2R,YAAY,GAAG7R,KAAK,CAACgB,SAAS;;IAElC;AACF;AACA;IACE,IAAI8Q,KAAK,GAAG/R,CAAC,CAACgS,GAAG,GAAG,CAAC,CAAC;;IAEtB;AACF;AACA;IACE,IAAIC,OAAO,GAAGF,KAAK,CAACG,IAAI,GAAG/R,IAAI,CAACC,MAAM,CAAC;MACtC;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACGI,IAAI,EAAE,SAAAA,CAAS2R,IAAI,EAAEC,GAAG,EAAE;QACzB,IAAI,CAACD,IAAI,GAAGA,IAAI;QAChB,IAAI,CAACC,GAAG,GAAGA,GAAG;MACf;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;;MAEA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;;MAEA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;;MAEA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;;MAEA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;;MAEA;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACG;MACA;MACA;MACA;;MAEA;MACA;IACD,CAAC,CAAC;;IAEF;AACF;AACA;AACA;AACA;AACA;IACE,IAAIC,YAAY,GAAGN,KAAK,CAAC9Q,SAAS,GAAGd,IAAI,CAACC,MAAM,CAAC;MAChD;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACGI,IAAI,EAAE,SAAAA,CAASU,KAAK,EAAEC,QAAQ,EAAE;QAC/BD,KAAK,GAAG,IAAI,CAACA,KAAK,GAAGA,KAAK,IAAI,EAAE;QAEhC,IAAIC,QAAQ,IAAI1B,SAAS,EAAE;UAC1B,IAAI,CAAC0B,QAAQ,GAAGA,QAAQ;QACzB,CAAC,MAAM;UACN,IAAI,CAACA,QAAQ,GAAGD,KAAK,CAACE,MAAM,GAAG,CAAC;QACjC;MACD,CAAC;MAED;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACGkR,KAAK,EAAE,SAAAA,CAAA,EAAW;QACjB;QACA,IAAIC,QAAQ,GAAG,IAAI,CAACrR,KAAK;QACzB,IAAIsR,cAAc,GAAGD,QAAQ,CAACnR,MAAM;;QAEpC;QACA,IAAIqR,QAAQ,GAAG,EAAE;QACjB,KAAK,IAAI1Q,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyQ,cAAc,EAAEzQ,CAAC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c,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9EA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAAEA,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,EAC9E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","ignoreList":[]}]}