diff --git a/src/openpgp.js b/src/openpgp.js index 366be111..61f36baa 100644 --- a/src/openpgp.js +++ b/src/openpgp.js @@ -21,6 +21,10 @@ * for extending and developing on top of the base library. */ +var armor = require('./encoding/armor.js'); +var packet = require('./packet'); +var util = require('./util'); + /** * GPG4Browsers Core interface. A single instance is hold * from the beginning. To use this library call "openpgp.init()" @@ -53,12 +57,12 @@ function _openpgp () { */ function read_publicKey(armoredText) { var mypos = 0; - var publicKeys = new Array(); + var publicKeys = []; var publicKeyCount = 0; - var input = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')).openpgp; + var input = armor.decode(armoredText.replace(/\r/g,'')).openpgp; var l = input.length; while (mypos != input.length) { - var first_packet = openpgp_packet.read_packet(input, mypos, l); + var first_packet = packet.io.read(input, mypos, l); // public key parser if (input[mypos].charCodeAt() == 0x99 || first_packet.tagType == 6) { publicKeys[publicKeyCount] = new openpgp_msg_publickey(); @@ -98,13 +102,13 @@ function _openpgp () { * returns null */ function read_privateKey(armoredText) { - var privateKeys = new Array(); + var privateKeys = []; var privateKeyCount = 0; var mypos = 0; - var input = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')).openpgp; + var input = armor.decode(armoredText.replace(/\r/g,'')).openpgp; var l = input.length; while (mypos != input.length) { - var first_packet = openpgp_packet.read_packet(input, mypos, l); + var first_packet = packet.io.read(input, mypos, l); if (first_packet.tagType == 5) { privateKeys[privateKeys.length] = new openpgp_msg_privatekey(); mypos += first_packet.headerLength+first_packet.packetLength; @@ -130,7 +134,7 @@ function _openpgp () { function read_message(armoredText) { var dearmored; try{ - dearmored = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')); + dearmored = armor.decode(armoredText.replace(/\r/g,'')); } catch(e){ util.print_error('no message found!'); @@ -151,12 +155,12 @@ function _openpgp () { function read_messages_dearmored(input){ var messageString = input.openpgp; var signatureText = input.text; //text to verify signatures against. Modified by Tag11. - var messages = new Array(); + var messages = []; var messageCount = 0; var mypos = 0; var l = messageString.length; while (mypos < messageString.length) { - var first_packet = openpgp_packet.read_packet(messageString, mypos, l); + var first_packet = packet.io.read(messageString, mypos, l); if (!first_packet) { break; } @@ -183,9 +187,9 @@ function _openpgp () { // Signed Message :- Signature Packet, OpenPGP Message | // One-Pass Signed Message. if (first_packet.tagType == 1 || - (first_packet.tagType == 2 && first_packet.signatureType < 16) || - first_packet.tagType == 3 || - first_packet.tagType == 4 || + (first_packet.tagType == 2 && first_packet.signatureType < 16) || + first_packet.tagType == 3 || + first_packet.tagType == 4 || first_packet.tagType == 8 || first_packet.tagType == 9 || first_packet.tagType == 10 || @@ -212,7 +216,7 @@ function _openpgp () { messages[messageCount].sessionKeys[sessionKeyCount] = first_packet; mypos += first_packet.packetLength + first_packet.headerLength; l -= (first_packet.packetLength + first_packet.headerLength); - first_packet = openpgp_packet.read_packet(messageString, mypos, l); + first_packet = packet.io.read(messageString, mypos, l); if (first_packet.tagType != 1 && first_packet.tagType != 3) issessionkey = false; @@ -240,7 +244,7 @@ function _openpgp () { l -= (first_packet.packetLength + first_packet.headerLength); messages[messageCount].text = signatureText; messages[messageCount].signature = first_packet; - messageCount++; + messageCount++; } else // Signed Message if (first_packet.tagType == 4) { @@ -252,8 +256,8 @@ function _openpgp () { // Compressed Message mypos += first_packet.packetLength + first_packet.headerLength; l -= (first_packet.packetLength + first_packet.headerLength); - var decompressedText = first_packet.decompress(); - messages = messages.concat(openpgp.read_messages_dearmored({text: decompressedText, openpgp: decompressedText})); + var decompressedText = first_packet.decompress(); + messages = messages.concat(openpgp.read_messages_dearmored({text: decompressedText, openpgp: decompressedText})); } else // Marker Packet (Obsolete Literal Packet) (Tag 10) // "Such a packet MUST be ignored when received." see http://tools.ietf.org/html/rfc4880#section-5.8 @@ -265,7 +269,7 @@ function _openpgp () { l -= (first_packet.packetLength + first_packet.headerLength); } else if (first_packet.tagType == 11) { - // Literal Message -- work is already done in read_packet + // Literal Message -- work is already done in packet.io.read mypos += first_packet.packetLength + first_packet.headerLength; l -= (first_packet.packetLength + first_packet.headerLength); signatureText = first_packet.data; @@ -300,19 +304,20 @@ function _openpgp () { */ function write_signed_and_encrypted_message(privatekey, publickeys, messagetext) { var result = ""; + var i; var literal = new openpgp_packet_literaldata().write_packet(messagetext.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n")); util.print_debug_hexstr_dump("literal_packet: |"+literal+"|\n",literal); - for (var i = 0; i < publickeys.length; i++) { + for (i = 0; i < publickeys.length; i++) { var onepasssignature = new openpgp_packet_onepasssignature(); var onepasssigstr = ""; - if (i == 0) + if (i === 0) onepasssigstr = onepasssignature.write_packet(1, openpgp.config.config.prefer_hash_algorithm, privatekey, false); else onepasssigstr = onepasssignature.write_packet(1, openpgp.config.config.prefer_hash_algorithm, privatekey, false); util.print_debug_hexstr_dump("onepasssigstr: |"+onepasssigstr+"|\n",onepasssigstr); var datasignature = new openpgp_packet_signature().write_message_signature(1, messagetext.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"), privatekey); util.print_debug_hexstr_dump("datasignature: |"+datasignature.openpgp+"|\n",datasignature.openpgp); - if (i == 0) { + if (i === 0) { result = onepasssigstr+literal+datasignature.openpgp; } else { result = onepasssigstr+result+datasignature.openpgp; @@ -325,9 +330,9 @@ function _openpgp () { var result2 = ""; // creating session keys for each recipient - for (var i = 0; i < publickeys.length; i++) { + for (i = 0; i < publickeys.length; i++) { var pkey = publickeys[i].getEncryptionKey(); - if (pkey == null) { + if (pkey === null) { util.print_error("no encryption key found! Key is for signing only."); return null; } @@ -344,7 +349,7 @@ function _openpgp () { } else { result2 += new openpgp_packet_encrypteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); } - return openpgp_encoding_armor(3,result2,null,null); + return armor.encode(3,result2,null,null); } /** * creates a binary string representation of an encrypted message. @@ -368,7 +373,7 @@ function _openpgp () { // creating session keys for each recipient for (var i = 0; i < publickeys.length; i++) { var pkey = publickeys[i].getEncryptionKey(); - if (pkey == null) { + if (pkey === null) { util.print_error("no encryption key found! Key is for signing only."); return null; } @@ -385,7 +390,7 @@ function _openpgp () { } else { result2 += new openpgp_packet_encrypteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); } - return openpgp_encoding_armor(3,result2,null,null); + return armor.encode(3,result2,null,null); } /** @@ -402,7 +407,7 @@ function _openpgp () { function write_signed_message(privatekey, messagetext) { var sig = new openpgp_packet_signature().write_message_signature(1, messagetext.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"), privatekey); var result = {text: messagetext.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"), openpgp: sig.openpgp, hash: sig.hash}; - return openpgp_encoding_armor(2,result, null, null) + return armor.encode(2,result, null, null); } /** @@ -426,7 +431,7 @@ function _openpgp () { var privKeyString = keyPair.privateKey; var privKeyPacket = new openpgp_packet_keymaterial().read_priv_key(privKeyString.string,3,privKeyString.string.length); if(!privKeyPacket.decryptSecretMPIs(passphrase)) - util.print_error('Issue creating key. Unable to read resulting private key'); + util.print_error('Issue creating key. Unable to read resulting private key'); var privKey = new openpgp_msg_privatekey(); privKey.privateKeyPacket = privKeyPacket; privKey.getPreferredSignatureHashAlgorithm = function(){return openpgp.config.config.prefer_hash_algorithm};//need to override this to solve catch 22 to generate signature. 8 is value for SHA256 @@ -435,14 +440,14 @@ function _openpgp () { var hashData = String.fromCharCode(0x99)+ String.fromCharCode(((publicKeyString.length) >> 8) & 0xFF) + String.fromCharCode((publicKeyString.length) & 0xFF) +publicKeyString+String.fromCharCode(0xB4) + String.fromCharCode((userId.length) >> 24) +String.fromCharCode(((userId.length) >> 16) & 0xFF) - + String.fromCharCode(((userId.length) >> 8) & 0xFF) + String.fromCharCode((userId.length) & 0xFF) + userId + + String.fromCharCode(((userId.length) >> 8) & 0xFF) + String.fromCharCode((userId.length) & 0xFF) + userId; var signature = new openpgp_packet_signature(); signature = signature.write_message_signature(16,hashData, privKey); - var publicArmored = openpgp_encoding_armor(4, keyPair.publicKey.string + userIdString + signature.openpgp ); + var publicArmored = armor.encode(4, keyPair.publicKey.string + userIdString + signature.openpgp ); - var privArmored = openpgp_encoding_armor(5,privKeyString.string+userIdString+signature.openpgp); + var privArmored = armor.encode(5,privKeyString.string+userIdString+signature.openpgp); - return {privateKey : privKey, privateKeyArmored: privArmored, publicKeyArmored: publicArmored} + return {privateKey : privKey, privateKeyArmored: privArmored, publicKeyArmored: publicArmored}; } this.generate_key_pair = generate_key_pair; diff --git a/src/packet/index.js b/src/packet/index.js index 902fd89e..0f3c4a48 100644 --- a/src/packet/index.js +++ b/src/packet/index.js @@ -3,7 +3,8 @@ var enums = require('../enums.js'); module.exports = { list: require('./packetlist.js'), -} + io: require('./packet.js') +}; var packets = require('./all_packets.js'); diff --git a/test/crypto/openpgp.sigcheck.js b/test/crypto/openpgp.sigcheck.js index 4c60fcbe..7eb8e81c 100644 --- a/test/crypto/openpgp.sigcheck.js +++ b/test/crypto/openpgp.sigcheck.js @@ -3,6 +3,7 @@ var unit = require('../unit.js'); unit.register("Testing of binary signature checking", function() { var openpgp = require('../../'); var result = []; + debugger; var priv_key = openpgp.read_privateKey([ '-----BEGIN PGP PRIVATE KEY BLOCK-----', 'Version: GnuPG v1.4.11 (GNU/Linux)', diff --git a/test/test-all.js b/test/test-all.js index a82defdf..3a7101ac 100644 --- a/test/test-all.js +++ b/test/test-all.js @@ -12,3 +12,5 @@ require('./crypto/cipher/des.js'); require('./crypto/cipher/twofish.js'); require('./crypto/openpgp.crypto.js'); +require('./crypto/openpgp.sigcheck.js'); + diff --git a/test/test-bundle.js b/test/test-bundle.js index e6940afd..50d2d17a 100644 --- a/test/test-bundle.js +++ b/test/test-bundle.js @@ -5961,93 +5961,151 @@ module.exports = DSA; // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +var enums = require('../enums.js'), + JXG = require('../compression/jxg.js'), + base64 = require('../encoding/base64.js'); + /** * @class - * @classdesc Implementation of the One-Pass Signature Packets (Tag 4) + * @classdesc Implementation of the Compressed Data Packet (Tag 8) * - * RFC4880 5.4: - * The One-Pass Signature packet precedes the signed data and contains - * enough information to allow the receiver to begin calculating any - * hashes needed to verify the signature. It allows the Signature - * packet to be placed at the end of the message, so that the signer - * can compute the entire signed message in one pass. - */ + * RFC4880 5.6: + * The Compressed Data packet contains compressed data. Typically, this + * packet is found as the contents of an encrypted packet, or following + * a Signature or One-Pass Signature packet, and contains a literal data + * packet. + */ +module.exports = function packet_compressed() { + /** @type {packetlist} */ + this.packets; + /** @type {compression} */ + this.algorithm = 'uncompressed'; -var enums = require('../enums.js'), - type_keyid = require('../type/keyid.js'); - -module.exports = function packet_one_pass_signature() { - this.version = null; // A one-octet version number. The current version is 3. - this.type = null; // A one-octet signature type. Signature types are described in RFC4880 Section 5.2.1. - this.hashAlgorithm = null; // A one-octet number describing the hash algorithm used. (See RFC4880 9.4) - this.publicKeyAlgorithm = null; // A one-octet number describing the public-key algorithm used. (See RFC4880 9.1) - this.signingKeyId = null; // An eight-octet number holding the Key ID of the signing key. - this.flags = null; // A one-octet number holding a flag showing whether the signature is nested. A zero value indicates that the next packet is another One-Pass Signature packet that describes another signature to be applied to the same message data. + this.compressed = null; + /** - * parsing function for a one-pass signature packet (tag 4). - * @param {String} bytes payload of a tag 4 packet - * @param {Integer} position position to start reading from the bytes string - * @param {Integer} len length of the packet or the remaining length of bytes at position - * @return {openpgp_packet_encrypteddata} object representation + * Parsing function for the packet. + * @param {String} input Payload of a tag 8 packet + * @param {Integer} position Position to start reading from the input string + * @parAM {iNTEGER} LEN lENGTH OF the packet or the remaining length of + * input at position + * @return {openpgp_packet_compressed} Object representation */ this.read = function(bytes) { - var mypos = 0; - // A one-octet version number. The current version is 3. - this.version = bytes.charCodeAt(mypos++); + // One octet that gives the algorithm used to compress the packet. + this.algorithm = enums.read(enums.compression, bytes.charCodeAt(0)); - // A one-octet signature type. Signature types are described in - // Section 5.2.1. - this.type = enums.read(enums.signature, bytes.charCodeAt(mypos++)); + // Compressed data, which makes up the remainder of the packet. + this.compressed = bytes.substr(1); - // A one-octet number describing the hash algorithm used. - this.hashAlgorithm = enums.read(enums.hash, bytes.charCodeAt(mypos++)); + this.decompress(); + } - // A one-octet number describing the public-key algorithm used. - this.publicKeyAlgorithm = enums.read(enums.publicKey, bytes.charCodeAt(mypos++)); + + + this.write = function() { + if(this.compressed == null) + this.compress(); - // An eight-octet number holding the Key ID of the signing key. - this.signingKeyId = new type_keyid(); - this.signingKeyId.read(bytes.substr(mypos)); - mypos += 8; - - // A one-octet number holding a flag showing whether the signature - // is nested. A zero value indicates that the next packet is - // another One-Pass Signature packet that describes another - // signature to be applied to the same message data. - this.flags = bytes.charCodeAt(mypos++); - return this; + return String.fromCharCode(enums.write(enums.compression, this.algorithm)) + + this.compressed; + } + + + /** + * Decompression method for decompressing the compressed data + * read by read_packet + * @return {String} The decompressed data + */ + this.decompress = function() { + var decompressed; + + switch (this.algorithm) { + case 'uncompressed': + decompressed = this.compressed; + break; + + case 'zip': + var compData = this.compressed; + + var radix = base64.encode(compData).replace(/\n/g,""); + // no header in this case, directly call deflate + var jxg_obj = new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(radix)); + + decompressed = unescape(jxg_obj.deflate()[0][0]); + break; + + case 'zlib': + //RFC 1950. Bits 0-3 Compression Method + var compressionMethod = this.compressed.charCodeAt(0) % 0x10; + + //Bits 4-7 RFC 1950 are LZ77 Window. Generally this value is 7 == 32k window size. + // 2nd Byte in RFC 1950 is for "FLAGs" Allows for a Dictionary + // (how is this defined). Basic checksum, and compression level. + + if (compressionMethod == 8) { //CM 8 is for DEFLATE, RFC 1951 + // remove 4 bytes ADLER32 checksum from the end + var compData = this.compressed.substring(0, this.compressed.length - 4); + var radix = base64.encode(compData).replace(/\n/g,""); + //TODO check ADLER32 checksum + decompressed = JXG.decompress(radix); + break; + + } else { + util.print_error("Compression algorithm ZLIB only supports " + + "DEFLATE compression method."); + } + break; + + case 'bzip2': + // TODO: need to implement this + throw new Error('Compression algorithm BZip2 [BZ2] is not implemented.'); + break; + + default: + throw new Error("Compression algorithm unknown :" + this.alogrithm); + break; + } + + this.packets.read(decompressed); } /** - * creates a string representation of a one-pass signature packet - * @param {Integer} type Signature types as described in RFC4880 Section 5.2.1. - * @param {Integer} hashalgorithm the hash algorithm used within the signature - * @param {openpgp_msg_privatekey} privatekey the private key used to generate the signature - * @param {Integer} length length of data to be signed - * @param {boolean} nested boolean showing whether the signature is nested. - * "true" indicates that the next packet is another One-Pass Signature packet - * that describes another signature to be applied to the same message data. - * @return {String} a string representation of a one-pass signature packet + * Compress the packet data (member decompressedData) + * @param {Integer} type Algorithm to be used // See RFC 4880 9.3 + * @param {String} data Data to be compressed + * @return {String} The compressed data stored in attribute compressedData */ - this.write = function(type, hashalgorithm, privatekey, length, nested) { - var result =""; - - result += String.fromCharCode(3); - result += String.fromCharCode(enums.write(enums.signature, type)); - result += String.fromCharCode(enums.write(enums.hash, this.hashAlgorithm)); - result += String.fromCharCode(enums.write(enums.publicKey, privatekey.algorithm)); - result += privatekey.getKeyId(); - if (nested) - result += String.fromCharCode(0); - else - result += String.fromCharCode(1); - - return result; + this.compress = function() { + switch (this.algorithm) { + + case 'uncompressed': // - Uncompressed + this.compressed = this.packets.write(); + break; + + case 'zip': // - ZIP [RFC1951] + util.print_error("Compression algorithm ZIP [RFC1951] is not implemented."); + break; + + case 'zlib': // - ZLIB [RFC1950] + // TODO: need to implement this + util.print_error("Compression algorithm ZLIB [RFC1950] is not implemented."); + break; + + case 'bzip2': // - BZip2 [BZ2] + // TODO: need to implement this + util.print_error("Compression algorithm BZip2 [BZ2] is not implemented."); + break; + + default: + util.print_error("Compression algorithm unknown :"+this.type); + break; + } } }; -},{"../enums.js":27,"../type/keyid.js":49}],"test-bundle.js":[function(require,module,exports){ +},{"../compression/jxg.js":1,"../encoding/base64.js":26,"../enums.js":27}],"test-bundle.js":[function(require,module,exports){ module.exports=require('2ZZCcm'); },{}],19:[function(require,module,exports){ // GPG4Browsers - An OpenPGP implementation in javascript @@ -8421,7 +8479,7 @@ for(var i in crypto) module.exports[i] = crypto[i]; -},{"./crypto":14,"./encoding/armor.js":25,"./enums.js":27,"./openpgp.js":29,"./packet":32,"./type/keyid.js":49,"./type/mpi.js":50,"./type/s2k.js":51,"./util":52}],29:[function(require,module,exports){ +},{"./crypto":14,"./encoding/armor.js":25,"./enums.js":27,"./openpgp.js":29,"./packet":31,"./type/keyid.js":49,"./type/mpi.js":50,"./type/s2k.js":51,"./util":52}],29:[function(require,module,exports){ // GPG4Browsers - An OpenPGP implementation in javascript // Copyright (C) 2011 Recurity Labs GmbH // @@ -8445,6 +8503,10 @@ for(var i in crypto) * for extending and developing on top of the base library. */ +var armor = require('./encoding/armor.js'); +var packet = require('./packet'); +var util = require('./util'); + /** * GPG4Browsers Core interface. A single instance is hold * from the beginning. To use this library call "openpgp.init()" @@ -8477,12 +8539,12 @@ function _openpgp () { */ function read_publicKey(armoredText) { var mypos = 0; - var publicKeys = new Array(); + var publicKeys = []; var publicKeyCount = 0; - var input = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')).openpgp; + var input = armor.decode(armoredText.replace(/\r/g,'')).openpgp; var l = input.length; while (mypos != input.length) { - var first_packet = openpgp_packet.read_packet(input, mypos, l); + var first_packet = packet.io.read(input, mypos, l); // public key parser if (input[mypos].charCodeAt() == 0x99 || first_packet.tagType == 6) { publicKeys[publicKeyCount] = new openpgp_msg_publickey(); @@ -8522,13 +8584,13 @@ function _openpgp () { * returns null */ function read_privateKey(armoredText) { - var privateKeys = new Array(); + var privateKeys = []; var privateKeyCount = 0; var mypos = 0; - var input = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')).openpgp; + var input = armor.decode(armoredText.replace(/\r/g,'')).openpgp; var l = input.length; while (mypos != input.length) { - var first_packet = openpgp_packet.read_packet(input, mypos, l); + var first_packet = packet.io.read(input, mypos, l); if (first_packet.tagType == 5) { privateKeys[privateKeys.length] = new openpgp_msg_privatekey(); mypos += first_packet.headerLength+first_packet.packetLength; @@ -8554,7 +8616,7 @@ function _openpgp () { function read_message(armoredText) { var dearmored; try{ - dearmored = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')); + dearmored = armor.decode(armoredText.replace(/\r/g,'')); } catch(e){ util.print_error('no message found!'); @@ -8575,12 +8637,12 @@ function _openpgp () { function read_messages_dearmored(input){ var messageString = input.openpgp; var signatureText = input.text; //text to verify signatures against. Modified by Tag11. - var messages = new Array(); + var messages = []; var messageCount = 0; var mypos = 0; var l = messageString.length; while (mypos < messageString.length) { - var first_packet = openpgp_packet.read_packet(messageString, mypos, l); + var first_packet = packet.io.read(messageString, mypos, l); if (!first_packet) { break; } @@ -8607,9 +8669,9 @@ function _openpgp () { // Signed Message :- Signature Packet, OpenPGP Message | // One-Pass Signed Message. if (first_packet.tagType == 1 || - (first_packet.tagType == 2 && first_packet.signatureType < 16) || - first_packet.tagType == 3 || - first_packet.tagType == 4 || + (first_packet.tagType == 2 && first_packet.signatureType < 16) || + first_packet.tagType == 3 || + first_packet.tagType == 4 || first_packet.tagType == 8 || first_packet.tagType == 9 || first_packet.tagType == 10 || @@ -8636,7 +8698,7 @@ function _openpgp () { messages[messageCount].sessionKeys[sessionKeyCount] = first_packet; mypos += first_packet.packetLength + first_packet.headerLength; l -= (first_packet.packetLength + first_packet.headerLength); - first_packet = openpgp_packet.read_packet(messageString, mypos, l); + first_packet = packet.io.read(messageString, mypos, l); if (first_packet.tagType != 1 && first_packet.tagType != 3) issessionkey = false; @@ -8664,7 +8726,7 @@ function _openpgp () { l -= (first_packet.packetLength + first_packet.headerLength); messages[messageCount].text = signatureText; messages[messageCount].signature = first_packet; - messageCount++; + messageCount++; } else // Signed Message if (first_packet.tagType == 4) { @@ -8676,8 +8738,8 @@ function _openpgp () { // Compressed Message mypos += first_packet.packetLength + first_packet.headerLength; l -= (first_packet.packetLength + first_packet.headerLength); - var decompressedText = first_packet.decompress(); - messages = messages.concat(openpgp.read_messages_dearmored({text: decompressedText, openpgp: decompressedText})); + var decompressedText = first_packet.decompress(); + messages = messages.concat(openpgp.read_messages_dearmored({text: decompressedText, openpgp: decompressedText})); } else // Marker Packet (Obsolete Literal Packet) (Tag 10) // "Such a packet MUST be ignored when received." see http://tools.ietf.org/html/rfc4880#section-5.8 @@ -8689,7 +8751,7 @@ function _openpgp () { l -= (first_packet.packetLength + first_packet.headerLength); } else if (first_packet.tagType == 11) { - // Literal Message -- work is already done in read_packet + // Literal Message -- work is already done in packet.io.read mypos += first_packet.packetLength + first_packet.headerLength; l -= (first_packet.packetLength + first_packet.headerLength); signatureText = first_packet.data; @@ -8724,19 +8786,20 @@ function _openpgp () { */ function write_signed_and_encrypted_message(privatekey, publickeys, messagetext) { var result = ""; + var i; var literal = new openpgp_packet_literaldata().write_packet(messagetext.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n")); util.print_debug_hexstr_dump("literal_packet: |"+literal+"|\n",literal); - for (var i = 0; i < publickeys.length; i++) { + for (i = 0; i < publickeys.length; i++) { var onepasssignature = new openpgp_packet_onepasssignature(); var onepasssigstr = ""; - if (i == 0) + if (i === 0) onepasssigstr = onepasssignature.write_packet(1, openpgp.config.config.prefer_hash_algorithm, privatekey, false); else onepasssigstr = onepasssignature.write_packet(1, openpgp.config.config.prefer_hash_algorithm, privatekey, false); util.print_debug_hexstr_dump("onepasssigstr: |"+onepasssigstr+"|\n",onepasssigstr); var datasignature = new openpgp_packet_signature().write_message_signature(1, messagetext.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"), privatekey); util.print_debug_hexstr_dump("datasignature: |"+datasignature.openpgp+"|\n",datasignature.openpgp); - if (i == 0) { + if (i === 0) { result = onepasssigstr+literal+datasignature.openpgp; } else { result = onepasssigstr+result+datasignature.openpgp; @@ -8749,9 +8812,9 @@ function _openpgp () { var result2 = ""; // creating session keys for each recipient - for (var i = 0; i < publickeys.length; i++) { + for (i = 0; i < publickeys.length; i++) { var pkey = publickeys[i].getEncryptionKey(); - if (pkey == null) { + if (pkey === null) { util.print_error("no encryption key found! Key is for signing only."); return null; } @@ -8768,7 +8831,7 @@ function _openpgp () { } else { result2 += new openpgp_packet_encrypteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); } - return openpgp_encoding_armor(3,result2,null,null); + return armor.encode(3,result2,null,null); } /** * creates a binary string representation of an encrypted message. @@ -8792,7 +8855,7 @@ function _openpgp () { // creating session keys for each recipient for (var i = 0; i < publickeys.length; i++) { var pkey = publickeys[i].getEncryptionKey(); - if (pkey == null) { + if (pkey === null) { util.print_error("no encryption key found! Key is for signing only."); return null; } @@ -8809,7 +8872,7 @@ function _openpgp () { } else { result2 += new openpgp_packet_encrypteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); } - return openpgp_encoding_armor(3,result2,null,null); + return armor.encode(3,result2,null,null); } /** @@ -8826,7 +8889,7 @@ function _openpgp () { function write_signed_message(privatekey, messagetext) { var sig = new openpgp_packet_signature().write_message_signature(1, messagetext.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"), privatekey); var result = {text: messagetext.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"), openpgp: sig.openpgp, hash: sig.hash}; - return openpgp_encoding_armor(2,result, null, null) + return armor.encode(2,result, null, null); } /** @@ -8850,7 +8913,7 @@ function _openpgp () { var privKeyString = keyPair.privateKey; var privKeyPacket = new openpgp_packet_keymaterial().read_priv_key(privKeyString.string,3,privKeyString.string.length); if(!privKeyPacket.decryptSecretMPIs(passphrase)) - util.print_error('Issue creating key. Unable to read resulting private key'); + util.print_error('Issue creating key. Unable to read resulting private key'); var privKey = new openpgp_msg_privatekey(); privKey.privateKeyPacket = privKeyPacket; privKey.getPreferredSignatureHashAlgorithm = function(){return openpgp.config.config.prefer_hash_algorithm};//need to override this to solve catch 22 to generate signature. 8 is value for SHA256 @@ -8859,14 +8922,14 @@ function _openpgp () { var hashData = String.fromCharCode(0x99)+ String.fromCharCode(((publicKeyString.length) >> 8) & 0xFF) + String.fromCharCode((publicKeyString.length) & 0xFF) +publicKeyString+String.fromCharCode(0xB4) + String.fromCharCode((userId.length) >> 24) +String.fromCharCode(((userId.length) >> 16) & 0xFF) - + String.fromCharCode(((userId.length) >> 8) & 0xFF) + String.fromCharCode((userId.length) & 0xFF) + userId + + String.fromCharCode(((userId.length) >> 8) & 0xFF) + String.fromCharCode((userId.length) & 0xFF) + userId; var signature = new openpgp_packet_signature(); signature = signature.write_message_signature(16,hashData, privKey); - var publicArmored = openpgp_encoding_armor(4, keyPair.publicKey.string + userIdString + signature.openpgp ); + var publicArmored = armor.encode(4, keyPair.publicKey.string + userIdString + signature.openpgp ); - var privArmored = openpgp_encoding_armor(5,privKeyString.string+userIdString+signature.openpgp); + var privArmored = armor.encode(5,privKeyString.string+userIdString+signature.openpgp); - return {privateKey : privKey, privateKeyArmored: privArmored, publicKeyArmored: publicArmored} + return {privateKey : privKey, privateKeyArmored: privArmored, publicKeyArmored: publicArmored}; } this.generate_key_pair = generate_key_pair; @@ -8883,7 +8946,7 @@ function _openpgp () { module.exports = new _openpgp(); -},{}],30:[function(require,module,exports){ +},{"./encoding/armor.js":25,"./packet":31,"./util":52}],30:[function(require,module,exports){ var enums = require('../enums.js'); @@ -8914,182 +8977,21 @@ for(var i in enums.packet) { packetClass.prototype.tag = enums.packet[i]; } -},{"../enums.js":27,"./compressed.js":31,"./literal.js":33,"./marker.js":34,"./one_pass_signature.js":17,"./public_key.js":37,"./public_key_encrypted_session_key.js":38,"./public_subkey.js":39,"./secret_key.js":40,"./secret_subkey.js":41,"./signature.js":42,"./sym_encrypted_integrity_protected.js":43,"./sym_encrypted_session_key.js":44,"./symmetrically_encrypted.js":45,"./trust.js":46,"./user_attribute.js":47,"./userid.js":48}],31:[function(require,module,exports){ -// GPG4Browsers - An OpenPGP implementation in javascript -// Copyright (C) 2011 Recurity Labs GmbH -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -var enums = require('../enums.js'), - JXG = require('../compression/jxg.js'), - base64 = require('../encoding/base64.js'); - -/** - * @class - * @classdesc Implementation of the Compressed Data Packet (Tag 8) - * - * RFC4880 5.6: - * The Compressed Data packet contains compressed data. Typically, this - * packet is found as the contents of an encrypted packet, or following - * a Signature or One-Pass Signature packet, and contains a literal data - * packet. - */ -module.exports = function packet_compressed() { - /** @type {packetlist} */ - this.packets; - /** @type {compression} */ - this.algorithm = 'uncompressed'; - - this.compressed = null; - - - /** - * Parsing function for the packet. - * @param {String} input Payload of a tag 8 packet - * @param {Integer} position Position to start reading from the input string - * @parAM {iNTEGER} LEN lENGTH OF the packet or the remaining length of - * input at position - * @return {openpgp_packet_compressed} Object representation - */ - this.read = function(bytes) { - // One octet that gives the algorithm used to compress the packet. - this.algorithm = enums.read(enums.compression, bytes.charCodeAt(0)); - - // Compressed data, which makes up the remainder of the packet. - this.compressed = bytes.substr(1); - - this.decompress(); - } - - - - this.write = function() { - if(this.compressed == null) - this.compress(); - - return String.fromCharCode(enums.write(enums.compression, this.algorithm)) - + this.compressed; - } - - - /** - * Decompression method for decompressing the compressed data - * read by read_packet - * @return {String} The decompressed data - */ - this.decompress = function() { - var decompressed; - - switch (this.algorithm) { - case 'uncompressed': - decompressed = this.compressed; - break; - - case 'zip': - var compData = this.compressed; - - var radix = base64.encode(compData).replace(/\n/g,""); - // no header in this case, directly call deflate - var jxg_obj = new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(radix)); - - decompressed = unescape(jxg_obj.deflate()[0][0]); - break; - - case 'zlib': - //RFC 1950. Bits 0-3 Compression Method - var compressionMethod = this.compressed.charCodeAt(0) % 0x10; - - //Bits 4-7 RFC 1950 are LZ77 Window. Generally this value is 7 == 32k window size. - // 2nd Byte in RFC 1950 is for "FLAGs" Allows for a Dictionary - // (how is this defined). Basic checksum, and compression level. - - if (compressionMethod == 8) { //CM 8 is for DEFLATE, RFC 1951 - // remove 4 bytes ADLER32 checksum from the end - var compData = this.compressed.substring(0, this.compressed.length - 4); - var radix = base64.encode(compData).replace(/\n/g,""); - //TODO check ADLER32 checksum - decompressed = JXG.decompress(radix); - break; - - } else { - util.print_error("Compression algorithm ZLIB only supports " + - "DEFLATE compression method."); - } - break; - - case 'bzip2': - // TODO: need to implement this - throw new Error('Compression algorithm BZip2 [BZ2] is not implemented.'); - break; - - default: - throw new Error("Compression algorithm unknown :" + this.alogrithm); - break; - } - - this.packets.read(decompressed); - } - - /** - * Compress the packet data (member decompressedData) - * @param {Integer} type Algorithm to be used // See RFC 4880 9.3 - * @param {String} data Data to be compressed - * @return {String} The compressed data stored in attribute compressedData - */ - this.compress = function() { - switch (this.algorithm) { - - case 'uncompressed': // - Uncompressed - this.compressed = this.packets.write(); - break; - - case 'zip': // - ZIP [RFC1951] - util.print_error("Compression algorithm ZIP [RFC1951] is not implemented."); - break; - - case 'zlib': // - ZLIB [RFC1950] - // TODO: need to implement this - util.print_error("Compression algorithm ZLIB [RFC1950] is not implemented."); - break; - - case 'bzip2': // - BZip2 [BZ2] - // TODO: need to implement this - util.print_error("Compression algorithm BZip2 [BZ2] is not implemented."); - break; - - default: - util.print_error("Compression algorithm unknown :"+this.type); - break; - } - } -}; - -},{"../compression/jxg.js":1,"../encoding/base64.js":26,"../enums.js":27}],32:[function(require,module,exports){ +},{"../enums.js":27,"./compressed.js":17,"./literal.js":32,"./marker.js":33,"./one_pass_signature.js":34,"./public_key.js":37,"./public_key_encrypted_session_key.js":38,"./public_subkey.js":39,"./secret_key.js":40,"./secret_subkey.js":41,"./signature.js":42,"./sym_encrypted_integrity_protected.js":43,"./sym_encrypted_session_key.js":44,"./symmetrically_encrypted.js":45,"./trust.js":46,"./user_attribute.js":47,"./userid.js":48}],31:[function(require,module,exports){ var enums = require('../enums.js'); module.exports = { list: require('./packetlist.js'), -} + io: require('./packet.js') +}; var packets = require('./all_packets.js'); for(var i in packets) module.exports[i] = packets[i]; -},{"../enums.js":27,"./all_packets.js":30,"./packetlist.js":36}],33:[function(require,module,exports){ +},{"../enums.js":27,"./all_packets.js":30,"./packet.js":35,"./packetlist.js":36}],32:[function(require,module,exports){ // GPG4Browsers - An OpenPGP implementation in javascript // Copyright (C) 2011 Recurity Labs GmbH // @@ -9211,7 +9113,7 @@ module.exports = function packet_literal() { } } -},{"../enums.js":27,"../util":52}],34:[function(require,module,exports){ +},{"../enums.js":27,"../util":52}],33:[function(require,module,exports){ // GPG4Browsers - An OpenPGP implementation in javascript // Copyright (C) 2011 Recurity Labs GmbH // @@ -9264,7 +9166,111 @@ function packet_marker() { module.exports = packet_marker; -},{}],35:[function(require,module,exports){ +},{}],34:[function(require,module,exports){ +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the One-Pass Signature Packets (Tag 4) + * + * RFC4880 5.4: + * The One-Pass Signature packet precedes the signed data and contains + * enough information to allow the receiver to begin calculating any + * hashes needed to verify the signature. It allows the Signature + * packet to be placed at the end of the message, so that the signer + * can compute the entire signed message in one pass. + */ + +var enums = require('../enums.js'), + type_keyid = require('../type/keyid.js'); + +module.exports = function packet_one_pass_signature() { + this.version = null; // A one-octet version number. The current version is 3. + this.type = null; // A one-octet signature type. Signature types are described in RFC4880 Section 5.2.1. + this.hashAlgorithm = null; // A one-octet number describing the hash algorithm used. (See RFC4880 9.4) + this.publicKeyAlgorithm = null; // A one-octet number describing the public-key algorithm used. (See RFC4880 9.1) + this.signingKeyId = null; // An eight-octet number holding the Key ID of the signing key. + this.flags = null; // A one-octet number holding a flag showing whether the signature is nested. A zero value indicates that the next packet is another One-Pass Signature packet that describes another signature to be applied to the same message data. + + /** + * parsing function for a one-pass signature packet (tag 4). + * @param {String} bytes payload of a tag 4 packet + * @param {Integer} position position to start reading from the bytes string + * @param {Integer} len length of the packet or the remaining length of bytes at position + * @return {openpgp_packet_encrypteddata} object representation + */ + this.read = function(bytes) { + var mypos = 0; + // A one-octet version number. The current version is 3. + this.version = bytes.charCodeAt(mypos++); + + // A one-octet signature type. Signature types are described in + // Section 5.2.1. + this.type = enums.read(enums.signature, bytes.charCodeAt(mypos++)); + + // A one-octet number describing the hash algorithm used. + this.hashAlgorithm = enums.read(enums.hash, bytes.charCodeAt(mypos++)); + + // A one-octet number describing the public-key algorithm used. + this.publicKeyAlgorithm = enums.read(enums.publicKey, bytes.charCodeAt(mypos++)); + + // An eight-octet number holding the Key ID of the signing key. + this.signingKeyId = new type_keyid(); + this.signingKeyId.read(bytes.substr(mypos)); + mypos += 8; + + // A one-octet number holding a flag showing whether the signature + // is nested. A zero value indicates that the next packet is + // another One-Pass Signature packet that describes another + // signature to be applied to the same message data. + this.flags = bytes.charCodeAt(mypos++); + return this; + } + + /** + * creates a string representation of a one-pass signature packet + * @param {Integer} type Signature types as described in RFC4880 Section 5.2.1. + * @param {Integer} hashalgorithm the hash algorithm used within the signature + * @param {openpgp_msg_privatekey} privatekey the private key used to generate the signature + * @param {Integer} length length of data to be signed + * @param {boolean} nested boolean showing whether the signature is nested. + * "true" indicates that the next packet is another One-Pass Signature packet + * that describes another signature to be applied to the same message data. + * @return {String} a string representation of a one-pass signature packet + */ + this.write = function(type, hashalgorithm, privatekey, length, nested) { + var result =""; + + result += String.fromCharCode(3); + result += String.fromCharCode(enums.write(enums.signature, type)); + result += String.fromCharCode(enums.write(enums.hash, this.hashAlgorithm)); + result += String.fromCharCode(enums.write(enums.publicKey, privatekey.algorithm)); + result += privatekey.getKeyId(); + if (nested) + result += String.fromCharCode(0); + else + result += String.fromCharCode(1); + + return result; + } +}; + +},{"../enums.js":27,"../type/keyid.js":49}],35:[function(require,module,exports){ // GPG4Browsers - An OpenPGP implementation in javascript // Copyright (C) 2011 Recurity Labs GmbH // @@ -11975,7 +11981,7 @@ unit.register("AES Rijndael cipher test with test vectors from ecb_tbl.txt", fun return result; }); -},{"../../../":28,"../../unit.js":63}],54:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],54:[function(require,module,exports){ var unit = require('../../unit.js'); unit.register("Blowfish cipher test with test vectors from http://www.schneier.com/code/vectors.txt", function() { @@ -12044,7 +12050,7 @@ unit.register("Blowfish cipher test with test vectors from http://www.schneier.c return result; }); -},{"../../../":28,"../../unit.js":63}],55:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],55:[function(require,module,exports){ var unit = require('../../unit.js'); unit.register("CAST-128 cipher test with test vectors from RFC2144", function() { @@ -12071,7 +12077,7 @@ unit.register("CAST-128 cipher test with test vectors from RFC2144", function() return result; }); -},{"../../../":28,"../../unit.js":63}],56:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],56:[function(require,module,exports){ var unit = require('../../unit.js'); unit.register("TripleDES (EDE) cipher test with test vectors from http://csrc.nist.gov/publications/nistpubs/800-20/800-20.pdf", function() { @@ -12238,7 +12244,7 @@ unit.register("DES encrypt/decrypt padding tests", function () { return result; }); -},{"../../../":28,"../../unit.js":63}],57:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],57:[function(require,module,exports){ var unit = require('../../unit.js'); unit.register("Twofish test with test vectors from http://www.schneier.com/code/ecb_ival.txt", function() { @@ -12308,7 +12314,7 @@ unit.register("Twofish test with test vectors from http://www.schneier.com/code/ return result; }); -},{"../../../":28,"../../unit.js":63}],58:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],58:[function(require,module,exports){ var unit = require('../../unit.js'); unit.register("MD5 test with test vectors from RFC 1321", function() { @@ -12332,7 +12338,7 @@ unit.register("MD5 test with test vectors from RFC 1321", function() { return result; }); -},{"../../../":28,"../../unit.js":63}],59:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],59:[function(require,module,exports){ var unit = require('../../unit.js'); unit.register("RIPE-MD 160 bits test with test vectors from http://homes.esat.kuleuven.be/~bosselae/ripemd160.html", function() { @@ -12353,7 +12359,7 @@ unit.register("RIPE-MD 160 bits test with test vectors from http://homes.esat.ku return result; }); -},{"../../../":28,"../../unit.js":63}],60:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],60:[function(require,module,exports){ var unit = require('../../unit.js'); @@ -12387,7 +12393,7 @@ unit.register("SHA* test with test vectors from NIST FIPS 180-2", function() { return result; }); -},{"../../../":28,"../../unit.js":63}],61:[function(require,module,exports){ +},{"../../../":28,"../../unit.js":64}],61:[function(require,module,exports){ var unit = require('../unit.js'); unit.register("Functional testing of openpgp.crypto.* methods", function() { @@ -12642,7 +12648,6 @@ unit.register("Functional testing of openpgp.crypto.* methods", function() { result[3] = new unit.result("Testing symmetric encrypt and decrypt without OpenPGP CFB resync (used in modification detection code \"MDC\" packets)", openpgp.cfb.decrypt(symmAlgo,symmKey,symmencDataCFB,false) == "foobarfoobar1234567890"); - debugger; var RSAUnencryptedData = new openpgp.mpi(); RSAUnencryptedData.fromBytes(openpgp.pkcs1.eme.encode(symmKey, RSApubMPIs[0].byteLength())); var RSAEncryptedData = openpgp.publicKeyEncrypt("rsa_encrypt_sign", RSApubMPIs, RSAUnencryptedData); @@ -12660,7 +12665,180 @@ unit.register("Functional testing of openpgp.crypto.* methods", function() { return result; }); -},{"../../":28,"../unit.js":63}],"2ZZCcm":[function(require,module,exports){ +},{"../../":28,"../unit.js":64}],62:[function(require,module,exports){ +var unit = require('../unit.js'); + +unit.register("Testing of binary signature checking", function() { + var openpgp = require('../../'); + var result = []; + debugger; + var priv_key = openpgp.read_privateKey([ + '-----BEGIN PGP PRIVATE KEY BLOCK-----', + 'Version: GnuPG v1.4.11 (GNU/Linux)', + '', + 'lQHhBFERnrMRBADmM0hIfkI3yosjgbWo9v0Lnr3CCE+8KsMszgVS+hBu0XfGraKm', + 'ivcA2aaJimHqVYOP7gEnwFAxHBBpeTJcu5wzCFyJwEYqVeS3nnaIhBPplSF14Duf', + 'i6bB9RV7KxVAg6aunmM2tAutqC+a0y2rDaf7jkJoZ9gWJe2zI+vraD6fiwCgxvHo', + '3IgULB9RqIqpLoMgXfcjC+cD/1jeJlKRm+n71ryYwT/ECKsspFz7S36z6q3XyS8Q', + 'QfrsUz2p1fbFicvJwIOJ8B20J/N2/nit4P0gBUTUxv3QEa7XCM/56/xrGkyBzscW', + 'AzBoy/AK9K7GN6z13RozuAS60F1xO7MQc6Yi2VU3eASDQEKiyL/Ubf/s/rkZ+sGj', + 'yJizBACtwCbQzA+z9XBZNUat5NPgcZz5Qeh1nwF9Nxnr6pyBv7tkrLh/3gxRGHqG', + '063dMbUk8pmUcJzBUyRsNiIPDoEUsLjY5zmZZmp/waAhpREsnK29WLCbqLdpUors', + 'c1JJBsObkA1IM8TZY8YUmvsMEvBLCCanuKpclZZXqeRAeOHJ0v4DAwK8WfuTe5B+', + 'M2BOOeZbN8BpfiA1l//fMMHLRS3UvbLBv4P1+4SyvhyYTR7M76Q0xPc03MFOWHL+', + 'S9VumbQWVGVzdDIgPHRlc3QyQHRlc3QuY29tPohiBBMRAgAiBQJREZ6zAhsDBgsJ', + 'CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRARJ5QDyxae+MXNAKCzWSDR3tMrTrDb', + 'TAri73N1Xb3j1ACfSl9y+SAah2q7GvmiR1+6+/ekqJGdAVgEURGesxAEANlpMZjW', + '33jMxlKHDdyRFXtKOq8RreXhq00plorHbgz9zFEWm4VF53+E/KGnmHGyY5Cy8TKy', + 'ZjaueZZ9XuG0huZg5If68irFfNZtxdA26jv8//PdZ0Uj+X6J3RVa2peMLDDswTYL', + 'OL1ZO1fxdtDD40fdAiIZ1QyjwEG0APtz41EfAAMFBAC5/dtgBBPtHe8UjDBaUe4n', + 'NzHuUBBp6XE+H7eqHNFCuZAJ7yqJLGVHNIaQR419cNy08/OO/+YUQ7rg78LxjFiv', + 'CH7IzhfU+6yvELSbgRMicY6EnAP2GT+b1+MtFNa3lBGtBHcJla52c2rTAHthYZWk', + 'fT5R5DnJuQ2cJHBMS9HWyP4DAwK8WfuTe5B+M2C7a/YJSUv6SexdGCaiaTcAm6g/', + 'PvA6hw/FLzIEP67QcQSSTmhftQIwnddt4S4MyJJH3U4fJaFfYQ1zCniYJohJBBgR', + 'AgAJBQJREZ6zAhsMAAoJEBEnlAPLFp74QbMAn3V4857xwnO9/+vzIVnL93W3k0/8', + 'AKC8omYPPomN1E/UJFfXdLDIMi5LoA==', + '=LSrW', + '-----END PGP PRIVATE KEY BLOCK-----' + ].join("\n")); + var pub_key = openpgp.read_publicKey( + [ '-----BEGIN PGP PUBLIC KEY BLOCK-----', + 'Version: GnuPG v1.4.11 (GNU/Linux)', + '', + 'mQGiBFERlw4RBAD6Bmcf2w1dtUmtCLkdxeqZLArk3vYoQAjdibxA3gXVyur7fsWb', + 'ro0jVbBHqOCtC6jDxE2l52NP9+tTlWeVMaqqNvUE47LSaPq2DGI8Wx1Rj6bF3mTs', + 'obYEwhGbGh/MhJnME9AHODarvk8AZbzo0+k1EwrBWF6dTUBPfqO7rGU2ewCg80WV', + 'x5pt3evj8rRK3jQ8SMKTNRsD/1PhTdxdZTdXARAFzcW1VaaruWW0Rr1+XHKKwDCz', + 'i7HE76SO9qjnQfZCZG75CdQxI0h8GFeN3zsDqmhob2iSz2aJ1krtjM+iZ1FBFd57', + 'OqCV6wmk5IT0RBN12ZzMS19YvzN/ONXHrmTZlKExd9Mh9RKLeVNw+bf6JsKQEzcY', + 'JzFkBACX9X+hDYchO/2hiTwx4iOO9Fhsuh7eIWumB3gt+aUpm1jrSbas/QLTymmk', + 'uZuQVXI4NtnlvzlNgWv4L5s5RU5WqNGG7WSaKNdcrvJZRC2dgbUJt04J5CKrWp6R', + 'aIYal/81Ut1778lU01PEt563TcQnUBlnjU5OR25KhfSeN5CZY7QUVGVzdCA8dGVz', + 'dEB0ZXN0LmNvbT6IYgQTEQIAIgUCURGXDgIbAwYLCQgHAwIGFQgCCQoLBBYCAwEC', + 'HgECF4AACgkQikDlZK/UvLSspgCfcNaOpTg1W2ucR1JwBbBGvaERfuMAnRgt3/rs', + 'EplqEakMckCtikEnpxYe', + '=b2Ln', + '-----END PGP PUBLIC KEY BLOCK-----' + ].join("\n")); + var msg = openpgp.read_message([ + '-----BEGIN PGP MESSAGE-----', + 'Version: GnuPG v1.4.11 (GNU/Linux)', + '', + 'hQEOA1N4OCSSjECBEAP/diDJCQn4e88193PgqhbfAkohk9RQ0v0MPnXpJbCRTHKO', + '8r9nxiAr/TQv4ZOingXdAp2JZEoE9pXxZ3r1UWew04czxmgJ8FP1ztZYWVFAWFVi', + 'Tj930TBD7L1fY/MD4fK6xjEG7z5GT8k4tn4mLm/PpWMbarIglfMopTy1M/py2cID', + '/2Sj7Ikh3UFiG+zm4sViYc5roNbMy8ixeoKixxi99Mx8INa2cxNfqbabjblFyc0Z', + 'BwmbIc+ZiY2meRNI5y/tk0gRD7hT84IXGGl6/mH00bsX/kkWdKGeTvz8s5G8RDHa', + 'Za4HgLbXItkX/QarvRS9kvkD01ujHfj+1ZvgmOBttNfP0p8BQLIICqvg1eYD9aPB', + '+GtOZ2F3+k5VyBL5yIn/s65SBjNO8Fqs3aL0x+p7s1cfUzx8J8a8nWpqq/qIQIqg', + 'ZJH6MZRKuQwscwH6NWgsSVwcnVCAXnYOpbHxFQ+j7RbF/+uiuqU+DFH/Rd5pik8b', + '0Dqnp0yfefrkjQ0nuvubgB6Rv89mHpnvuJfFJRInpg4lrHwLvRwdpN2HDozFHcKK', + 'aOU=', + '=4iGt', + '-----END PGP MESSAGE-----' + ].join("\n")); + priv_key[0].subKeys[0].decryptSecretMPIs("abcd"); + var ret = msg[0].decryptAndVerifySignature( + { key: priv_key[0], keymaterial: priv_key[0].subKeys[0]}, + msg[0].sessionKeys[0], + [{obj:pub_key[0], keyId: pub_key[0].getKeyId()}]); + result[0] = new test_result("Testing signature checking on CAST5-enciphered message", + ret.validSignatures[0] == true); + + // exercises the GnuPG s2k type 1001 extension: + // the secrets on the primary key have been stripped. + var priv_key_gnupg_ext = openpgp.read_privateKey([ + '-----BEGIN PGP PRIVATE KEY BLOCK-----', + 'Version: GnuPG v1.4.11 (GNU/Linux)', + '', + 'lQGqBFERnrMRBADmM0hIfkI3yosjgbWo9v0Lnr3CCE+8KsMszgVS+hBu0XfGraKm', + 'ivcA2aaJimHqVYOP7gEnwFAxHBBpeTJcu5wzCFyJwEYqVeS3nnaIhBPplSF14Duf', + 'i6bB9RV7KxVAg6aunmM2tAutqC+a0y2rDaf7jkJoZ9gWJe2zI+vraD6fiwCgxvHo', + '3IgULB9RqIqpLoMgXfcjC+cD/1jeJlKRm+n71ryYwT/ECKsspFz7S36z6q3XyS8Q', + 'QfrsUz2p1fbFicvJwIOJ8B20J/N2/nit4P0gBUTUxv3QEa7XCM/56/xrGkyBzscW', + 'AzBoy/AK9K7GN6z13RozuAS60F1xO7MQc6Yi2VU3eASDQEKiyL/Ubf/s/rkZ+sGj', + 'yJizBACtwCbQzA+z9XBZNUat5NPgcZz5Qeh1nwF9Nxnr6pyBv7tkrLh/3gxRGHqG', + '063dMbUk8pmUcJzBUyRsNiIPDoEUsLjY5zmZZmp/waAhpREsnK29WLCbqLdpUors', + 'c1JJBsObkA1IM8TZY8YUmvsMEvBLCCanuKpclZZXqeRAeOHJ0v4DZQJHTlUBtBZU', + 'ZXN0MiA8dGVzdDJAdGVzdC5jb20+iGIEExECACIFAlERnrMCGwMGCwkIBwMCBhUI', + 'AgkKCwQWAgMBAh4BAheAAAoJEBEnlAPLFp74xc0AoLNZINHe0ytOsNtMCuLvc3Vd', + 'vePUAJ9KX3L5IBqHarsa+aJHX7r796SokZ0BWARREZ6zEAQA2WkxmNbfeMzGUocN', + '3JEVe0o6rxGt5eGrTSmWisduDP3MURabhUXnf4T8oaeYcbJjkLLxMrJmNq55ln1e', + '4bSG5mDkh/ryKsV81m3F0DbqO/z/891nRSP5fondFVral4wsMOzBNgs4vVk7V/F2', + '0MPjR90CIhnVDKPAQbQA+3PjUR8AAwUEALn922AEE+0d7xSMMFpR7ic3Me5QEGnp', + 'cT4ft6oc0UK5kAnvKoksZUc0hpBHjX1w3LTz847/5hRDuuDvwvGMWK8IfsjOF9T7', + 'rK8QtJuBEyJxjoScA/YZP5vX4y0U1reUEa0EdwmVrnZzatMAe2FhlaR9PlHkOcm5', + 'DZwkcExL0dbI/gMDArxZ+5N7kH4zYLtr9glJS/pJ7F0YJqJpNwCbqD8+8DqHD8Uv', + 'MgQ/rtBxBJJOaF+1AjCd123hLgzIkkfdTh8loV9hDXMKeJgmiEkEGBECAAkFAlER', + 'nrMCGwwACgkQESeUA8sWnvhBswCfdXjznvHCc73/6/MhWcv3dbeTT/wAoLyiZg8+', + 'iY3UT9QkV9d0sMgyLkug', + '=GQsY', + '-----END PGP PRIVATE KEY BLOCK-----', + ].join("\n")); + priv_key_gnupg_ext[0].subKeys[0].decryptSecretMPIs("abcd"); + var ret2 = msg[0].decryptAndVerifySignature( + { key: priv_key_gnupg_ext[0], keymaterial: priv_key_gnupg_ext[0].subKeys[0]}, + msg[0].sessionKeys[0], + [{obj:pub_key[0], keyId: pub_key[0].getKeyId()}]); + result[1] = new test_result("Testing GnuPG stripped-key extensions", + priv_key_gnupg_ext[0].privateKeyPacket.s2k.type == 1001 && + ret.validSignatures[0] == true); + + // Exercises the ability of openpgp_keyring.getPublicKeysForKeyId to return subkeys + var test_keyring = new openpgp_keyring(); + test_keyring.init(); + test_keyring.importPublicKey([ + '-----BEGIN PGP PUBLIC KEY BLOCK-----', + 'Version: GnuPG v1.4.11 (GNU/Linux)', + '', + 'mQGiBFERvI4RBAD0M/HGglCtVNXPF72ehT8riAXrl0rSec4RJC61Bh+UAOhxn5+U', + 'fDgos5p1SpIzYmn+M87JoSSVLAjfakFk0gHgR9I3bu7SIwq3Bikk1Vw3gO+yDSO6', + 'TKpLUFGYDiBSSE1MGdxBadWLE1hlRf5B2x62gnGmjSpSVbly33PFkoDmrwCg9rAp', + 'RmncnF9GhWjOLFkEoQw9Yx8EAOsxvq8Ig5Z1gk+ZKfDZeftpHRe3FdrRtbnhxvYY', + '7z+w9uz1EpoZUwDR5G4X3hTwJQ7lXmIOskg/+eRMLEAqEY7b/7tW6RaUJ2d6Ehsi', + 'dOS89fIxElwjAOnVOM5S24f0FDQTTto7QBOoxcNTfkEJCHXSlpoOUmGAP85fXh3l', + 'yPTGBACJfKc76Un3UWC1sWIRDxYiyh3ZpZyNEskoV6ESW8jEI1RnMnv5TrfGJH5K', + 'E8jWX7TTnoFyPJtBTjlucAtkQaS4Bb7dg1LLja17zAqKNGOJK2b9fb2Z+lnTjPiY', + 'i7DPH1XHnfaEexjlh/U7mYa5RrwIphRxNi8gCuxv874ZMmhEn7QWVGVzdDMgPHRl', + 'c3QzQHRlc3QuY29tPohiBBMRAgAiBQJREbyOAhsDBgsJCAcDAgYVCAIJCgsEFgID', + 'AQIeAQIXgAAKCRC0u8O0Moa2JYxyAJ9Oi2UlcUT0VJNgwjyl/VF9Xcjf9gCeJPvy', + 'g/fp4EAU8MJIaN2yMI8pLFS5AaIEURG8nhEEAKVgeNDuYDPufLuJ0GrJV/CbXEjj', + 'aEPA0iTUqV0nTCPdAfQ/nmE3gh5UlNMr/zSHJ+c4FQhYdLrzRGDOSzV+mfPHH3t+', + 'YVx+wat0BYwABpHAtsIuLIVo2RQqYZYH85tatwBkm71HHT3jmlEAvr6NFH38+v3s', + '3w4Wl0/sdHyaeiSXAKCxJ4X1eOdN7L1rrbJozQ/gDCFuVQP/dcV6Ksss8Aw443jG', + 'AYBLHWh6o4GhAY6/h1kijF0xD+uc+tNmTQnQi1tEOoTeIZMXnSRwtk8XEuJkkbAP', + '+uyvMgyV3wrk9zkaTAin7nrjAERxezFOdBEOtnB1CovJxtMn+RRxaMEGpC4GnETy', + 'N5+6FkLuLcNXiCQP75ajzOAN1aID/juNjUNpBbNpfqBV7j1K+Kn0n9HYTyQl9ghy', + '026+/4c8ag2HV+bg3BD7c2VTVu9xBODHsfu0q8Ql/QB9W8tmYugU6DeXMHaeWPUH', + 'ph98guM9kF2yHIiRBvAd5i7wOjwn+I/Ir6nBR2yxJ3p31CDUnUlbjTPYg7mtQvHW', + 'EY2Cp4SWiJEEGBECAAkFAlERvJ4CGwIAUgkQtLvDtDKGtiVHIAQZEQIABgUCURG8', + 'ngAKCRAMiMeR296Y2SjyAJ9V3wRJJ2Szazqal4khWGfLu5R6/wCfQQIRD24yVdz8', + '2a+2eCrwyALT2GAihACfS0nWM3a0gtITqngpJsRws+Ep+eIAn15qD2itutxNb8NI', + 'bR2gBB5QmVJ3', + '=pGA6', + '-----END PGP PUBLIC KEY BLOCK-----' + ].join("\n")); + + var msg2 = openpgp.read_message([ + '-----BEGIN PGP MESSAGE-----', + 'Version: GnuPG v1.4.11 (GNU/Linux)', + '', + 'kA0DAAIRDIjHkdvemNkBrB1iB2Zvby50eHRREbz3VEVTVCBEQVRBIDEyMzQ1NohG', + 'BAARAgAGBQJREbz3AAoJEAyIx5Hb3pjZ2TcAn32LpDEuHe9QrSRlyvSuREKNOFwz', + 'AJ9zh4zsK4GIPuEu81YPNmHsju7DYg==', + '=WaSx', + '-----END PGP MESSAGE-----' + ].join("\n")); + var pubKey = test_keyring.getPublicKeysForKeyId(msg2[1].signature.issuerKeyId); + result[2] = new test_result("Testing keyring public subkey support", + pubKey != null && + pubKey.length == 1 && + msg2[1].signature.verify(msg2[0].data, pubKey[0])); + return result; +}); + + +},{"../../":28,"../unit.js":64}],"2ZZCcm":[function(require,module,exports){ module.exports = require('./unit.js'); @@ -12675,8 +12853,10 @@ require('./crypto/cipher/des.js'); require('./crypto/cipher/twofish.js'); require('./crypto/openpgp.crypto.js'); +require('./crypto/openpgp.sigcheck.js'); -},{"./crypto/cipher/aes.js":53,"./crypto/cipher/blowfish.js":54,"./crypto/cipher/cast5.js":55,"./crypto/cipher/des.js":56,"./crypto/cipher/twofish.js":57,"./crypto/hash/md5.js":58,"./crypto/hash/ripemd.js":59,"./crypto/hash/sha.js":60,"./crypto/openpgp.crypto.js":61,"./unit.js":63}],63:[function(require,module,exports){ + +},{"./crypto/cipher/aes.js":53,"./crypto/cipher/blowfish.js":54,"./crypto/cipher/cast5.js":55,"./crypto/cipher/des.js":56,"./crypto/cipher/twofish.js":57,"./crypto/hash/md5.js":58,"./crypto/hash/ripemd.js":59,"./crypto/hash/sha.js":60,"./crypto/openpgp.crypto.js":61,"./crypto/openpgp.sigcheck.js":62,"./unit.js":64}],64:[function(require,module,exports){ var process=require("__browserify_process"); module.exports = { tests: [], @@ -12726,7 +12906,7 @@ module.exports = { } -},{"__browserify_process":64}],64:[function(require,module,exports){ +},{"__browserify_process":65}],65:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -12781,5 +12961,5 @@ process.chdir = function (dir) { }; },{}]},{},[]) -//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jb21wcmVzc2lvbi9qeGcuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vY2ZiLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL2NpcGhlci9hZXMuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vY2lwaGVyL2Jsb3dmaXNoLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL2NpcGhlci9jYXN0NS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9jaXBoZXIvZGVzLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL2NpcGhlci9pbmRleC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9jaXBoZXIvdHdvZmlzaC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9jcnlwdG8uanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vaGFzaC9pbmRleC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9oYXNoL21kNS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9oYXNoL3JpcGUtbWQuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vaGFzaC9zaGEuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vaW5kZXguanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vcGtjczEuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vcHVibGljX2tleS9kc2EuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvb25lX3Bhc3Nfc2lnbmF0dXJlLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL3B1YmxpY19rZXkvZWxnYW1hbC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9wdWJsaWNfa2V5L2luZGV4LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL3B1YmxpY19rZXkvanNibi5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9wdWJsaWNfa2V5L3JzYS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9yYW5kb20uanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vc2lnbmF0dXJlLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvZW5jb2RpbmcvYXJtb3IuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9lbmNvZGluZy9iYXNlNjQuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9lbnVtcy5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2luZGV4LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvb3BlbnBncC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9hbGxfcGFja2V0cy5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9jb21wcmVzc2VkLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L2luZGV4LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L2xpdGVyYWwuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvbWFya2VyLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3BhY2tldC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9wYWNrZXRsaXN0LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3B1YmxpY19rZXkuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvcHVibGljX2tleV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvcHVibGljX3N1YmtleS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9zZWNyZXRfa2V5LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3NlY3JldF9zdWJrZXkuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvc2lnbmF0dXJlLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3N5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9zeW1fZW5jcnlwdGVkX3Nlc3Npb25fa2V5LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3N5bW1ldHJpY2FsbHlfZW5jcnlwdGVkLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3RydXN0LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3VzZXJfYXR0cmlidXRlLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3VzZXJpZC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3R5cGUva2V5aWQuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy90eXBlL21waS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3R5cGUvczJrLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvdXRpbC91dGlsLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L2NyeXB0by9jaXBoZXIvYWVzLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L2NyeXB0by9jaXBoZXIvYmxvd2Zpc2guanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3Rlc3QvY3J5cHRvL2NpcGhlci9jYXN0NS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvdGVzdC9jcnlwdG8vY2lwaGVyL2Rlcy5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvdGVzdC9jcnlwdG8vY2lwaGVyL3R3b2Zpc2guanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3Rlc3QvY3J5cHRvL2hhc2gvbWQ1LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L2NyeXB0by9oYXNoL3JpcGVtZC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvdGVzdC9jcnlwdG8vaGFzaC9zaGEuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3Rlc3QvY3J5cHRvL29wZW5wZ3AuY3J5cHRvLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L3Rlc3QtYWxsLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L3VuaXQuanMiLCIvdXNyL2xvY2FsL3NoYXJlL25wbS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2luc2VydC1tb2R1bGUtZ2xvYmFscy9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9UQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Y0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIkpYRyA9IHtleGlzdHM6IChmdW5jdGlvbih1bmRlZmluZWQpe3JldHVybiBmdW5jdGlvbih2KXtyZXR1cm4gISh2PT09dW5kZWZpbmVkIHx8IHY9PT1udWxsKTt9fSkoKX07XG5KWEcuZGVjb21wcmVzcyA9IGZ1bmN0aW9uKHN0cikge3JldHVybiB1bmVzY2FwZSgobmV3IEpYRy5VdGlsLlVuemlwKEpYRy5VdGlsLkJhc2U2NC5kZWNvZGVBc0FycmF5KHN0cikpKS51bnppcCgpWzBdWzBdKTt9O1xuLypcbiAgICBDb3B5cmlnaHQgMjAwOC0yMDEyXG4gICAgICAgIE1hdHRoaWFzIEVobWFubixcbiAgICAgICAgTWljaGFlbCBHZXJoYWV1c2VyLFxuICAgICAgICBDYXJzdGVuIE1pbGxlcixcbiAgICAgICAgQmlhbmNhIFZhbGVudGluLFxuICAgICAgICBBbGZyZWQgV2Fzc2VybWFubixcbiAgICAgICAgUGV0ZXIgV2lsZmFocnRcblxuICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEpTWEdyYXBoLlxuICAgIFxuICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy5cblxuICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICAgIGFsb25nIHdpdGggSlNYQ29tcHJlc3Nvci4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiAgICBcbiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBBcGFjaGUgTGljZW5zZSBhbG9uZyB3aXRoIEpTWENvbXByZXNzb3IuICBcbiAgICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLz4uXG5cbiovXG5cbi8qKlxuICAqIEBjbGFzcyBVdGlsIGNsYXNzXG4gICogQGNsYXNzZGVzYyBVdGlsaXRpZXMgZm9yIHVuY29tcHJlc3NpbmcgYW5kIGJhc2U2NCBkZWNvZGluZ1xuICAqIENsYXNzIGZvciBndW56aXBwaW5nLCB1bnppcHBpbmcgYW5kIGJhc2U2NCBkZWNvZGluZyBvZiBmaWxlcy5cbiAgKiBJdCBpcyB1c2VkIGZvciByZWFkaW5nIEdFT05FeFQsIEdlb2dlYnJhIGFuZCBJbnRlcmdlbyBmaWxlcy5cbiAgKlxuICAqIE9ubHkgSHVmZm1hbiBjb2RlcyBhcmUgZGVjb2RlZCBpbiBndW56aXAuXG4gICogVGhlIGNvZGUgaXMgYmFzZWQgb24gdGhlIHNvdXJjZSBjb2RlIGZvciBndW56aXAuYyBieSBQYXNpIE9qYWxhIFxuICAqIHtAbGluayBodHRwOi8vd3d3LmNzLnR1dC5maS9+YWxiZXJ0L0Rldi9ndW56aXAvZ3VuemlwLmN9XG4gICoge0BsaW5rIGh0dHA6Ly93d3cuY3MudHV0LmZpL35hbGJlcnR9XG4gICovXG5KWEcuVXRpbCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4vKipcbiAqIFVuemlwIHppcCBmaWxlc1xuICovXG5KWEcuVXRpbC5VbnppcCA9IGZ1bmN0aW9uIChiYXJyYXkpe1xuICAgIHZhciBvdXRwdXRBcnIgPSBbXSxcbiAgICAgICAgb3V0cHV0ID0gXCJcIixcbiAgICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgICAgZ3BmbGFncyxcbiAgICAgICAgZmlsZXMgPSAwLFxuICAgICAgICB1bnppcHBlZCA9IFtdLFxuICAgICAgICBjcmMsXG4gICAgICAgIGJ1ZjMyayA9IG5ldyBBcnJheSgzMjc2OCksXG4gICAgICAgIGJJZHggPSAwLFxuICAgICAgICBtb2RlWklQPWZhbHNlLFxuXG4gICAgICAgIENSQywgU0laRSxcbiAgICBcbiAgICAgICAgYml0UmV2ZXJzZSA9IFtcbiAgICAgICAgMHgwMCwgMHg4MCwgMHg0MCwgMHhjMCwgMHgyMCwgMHhhMCwgMHg2MCwgMHhlMCxcbiAgICAgICAgMHgxMCwgMHg5MCwgMHg1MCwgMHhkMCwgMHgzMCwgMHhiMCwgMHg3MCwgMHhmMCxcbiAgICAgICAgMHgwOCwgMHg4OCwgMHg0OCwgMHhjOCwgMHgyOCwgMHhhOCwgMHg2OCwgMHhlOCxcbiAgICAgICAgMHgxOCwgMHg5OCwgMHg1OCwgMHhkOCwgMHgzOCwgMHhiOCwgMHg3OCwgMHhmOCxcbiAgICAgICAgMHgwNCwgMHg4NCwgMHg0NCwgMHhjNCwgMHgyNCwgMHhhNCwgMHg2NCwgMHhlNCxcbiAgICAgICAgMHgxNCwgMHg5NCwgMHg1NCwgMHhkNCwgMHgzNCwgMHhiNCwgMHg3NCwgMHhmNCxcbiAgICAgICAgMHgwYywgMHg4YywgMHg0YywgMHhjYywgMHgyYywgMHhhYywgMHg2YywgMHhlYyxcbiAgICAgICAgMHgxYywgMHg5YywgMHg1YywgMHhkYywgMHgzYywgMHhiYywgMHg3YywgMHhmYyxcbiAgICAgICAgMHgwMiwgMHg4MiwgMHg0MiwgMHhjMiwgMHgyMiwgMHhhMiwgMHg2MiwgMHhlMixcbiAgICAgICAgMHgxMiwgMHg5MiwgMHg1MiwgMHhkMiwgMHgzMiwgMHhiMiwgMHg3MiwgMHhmMixcbiAgICAgICAgMHgwYSwgMHg4YSwgMHg0YSwgMHhjYSwgMHgyYSwgMHhhYSwgMHg2YSwgMHhlYSxcbiAgICAgICAgMHgxYSwgMHg5YSwgMHg1YSwgMHhkYSwgMHgzYSwgMHhiYSwgMHg3YSwgMHhmYSxcbiAgICAgICAgMHgwNiwgMHg4NiwgMHg0NiwgMHhjNiwgMHgyNiwgMHhhNiwgMHg2NiwgMHhlNixcbiAgICAgICAgMHgxNiwgMHg5NiwgMHg1NiwgMHhkNiwgMHgzNiwgMHhiNiwgMHg3NiwgMHhmNixcbiAgICAgICAgMHgwZSwgMHg4ZSwgMHg0ZSwgMHhjZSwgMHgyZSwgMHhhZSwgMHg2ZSwgMHhlZSxcbiAgICAgICAgMHgxZSwgMHg5ZSwgMHg1ZSwgMHhkZSwgMHgzZSwgMHhiZSwgMHg3ZSwgMHhmZSxcbiAgICAgICAgMHgwMSwgMHg4MSwgMHg0MSwgMHhjMSwgMHgyMSwgMHhhMSwgMHg2MSwgMHhlMSxcbiAgICAgICAgMHgxMSwgMHg5MSwgMHg1MSwgMHhkMSwgMHgzMSwgMHhiMSwgMHg3MSwgMHhmMSxcbiAgICAgICAgMHgwOSwgMHg4OSwgMHg0OSwgMHhjOSwgMHgyOSwgMHhhOSwgMHg2OSwgMHhlOSxcbiAgICAgICAgMHgxOSwgMHg5OSwgMHg1OSwgMHhkOSwgMHgzOSwgMHhiOSwgMHg3OSwgMHhmOSxcbiAgICAgICAgMHgwNSwgMHg4NSwgMHg0NSwgMHhjNSwgMHgyNSwgMHhhNSwgMHg2NSwgMHhlNSxcbiAgICAgICAgMHgxNSwgMHg5NSwgMHg1NSwgMHhkNSwgMHgzNSwgMHhiNSwgMHg3NSwgMHhmNSxcbiAgICAgICAgMHgwZCwgMHg4ZCwgMHg0ZCwgMHhjZCwgMHgyZCwgMHhhZCwgMHg2ZCwgMHhlZCxcbiAgICAgICAgMHgxZCwgMHg5ZCwgMHg1ZCwgMHhkZCwgMHgzZCwgMHhiZCwgMHg3ZCwgMHhmZCxcbiAgICAgICAgMHgwMywgMHg4MywgMHg0MywgMHhjMywgMHgyMywgMHhhMywgMHg2MywgMHhlMyxcbiAgICAgICAgMHgxMywgMHg5MywgMHg1MywgMHhkMywgMHgzMywgMHhiMywgMHg3MywgMHhmMyxcbiAgICAgICAgMHgwYiwgMHg4YiwgMHg0YiwgMHhjYiwgMHgyYiwgMHhhYiwgMHg2YiwgMHhlYixcbiAgICAgICAgMHgxYiwgMHg5YiwgMHg1YiwgMHhkYiwgMHgzYiwgMHhiYiwgMHg3YiwgMHhmYixcbiAgICAgICAgMHgwNywgMHg4NywgMHg0NywgMHhjNywgMHgyNywgMHhhNywgMHg2NywgMHhlNyxcbiAgICAgICAgMHgxNywgMHg5NywgMHg1NywgMHhkNywgMHgzNywgMHhiNywgMHg3NywgMHhmNyxcbiAgICAgICAgMHgwZiwgMHg4ZiwgMHg0ZiwgMHhjZiwgMHgyZiwgMHhhZiwgMHg2ZiwgMHhlZixcbiAgICAgICAgMHgxZiwgMHg5ZiwgMHg1ZiwgMHhkZiwgMHgzZiwgMHhiZiwgMHg3ZiwgMHhmZlxuICAgIF0sXG4gICAgXG4gICAgY3BsZW5zID0gW1xuICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuICAgIF0sXG5cbiAgICBjcGxleHQgPSBbXG4gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsXG4gICAgICAgIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDAsIDk5LCA5OVxuICAgIF0sIC8qIDk5PT1pbnZhbGlkICovXG5cbiAgICBjcGRpc3QgPSBbXG4gICAgICAgIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDcsIDB4MDAwOSwgMHgwMDBkLFxuICAgICAgICAweDAwMTEsIDB4MDAxOSwgMHgwMDIxLCAweDAwMzEsIDB4MDA0MSwgMHgwMDYxLCAweDAwODEsIDB4MDBjMSxcbiAgICAgICAgMHgwMTAxLCAweDAxODEsIDB4MDIwMSwgMHgwMzAxLCAweDA0MDEsIDB4MDYwMSwgMHgwODAxLCAweDBjMDEsXG4gICAgICAgIDB4MTAwMSwgMHgxODAxLCAweDIwMDEsIDB4MzAwMSwgMHg0MDAxLCAweDYwMDFcbiAgICBdLFxuXG4gICAgY3BkZXh0ID0gW1xuICAgICAgICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAyLCAgMixcbiAgICAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsXG4gICAgICAgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLFxuICAgICAgICAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzXG4gICAgXSxcbiAgICBcbiAgICBib3JkZXIgPSBbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0sXG4gICAgXG4gICAgYkEgPSBiYXJyYXksXG5cbiAgICBieXRlcG9zPTAsXG4gICAgYml0cG9zPTAsXG4gICAgYmIgPSAxLFxuICAgIGJpdHM9MCxcbiAgICBcbiAgICBOQU1FTUFYID0gMjU2LFxuICAgIFxuICAgIG5hbWVCdWYgPSBbXSxcbiAgICBcbiAgICBmaWxlb3V0O1xuICAgIFxuICAgIGZ1bmN0aW9uIHJlYWRCeXRlKCl7XG4gICAgICAgIGJpdHMrPTg7XG4gICAgICAgIGlmIChieXRlcG9zPGJBLmxlbmd0aCl7XG4gICAgICAgICAgICAvL2lmIChkZWJ1ZylcbiAgICAgICAgICAgIC8vICAgIGRvY3VtZW50LndyaXRlKGJ5dGVwb3MrXCI6IFwiK2JBW2J5dGVwb3NdK1wiPGJyPlwiKTtcbiAgICAgICAgICAgIHJldHVybiBiQVtieXRlcG9zKytdO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYnl0ZUFsaWduKCl7XG4gICAgICAgIGJiID0gMTtcbiAgICB9O1xuICAgIFxuICAgIGZ1bmN0aW9uIHJlYWRCaXQoKXtcbiAgICAgICAgdmFyIGNhcnJ5O1xuICAgICAgICBiaXRzKys7XG4gICAgICAgIGNhcnJ5ID0gKGJiICYgMSk7XG4gICAgICAgIGJiID4+PSAxO1xuICAgICAgICBpZiAoYmI9PTApe1xuICAgICAgICAgICAgYmIgPSByZWFkQnl0ZSgpO1xuICAgICAgICAgICAgY2FycnkgPSAoYmIgJiAxKTtcbiAgICAgICAgICAgIGJiID0gKGJiPj4xKSB8IDB4ODA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcnJ5O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWFkQml0cyhhKSB7XG4gICAgICAgIHZhciByZXMgPSAwLFxuICAgICAgICAgICAgaSA9IGE7XG4gICAgXG4gICAgICAgIHdoaWxlKGktLSkge1xuICAgICAgICAgICAgcmVzID0gKHJlczw8MSkgfCByZWFkQml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoYSkge1xuICAgICAgICAgICAgcmVzID0gYml0UmV2ZXJzZVtyZXNdPj4oOC1hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgICAgIFxuICAgIGZ1bmN0aW9uIGZsdXNoQnVmZmVyKCl7XG4gICAgICAgIC8vZG9jdW1lbnQud3JpdGUoJ0ZMVVNIQlVGRkVSOicrYnVmMzJrKTtcbiAgICAgICAgYklkeCA9IDA7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBhZGRCdWZmZXIoYSl7XG4gICAgICAgIFNJWkUrKztcbiAgICAgICAgLy9DUkM9dXBkY3JjKGEsY3JjKTtcbiAgICAgICAgYnVmMzJrW2JJZHgrK10gPSBhO1xuICAgICAgICBvdXRwdXRBcnIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKTtcbiAgICAgICAgLy9vdXRwdXQrPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk7XG4gICAgICAgIGlmKGJJZHg9PTB4ODAwMCl7XG4gICAgICAgICAgICAvL2RvY3VtZW50LndyaXRlKCdBRERCVUZGRVI6JytidWYzMmspO1xuICAgICAgICAgICAgYklkeD0wO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBcbiAgICBmdW5jdGlvbiBIdWZOb2RlKCkge1xuICAgICAgICB0aGlzLmIwPTA7XG4gICAgICAgIHRoaXMuYjE9MDtcbiAgICAgICAgdGhpcy5qdW1wID0gbnVsbDtcbiAgICAgICAgdGhpcy5qdW1wcG9zID0gLTE7XG4gICAgfTtcblxuICAgIHZhciBMSVRFUkFMUyA9IDI4ODtcbiAgICBcbiAgICB2YXIgbGl0ZXJhbFRyZWUgPSBuZXcgQXJyYXkoTElURVJBTFMpO1xuICAgIHZhciBkaXN0YW5jZVRyZWUgPSBuZXcgQXJyYXkoMzIpO1xuICAgIHZhciB0cmVlcG9zPTA7XG4gICAgdmFyIFBsYWNlcyA9IG51bGw7XG4gICAgdmFyIFBsYWNlczIgPSBudWxsO1xuICAgIFxuICAgIHZhciBpbXBEaXN0YW5jZVRyZWUgPSBuZXcgQXJyYXkoNjQpO1xuICAgIHZhciBpbXBMZW5ndGhUcmVlID0gbmV3IEFycmF5KDY0KTtcbiAgICBcbiAgICB2YXIgbGVuID0gMDtcbiAgICB2YXIgZnBvcyA9IG5ldyBBcnJheSgxNyk7XG4gICAgZnBvc1swXT0wO1xuICAgIHZhciBmbGVucztcbiAgICB2YXIgZm1heDtcbiAgICBcbiAgICBmdW5jdGlvbiBJc1BhdCgpIHtcbiAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIGlmIChmcG9zW2xlbl0gPj0gZm1heClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAoZmxlbnNbZnBvc1tsZW5dXSA9PSBsZW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZwb3NbbGVuXSsrO1xuICAgICAgICAgICAgZnBvc1tsZW5dKys7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gUmVjKCkge1xuICAgICAgICB2YXIgY3VycGxhY2UgPSBQbGFjZXNbdHJlZXBvc107XG4gICAgICAgIHZhciB0bXA7XG4gICAgICAgIGlmIChkZWJ1ZylcbiAgICBcdFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+bGVuOlwiK2xlbitcIiB0cmVlcG9zOlwiK3RyZWVwb3MpO1xuICAgICAgICBpZihsZW49PTE3KSB7IC8vd2FyIDE3XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdHJlZXBvcysrO1xuICAgICAgICBsZW4rKztcbiAgICBcdFxuICAgICAgICB0bXAgPSBJc1BhdCgpO1xuICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+SXNQYXQgXCIrdG1wKTtcbiAgICAgICAgaWYodG1wID49IDApIHtcbiAgICAgICAgICAgIGN1cnBsYWNlLmIwID0gdG1wOyAgICAvKiBsZWFmIGNlbGwgZm9yIDAtYml0ICovXG4gICAgICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPmIwIFwiK2N1cnBsYWNlLmIwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogTm90IGEgTGVhZiBjZWxsICovXG4gICAgICAgIGN1cnBsYWNlLmIwID0gMHg4MDAwO1xuICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+YjAgXCIrY3VycGxhY2UuYjApO1xuICAgICAgICBpZihSZWMoKSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICB0bXAgPSBJc1BhdCgpO1xuICAgICAgICBpZih0bXAgPj0gMCkge1xuICAgICAgICAgICAgY3VycGxhY2UuYjEgPSB0bXA7ICAgIC8qIGxlYWYgY2VsbCBmb3IgMS1iaXQgKi9cbiAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+YjEgXCIrY3VycGxhY2UuYjEpO1xuICAgICAgICAgICAgY3VycGxhY2UuanVtcCA9IG51bGw7ICAgIC8qIEp1c3QgZm9yIHRoZSBkaXNwbGF5IHJvdXRpbmUgKi9cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIE5vdCBhIExlYWYgY2VsbCAqL1xuICAgICAgICAgICAgY3VycGxhY2UuYjEgPSAweDgwMDA7XG4gICAgICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPmIxIFwiK2N1cnBsYWNlLmIxKTtcbiAgICAgICAgICAgIGN1cnBsYWNlLmp1bXAgPSBQbGFjZXNbdHJlZXBvc107XG4gICAgICAgICAgICBjdXJwbGFjZS5qdW1wcG9zID0gdHJlZXBvcztcbiAgICAgICAgICAgIGlmKFJlYygpKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBsZW4tLTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIENyZWF0ZVRyZWUoY3VycmVudFRyZWUsIG51bXZhbCwgbGVuZ3Rocywgc2hvdykge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgLyogQ3JlYXRlIHRoZSBIdWZmbWFuIGRlY29kZSB0cmVlL3RhYmxlICovXG4gICAgICAgIC8vZG9jdW1lbnQud3JpdGUoXCI8YnI+Y3JlYXRldHJlZTxicj5cIik7XG4gICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgXHRkb2N1bWVudC53cml0ZShcImN1cnJlbnRUcmVlIFwiK2N1cnJlbnRUcmVlK1wiIG51bXZhbCBcIitudW12YWwrXCIgbGVuZ3RocyBcIitsZW5ndGhzK1wiIHNob3cgXCIrc2hvdyk7XG4gICAgICAgIFBsYWNlcyA9IGN1cnJlbnRUcmVlO1xuICAgICAgICB0cmVlcG9zPTA7XG4gICAgICAgIGZsZW5zID0gbGVuZ3RocztcbiAgICAgICAgZm1heCAgPSBudW12YWw7XG4gICAgICAgIGZvciAoaT0wO2k8MTc7aSsrKVxuICAgICAgICAgICAgZnBvc1tpXSA9IDA7XG4gICAgICAgIGxlbiA9IDA7XG4gICAgICAgIGlmKFJlYygpKSB7XG4gICAgICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCBcImludmFsaWQgaHVmZm1hbiB0cmVlXFxuXCIpO1xuICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICAgXHRhbGVydChcImludmFsaWQgaHVmZm1hbiB0cmVlXFxuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJ1Zyl7XG4gICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoJzxicj5UcmVlOiAnK1BsYWNlcy5sZW5ndGgpO1xuICAgICAgICBcdGZvciAodmFyIGE9MDthPDMyO2ErKyl7XG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiUGxhY2VzW1wiK2ErXCJdLmIwPVwiK1BsYWNlc1thXS5iMCtcIjxicj5cIik7XG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiUGxhY2VzW1wiK2ErXCJdLmIxPVwiK1BsYWNlc1thXS5iMStcIjxicj5cIik7XG4gICAgICAgIFx0fVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIC8qaWYoc2hvdykge1xuICAgICAgICAgICAgdmFyIHRtcDtcbiAgICAgICAgICAgIGZvcih0bXA9Y3VycmVudFRyZWU7dG1wPFBsYWNlczt0bXArKykge1xuICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCBcIjB4JTAzeCAgMHglMDN4ICgweCUwNHgpXCIsdG1wLWN1cnJlbnRUcmVlLCB0bXAtPmp1bXA/dG1wLT5qdW1wLWN1cnJlbnRUcmVlOjAsKHRtcC0+anVtcD90bXAtPmp1bXAtY3VycmVudFRyZWU6MCkqNisweGNmMCk7XG4gICAgICAgICAgICAgICAgaWYoISh0bXAuYjAgJiAweDgwMDApKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsIFwiICAweCUwM3ggKCVjKVwiLCB0bXAtPmIwLCh0bXAtPmIwPDI1NiAmJiBpc3ByaW50KHRtcC0+YjApKT90bXAtPmIwOifvv70nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoISh0bXAuYjEgJiAweDgwMDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCh0bXAuYjAgJiAweDgwMDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsIFwiICAgICAgICAgICBcIik7XG4gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCBcIiAgMHglMDN4ICglYylcIiwgdG1wLT5iMSwodG1wLT5iMTwyNTYgJiYgaXNwcmludCh0bXAtPmIxKSk/dG1wLT5iMTon77+9Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCBcIlxcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSovXG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgXG4gICAgZnVuY3Rpb24gRGVjb2RlVmFsdWUoY3VycmVudFRyZWUpIHtcbiAgICAgICAgdmFyIGxlbiwgaSxcbiAgICAgICAgICAgIHh0cmVlcG9zPTAsXG4gICAgICAgICAgICBYID0gY3VycmVudFRyZWVbeHRyZWVwb3NdLFxuICAgICAgICAgICAgYjtcblxuICAgICAgICAvKiBkZWNvZGUgb25lIHN5bWJvbCBvZiB0aGUgZGF0YSAqL1xuICAgICAgICB3aGlsZSgxKSB7XG4gICAgICAgICAgICBiPXJlYWRCaXQoKTtcbiAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCJiPVwiK2IpO1xuICAgICAgICAgICAgaWYoYikge1xuICAgICAgICAgICAgICAgIGlmKCEoWC5iMSAmIDB4ODAwMCkpe1xuICAgICAgICAgICAgICAgIFx0aWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwicmV0MVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFguYjE7ICAgIC8qIElmIGxlYWYgbm9kZSwgcmV0dXJuIGRhdGEgKi9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgWCA9IFguanVtcDtcbiAgICAgICAgICAgICAgICBsZW4gPSBjdXJyZW50VHJlZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChpPTA7aTxsZW47aSsrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUcmVlW2ldPT09WCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB4dHJlZXBvcz1pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy94dHJlZXBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZighKFguYjAgJiAweDgwMDApKXtcbiAgICAgICAgICAgICAgICBcdGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcInJldDJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBYLmIwOyAgICAvKiBJZiBsZWFmIG5vZGUsIHJldHVybiBkYXRhICovXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vWCsrOyAvLz8/Pz8/Pz8/Pz8/Pz8/Pz8/P1xuICAgICAgICAgICAgICAgIHh0cmVlcG9zKys7XG4gICAgICAgICAgICAgICAgWCA9IGN1cnJlbnRUcmVlW3h0cmVlcG9zXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCJyZXQzXCIpO1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgICBcbiAgICBmdW5jdGlvbiBEZWZsYXRlTG9vcCgpIHtcbiAgICB2YXIgbGFzdCwgYywgdHlwZSwgaSwgbGVuO1xuXG4gICAgZG8ge1xuICAgICAgICAvKmlmKChsYXN0ID0gcmVhZEJpdCgpKSl7XG4gICAgICAgICAgICBmcHJpbnRmKGVycmZwLCBcIkxhc3QgQmxvY2s6IFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZwcmludGYoZXJyZnAsIFwiTm90IExhc3QgQmxvY2s6IFwiKTtcbiAgICAgICAgfSovXG4gICAgICAgIGxhc3QgPSByZWFkQml0KCk7XG4gICAgICAgIHR5cGUgPSByZWFkQml0cygyKTtcbiAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIFx0aWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgIFx0YWxlcnQoXCJTdG9yZWRcXG5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBcdGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICBcdGFsZXJ0KFwiRml4ZWQgSHVmZm1hbiBjb2Rlc1xcblwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIFx0aWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgIFx0YWxlcnQoXCJEeW5hbWljIEh1ZmZtYW4gY29kZXNcXG5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBcdGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICBcdGFsZXJ0KFwiUmVzZXJ2ZWQgYmxvY2sgdHlwZSEhXFxuXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIFx0aWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgIFx0YWxlcnQoXCJVbmV4cGVjdGVkIHZhbHVlICVkIVxcblwiLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGU9PTApIHtcbiAgICAgICAgICAgIHZhciBibG9ja0xlbiwgY1N1bTtcblxuICAgICAgICAgICAgLy8gU3RvcmVkIFxuICAgICAgICAgICAgYnl0ZUFsaWduKCk7XG4gICAgICAgICAgICBibG9ja0xlbiA9IHJlYWRCeXRlKCk7XG4gICAgICAgICAgICBibG9ja0xlbiB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cbiAgICAgICAgICAgIGNTdW0gPSByZWFkQnl0ZSgpO1xuICAgICAgICAgICAgY1N1bSB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cbiAgICAgICAgICAgIGlmKCgoYmxvY2tMZW4gXiB+Y1N1bSkgJiAweGZmZmYpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoXCJCbG9ja0xlbiBjaGVja3N1bSBtaXNtYXRjaFxcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlKGJsb2NrTGVuLS0pIHtcbiAgICAgICAgICAgICAgICBjID0gcmVhZEJ5dGUoKTtcbiAgICAgICAgICAgICAgICBhZGRCdWZmZXIoYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZih0eXBlPT0xKSB7XG4gICAgICAgICAgICB2YXIgajtcblxuICAgICAgICAgICAgLyogRml4ZWQgSHVmZm1hbiB0YWJsZXMgLS0gZml4ZWQgZGVjb2RlIHJvdXRpbmUgKi9cbiAgICAgICAgICAgIHdoaWxlKDEpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgMjU2ICAgIDAwMDAwMDAgICAgICAgIDBcbiAgICAgICAgICAgICAgICA6ICAgOiAgICAgOlxuICAgICAgICAgICAgICAgIDI3OSAgICAwMDEwMTExICAgICAgICAyM1xuICAgICAgICAgICAgICAgIDAgICAwMDExMDAwMCAgICA0OFxuICAgICAgICAgICAgICAgIDogICAgOiAgICAgIDpcbiAgICAgICAgICAgICAgICAxNDMgICAgMTAxMTExMTEgICAgMTkxXG4gICAgICAgICAgICAgICAgMjgwIDExMDAwMDAwICAgIDE5MlxuICAgICAgICAgICAgICAgIDogICAgOiAgICAgIDpcbiAgICAgICAgICAgICAgICAyODcgMTEwMDAxMTEgICAgMTk5XG4gICAgICAgICAgICAgICAgMTQ0ICAgIDExMDAxMDAwMCAgICA0MDBcbiAgICAgICAgICAgICAgICA6ICAgIDogICAgICAgOlxuICAgICAgICAgICAgICAgIDI1NSAgICAxMTExMTExMTEgICAgNTExXG4gICAgXG4gICAgICAgICAgICAgICAgTm90ZSB0aGUgYml0IG9yZGVyIVxuICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIGogPSAoYml0UmV2ZXJzZVtyZWFkQml0cyg3KV0+PjEpO1xuICAgICAgICAgICAgaWYoaiA+IDIzKSB7XG4gICAgICAgICAgICAgICAgaiA9IChqPDwxKSB8IHJlYWRCaXQoKTsgICAgLyogNDguLjI1NSAqL1xuXG4gICAgICAgICAgICAgICAgaWYoaiA+IDE5OSkgeyAgICAvKiAyMDAuLjI1NSAqL1xuICAgICAgICAgICAgICAgICAgICBqIC09IDEyODsgICAgLyogIDcyLi4xMjcgKi9cbiAgICAgICAgICAgICAgICAgICAgaiA9IChqPDwxKSB8IHJlYWRCaXQoKTsgICAgICAgIC8qIDE0NC4uMjU1IDw8ICovXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgIC8qICA0OC4uMTk5ICovXG4gICAgICAgICAgICAgICAgICAgIGogLT0gNDg7ICAgIC8qICAgMC4uMTUxICovXG4gICAgICAgICAgICAgICAgICAgIGlmKGogPiAxNDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBqKzEzNjsgICAgLyogMjgwLi4yODcgPDwgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMC4uMTQzIDw8ICovXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAgICAvKiAgIDAuLjIzICovXG4gICAgICAgICAgICAgICAgaiArPSAyNTY7ICAgIC8qIDI1Ni4uMjc5IDw8ICovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihqIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgYWRkQnVmZmVyKGopO1xuICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQud3JpdGUoXCJvdXQ6XCIrU3RyaW5nLmZyb21DaGFyQ29kZShqKSk7XG4gICAgICAgICAgICAgICAgLypmcHJpbnRmKGVycmZwLCBcIkAlZCAlMDJ4XFxuXCIsIFNJWkUsIGopOyovXG4gICAgICAgICAgICB9IGVsc2UgaWYoaiA9PSAyNTYpIHtcbiAgICAgICAgICAgICAgICAvKiBFT0YgKi9cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiwgZGlzdDtcblxuICAgICAgICAgICAgICAgIGogLT0gMjU2ICsgMTsgICAgLyogYnl0ZXMgKyBFT0YgKi9cbiAgICAgICAgICAgICAgICBsZW4gPSByZWFkQml0cyhjcGxleHRbal0pICsgY3BsZW5zW2pdO1xuXG4gICAgICAgICAgICAgICAgaiA9IGJpdFJldmVyc2VbcmVhZEJpdHMoNSldPj4zO1xuICAgICAgICAgICAgICAgIGlmKGNwZGV4dFtqXSA+IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdCA9IHJlYWRCaXRzKDgpO1xuICAgICAgICAgICAgICAgICAgICBkaXN0IHw9IChyZWFkQml0cyhjcGRleHRbal0tOCk8PDgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3QgPSByZWFkQml0cyhjcGRleHRbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXN0ICs9IGNwZGlzdFtqXTtcblxuICAgICAgICAgICAgICAgIC8qZnByaW50ZihlcnJmcCwgXCJAJWQgKGwlMDJ4LGQlMDR4KVxcblwiLCBTSVpFLCBsZW4sIGRpc3QpOyovXG4gICAgICAgICAgICAgICAgZm9yKGo9MDtqPGxlbjtqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBidWYzMmtbKGJJZHggLSBkaXN0KSAmIDB4N2ZmZl07XG4gICAgICAgICAgICAgICAgICAgIGFkZEJ1ZmZlcihjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIHdoaWxlXG4gICAgICAgIH0gZWxzZSBpZih0eXBlPT0yKSB7XG4gICAgICAgICAgICB2YXIgaiwgbiwgbGl0ZXJhbENvZGVzLCBkaXN0Q29kZXMsIGxlbkNvZGVzO1xuICAgICAgICAgICAgdmFyIGxsID0gbmV3IEFycmF5KDI4OCszMik7ICAgIC8vIFwic3RhdGljXCIganVzdCB0byBwcmVzZXJ2ZSBzdGFja1xuICAgIFxuICAgICAgICAgICAgLy8gRHluYW1pYyBIdWZmbWFuIHRhYmxlcyBcbiAgICBcbiAgICAgICAgICAgIGxpdGVyYWxDb2RlcyA9IDI1NyArIHJlYWRCaXRzKDUpO1xuICAgICAgICAgICAgZGlzdENvZGVzID0gMSArIHJlYWRCaXRzKDUpO1xuICAgICAgICAgICAgbGVuQ29kZXMgPSA0ICsgcmVhZEJpdHMoNCk7XG4gICAgICAgICAgICAvL2RvY3VtZW50LndyaXRlKFwiPGJyPnBhcmFtOiBcIitsaXRlcmFsQ29kZXMrXCIgXCIrZGlzdENvZGVzK1wiIFwiK2xlbkNvZGVzK1wiPGJyPlwiKTtcbiAgICAgICAgICAgIGZvcihqPTA7IGo8MTk7IGorKykge1xuICAgICAgICAgICAgICAgIGxsW2pdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIC8vIEdldCB0aGUgZGVjb2RlIHRyZWUgY29kZSBsZW5ndGhzXG4gICAgXG4gICAgICAgICAgICAvL2RvY3VtZW50LndyaXRlKFwiPGJyPlwiKTtcbiAgICAgICAgICAgIGZvcihqPTA7IGo8bGVuQ29kZXM7IGorKykge1xuICAgICAgICAgICAgICAgIGxsW2JvcmRlcltqXV0gPSByZWFkQml0cygzKTtcbiAgICAgICAgICAgICAgICAvL2RvY3VtZW50LndyaXRlKGxsW2JvcmRlcltqXV0rXCIgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9mcHJpbnRmKGVycmZwLCBcIlxcblwiKTtcbiAgICAgICAgICAgIC8vZG9jdW1lbnQud3JpdGUoJzxicj5sbDonK2xsKTtcbiAgICAgICAgICAgIGxlbiA9IGRpc3RhbmNlVHJlZS5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKylcbiAgICAgICAgICAgICAgICBkaXN0YW5jZVRyZWVbaV09bmV3IEh1Zk5vZGUoKTtcbiAgICAgICAgICAgIGlmKENyZWF0ZVRyZWUoZGlzdGFuY2VUcmVlLCAxOSwgbGwsIDApKSB7XG4gICAgICAgICAgICAgICAgZmx1c2hCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWJ1Zyl7XG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPmRpc3RhbmNlVHJlZVwiKTtcbiAgICAgICAgICAgIFx0Zm9yKHZhciBhPTA7YTxkaXN0YW5jZVRyZWUubGVuZ3RoO2ErKyl7XG4gICAgICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcIjxicj5cIitkaXN0YW5jZVRyZWVbYV0uYjArXCIgXCIrZGlzdGFuY2VUcmVlW2FdLmIxK1wiIFwiK2Rpc3RhbmNlVHJlZVthXS5qdW1wK1wiIFwiK2Rpc3RhbmNlVHJlZVthXS5qdW1wcG9zKTtcbiAgICAgICAgICAgICAgICBcdC8qaWYgKGRpc3RhbmNlVHJlZVthXS5qdW1wcG9zIT0tMSlcbiAgICAgICAgICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcIiBcIitkaXN0YW5jZVRyZWVbYV0uanVtcC5iMCtcIiBcIitkaXN0YW5jZVRyZWVbYV0uanVtcC5iMSk7XG4gICAgICAgICAgICAgICAgXHQqL1xuICAgICAgICAgICAgXHR9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2RvY3VtZW50LndyaXRlKCc8QlI+dHJlZSBjcmVhdGVkJyk7XG4gICAgXG4gICAgICAgICAgICAvL3JlYWQgaW4gbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzXG4gICAgICAgICAgICBuID0gbGl0ZXJhbENvZGVzICsgZGlzdENvZGVzO1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICB2YXIgej0tMTtcbiAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+bj1cIituK1wiIGJpdHM6IFwiK2JpdHMrXCI8YnI+XCIpO1xuICAgICAgICAgICAgd2hpbGUoaSA8IG4pIHtcbiAgICAgICAgICAgICAgICB6Kys7XG4gICAgICAgICAgICAgICAgaiA9IERlY29kZVZhbHVlKGRpc3RhbmNlVHJlZSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+XCIreitcIiBpOlwiK2krXCIgZGVjb2RlOiBcIitqK1wiICAgIGJpdHMgXCIrYml0cytcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgaWYoajwxNikgeyAgICAvLyBsZW5ndGggb2YgY29kZSBpbiBiaXRzICgwLi4xNSlcbiAgICAgICAgICAgICAgICAgICAgICAgbGxbaSsrXSA9IGo7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGo9PTE2KSB7ICAgIC8vIHJlcGVhdCBsYXN0IGxlbmd0aCAzIHRvIDYgdGltZXMgXG4gICAgICAgICAgICAgICAgICAgICAgIHZhciBsO1xuICAgICAgICAgICAgICAgICAgICBqID0gMyArIHJlYWRCaXRzKDIpO1xuICAgICAgICAgICAgICAgICAgICBpZihpK2ogPiBuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbCA9IGkgPyBsbFtpLTFdIDogMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUoai0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsbFtpKytdID0gbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGo9PTE3KSB7ICAgICAgICAvLyAzIHRvIDEwIHplcm8gbGVuZ3RoIGNvZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBqID0gMyArIHJlYWRCaXRzKDMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLy8gaiA9PSAxODogMTEgdG8gMTM4IHplcm8gbGVuZ3RoIGNvZGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDExICsgcmVhZEJpdHMoNyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYoaStqID4gbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlKGotLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGxbaSsrXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKmZvcihqPTA7IGo8bGl0ZXJhbENvZGVzK2Rpc3RDb2RlczsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy9mcHJpbnRmKGVycmZwLCBcIiVkIFwiLCBsbFtqXSk7XG4gICAgICAgICAgICAgICAgaWYgKChqJjcpPT03KVxuICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGVycmZwLCBcIlxcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZwcmludGYoZXJyZnAsIFwiXFxuXCIpOyovXG4gICAgICAgICAgICAvLyBDYW4gb3ZlcndyaXRlIHRyZWUgZGVjb2RlIHRyZWUgYXMgaXQgaXMgbm90IHVzZWQgYW55bW9yZVxuICAgICAgICAgICAgbGVuID0gbGl0ZXJhbFRyZWUubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspXG4gICAgICAgICAgICAgICAgbGl0ZXJhbFRyZWVbaV09bmV3IEh1Zk5vZGUoKTtcbiAgICAgICAgICAgIGlmKENyZWF0ZVRyZWUobGl0ZXJhbFRyZWUsIGxpdGVyYWxDb2RlcywgbGwsIDApKSB7XG4gICAgICAgICAgICAgICAgZmx1c2hCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IGxpdGVyYWxUcmVlLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKVxuICAgICAgICAgICAgICAgIGRpc3RhbmNlVHJlZVtpXT1uZXcgSHVmTm9kZSgpO1xuICAgICAgICAgICAgdmFyIGxsMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgZm9yIChpPWxpdGVyYWxDb2RlczsgaSA8bGwubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGxsMltpLWxpdGVyYWxDb2Rlc109bGxbaV07XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgaWYoQ3JlYXRlVHJlZShkaXN0YW5jZVRyZWUsIGRpc3RDb2RlcywgbGwyLCAwKSkge1xuICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgICAgIFx0XHRkb2N1bWVudC53cml0ZShcIjxicj5saXRlcmFsVHJlZVwiKTtcbiAgICAgICAgICAgIG91dGVyOlxuICAgICAgICAgICAgd2hpbGUoMSkge1xuICAgICAgICAgICAgICAgIGogPSBEZWNvZGVWYWx1ZShsaXRlcmFsVHJlZSk7XG4gICAgICAgICAgICAgICAgaWYoaiA+PSAyNTYpIHsgICAgICAgIC8vIEluIEM2NDogaWYgY2Fycnkgc2V0XG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW4sIGRpc3Q7XG4gICAgICAgICAgICAgICAgICAgIGogLT0gMjU2O1xuICAgICAgICAgICAgICAgICAgICBpZihqID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVPRlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgICAgICBsZW4gPSByZWFkQml0cyhjcGxleHRbal0pICsgY3BsZW5zW2pdO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICBqID0gRGVjb2RlVmFsdWUoZGlzdGFuY2VUcmVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoY3BkZXh0W2pdID4gOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCA9IHJlYWRCaXRzKDgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCB8PSAocmVhZEJpdHMoY3BkZXh0W2pdLTgpPDw4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSByZWFkQml0cyhjcGRleHRbal0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gY3BkaXN0W2pdO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZShsZW4tLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYklkeCAtIGRpc3QgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGJ1ZjMya1soYklkeCAtIGRpc3QpICYgMHg3ZmZmXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEJ1ZmZlcihjKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEJ1ZmZlcihqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IHdoaWxlKCFsYXN0KTtcbiAgICBmbHVzaEJ1ZmZlcigpO1xuXG4gICAgYnl0ZUFsaWduKCk7XG4gICAgcmV0dXJuIDA7XG59O1xuXG5KWEcuVXRpbC5VbnppcC5wcm90b3R5cGUudW56aXBGaWxlID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpO1xuXHR0aGlzLnVuemlwKCk7XG5cdC8vYWxlcnQodW56aXBwZWRbMF1bMV0pO1xuXHRmb3IgKGk9MDtpPHVuemlwcGVkLmxlbmd0aDtpKyspe1xuXHRcdGlmKHVuemlwcGVkW2ldWzFdPT1uYW1lKSB7XG5cdFx0XHRyZXR1cm4gdW56aXBwZWRbaV1bMF07XG5cdFx0fVxuXHR9XG5cdFxuICB9O1xuXG5KWEcuVXRpbC5VbnppcC5wcm90b3R5cGUuZGVmbGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIG91dHB1dEFyciA9IFtdO1xuICAgIHZhciB0bXAgPSBbXTtcbiAgICBtb2RlWklQID0gZmFsc2U7XG4gICAgRGVmbGF0ZUxvb3AoKTtcbiAgICBpZiAoZGVidWcpXG4gICAgICAgIGFsZXJ0KG91dHB1dEFyci5qb2luKCcnKSk7XG4gICAgdW56aXBwZWRbZmlsZXNdID0gbmV3IEFycmF5KDIpO1xuICAgIHVuemlwcGVkW2ZpbGVzXVswXSA9IG91dHB1dEFyci5qb2luKCcnKTtcbiAgICB1bnppcHBlZFtmaWxlc11bMV0gPSBcIkRFRkxBVEVcIjtcbiAgICBmaWxlcysrO1xuICAgIHJldHVybiB1bnppcHBlZDtcbn0gICAgXG4gICAgXG5KWEcuVXRpbC5VbnppcC5wcm90b3R5cGUudW56aXAgPSBmdW5jdGlvbigpIHtcblx0Ly9jb252ZXJ0VG9CeXRlQXJyYXkoaW5wdXQpO1xuXHRpZiAoZGVidWcpXG5cdFx0YWxlcnQoYkEpO1xuXHQvKmZvciAoaT0wO2k8YkEubGVuZ3RoKjg7aSsrKXtcblx0XHRkb2N1bWVudC53cml0ZShyZWFkQml0KCkpO1xuXHRcdGlmICgoaSsxKSU4PT0wKVxuXHRcdFx0ZG9jdW1lbnQud3JpdGUoXCIgXCIpO1xuXHR9Ki9cblx0Lypmb3IgKGk9MDtpPGJBLmxlbmd0aDtpKyspe1xuXHRcdGRvY3VtZW50LndyaXRlKHJlYWRCeXRlKCkrXCIgXCIpO1xuXHRcdGlmICgoaSsxKSU4PT0wKVxuXHRcdFx0ZG9jdW1lbnQud3JpdGUoXCIgXCIpO1xuXHR9XG5cdGZvciAoaT0wO2k8YkEubGVuZ3RoO2krKyl7XG5cdFx0ZG9jdW1lbnQud3JpdGUoYkFbaV0rXCIgXCIpO1xuXHRcdGlmICgoaSsxKSUxNj09MClcblx0XHRcdGRvY3VtZW50LndyaXRlKFwiPGJyPlwiKTtcblx0fVx0XG5cdCovXG5cdC8vYWxlcnQoYkEpO1xuXHRuZXh0RmlsZSgpO1xuXHRyZXR1cm4gdW56aXBwZWQ7XG4gIH07XG4gICAgXG4gZnVuY3Rpb24gbmV4dEZpbGUoKXtcbiBcdGlmIChkZWJ1ZylcbiBcdFx0YWxlcnQoXCJORVhURklMRVwiKTtcbiBcdG91dHB1dEFyciA9IFtdO1xuIFx0dmFyIHRtcCA9IFtdO1xuIFx0bW9kZVpJUCA9IGZhbHNlO1xuXHR0bXBbMF0gPSByZWFkQnl0ZSgpO1xuXHR0bXBbMV0gPSByZWFkQnl0ZSgpO1xuXHRpZiAoZGVidWcpXG5cdFx0YWxlcnQoXCJ0eXBlOiBcIit0bXBbMF0rXCIgXCIrdG1wWzFdKTtcblx0aWYgKHRtcFswXSA9PSBwYXJzZUludChcIjc4XCIsMTYpICYmIHRtcFsxXSA9PSBwYXJzZUludChcImRhXCIsMTYpKXsgLy9HWklQXG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQoXCJHRU9ORXhULUdaSVBcIik7XG5cdFx0RGVmbGF0ZUxvb3AoKTtcblx0XHRpZiAoZGVidWcpXG5cdFx0XHRhbGVydChvdXRwdXRBcnIuam9pbignJykpO1xuXHRcdHVuemlwcGVkW2ZpbGVzXSA9IG5ldyBBcnJheSgyKTtcbiAgICBcdHVuemlwcGVkW2ZpbGVzXVswXSA9IG91dHB1dEFyci5qb2luKCcnKTtcbiAgICBcdHVuemlwcGVkW2ZpbGVzXVsxXSA9IFwiZ2VvbmV4dC5neHRcIjtcbiAgICBcdGZpbGVzKys7XG5cdH1cblx0aWYgKHRtcFswXSA9PSBwYXJzZUludChcIjc4XCIsMTYpICYmIHRtcFsxXSA9PSBwYXJzZUludChcIjljXCIsMTYpKXsgLy9aTElCXG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQoXCJaTElCXCIpO1xuXHRcdERlZmxhdGVMb29wKCk7XG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQob3V0cHV0QXJyLmpvaW4oJycpKTtcblx0XHR1bnppcHBlZFtmaWxlc10gPSBuZXcgQXJyYXkoMik7XG4gICAgXHR1bnppcHBlZFtmaWxlc11bMF0gPSBvdXRwdXRBcnIuam9pbignJyk7XG4gICAgXHR1bnppcHBlZFtmaWxlc11bMV0gPSBcIlpMSUJcIjtcbiAgICBcdGZpbGVzKys7XG5cdH1cblx0aWYgKHRtcFswXSA9PSBwYXJzZUludChcIjFmXCIsMTYpICYmIHRtcFsxXSA9PSBwYXJzZUludChcIjhiXCIsMTYpKXsgLy9HWklQXG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQoXCJHWklQXCIpO1xuXHRcdC8vRGVmbGF0ZUxvb3AoKTtcblx0XHRza2lwZGlyKCk7XG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQob3V0cHV0QXJyLmpvaW4oJycpKTtcblx0XHR1bnppcHBlZFtmaWxlc10gPSBuZXcgQXJyYXkoMik7XG4gICAgXHR1bnppcHBlZFtmaWxlc11bMF0gPSBvdXRwdXRBcnIuam9pbignJyk7XG4gICAgXHR1bnppcHBlZFtmaWxlc11bMV0gPSBcImZpbGVcIjtcbiAgICBcdGZpbGVzKys7XG5cdH1cblx0aWYgKHRtcFswXSA9PSBwYXJzZUludChcIjUwXCIsMTYpICYmIHRtcFsxXSA9PSBwYXJzZUludChcIjRiXCIsMTYpKXsgLy9aSVBcblx0XHRtb2RlWklQID0gdHJ1ZTtcblx0XHR0bXBbMl0gPSByZWFkQnl0ZSgpO1xuXHRcdHRtcFszXSA9IHJlYWRCeXRlKCk7XG5cdFx0aWYgKHRtcFsyXSA9PSBwYXJzZUludChcIjNcIiwxNikgJiYgdG1wWzNdID09IHBhcnNlSW50KFwiNFwiLDE2KSl7XG5cdFx0XHQvL01PREVfWklQXG5cdFx0XHR0bXBbMF0gPSByZWFkQnl0ZSgpO1xuXHRcdFx0dG1wWzFdID0gcmVhZEJ5dGUoKTtcblx0XHRcdGlmIChkZWJ1Zylcblx0XHRcdFx0YWxlcnQoXCJaSVAtVmVyc2lvbjogXCIrdG1wWzFdK1wiIFwiK3RtcFswXS8xMCtcIi5cIit0bXBbMF0lMTApO1xuXHRcdFx0XG5cdFx0XHRncGZsYWdzID0gcmVhZEJ5dGUoKTtcblx0XHRcdGdwZmxhZ3MgfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdFx0aWYgKGRlYnVnKVxuXHRcdFx0XHRhbGVydChcImdwZmxhZ3M6IFwiK2dwZmxhZ3MpO1xuXHRcdFx0XG5cdFx0XHR2YXIgbWV0aG9kID0gcmVhZEJ5dGUoKTtcblx0XHRcdG1ldGhvZCB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cdFx0XHRpZiAoZGVidWcpXG5cdFx0XHRcdGFsZXJ0KFwibWV0aG9kOiBcIittZXRob2QpO1xuXHRcdFx0XG5cdFx0XHRyZWFkQnl0ZSgpO1xuXHRcdFx0cmVhZEJ5dGUoKTtcblx0XHRcdHJlYWRCeXRlKCk7XG5cdFx0XHRyZWFkQnl0ZSgpO1xuXHRcdFx0XG5cdFx0XHR2YXIgY3JjID0gcmVhZEJ5dGUoKTtcblx0XHRcdGNyYyB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cdFx0XHRjcmMgfD0gKHJlYWRCeXRlKCk8PDE2KTtcblx0XHRcdGNyYyB8PSAocmVhZEJ5dGUoKTw8MjQpO1xuXHRcdFx0XG5cdFx0XHR2YXIgY29tcFNpemUgPSByZWFkQnl0ZSgpO1xuXHRcdFx0Y29tcFNpemUgfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdFx0Y29tcFNpemUgfD0gKHJlYWRCeXRlKCk8PDE2KTtcblx0XHRcdGNvbXBTaXplIHw9IChyZWFkQnl0ZSgpPDwyNCk7XG5cdFx0XHRcblx0XHRcdHZhciBzaXplID0gcmVhZEJ5dGUoKTtcblx0XHRcdHNpemUgfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdFx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8MTYpO1xuXHRcdFx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8MjQpO1xuXHRcdFx0XG5cdFx0XHRpZiAoZGVidWcpXG5cdFx0XHRcdGFsZXJ0KFwibG9jYWwgQ1JDOiBcIitjcmMrXCJcXG5sb2NhbCBTaXplOiBcIitzaXplK1wiXFxubG9jYWwgQ29tcFNpemU6IFwiK2NvbXBTaXplKTtcblx0XHRcdFxuXHRcdFx0dmFyIGZpbGVsZW4gPSByZWFkQnl0ZSgpO1xuXHRcdFx0ZmlsZWxlbiB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cdFx0XHRcblx0XHRcdHZhciBleHRyYWxlbiA9IHJlYWRCeXRlKCk7XG5cdFx0XHRleHRyYWxlbiB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cdFx0XHRcblx0XHRcdGlmIChkZWJ1Zylcblx0XHRcdFx0YWxlcnQoXCJmaWxlbGVuIFwiK2ZpbGVsZW4pO1xuXHRcdFx0aSA9IDA7XG5cdFx0XHRuYW1lQnVmID0gW107XG5cdFx0XHR3aGlsZSAoZmlsZWxlbi0tKXsgXG5cdFx0XHRcdHZhciBjID0gcmVhZEJ5dGUoKTtcblx0XHRcdFx0aWYgKGMgPT0gXCIvXCIgfCBjID09XCI6XCIpe1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGkgPCBOQU1FTUFYLTEpXG5cdFx0XHRcdFx0bmFtZUJ1ZltpKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcblx0XHRcdH1cblx0XHRcdGlmIChkZWJ1Zylcblx0XHRcdFx0YWxlcnQoXCJuYW1lQnVmOiBcIituYW1lQnVmKTtcblx0XHRcdFxuXHRcdFx0Ly9uYW1lQnVmW2ldID0gXCJcXDBcIjtcblx0XHRcdGlmICghZmlsZW91dClcblx0XHRcdFx0ZmlsZW91dCA9IG5hbWVCdWY7XG5cdFx0XHRcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdHdoaWxlIChpIDwgZXh0cmFsZW4pe1xuXHRcdFx0XHRjID0gcmVhZEJ5dGUoKTtcblx0XHRcdFx0aSsrO1xuXHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdENSQyA9IDB4ZmZmZmZmZmY7XG5cdFx0XHRTSVpFID0gMDtcblx0XHRcdFxuXHRcdFx0aWYgKHNpemUgPSAwICYmIGZpbGVPdXQuY2hhckF0KGZpbGVvdXQubGVuZ3RoLTEpPT1cIi9cIil7XG5cdFx0XHRcdC8vc2tpcGRpclxuXHRcdFx0XHRpZiAoZGVidWcpXG5cdFx0XHRcdFx0YWxlcnQoXCJza2lwZGlyXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1ldGhvZCA9PSA4KXtcblx0XHRcdFx0RGVmbGF0ZUxvb3AoKTtcblx0XHRcdFx0aWYgKGRlYnVnKVxuXHRcdFx0XHRcdGFsZXJ0KG91dHB1dEFyci5qb2luKCcnKSk7XG5cdFx0XHRcdHVuemlwcGVkW2ZpbGVzXSA9IG5ldyBBcnJheSgyKTtcblx0XHRcdFx0dW56aXBwZWRbZmlsZXNdWzBdID0gb3V0cHV0QXJyLmpvaW4oJycpO1xuICAgIFx0XHRcdHVuemlwcGVkW2ZpbGVzXVsxXSA9IG5hbWVCdWYuam9pbignJyk7XG4gICAgXHRcdFx0ZmlsZXMrKztcblx0XHRcdFx0Ly9yZXR1cm4gb3V0cHV0QXJyLmpvaW4oJycpO1xuXHRcdFx0fVxuXHRcdFx0c2tpcGRpcigpO1xuXHRcdH1cblx0fVxuIH07XG5cdFxuZnVuY3Rpb24gc2tpcGRpcigpe1xuICAgIHZhciBjcmMsIFxuICAgICAgICB0bXAgPSBbXSxcbiAgICAgICAgY29tcFNpemUsIHNpemUsIG9zLCBpLCBjO1xuICAgIFxuXHRpZiAoKGdwZmxhZ3MgJiA4KSkge1xuXHRcdHRtcFswXSA9IHJlYWRCeXRlKCk7XG5cdFx0dG1wWzFdID0gcmVhZEJ5dGUoKTtcblx0XHR0bXBbMl0gPSByZWFkQnl0ZSgpO1xuXHRcdHRtcFszXSA9IHJlYWRCeXRlKCk7XG5cdFx0XG5cdFx0aWYgKHRtcFswXSA9PSBwYXJzZUludChcIjUwXCIsMTYpICYmIFxuICAgICAgICAgICAgdG1wWzFdID09IHBhcnNlSW50KFwiNGJcIiwxNikgJiYgXG4gICAgICAgICAgICB0bXBbMl0gPT0gcGFyc2VJbnQoXCIwN1wiLDE2KSAmJiBcbiAgICAgICAgICAgIHRtcFszXSA9PSBwYXJzZUludChcIjA4XCIsMTYpKVxuICAgICAgICB7XG4gICAgICAgICAgICBjcmMgPSByZWFkQnl0ZSgpO1xuICAgICAgICAgICAgY3JjIHw9IChyZWFkQnl0ZSgpPDw4KTtcbiAgICAgICAgICAgIGNyYyB8PSAocmVhZEJ5dGUoKTw8MTYpO1xuICAgICAgICAgICAgY3JjIHw9IChyZWFkQnl0ZSgpPDwyNCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNyYyA9IHRtcFswXSB8ICh0bXBbMV08PDgpIHwgKHRtcFsyXTw8MTYpIHwgKHRtcFszXTw8MjQpO1xuXHRcdH1cblx0XHRcblx0XHRjb21wU2l6ZSA9IHJlYWRCeXRlKCk7XG5cdFx0Y29tcFNpemUgfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdGNvbXBTaXplIHw9IChyZWFkQnl0ZSgpPDwxNik7XG5cdFx0Y29tcFNpemUgfD0gKHJlYWRCeXRlKCk8PDI0KTtcblx0XHRcblx0XHRzaXplID0gcmVhZEJ5dGUoKTtcblx0XHRzaXplIHw9IChyZWFkQnl0ZSgpPDw4KTtcblx0XHRzaXplIHw9IChyZWFkQnl0ZSgpPDwxNik7XG5cdFx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8MjQpO1xuXHRcdFxuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGFsZXJ0KFwiQ1JDOlwiKTtcblx0fVxuXG5cdGlmIChtb2RlWklQKVxuXHRcdG5leHRGaWxlKCk7XG5cdFxuXHR0bXBbMF0gPSByZWFkQnl0ZSgpO1xuXHRpZiAodG1wWzBdICE9IDgpIHtcblx0XHRpZiAoZGVidWcpXG5cdFx0XHRhbGVydChcIlVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIVwiKTtcbiAgICAgICAgcmV0dXJuIDA7XHRcblx0fVxuXHRcblx0Z3BmbGFncyA9IHJlYWRCeXRlKCk7XG5cdGlmIChkZWJ1Zyl7XG5cdFx0aWYgKChncGZsYWdzICYgfihwYXJzZUludChcIjFmXCIsMTYpKSkpXG5cdFx0XHRhbGVydChcIlVua25vd24gZmxhZ3Mgc2V0IVwiKTtcblx0fVxuXHRcblx0cmVhZEJ5dGUoKTtcblx0cmVhZEJ5dGUoKTtcblx0cmVhZEJ5dGUoKTtcblx0cmVhZEJ5dGUoKTtcblx0XG5cdHJlYWRCeXRlKCk7XG5cdG9zID0gcmVhZEJ5dGUoKTtcblx0XG5cdGlmICgoZ3BmbGFncyAmIDQpKXtcblx0XHR0bXBbMF0gPSByZWFkQnl0ZSgpO1xuXHRcdHRtcFsyXSA9IHJlYWRCeXRlKCk7XG5cdFx0bGVuID0gdG1wWzBdICsgMjU2KnRtcFsxXTtcblx0XHRpZiAoZGVidWcpXG5cdFx0XHRhbGVydChcIkV4dHJhIGZpZWxkIHNpemU6IFwiK2xlbik7XG5cdFx0Zm9yIChpPTA7aTxsZW47aSsrKVxuXHRcdFx0cmVhZEJ5dGUoKTtcblx0fVxuXHRcblx0aWYgKChncGZsYWdzICYgOCkpe1xuXHRcdGk9MDtcblx0XHRuYW1lQnVmPVtdO1xuXHRcdHdoaWxlIChjPXJlYWRCeXRlKCkpe1xuXHRcdFx0aWYoYyA9PSBcIjdcIiB8fCBjID09IFwiOlwiKVxuXHRcdFx0XHRpPTA7XG5cdFx0XHRpZiAoaTxOQU1FTUFYLTEpXG5cdFx0XHRcdG5hbWVCdWZbaSsrXSA9IGM7XG5cdFx0fVxuXHRcdC8vbmFtZUJ1ZltpXSA9IFwiXFwwXCI7XG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQoXCJvcmlnaW5hbCBmaWxlIG5hbWU6IFwiK25hbWVCdWYpO1xuXHR9XG5cdFx0XG5cdGlmICgoZ3BmbGFncyAmIDE2KSl7XG5cdFx0d2hpbGUgKGM9cmVhZEJ5dGUoKSl7XG5cdFx0XHQvL0ZJTEUgQ09NTUVOVFxuXHRcdH1cblx0fVxuXHRcblx0aWYgKChncGZsYWdzICYgMikpe1xuXHRcdHJlYWRCeXRlKCk7XG5cdFx0cmVhZEJ5dGUoKTtcblx0fVxuXHRcblx0RGVmbGF0ZUxvb3AoKTtcblx0XG5cdGNyYyA9IHJlYWRCeXRlKCk7XG5cdGNyYyB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cdGNyYyB8PSAocmVhZEJ5dGUoKTw8MTYpO1xuXHRjcmMgfD0gKHJlYWRCeXRlKCk8PDI0KTtcblx0XG5cdHNpemUgPSByZWFkQnl0ZSgpO1xuXHRzaXplIHw9IChyZWFkQnl0ZSgpPDw4KTtcblx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8MTYpO1xuXHRzaXplIHw9IChyZWFkQnl0ZSgpPDwyNCk7XG5cdFxuXHRpZiAobW9kZVpJUClcblx0XHRuZXh0RmlsZSgpO1xuXHRcbn07XG5cbn07XG5cbi8qKlxuKiAgQmFzZTY0IGVuY29kaW5nIC8gZGVjb2RpbmdcbiogIHtAbGluayBodHRwOi8vd3d3LndlYnRvb2xraXQuaW5mby99XG4qL1xuSlhHLlV0aWwuQmFzZTY0ID0ge1xuXG4gICAgLy8gcHJpdmF0ZSBwcm9wZXJ0eVxuICAgIF9rZXlTdHIgOiBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIsXG5cbiAgICAvLyBwdWJsaWMgbWV0aG9kIGZvciBlbmNvZGluZ1xuICAgIGVuY29kZSA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gW10sXG4gICAgICAgICAgICBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0LFxuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgaW5wdXQgPSBKWEcuVXRpbC5CYXNlNjQuX3V0ZjhfZW5jb2RlKGlucHV0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuXG4gICAgICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuICAgICAgICAgICAgY2hyMiA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgICAgICAgIGNocjMgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG5cbiAgICAgICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4gICAgICAgICAgICBlbmMyID0gKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KTtcbiAgICAgICAgICAgIGVuYzMgPSAoKGNocjIgJiAxNSkgPDwgMikgfCAoY2hyMyA+PiA2KTtcbiAgICAgICAgICAgIGVuYzQgPSBjaHIzICYgNjM7XG5cbiAgICAgICAgICAgIGlmIChpc05hTihjaHIyKSkge1xuICAgICAgICAgICAgICAgIGVuYzMgPSBlbmM0ID0gNjQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKGNocjMpKSB7XG4gICAgICAgICAgICAgICAgZW5jNCA9IDY0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXRwdXQucHVzaChbdGhpcy5fa2V5U3RyLmNoYXJBdChlbmMxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlTdHIuY2hhckF0KGVuYzIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleVN0ci5jaGFyQXQoZW5jMyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5U3RyLmNoYXJBdChlbmM0KV0uam9pbignJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbiAgICB9LFxuXG4gICAgLy8gcHVibGljIG1ldGhvZCBmb3IgZGVjb2RpbmdcbiAgICBkZWNvZGUgOiBmdW5jdGlvbiAoaW5wdXQsIHV0ZjgpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdLFxuICAgICAgICAgICAgY2hyMSwgY2hyMiwgY2hyMyxcbiAgICAgICAgICAgIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQsXG4gICAgICAgICAgICBpID0gMDtcblxuICAgICAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXFw9XS9nLCBcIlwiKTtcblxuICAgICAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuXG4gICAgICAgICAgICBlbmMxID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICAgICAgZW5jMiA9IHRoaXMuX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgICAgIGVuYzMgPSB0aGlzLl9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgICAgICBlbmM0ID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuXG4gICAgICAgICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgICAgICAgIGNocjIgPSAoKGVuYzIgJiAxNSkgPDwgNCkgfCAoZW5jMyA+PiAyKTtcbiAgICAgICAgICAgIGNocjMgPSAoKGVuYzMgJiAzKSA8PCA2KSB8IGVuYzQ7XG5cbiAgICAgICAgICAgIG91dHB1dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMSkpO1xuXG4gICAgICAgICAgICBpZiAoZW5jMyAhPSA2NCkge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuYzQgIT0gNjQpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmpvaW4oJycpOyBcbiAgICAgICAgXG4gICAgICAgIGlmICh1dGY4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBKWEcuVXRpbC5CYXNlNjQuX3V0ZjhfZGVjb2RlKG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcblxuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlIG1ldGhvZCBmb3IgVVRGLTggZW5jb2RpbmdcbiAgICBfdXRmOF9lbmNvZGUgOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZyxcIlxcblwiKTtcbiAgICAgICAgdmFyIHV0ZnRleHQgPSBcIlwiO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nLmxlbmd0aDsgbisrKSB7XG5cbiAgICAgICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQobik7XG5cbiAgICAgICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZigoYyA+IDEyNykgJiYgKGMgPCAyMDQ4KSkge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiA2KSB8IDE5Mik7XG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1dGZ0ZXh0O1xuICAgIH0sXG5cbiAgICAvLyBwcml2YXRlIG1ldGhvZCBmb3IgVVRGLTggZGVjb2RpbmdcbiAgICBfdXRmOF9kZWNvZGUgOiBmdW5jdGlvbiAodXRmdGV4dCkge1xuICAgICAgICB2YXIgc3RyaW5nID0gW10sXG4gICAgICAgICAgICBpID0gMCxcbiAgICAgICAgICAgIGMgPSAwLCBjMiA9IDAsIGMzID0gMDtcblxuICAgICAgICB3aGlsZSAoIGkgPCB1dGZ0ZXh0Lmxlbmd0aCApIHtcbiAgICAgICAgICAgIGMgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgICAgICAgIHN0cmluZy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoKGMgPiAxOTEpICYmIChjIDwgMjI0KSkge1xuICAgICAgICAgICAgICAgIGMyID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkrMSk7XG4gICAgICAgICAgICAgICAgc3RyaW5nLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpKTtcbiAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjMiA9IHV0ZnRleHQuY2hhckNvZGVBdChpKzEpO1xuICAgICAgICAgICAgICAgIGMzID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkrMik7XG4gICAgICAgICAgICAgICAgc3RyaW5nLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAxNSkgPDwgMTIpIHwgKChjMiAmIDYzKSA8PCA2KSB8IChjMyAmIDYzKSkpO1xuICAgICAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oJycpO1xuICAgIH0sXG4gICAgXG4gICAgX2Rlc3RyaXA6IGZ1bmN0aW9uIChzdHJpcHBlZCwgd3JhcCl7XG4gICAgICAgIHZhciBsaW5lcyA9IFtdLCBsaW5lbm8sIGksXG4gICAgICAgICAgICBkZXN0cmlwcGVkID0gW107XG4gICAgICAgIFxuICAgICAgICBpZiAod3JhcD09bnVsbCkgXG4gICAgICAgICAgICB3cmFwID0gNzY7XG4gICAgICAgICAgICBcbiAgICAgICAgc3RyaXBwZWQucmVwbGFjZSgvIC9nLCBcIlwiKTtcbiAgICAgICAgbGluZW5vID0gc3RyaXBwZWQubGVuZ3RoIC8gd3JhcDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVubzsgaSsrKVxuICAgICAgICAgICAgbGluZXNbaV09c3RyaXBwZWQuc3Vic3RyKGkgKiB3cmFwLCB3cmFwKTtcbiAgICAgICAgaWYgKGxpbmVubyAhPSBzdHJpcHBlZC5sZW5ndGggLyB3cmFwKVxuICAgICAgICAgICAgbGluZXNbbGluZXMubGVuZ3RoXT1zdHJpcHBlZC5zdWJzdHIobGluZW5vICogd3JhcCwgc3RyaXBwZWQubGVuZ3RoLShsaW5lbm8gKiB3cmFwKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgZGVzdHJpcHBlZC5wdXNoKGxpbmVzW2ldKTtcbiAgICAgICAgcmV0dXJuIGRlc3RyaXBwZWQuam9pbignXFxuJyk7XG4gICAgfSxcbiAgICBcbiAgICBkZWNvZGVBc0FycmF5OiBmdW5jdGlvbiAoaW5wdXQpe1xuICAgICAgICB2YXIgZGVjID0gdGhpcy5kZWNvZGUoaW5wdXQpLFxuICAgICAgICAgICAgYXIgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpPTA7aTxkZWMubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICBhcltpXT1kZWMuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXI7XG4gICAgfSxcbiAgICBcbiAgICBkZWNvZGVHRU9ORXhUIDogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVBc0FycmF5KGRlc3RyaXAoaW5wdXQpLGZhbHNlKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbkpYRy5VdGlsLmFzY2lpQ2hhckNvZGVBdCA9IGZ1bmN0aW9uKHN0cixpKXtcblx0dmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcblx0aWYgKGM+MjU1KXtcbiAgICBcdHN3aXRjaCAoYykge1xuXHRcdFx0Y2FzZSA4MzY0OiBjPTEyODtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODIxODogYz0xMzA7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDQwMjogYz0xMzE7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMjI6IGM9MTMyO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjMwOiBjPTEzMztcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODIyNDogYz0xMzQ7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMjU6IGM9MTM1O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA3MTA6IGM9MTM2O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjQwOiBjPTEzNztcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgMzUyOiBjPTEzODtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODI0OTogYz0xMzk7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDMzODogYz0xNDA7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDM4MTogYz0xNDI7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMTY6IGM9MTQ1O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjE3OiBjPTE0Njtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODIyMDogYz0xNDc7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMjE6IGM9MTQ4O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjI2OiBjPTE0OTtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODIxMTogYz0xNTA7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMTI6IGM9MTUxO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA3MzI6IGM9MTUyO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4NDgyOiBjPTE1Mztcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgMzUzOiBjPTE1NDtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODI1MDogYz0xNTU7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDMzOTogYz0xNTY7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDM4MjogYz0xNTg7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDM3NjogYz0xNTk7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRkZWZhdWx0OlxuXHQgICAgXHRicmVhaztcblx0ICAgIH1cblx0fVxuXHRyZXR1cm4gYztcbn07XG5cbi8qKlxuICogRGVjb2Rpbmcgc3RyaW5nIGludG8gdXRmLThcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgdG8gZGVjb2RlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHV0ZjggZGVjb2RlZCBzdHJpbmdcbiAqL1xuSlhHLlV0aWwudXRmOERlY29kZSA9IGZ1bmN0aW9uKHV0ZnRleHQpIHtcbiAgdmFyIHN0cmluZyA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBjID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzO1xuICBpZiAoIUpYRy5leGlzdHModXRmdGV4dCkpIHJldHVybiAnJztcbiAgXG4gIHdoaWxlICggaSA8IHV0ZnRleHQubGVuZ3RoICkge1xuICAgIGMgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgc3RyaW5nLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjKSk7XG4gICAgICBpKys7XG4gICAgfSBlbHNlIGlmKChjID4gMTkxKSAmJiAoYyA8IDIyNCkpIHtcbiAgICAgIGMyID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkrMSk7XG4gICAgICBzdHJpbmcucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSkpO1xuICAgICAgaSArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjMiA9IHV0ZnRleHQuY2hhckNvZGVBdChpKzEpO1xuICAgICAgYzMgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsyKTtcbiAgICAgIHN0cmluZy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpKTtcbiAgICAgIGkgKz0gMztcbiAgICB9XG4gIH07XG4gIHJldHVybiBzdHJpbmcuam9pbignJyk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZG9tIHV1aWQuXG4gKiBodHRwOi8vd3d3LmJyb29mYS5jb21cbiAqIG1haWx0bzpyb2JlcnRAYnJvb2ZhLmNvbVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMCBSb2JlcnQgS2llZmZlclxuICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXMuXG4gKlxuICogRVhBTVBMRVM6XG4gKiAgID4+PiBNYXRoLnV1aWQoKVxuICogICBcIjkyMzI5RDM5LTZGNUMtNDUyMC1BQkZDLUFBQjY0NTQ0RTE3MlwiXG4gKi9cbkpYRy5VdGlsLmdlblVVSUQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBQcml2YXRlIGFycmF5IG9mIGNoYXJzIHRvIHVzZVxuICAgIHZhciBjaGFycyA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicuc3BsaXQoJycpLFxuICAgICAgICB1dWlkID0gbmV3IEFycmF5KDM2KSwgcm5kPTAsIHI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM2OyBpKyspIHtcbiAgICAgIGlmIChpPT04IHx8IGk9PTEzIHx8ICBpPT0xOCB8fCBpPT0yMykge1xuICAgICAgICB1dWlkW2ldID0gJy0nO1xuICAgICAgfSBlbHNlIGlmIChpPT0xNCkge1xuICAgICAgICB1dWlkW2ldID0gJzQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJuZCA8PSAweDAyKSBybmQgPSAweDIwMDAwMDAgKyAoTWF0aC5yYW5kb20oKSoweDEwMDAwMDApfDA7XG4gICAgICAgIHIgPSBybmQgJiAweGY7XG4gICAgICAgIHJuZCA9IHJuZCA+PiA0O1xuICAgICAgICB1dWlkW2ldID0gY2hhcnNbKGkgPT0gMTkpID8gKHIgJiAweDMpIHwgMHg4IDogcl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHV1aWQuam9pbignJyk7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gSlhHO1xuIiwiLy8gTW9kaWZpZWQgYnkgUmVjdXJpdHkgTGFicyBHbWJIIFxuXG4vLyBtb2RpZmllZCB2ZXJzaW9uIG9mIGh0dHA6Ly93d3cuaGFuZXdpbi5uZXQvZW5jcnlwdC9QR2RlY29kZS5qczpcblxuLyogT3BlblBHUCBlbmNyeXB0aW9uIHVzaW5nIFJTQS9BRVNcbiAqIENvcHlyaWdodCAyMDA1LTIwMDYgSGVyYmVydCBIYW5ld2lua2VsLCB3d3cuaGFuZVdJTi5kZVxuICogdmVyc2lvbiAyLjAsIGNoZWNrIHd3dy5oYW5lV0lOLmRlIGZvciB0aGUgbGF0ZXN0IHZlcnNpb25cblxuICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcywgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICBcbiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgb3Igc2VsbCB0aGlzIHNvZnR3YXJlLCB3aXRoIG9yXG4gKiB3aXRob3V0IGZlZSwgZm9yIGFueSBwdXJwb3NlIGFuZCBieSBhbnkgaW5kaXZpZHVhbCBvciBvcmdhbml6YXRpb24sIGlzIGhlcmVieVxuICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXBwZWFyIFxuICogaW4gYWxsIGNvcGllcy4gRGlzdHJpYnV0aW9uIGFzIGEgcGFydCBvZiBhbiBhcHBsaWNhdGlvbiBvciBiaW5hcnkgbXVzdFxuICogaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXJcbiAqIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBvciBkaXN0cmlidXRpb24uXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdGNpcGhlciA9IHJlcXVpcmUoJy4vY2lwaGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG5cdC8qKlxuXHQgKiBBbiBhcnJheSBvZiBieXRlcywgdGhhdCBpcyBpbnRlZ2VycyB3aXRoIHZhbHVlcyBmcm9tIDAgdG8gMjU1XG5cdCAqIEB0eXBlZGVmIHsoQXJyYXl8VWludDhBcnJheSl9IG9wZW5wZ3BfYnl0ZV9hcnJheVxuXHQgKi9cblxuXHQvKipcblx0ICogQmxvY2sgY2lwaGVyIGZ1bmN0aW9uXG5cdCAqIEBjYWxsYmFjayBvcGVucGdwX2NpcGhlcl9ibG9ja19mblxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfYnl0ZV9hcnJheX0gYmxvY2sgQSBibG9jayB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb25cblx0ICogQHBhcmFtIHtvcGVucGdwX2J5dGVfYXJyYXl9IGtleSB0byB1c2UgaW4gZW5jcnlwdGlvbi9kZWNyeXB0aW9uXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfYnl0ZV9hcnJheX0gRW5jcnlwdGVkL2RlY3J5cHRlZCBibG9ja1xuXHQgKi9cblxuXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGVuY3J5cHRzIGEgZ2l2ZW4gd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeHJhbmRvbSBcblx0ICogdXNpbmcgdGhlIHNwZWNpZmllZCBibG9ja2NpcGhlciB0byBlbmNyeXB0IGEgbWVzc2FnZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4cmFuZG9tIHJhbmRvbSBieXRlcyBvZiBibG9ja19zaXplIGxlbmd0aCBwcm92aWRlZCBcblx0ICogIGFzIGEgc3RyaW5nIHRvIGJlIHVzZWQgaW4gcHJlZml4aW5nIHRoZSBkYXRhXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9jaXBoZXJfYmxvY2tfZm59IGJsb2NrY2lwaGVyZm4gdGhlIGFsZ29yaXRobSBlbmNyeXB0IGZ1bmN0aW9uIHRvIGVuY3J5cHRcblx0ICogIGRhdGEgaW4gb25lIGJsb2NrX3NpemUgZW5jcnlwdGlvbi4gXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gYmxvY2tfc2l6ZSB0aGUgYmxvY2sgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYWxnb3JpdGhtIHVzZWRcblx0ICogQHBhcmFtIHtTdHJpbmd9IHBsYWludGV4dCBkYXRhIHRvIGJlIGVuY3J5cHRlZCBwcm92aWRlZCBhcyBhIHN0cmluZ1xuXHQgKiBAcGFyYW0ge29wZW5wZ3BfYnl0ZV9hcnJheX0ga2V5IGtleSB0byBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIGRhdGEuIFRoaXMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFxuXHQgKiAgYmxvY2tjaXBoZXJmblxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IHJlc3luYyBhIGJvb2xlYW4gdmFsdWUgc3BlY2lmeWluZyBpZiBhIHJlc3luYyBvZiB0aGUgXG5cdCAqICBJViBzaG91bGQgYmUgdXNlZCBvciBub3QuIFRoZSBlbmNyeXB0ZWRkYXRhcGFja2V0IHVzZXMgdGhlIFxuXHQgKiAgXCJvbGRcIiBzdHlsZSB3aXRoIGEgcmVzeW5jLiBFbmNyeXB0aW9uIHdpdGhpbiBhbiBcblx0ICogIGVuY3J5cHRlZGludGVncml0eXByb3RlY3RlZGRhdGEgcGFja2V0IGlzIG5vdCByZXN5bmNpbmcgdGhlIElWLlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IGEgc3RyaW5nIHdpdGggdGhlIGVuY3J5cHRlZCBkYXRhXG5cdCAqL1xuXHRlbmNyeXB0OiBmdW5jdGlvbiAocHJlZml4cmFuZG9tLCBjaXBoZXJmbiwgcGxhaW50ZXh0LCBrZXksIHJlc3luYykge1xuXHRcdGNpcGhlcmZuID0gbmV3IGNpcGhlcltjaXBoZXJmbl0oa2V5KTtcblx0XHR2YXIgYmxvY2tfc2l6ZSA9IGNpcGhlcmZuLmJsb2NrU2l6ZTtcblxuXHRcdHZhciBGUiA9IG5ldyBBcnJheShibG9ja19zaXplKTtcblx0XHR2YXIgRlJFID0gbmV3IEFycmF5KGJsb2NrX3NpemUpO1xuXG5cdFx0cHJlZml4cmFuZG9tID0gcHJlZml4cmFuZG9tICsgcHJlZml4cmFuZG9tLmNoYXJBdChibG9ja19zaXplLTIpICtwcmVmaXhyYW5kb20uY2hhckF0KGJsb2NrX3NpemUtMSk7XG5cdFx0dXRpbC5wcmludF9kZWJ1ZyhcInByZWZpeHJhbmRvbTpcIit1dGlsLmhleHN0cmR1bXAocHJlZml4cmFuZG9tKSk7XG5cdFx0dmFyIGNpcGhlcnRleHQgPSBcIlwiO1xuXHRcdC8vIDEuICBUaGUgZmVlZGJhY2sgcmVnaXN0ZXIgKEZSKSBpcyBzZXQgdG8gdGhlIElWLCB3aGljaCBpcyBhbGwgemVyb3MuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIEZSW2ldID0gMDtcblx0XHRcblx0XHQvLyAyLiAgRlIgaXMgZW5jcnlwdGVkIHRvIHByb2R1Y2UgRlJFIChGUiBFbmNyeXB0ZWQpLiAgVGhpcyBpcyB0aGVcblx0XHQvLyAgICAgZW5jcnlwdGlvbiBvZiBhbiBhbGwtemVybyB2YWx1ZS5cblx0XHRGUkUgPSBjaXBoZXJmbi5lbmNyeXB0KEZSKTtcblx0XHQvLyAzLiAgRlJFIGlzIHhvcmVkIHdpdGggdGhlIGZpcnN0IEJTIG9jdGV0cyBvZiByYW5kb20gZGF0YSBwcmVmaXhlZCB0b1xuXHRcdC8vICAgICB0aGUgcGxhaW50ZXh0IHRvIHByb2R1Y2UgQ1sxXSB0aHJvdWdoIENbQlNdLCB0aGUgZmlyc3QgQlMgb2N0ZXRzXG5cdFx0Ly8gICAgIG9mIGNpcGhlcnRleHQuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIGNpcGhlcnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShGUkVbaV0gXiBwcmVmaXhyYW5kb20uY2hhckNvZGVBdChpKSk7XG5cdFx0XG5cdFx0Ly8gNC4gIEZSIGlzIGxvYWRlZCB3aXRoIENbMV0gdGhyb3VnaCBDW0JTXS5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgRlJbaV0gPSBjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQoaSk7XG5cdFx0XG5cdFx0Ly8gNS4gIEZSIGlzIGVuY3J5cHRlZCB0byBwcm9kdWNlIEZSRSwgdGhlIGVuY3J5cHRpb24gb2YgdGhlIGZpcnN0IEJTXG5cdFx0Ly8gXHQgICBvY3RldHMgb2YgY2lwaGVydGV4dC5cblx0XHRGUkUgPSBjaXBoZXJmbi5lbmNyeXB0KEZSKTtcblxuXHRcdC8vIDYuICBUaGUgbGVmdCB0d28gb2N0ZXRzIG9mIEZSRSBnZXQgeG9yZWQgd2l0aCB0aGUgbmV4dCB0d28gb2N0ZXRzIG9mXG5cdFx0Ly8gICAgIGRhdGEgdGhhdCB3ZXJlIHByZWZpeGVkIHRvIHRoZSBwbGFpbnRleHQuICBUaGlzIHByb2R1Y2VzIENbQlMrMV1cblx0XHQvLyAgICAgYW5kIENbQlMrMl0sIHRoZSBuZXh0IHR3byBvY3RldHMgb2YgY2lwaGVydGV4dC5cblx0XHRjaXBoZXJ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoRlJFWzBdIF4gcHJlZml4cmFuZG9tLmNoYXJDb2RlQXQoYmxvY2tfc2l6ZSkpO1xuXHRcdGNpcGhlcnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShGUkVbMV0gXiBwcmVmaXhyYW5kb20uY2hhckNvZGVBdChibG9ja19zaXplKzEpKTtcblxuXHRcdGlmIChyZXN5bmMpIHtcblx0XHRcdC8vIDcuICAoVGhlIHJlc3luYyBzdGVwKSBGUiBpcyBsb2FkZWQgd2l0aCBDMy1DMTAuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgRlJbaV0gPSBjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQoaSsyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIEZSW2ldID0gY2lwaGVydGV4dC5jaGFyQ29kZUF0KGkpO1xuXHRcdH1cblx0XHQvLyA4LiAgRlIgaXMgZW5jcnlwdGVkIHRvIHByb2R1Y2UgRlJFLlxuXHRcdEZSRSA9IGNpcGhlcmZuLmVuY3J5cHQoRlIsIGtleSk7XG5cdFx0XG5cdFx0aWYgKHJlc3luYykge1xuXHRcdFx0Ly8gOS4gIEZSRSBpcyB4b3JlZCB3aXRoIHRoZSBmaXJzdCA4IG9jdGV0cyBvZiB0aGUgZ2l2ZW4gcGxhaW50ZXh0LCBub3dcblx0XHRcdC8vXHQgICB0aGF0IHdlIGhhdmUgZmluaXNoZWQgZW5jcnlwdGluZyB0aGUgMTAgb2N0ZXRzIG9mIHByZWZpeGVkIGRhdGEuXG5cdFx0XHQvLyBcdCAgIFRoaXMgcHJvZHVjZXMgQzExLUMxOCwgdGhlIG5leHQgOCBvY3RldHMgb2YgY2lwaGVydGV4dC5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKVxuXHRcdFx0XHRjaXBoZXJ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoRlJFW2ldIF4gcGxhaW50ZXh0LmNoYXJDb2RlQXQoaSkpO1xuXHRcdFx0Zm9yKG49YmxvY2tfc2l6ZSsyOyBuIDwgcGxhaW50ZXh0Lmxlbmd0aDsgbis9YmxvY2tfc2l6ZSkge1xuXHRcdFx0XHQvLyAxMC4gRlIgaXMgbG9hZGVkIHdpdGggQzExLUMxOFxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgRlJbaV0gPSBjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQobitpKTtcblx0XHRcdFxuXHRcdFx0XHQvLyAxMS4gRlIgaXMgZW5jcnlwdGVkIHRvIHByb2R1Y2UgRlJFLlxuXHRcdFx0XHRGUkUgPSBjaXBoZXJmbi5lbmNyeXB0KEZSKTtcblx0XHRcdFxuXHRcdFx0XHQvLyAxMi4gRlJFIGlzIHhvcmVkIHdpdGggdGhlIG5leHQgOCBvY3RldHMgb2YgcGxhaW50ZXh0LCB0byBwcm9kdWNlIHRoZVxuXHRcdFx0XHQvLyBuZXh0IDggb2N0ZXRzIG9mIGNpcGhlcnRleHQuICBUaGVzZSBhcmUgbG9hZGVkIGludG8gRlIgYW5kIHRoZVxuXHRcdFx0XHQvLyBwcm9jZXNzIGlzIHJlcGVhdGVkIHVudGlsIHRoZSBwbGFpbnRleHQgaXMgdXNlZCB1cC5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIGNpcGhlcnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShGUkVbaV0gXiBwbGFpbnRleHQuY2hhckNvZGVBdCgobi0yKStpKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0cGxhaW50ZXh0ID0gXCIgIFwiK3BsYWludGV4dDtcblx0XHRcdC8vIDkuICBGUkUgaXMgeG9yZWQgd2l0aCB0aGUgZmlyc3QgOCBvY3RldHMgb2YgdGhlIGdpdmVuIHBsYWludGV4dCwgbm93XG5cdFx0XHQvL1x0ICAgdGhhdCB3ZSBoYXZlIGZpbmlzaGVkIGVuY3J5cHRpbmcgdGhlIDEwIG9jdGV0cyBvZiBwcmVmaXhlZCBkYXRhLlxuXHRcdFx0Ly8gXHQgICBUaGlzIHByb2R1Y2VzIEMxMS1DMTgsIHRoZSBuZXh0IDggb2N0ZXRzIG9mIGNpcGhlcnRleHQuXG5cdFx0XHRmb3IgKHZhciBpID0gMjsgaSA8IGJsb2NrX3NpemU7IGkrKykgY2lwaGVydGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEZSRVtpXSBeIHBsYWludGV4dC5jaGFyQ29kZUF0KGkpKTtcblx0XHRcdHZhciB0ZW1wQ2lwaGVydGV4dCA9IGNpcGhlcnRleHQuc3Vic3RyaW5nKDAsMipibG9ja19zaXplKS5zcGxpdCgnJyk7XG5cdFx0XHR2YXIgdGVtcENpcGhlcnRleHRTdHJpbmcgPSBjaXBoZXJ0ZXh0LnN1YnN0cmluZyhibG9ja19zaXplKTtcblx0XHRcdGZvcihuPWJsb2NrX3NpemU7IG48cGxhaW50ZXh0Lmxlbmd0aDsgbis9YmxvY2tfc2l6ZSkge1xuXHRcdFx0XHQvLyAxMC4gRlIgaXMgbG9hZGVkIHdpdGggQzExLUMxOFxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgRlJbaV0gPSB0ZW1wQ2lwaGVydGV4dFN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0XHR0ZW1wQ2lwaGVydGV4dFN0cmluZz0nJztcblx0XHRcdFx0XG5cdFx0XHRcdC8vIDExLiBGUiBpcyBlbmNyeXB0ZWQgdG8gcHJvZHVjZSBGUkUuXG5cdFx0XHRcdEZSRSA9IGNpcGhlcmZuLmVuY3J5cHQoRlIpO1xuXHRcdFx0XHRcblx0XHRcdFx0Ly8gMTIuIEZSRSBpcyB4b3JlZCB3aXRoIHRoZSBuZXh0IDggb2N0ZXRzIG9mIHBsYWludGV4dCwgdG8gcHJvZHVjZSB0aGVcblx0XHRcdFx0Ly8gICAgIG5leHQgOCBvY3RldHMgb2YgY2lwaGVydGV4dC4gIFRoZXNlIGFyZSBsb2FkZWQgaW50byBGUiBhbmQgdGhlXG5cdFx0XHRcdC8vICAgICBwcm9jZXNzIGlzIHJlcGVhdGVkIHVudGlsIHRoZSBwbGFpbnRleHQgaXMgdXNlZCB1cC5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspeyB0ZW1wQ2lwaGVydGV4dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoRlJFW2ldIF4gcGxhaW50ZXh0LmNoYXJDb2RlQXQobitpKSkpO1xuXHRcdFx0XHR0ZW1wQ2lwaGVydGV4dFN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEZSRVtpXSBeIHBsYWludGV4dC5jaGFyQ29kZUF0KG4raSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjaXBoZXJ0ZXh0ID0gdGVtcENpcGhlcnRleHQuam9pbignJyk7XG5cdFx0XHRcblx0XHR9XG5cblx0XHRjaXBoZXJ0ZXh0ID0gY2lwaGVydGV4dC5zdWJzdHJpbmcoMCwgcGxhaW50ZXh0Lmxlbmd0aCArIDIgKyBibG9ja19zaXplKTtcblxuXHRcdHJldHVybiBjaXBoZXJ0ZXh0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBEZWNyeXB0cyB0aGUgcHJlZml4ZWQgZGF0YSBmb3IgdGhlIE1vZGlmaWNhdGlvbiBEZXRlY3Rpb24gQ29kZSAoTURDKSBjb21wdXRhdGlvblxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfYmxvY2tfY2lwaGVyX2ZufSBjaXBoZXJmbi5lbmNyeXB0IENpcGhlciBmdW5jdGlvbiB0byB1c2Vcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBibG9ja19zaXplIEJsb2Nrc2l6ZSBvZiB0aGUgYWxnb3JpdGhtXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9ieXRlX2FycmF5fSBrZXkgVGhlIGtleSBmb3IgZW5jcnlwdGlvblxuXHQgKiBAcGFyYW0ge1N0cmluZ30gY2lwaGVydGV4dCBUaGUgZW5jcnlwdGVkIGRhdGFcblx0ICogQHJldHVybiB7U3RyaW5nfSBwbGFpbnRleHQgRGF0YSBvZiBEKGNpcGhlcnRleHQpIHdpdGggYmxvY2tzaXplIGxlbmd0aCArMlxuXHQgKi9cblx0bWRjOiBmdW5jdGlvbiAoY2lwaGVyZm4sIGtleSwgY2lwaGVydGV4dCkge1xuXHRcdGNpcGhlcmZuID0gbmV3IGNpcGhlcltjaXBoZXJmbl0oa2V5KTtcblx0XHR2YXIgYmxvY2tfc2l6ZSA9IGNpcGhlcmZuLmJsb2NrU2l6ZTtcblxuXHRcdHZhciBpYmxvY2sgPSBuZXcgQXJyYXkoYmxvY2tfc2l6ZSk7XG5cdFx0dmFyIGFibG9jayA9IG5ldyBBcnJheShibG9ja19zaXplKTtcblx0XHR2YXIgaTtcblxuXG5cdFx0Ly8gaW5pdGlhbGlzYXRpb24gdmVjdG9yXG5cdFx0Zm9yKGk9MDsgaSA8IGJsb2NrX3NpemU7IGkrKykgaWJsb2NrW2ldID0gMDtcblxuXHRcdGlibG9jayA9IGNpcGhlcmZuLmVuY3J5cHQoaWJsb2NrKTtcblx0XHRmb3IoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspXG5cdFx0e1xuXHRcdFx0YWJsb2NrW2ldID0gY2lwaGVydGV4dC5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aWJsb2NrW2ldIF49IGFibG9ja1tpXTtcblx0XHR9XG5cblx0XHRhYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGFibG9jayk7XG5cblx0XHRyZXR1cm4gdXRpbC5iaW4yc3RyKGlibG9jaykrXG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKGFibG9ja1swXV5jaXBoZXJ0ZXh0LmNoYXJDb2RlQXQoYmxvY2tfc2l6ZSkpK1xuXHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZShhYmxvY2tbMV1eY2lwaGVydGV4dC5jaGFyQ29kZUF0KGJsb2NrX3NpemUrMSkpO1xuXHR9LFxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBkZWNyeXB0cyBhIGdpdmVuIHBsYWludGV4dCB1c2luZyB0aGUgc3BlY2lmaWVkXG5cdCAqIGJsb2NrY2lwaGVyIHRvIGRlY3J5cHQgYSBtZXNzYWdlXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9jaXBoZXJfYmxvY2tfZm59IGJsb2NrY2lwaGVyZm4gVGhlIGFsZ29yaXRobSBfZW5jcnlwdF8gZnVuY3Rpb24gdG8gZW5jcnlwdFxuXHQgKiAgZGF0YSBpbiBvbmUgYmxvY2tfc2l6ZSBlbmNyeXB0aW9uLlxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGJsb2NrX3NpemUgdGhlIGJsb2NrIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGFsZ29yaXRobSB1c2VkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBwbGFpbnRleHQgY2lwaGVydGV4dCB0byBiZSBkZWNyeXB0ZWQgcHJvdmlkZWQgYXMgYSBzdHJpbmdcblx0ICogQHBhcmFtIHtvcGVucGdwX2J5dGVfYXJyYXl9IGtleSBrZXkgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSBjaXBoZXJ0ZXh0LiBUaGlzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBcblx0ICogIGJsb2NrY2lwaGVyZm5cblx0ICogQHBhcmFtIHtCb29sZWFufSByZXN5bmMgYSBib29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgaWYgYSByZXN5bmMgb2YgdGhlIFxuXHQgKiAgSVYgc2hvdWxkIGJlIHVzZWQgb3Igbm90LiBUaGUgZW5jcnlwdGVkZGF0YXBhY2tldCB1c2VzIHRoZSBcblx0ICogIFwib2xkXCIgc3R5bGUgd2l0aCBhIHJlc3luYy4gRGVjcnlwdGlvbiB3aXRoaW4gYW4gXG5cdCAqICBlbmNyeXB0ZWRpbnRlZ3JpdHlwcm90ZWN0ZWRkYXRhIHBhY2tldCBpcyBub3QgcmVzeW5jaW5nIHRoZSBJVi5cblx0ICogQHJldHVybiB7U3RyaW5nfSBhIHN0cmluZyB3aXRoIHRoZSBwbGFpbnRleHQgZGF0YVxuXHQgKi9cblxuXHRkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyZm4sIGtleSwgY2lwaGVydGV4dCwgcmVzeW5jKSB7XG5cdFx0Y2lwaGVyZm4gPSBuZXcgY2lwaGVyW2NpcGhlcmZuXShrZXkpO1xuXHRcdHZhciBibG9ja19zaXplID0gY2lwaGVyZm4uYmxvY2tTaXplO1xuXG5cdFx0dmFyIGlibG9jayA9IG5ldyBBcnJheShibG9ja19zaXplKTtcblx0XHR2YXIgYWJsb2NrID0gbmV3IEFycmF5KGJsb2NrX3NpemUpO1xuXHRcdHZhciBpLCBuID0gJyc7XG5cdFx0dmFyIHRleHQgPSBbXTtcblxuXHRcdC8vIGluaXRpYWxpc2F0aW9uIHZlY3RvclxuXHRcdGZvcihpPTA7IGkgPCBibG9ja19zaXplOyBpKyspIGlibG9ja1tpXSA9IDA7XG5cblx0XHRpYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGlibG9jaywga2V5KTtcblx0XHRmb3IoaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspXG5cdFx0e1xuXHRcdFx0YWJsb2NrW2ldID0gY2lwaGVydGV4dC5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aWJsb2NrW2ldIF49IGFibG9ja1tpXTtcblx0XHR9XG5cblx0XHRhYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGFibG9jaywga2V5KTtcblxuXHRcdC8vIHRlc3QgY2hlY2sgb2N0ZXRzXG5cdFx0aWYoaWJsb2NrW2Jsb2NrX3NpemUtMl0hPShhYmxvY2tbMF1eY2lwaGVydGV4dC5jaGFyQ29kZUF0KGJsb2NrX3NpemUpKVxuXHRcdHx8IGlibG9ja1tibG9ja19zaXplLTFdIT0oYWJsb2NrWzFdXmNpcGhlcnRleHQuY2hhckNvZGVBdChibG9ja19zaXplKzEpKSlcblx0XHR7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS4nKTtcblx0XHR9XG5cdFx0XG5cdFx0LyogIFJGQzQ4ODA6IFRhZyAxOCBhbmQgUmVzeW5jOlxuXHRcdCAqICBbLi4uXSBVbmxpa2UgdGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0LCBub1xuXHRcdCAqICBzcGVjaWFsIENGQiByZXN5bmNocm9uaXphdGlvbiBpcyBkb25lIGFmdGVyIGVuY3J5cHRpbmcgdGhpcyBwcmVmaXhcblx0XHQgKiAgZGF0YS4gIFNlZSBcIk9wZW5QR1AgQ0ZCIE1vZGVcIiBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuXG5cdFx0ICovXG5cdFx0XG5cdFx0aWYgKHJlc3luYykge1xuXHRcdFx0Zm9yKGk9MDsgaTxibG9ja19zaXplOyBpKyspIGlibG9ja1tpXSA9IGNpcGhlcnRleHQuY2hhckNvZGVBdChpKzIpO1xuXHRcdFx0Zm9yKG49YmxvY2tfc2l6ZSsyOyBuPGNpcGhlcnRleHQubGVuZ3RoOyBuKz1ibG9ja19zaXplKVxuXHRcdFx0e1xuXHRcdFx0XHRhYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGlibG9jayk7XG5cblx0XHRcdFx0Zm9yKGkgPSAwOyBpPGJsb2NrX3NpemUgJiYgaStuIDwgY2lwaGVydGV4dC5sZW5ndGg7IGkrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlibG9ja1tpXSA9IGNpcGhlcnRleHQuY2hhckNvZGVBdChuK2kpO1xuXHRcdFx0XHRcdHRleHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGFibG9ja1tpXV5pYmxvY2tbaV0pKTsgXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yKGk9MDsgaTxibG9ja19zaXplOyBpKyspIGlibG9ja1tpXSA9IGNpcGhlcnRleHQuY2hhckNvZGVBdChpKTtcblx0XHRcdGZvcihuPWJsb2NrX3NpemU7IG48Y2lwaGVydGV4dC5sZW5ndGg7IG4rPWJsb2NrX3NpemUpXG5cdFx0XHR7XG5cdFx0XHRcdGFibG9jayA9IGNpcGhlcmZuLmVuY3J5cHQoaWJsb2NrKTtcblx0XHRcdFx0Zm9yKGkgPSAwOyBpPGJsb2NrX3NpemUgJiYgaStuIDwgY2lwaGVydGV4dC5sZW5ndGg7IGkrKylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlibG9ja1tpXSA9IGNpcGhlcnRleHQuY2hhckNvZGVBdChuK2kpO1xuXHRcdFx0XHRcdHRleHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGFibG9ja1tpXV5pYmxvY2tbaV0pKTsgXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgbiA9IHJlc3luYyA/IDAgOiAyO1xuXG5cdFx0dGV4dCA9IHRleHQuam9pbignJyk7XG5cblx0XHR0ZXh0ID0gdGV4dC5zdWJzdHJpbmcobiwgY2lwaGVydGV4dC5sZW5ndGggLSBibG9ja19zaXplIC0gMik7XG5cblx0XHRcblx0XHRyZXR1cm4gdGV4dDtcblx0fSxcblxuXG5cdG5vcm1hbEVuY3J5cHQ6IGZ1bmN0aW9uKGNpcGhlcmZuLCBrZXksIHBsYWludGV4dCwgaXYpIHtcblx0XHRjaXBoZXJmbiA9IG5ldyBjaXBoZXJbY2lwaGVyZm5dKGtleSk7XG5cdFx0dmFyIGJsb2NrX3NpemUgPSBjaXBoZXJmbi5ibG9ja1NpemU7XG5cblx0XHR2YXIgYmxvY2tpID1cIlwiO1xuXHRcdHZhciBibG9ja2MgPSBcIlwiO1xuXHRcdHZhciBwb3MgPSAwO1xuXHRcdHZhciBjeXBoZXJ0ZXh0ID0gW107XG5cdFx0dmFyIHRlbXBCbG9jayA9IFtdO1xuXHRcdGJsb2NrYyA9IGl2LnN1YnN0cmluZygwLGJsb2NrX3NpemUpO1xuXHRcdHdoaWxlIChwbGFpbnRleHQubGVuZ3RoID4gYmxvY2tfc2l6ZSpwb3MpIHtcblx0XHRcdHZhciBlbmNibG9jayA9IGNpcGhlcmZuLmVuY3J5cHQodXRpbC5zdHIyYmluKGJsb2NrYykpO1xuXHRcdFx0YmxvY2tpID0gcGxhaW50ZXh0LnN1YnN0cmluZygocG9zKmJsb2NrX3NpemUpLChwb3MqYmxvY2tfc2l6ZSkrYmxvY2tfc2l6ZSk7XG5cdFx0XHRmb3IgKHZhciBpPTA7IGkgPCBibG9ja2kubGVuZ3RoOyBpKyspXG5cdFx0XHRcdHRlbXBCbG9jay5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYmxvY2tpLmNoYXJDb2RlQXQoaSkgXiBlbmNibG9ja1tpXSkpO1xuXHRcdFx0YmxvY2tjID0gdGVtcEJsb2NrLmpvaW4oJycpO1xuXHRcdFx0dGVtcEJsb2NrID0gW107XG5cdFx0XHRjeXBoZXJ0ZXh0LnB1c2goYmxvY2tjKTtcblx0XHRcdHBvcysrO1xuXHRcdH1cblx0XHRyZXR1cm4gY3lwaGVydGV4dC5qb2luKCcnKTtcblx0fSxcblxuXHRub3JtYWxEZWNyeXB0OiBmdW5jdGlvbihjaXBoZXJmbiwga2V5LCBjaXBoZXJ0ZXh0LCBpdikgeyBcblx0XHRjaXBoZXJmbiA9IG5ldyBjaXBoZXJbY2lwaGVyZm5dKGtleSk7XG5cdFx0dmFyIGJsb2NrX3NpemUgPSBjaXBoZXJmbi5ibG9ja1NpemU7XG5cblx0XHR2YXIgYmxvY2twID1cIlwiO1xuXHRcdHZhciBwb3MgPSAwO1xuXHRcdHZhciBwbGFpbnRleHQgPSBbXTtcblx0XHR2YXIgb2Zmc2V0ID0gMDtcblx0XHRpZiAoaXYgPT0gbnVsbClcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSBibG9ja3AgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTtcblx0XHRlbHNlXG5cdFx0XHRibG9ja3AgPSBpdi5zdWJzdHJpbmcoMCxibG9ja19zaXplKTtcblx0XHR3aGlsZSAoY2lwaGVydGV4dC5sZW5ndGggPiAoYmxvY2tfc2l6ZSpwb3MpKSB7XG5cdFx0XHR2YXIgZGVjYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KHV0aWwuc3RyMmJpbihibG9ja3ApKTtcblx0XHRcdGJsb2NrcCA9IGNpcGhlcnRleHQuc3Vic3RyaW5nKChwb3MqKGJsb2NrX3NpemUpKStvZmZzZXQsKHBvcyooYmxvY2tfc2l6ZSkpKyhibG9ja19zaXplKStvZmZzZXQpO1xuXHRcdFx0Zm9yICh2YXIgaT0wOyBpIDwgYmxvY2twLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHBsYWludGV4dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYmxvY2twLmNoYXJDb2RlQXQoaSkgXiBkZWNibG9ja1tpXSkpO1xuXHRcdFx0fVxuXHRcdFx0cG9zKys7XG5cdFx0fVxuXHRcdFxuXHRcdHJldHVybiBwbGFpbnRleHQuam9pbignJyk7XG5cdH1cbn1cbiIsIlxuLyogUmlqbmRhZWwgKEFFUykgRW5jcnlwdGlvblxuICogQ29weXJpZ2h0IDIwMDUgSGVyYmVydCBIYW5ld2lua2VsLCB3d3cuaGFuZVdJTi5kZVxuICogdmVyc2lvbiAxLjEsIGNoZWNrIHd3dy5oYW5lV0lOLmRlIGZvciB0aGUgbGF0ZXN0IHZlcnNpb25cblxuICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcywgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICBcbiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgb3Igc2VsbCB0aGlzIHNvZnR3YXJlLCB3aXRoIG9yXG4gKiB3aXRob3V0IGZlZSwgZm9yIGFueSBwdXJwb3NlIGFuZCBieSBhbnkgaW5kaXZpZHVhbCBvciBvcmdhbml6YXRpb24sIGlzIGhlcmVieVxuICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXBwZWFyIFxuICogaW4gYWxsIGNvcGllcy4gRGlzdHJpYnV0aW9uIGFzIGEgcGFydCBvZiBhbiBhcHBsaWNhdGlvbiBvciBiaW5hcnkgbXVzdFxuICogaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXJcbiAqIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBvciBkaXN0cmlidXRpb24uXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyk7XG5cbi8vIFRoZSByb3VuZCBjb25zdGFudHMgdXNlZCBpbiBzdWJrZXkgZXhwYW5zaW9uXG52YXIgUmNvbiA9IFsgXG4weDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2LCAweDZjLCAweGQ4LCBcbjB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIFxuMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MSBdO1xuXG4vLyBQcmVjb21wdXRlZCBsb29rdXAgdGFibGUgZm9yIHRoZSBTQm94XG52YXIgUyA9IFtcbiA5OSwgMTI0LCAxMTksIDEyMywgMjQyLCAxMDcsIDExMSwgMTk3LCAgNDgsICAgMSwgMTAzLCAgNDMsIDI1NCwgMjE1LCAxNzEsIFxuMTE4LCAyMDIsIDEzMCwgMjAxLCAxMjUsIDI1MCwgIDg5LCAgNzEsIDI0MCwgMTczLCAyMTIsIDE2MiwgMTc1LCAxNTYsIDE2NCwgXG4xMTQsIDE5MiwgMTgzLCAyNTMsIDE0NywgIDM4LCAgNTQsICA2MywgMjQ3LCAyMDQsICA1MiwgMTY1LCAyMjksIDI0MSwgMTEzLCBcbjIxNiwgIDQ5LCAgMjEsICAgNCwgMTk5LCAgMzUsIDE5NSwgIDI0LCAxNTAsICAgNSwgMTU0LCAgIDcsICAxOCwgMTI4LCAyMjYsIFxuMjM1LCAgMzksIDE3OCwgMTE3LCAgIDksIDEzMSwgIDQ0LCAgMjYsICAyNywgMTEwLCAgOTAsIDE2MCwgIDgyLCAgNTksIDIxNCwgXG4xNzksICA0MSwgMjI3LCAgNDcsIDEzMiwgIDgzLCAyMDksICAgMCwgMjM3LCAgMzIsIDI1MiwgMTc3LCAgOTEsIDEwNiwgMjAzLCBcbjE5MCwgIDU3LCAgNzQsICA3NiwgIDg4LCAyMDcsIDIwOCwgMjM5LCAxNzAsIDI1MSwgIDY3LCAgNzcsICA1MSwgMTMzLCAgNjksIFxuMjQ5LCAgIDIsIDEyNywgIDgwLCAgNjAsIDE1OSwgMTY4LCAgODEsIDE2MywgIDY0LCAxNDMsIDE0NiwgMTU3LCAgNTYsIDI0NSwgXG4xODgsIDE4MiwgMjE4LCAgMzMsICAxNiwgMjU1LCAyNDMsIDIxMCwgMjA1LCAgMTIsICAxOSwgMjM2LCAgOTUsIDE1MSwgIDY4LCAgXG4yMywgIDE5NiwgMTY3LCAxMjYsICA2MSwgMTAwLCAgOTMsICAyNSwgMTE1LCAgOTYsIDEyOSwgIDc5LCAyMjAsICAzNCwgIDQyLCBcbjE0NCwgMTM2LCAgNzAsIDIzOCwgMTg0LCAgMjAsIDIyMiwgIDk0LCAgMTEsIDIxOSwgMjI0LCAgNTAsICA1OCwgIDEwLCAgNzMsXG4gIDYsICAzNiwgIDkyLCAxOTQsIDIxMSwgMTcyLCAgOTgsIDE0NSwgMTQ5LCAyMjgsIDEyMSwgMjMxLCAyMDAsICA1NSwgMTA5LCBcbjE0MSwgMjEzLCAgNzgsIDE2OSwgMTA4LCAgODYsIDI0NCwgMjM0LCAxMDEsIDEyMiwgMTc0LCAgIDgsIDE4NiwgMTIwLCAgMzcsICBcbiA0NiwgIDI4LCAxNjYsIDE4MCwgMTk4LCAyMzIsIDIyMSwgMTE2LCAgMzEsICA3NSwgMTg5LCAxMzksIDEzOCwgMTEyLCAgNjIsIFxuMTgxLCAxMDIsICA3MiwgICAzLCAyNDYsICAxNCwgIDk3LCAgNTMsICA4NywgMTg1LCAxMzQsIDE5MywgIDI5LCAxNTgsIDIyNSxcbjI0OCwgMTUyLCAgMTcsIDEwNSwgMjE3LCAxNDIsIDE0OCwgMTU1LCAgMzAsIDEzNSwgMjMzLCAyMDYsICA4NSwgIDQwLCAyMjMsXG4xNDAsIDE2MSwgMTM3LCAgMTMsIDE5MSwgMjMwLCAgNjYsIDEwNCwgIDY1LCAxNTMsICA0NSwgIDE1LCAxNzYsICA4NCwgMTg3LCAgXG4gMjIgXTtcblxudmFyIFQxID0gW1xuMHhhNTYzNjNjNiwgMHg4NDdjN2NmOCwgMHg5OTc3NzdlZSwgMHg4ZDdiN2JmNixcbjB4MGRmMmYyZmYsIDB4YmQ2YjZiZDYsIDB4YjE2ZjZmZGUsIDB4NTRjNWM1OTEsXG4weDUwMzAzMDYwLCAweDAzMDEwMTAyLCAweGE5Njc2N2NlLCAweDdkMmIyYjU2LFxuMHgxOWZlZmVlNywgMHg2MmQ3ZDdiNSwgMHhlNmFiYWI0ZCwgMHg5YTc2NzZlYyxcbjB4NDVjYWNhOGYsIDB4OWQ4MjgyMWYsIDB4NDBjOWM5ODksIDB4ODc3ZDdkZmEsXG4weDE1ZmFmYWVmLCAweGViNTk1OWIyLCAweGM5NDc0NzhlLCAweDBiZjBmMGZiLFxuMHhlY2FkYWQ0MSwgMHg2N2Q0ZDRiMywgMHhmZGEyYTI1ZiwgMHhlYWFmYWY0NSxcbjB4YmY5YzljMjMsIDB4ZjdhNGE0NTMsIDB4OTY3MjcyZTQsIDB4NWJjMGMwOWIsXG4weGMyYjdiNzc1LCAweDFjZmRmZGUxLCAweGFlOTM5MzNkLCAweDZhMjYyNjRjLFxuMHg1YTM2MzY2YywgMHg0MTNmM2Y3ZSwgMHgwMmY3ZjdmNSwgMHg0ZmNjY2M4MyxcbjB4NWMzNDM0NjgsIDB4ZjRhNWE1NTEsIDB4MzRlNWU1ZDEsIDB4MDhmMWYxZjksXG4weDkzNzE3MWUyLCAweDczZDhkOGFiLCAweDUzMzEzMTYyLCAweDNmMTUxNTJhLFxuMHgwYzA0MDQwOCwgMHg1MmM3Yzc5NSwgMHg2NTIzMjM0NiwgMHg1ZWMzYzM5ZCxcbjB4MjgxODE4MzAsIDB4YTE5Njk2MzcsIDB4MGYwNTA1MGEsIDB4YjU5YTlhMmYsXG4weDA5MDcwNzBlLCAweDM2MTIxMjI0LCAweDliODA4MDFiLCAweDNkZTJlMmRmLFxuMHgyNmViZWJjZCwgMHg2OTI3Mjc0ZSwgMHhjZGIyYjI3ZiwgMHg5Zjc1NzVlYSxcbjB4MWIwOTA5MTIsIDB4OWU4MzgzMWQsIDB4NzQyYzJjNTgsIDB4MmUxYTFhMzQsXG4weDJkMWIxYjM2LCAweGIyNmU2ZWRjLCAweGVlNWE1YWI0LCAweGZiYTBhMDViLFxuMHhmNjUyNTJhNCwgMHg0ZDNiM2I3NiwgMHg2MWQ2ZDZiNywgMHhjZWIzYjM3ZCxcbjB4N2IyOTI5NTIsIDB4M2VlM2UzZGQsIDB4NzEyZjJmNWUsIDB4OTc4NDg0MTMsXG4weGY1NTM1M2E2LCAweDY4ZDFkMWI5LCAweDAwMDAwMDAwLCAweDJjZWRlZGMxLFxuMHg2MDIwMjA0MCwgMHgxZmZjZmNlMywgMHhjOGIxYjE3OSwgMHhlZDViNWJiNixcbjB4YmU2YTZhZDQsIDB4NDZjYmNiOGQsIDB4ZDliZWJlNjcsIDB4NGIzOTM5NzIsXG4weGRlNGE0YTk0LCAweGQ0NGM0Yzk4LCAweGU4NTg1OGIwLCAweDRhY2ZjZjg1LFxuMHg2YmQwZDBiYiwgMHgyYWVmZWZjNSwgMHhlNWFhYWE0ZiwgMHgxNmZiZmJlZCxcbjB4YzU0MzQzODYsIDB4ZDc0ZDRkOWEsIDB4NTUzMzMzNjYsIDB4OTQ4NTg1MTEsXG4weGNmNDU0NThhLCAweDEwZjlmOWU5LCAweDA2MDIwMjA0LCAweDgxN2Y3ZmZlLFxuMHhmMDUwNTBhMCwgMHg0NDNjM2M3OCwgMHhiYTlmOWYyNSwgMHhlM2E4YTg0YixcbjB4ZjM1MTUxYTIsIDB4ZmVhM2EzNWQsIDB4YzA0MDQwODAsIDB4OGE4ZjhmMDUsXG4weGFkOTI5MjNmLCAweGJjOWQ5ZDIxLCAweDQ4MzgzODcwLCAweDA0ZjVmNWYxLFxuMHhkZmJjYmM2MywgMHhjMWI2YjY3NywgMHg3NWRhZGFhZiwgMHg2MzIxMjE0MixcbjB4MzAxMDEwMjAsIDB4MWFmZmZmZTUsIDB4MGVmM2YzZmQsIDB4NmRkMmQyYmYsXG4weDRjY2RjZDgxLCAweDE0MGMwYzE4LCAweDM1MTMxMzI2LCAweDJmZWNlY2MzLFxuMHhlMTVmNWZiZSwgMHhhMjk3OTczNSwgMHhjYzQ0NDQ4OCwgMHgzOTE3MTcyZSxcbjB4NTdjNGM0OTMsIDB4ZjJhN2E3NTUsIDB4ODI3ZTdlZmMsIDB4NDczZDNkN2EsXG4weGFjNjQ2NGM4LCAweGU3NWQ1ZGJhLCAweDJiMTkxOTMyLCAweDk1NzM3M2U2LFxuMHhhMDYwNjBjMCwgMHg5ODgxODExOSwgMHhkMTRmNGY5ZSwgMHg3ZmRjZGNhMyxcbjB4NjYyMjIyNDQsIDB4N2UyYTJhNTQsIDB4YWI5MDkwM2IsIDB4ODM4ODg4MGIsXG4weGNhNDY0NjhjLCAweDI5ZWVlZWM3LCAweGQzYjhiODZiLCAweDNjMTQxNDI4LFxuMHg3OWRlZGVhNywgMHhlMjVlNWViYywgMHgxZDBiMGIxNiwgMHg3NmRiZGJhZCxcbjB4M2JlMGUwZGIsIDB4NTYzMjMyNjQsIDB4NGUzYTNhNzQsIDB4MWUwYTBhMTQsXG4weGRiNDk0OTkyLCAweDBhMDYwNjBjLCAweDZjMjQyNDQ4LCAweGU0NWM1Y2I4LFxuMHg1ZGMyYzI5ZiwgMHg2ZWQzZDNiZCwgMHhlZmFjYWM0MywgMHhhNjYyNjJjNCxcbjB4YTg5MTkxMzksIDB4YTQ5NTk1MzEsIDB4MzdlNGU0ZDMsIDB4OGI3OTc5ZjIsXG4weDMyZTdlN2Q1LCAweDQzYzhjODhiLCAweDU5MzczNzZlLCAweGI3NmQ2ZGRhLFxuMHg4YzhkOGQwMSwgMHg2NGQ1ZDViMSwgMHhkMjRlNGU5YywgMHhlMGE5YTk0OSxcbjB4YjQ2YzZjZDgsIDB4ZmE1NjU2YWMsIDB4MDdmNGY0ZjMsIDB4MjVlYWVhY2YsXG4weGFmNjU2NWNhLCAweDhlN2E3YWY0LCAweGU5YWVhZTQ3LCAweDE4MDgwODEwLFxuMHhkNWJhYmE2ZiwgMHg4ODc4NzhmMCwgMHg2ZjI1MjU0YSwgMHg3MjJlMmU1YyxcbjB4MjQxYzFjMzgsIDB4ZjFhNmE2NTcsIDB4YzdiNGI0NzMsIDB4NTFjNmM2OTcsXG4weDIzZThlOGNiLCAweDdjZGRkZGExLCAweDljNzQ3NGU4LCAweDIxMWYxZjNlLFxuMHhkZDRiNGI5NiwgMHhkY2JkYmQ2MSwgMHg4NjhiOGIwZCwgMHg4NThhOGEwZixcbjB4OTA3MDcwZTAsIDB4NDIzZTNlN2MsIDB4YzRiNWI1NzEsIDB4YWE2NjY2Y2MsXG4weGQ4NDg0ODkwLCAweDA1MDMwMzA2LCAweDAxZjZmNmY3LCAweDEyMGUwZTFjLFxuMHhhMzYxNjFjMiwgMHg1ZjM1MzU2YSwgMHhmOTU3NTdhZSwgMHhkMGI5Yjk2OSxcbjB4OTE4Njg2MTcsIDB4NThjMWMxOTksIDB4MjcxZDFkM2EsIDB4Yjk5ZTllMjcsXG4weDM4ZTFlMWQ5LCAweDEzZjhmOGViLCAweGIzOTg5ODJiLCAweDMzMTExMTIyLFxuMHhiYjY5NjlkMiwgMHg3MGQ5ZDlhOSwgMHg4OThlOGUwNywgMHhhNzk0OTQzMyxcbjB4YjY5YjliMmQsIDB4MjIxZTFlM2MsIDB4OTI4Nzg3MTUsIDB4MjBlOWU5YzksXG4weDQ5Y2VjZTg3LCAweGZmNTU1NWFhLCAweDc4MjgyODUwLCAweDdhZGZkZmE1LFxuMHg4ZjhjOGMwMywgMHhmOGExYTE1OSwgMHg4MDg5ODkwOSwgMHgxNzBkMGQxYSxcbjB4ZGFiZmJmNjUsIDB4MzFlNmU2ZDcsIDB4YzY0MjQyODQsIDB4Yjg2ODY4ZDAsXG4weGMzNDE0MTgyLCAweGIwOTk5OTI5LCAweDc3MmQyZDVhLCAweDExMGYwZjFlLFxuMHhjYmIwYjA3YiwgMHhmYzU0NTRhOCwgMHhkNmJiYmI2ZCwgMHgzYTE2MTYyYyBdO1xuXG52YXIgVDIgPSBbXG4weDYzNjNjNmE1LCAweDdjN2NmODg0LCAweDc3NzdlZTk5LCAweDdiN2JmNjhkLFxuMHhmMmYyZmYwZCwgMHg2YjZiZDZiZCwgMHg2ZjZmZGViMSwgMHhjNWM1OTE1NCxcbjB4MzAzMDYwNTAsIDB4MDEwMTAyMDMsIDB4Njc2N2NlYTksIDB4MmIyYjU2N2QsXG4weGZlZmVlNzE5LCAweGQ3ZDdiNTYyLCAweGFiYWI0ZGU2LCAweDc2NzZlYzlhLFxuMHhjYWNhOGY0NSwgMHg4MjgyMWY5ZCwgMHhjOWM5ODk0MCwgMHg3ZDdkZmE4NyxcbjB4ZmFmYWVmMTUsIDB4NTk1OWIyZWIsIDB4NDc0NzhlYzksIDB4ZjBmMGZiMGIsXG4weGFkYWQ0MWVjLCAweGQ0ZDRiMzY3LCAweGEyYTI1ZmZkLCAweGFmYWY0NWVhLFxuMHg5YzljMjNiZiwgMHhhNGE0NTNmNywgMHg3MjcyZTQ5NiwgMHhjMGMwOWI1YixcbjB4YjdiNzc1YzIsIDB4ZmRmZGUxMWMsIDB4OTM5MzNkYWUsIDB4MjYyNjRjNmEsXG4weDM2MzY2YzVhLCAweDNmM2Y3ZTQxLCAweGY3ZjdmNTAyLCAweGNjY2M4MzRmLFxuMHgzNDM0Njg1YywgMHhhNWE1NTFmNCwgMHhlNWU1ZDEzNCwgMHhmMWYxZjkwOCxcbjB4NzE3MWUyOTMsIDB4ZDhkOGFiNzMsIDB4MzEzMTYyNTMsIDB4MTUxNTJhM2YsXG4weDA0MDQwODBjLCAweGM3Yzc5NTUyLCAweDIzMjM0NjY1LCAweGMzYzM5ZDVlLFxuMHgxODE4MzAyOCwgMHg5Njk2MzdhMSwgMHgwNTA1MGEwZiwgMHg5YTlhMmZiNSxcbjB4MDcwNzBlMDksIDB4MTIxMjI0MzYsIDB4ODA4MDFiOWIsIDB4ZTJlMmRmM2QsXG4weGViZWJjZDI2LCAweDI3Mjc0ZTY5LCAweGIyYjI3ZmNkLCAweDc1NzVlYTlmLFxuMHgwOTA5MTIxYiwgMHg4MzgzMWQ5ZSwgMHgyYzJjNTg3NCwgMHgxYTFhMzQyZSxcbjB4MWIxYjM2MmQsIDB4NmU2ZWRjYjIsIDB4NWE1YWI0ZWUsIDB4YTBhMDViZmIsXG4weDUyNTJhNGY2LCAweDNiM2I3NjRkLCAweGQ2ZDZiNzYxLCAweGIzYjM3ZGNlLFxuMHgyOTI5NTI3YiwgMHhlM2UzZGQzZSwgMHgyZjJmNWU3MSwgMHg4NDg0MTM5NyxcbjB4NTM1M2E2ZjUsIDB4ZDFkMWI5NjgsIDB4MDAwMDAwMDAsIDB4ZWRlZGMxMmMsXG4weDIwMjA0MDYwLCAweGZjZmNlMzFmLCAweGIxYjE3OWM4LCAweDViNWJiNmVkLFxuMHg2YTZhZDRiZSwgMHhjYmNiOGQ0NiwgMHhiZWJlNjdkOSwgMHgzOTM5NzI0YixcbjB4NGE0YTk0ZGUsIDB4NGM0Yzk4ZDQsIDB4NTg1OGIwZTgsIDB4Y2ZjZjg1NGEsXG4weGQwZDBiYjZiLCAweGVmZWZjNTJhLCAweGFhYWE0ZmU1LCAweGZiZmJlZDE2LFxuMHg0MzQzODZjNSwgMHg0ZDRkOWFkNywgMHgzMzMzNjY1NSwgMHg4NTg1MTE5NCxcbjB4NDU0NThhY2YsIDB4ZjlmOWU5MTAsIDB4MDIwMjA0MDYsIDB4N2Y3ZmZlODEsXG4weDUwNTBhMGYwLCAweDNjM2M3ODQ0LCAweDlmOWYyNWJhLCAweGE4YTg0YmUzLFxuMHg1MTUxYTJmMywgMHhhM2EzNWRmZSwgMHg0MDQwODBjMCwgMHg4ZjhmMDU4YSxcbjB4OTI5MjNmYWQsIDB4OWQ5ZDIxYmMsIDB4MzgzODcwNDgsIDB4ZjVmNWYxMDQsXG4weGJjYmM2M2RmLCAweGI2YjY3N2MxLCAweGRhZGFhZjc1LCAweDIxMjE0MjYzLFxuMHgxMDEwMjAzMCwgMHhmZmZmZTUxYSwgMHhmM2YzZmQwZSwgMHhkMmQyYmY2ZCxcbjB4Y2RjZDgxNGMsIDB4MGMwYzE4MTQsIDB4MTMxMzI2MzUsIDB4ZWNlY2MzMmYsXG4weDVmNWZiZWUxLCAweDk3OTczNWEyLCAweDQ0NDQ4OGNjLCAweDE3MTcyZTM5LFxuMHhjNGM0OTM1NywgMHhhN2E3NTVmMiwgMHg3ZTdlZmM4MiwgMHgzZDNkN2E0NyxcbjB4NjQ2NGM4YWMsIDB4NWQ1ZGJhZTcsIDB4MTkxOTMyMmIsIDB4NzM3M2U2OTUsXG4weDYwNjBjMGEwLCAweDgxODExOTk4LCAweDRmNGY5ZWQxLCAweGRjZGNhMzdmLFxuMHgyMjIyNDQ2NiwgMHgyYTJhNTQ3ZSwgMHg5MDkwM2JhYiwgMHg4ODg4MGI4MyxcbjB4NDY0NjhjY2EsIDB4ZWVlZWM3MjksIDB4YjhiODZiZDMsIDB4MTQxNDI4M2MsXG4weGRlZGVhNzc5LCAweDVlNWViY2UyLCAweDBiMGIxNjFkLCAweGRiZGJhZDc2LFxuMHhlMGUwZGIzYiwgMHgzMjMyNjQ1NiwgMHgzYTNhNzQ0ZSwgMHgwYTBhMTQxZSxcbjB4NDk0OTkyZGIsIDB4MDYwNjBjMGEsIDB4MjQyNDQ4NmMsIDB4NWM1Y2I4ZTQsXG4weGMyYzI5ZjVkLCAweGQzZDNiZDZlLCAweGFjYWM0M2VmLCAweDYyNjJjNGE2LFxuMHg5MTkxMzlhOCwgMHg5NTk1MzFhNCwgMHhlNGU0ZDMzNywgMHg3OTc5ZjI4YixcbjB4ZTdlN2Q1MzIsIDB4YzhjODhiNDMsIDB4MzczNzZlNTksIDB4NmQ2ZGRhYjcsXG4weDhkOGQwMThjLCAweGQ1ZDViMTY0LCAweDRlNGU5Y2QyLCAweGE5YTk0OWUwLFxuMHg2YzZjZDhiNCwgMHg1NjU2YWNmYSwgMHhmNGY0ZjMwNywgMHhlYWVhY2YyNSxcbjB4NjU2NWNhYWYsIDB4N2E3YWY0OGUsIDB4YWVhZTQ3ZTksIDB4MDgwODEwMTgsXG4weGJhYmE2ZmQ1LCAweDc4NzhmMDg4LCAweDI1MjU0YTZmLCAweDJlMmU1YzcyLFxuMHgxYzFjMzgyNCwgMHhhNmE2NTdmMSwgMHhiNGI0NzNjNywgMHhjNmM2OTc1MSxcbjB4ZThlOGNiMjMsIDB4ZGRkZGExN2MsIDB4NzQ3NGU4OWMsIDB4MWYxZjNlMjEsXG4weDRiNGI5NmRkLCAweGJkYmQ2MWRjLCAweDhiOGIwZDg2LCAweDhhOGEwZjg1LFxuMHg3MDcwZTA5MCwgMHgzZTNlN2M0MiwgMHhiNWI1NzFjNCwgMHg2NjY2Y2NhYSxcbjB4NDg0ODkwZDgsIDB4MDMwMzA2MDUsIDB4ZjZmNmY3MDEsIDB4MGUwZTFjMTIsXG4weDYxNjFjMmEzLCAweDM1MzU2YTVmLCAweDU3NTdhZWY5LCAweGI5Yjk2OWQwLFxuMHg4Njg2MTc5MSwgMHhjMWMxOTk1OCwgMHgxZDFkM2EyNywgMHg5ZTllMjdiOSxcbjB4ZTFlMWQ5MzgsIDB4ZjhmOGViMTMsIDB4OTg5ODJiYjMsIDB4MTExMTIyMzMsXG4weDY5NjlkMmJiLCAweGQ5ZDlhOTcwLCAweDhlOGUwNzg5LCAweDk0OTQzM2E3LFxuMHg5YjliMmRiNiwgMHgxZTFlM2MyMiwgMHg4Nzg3MTU5MiwgMHhlOWU5YzkyMCxcbjB4Y2VjZTg3NDksIDB4NTU1NWFhZmYsIDB4MjgyODUwNzgsIDB4ZGZkZmE1N2EsXG4weDhjOGMwMzhmLCAweGExYTE1OWY4LCAweDg5ODkwOTgwLCAweDBkMGQxYTE3LFxuMHhiZmJmNjVkYSwgMHhlNmU2ZDczMSwgMHg0MjQyODRjNiwgMHg2ODY4ZDBiOCxcbjB4NDE0MTgyYzMsIDB4OTk5OTI5YjAsIDB4MmQyZDVhNzcsIDB4MGYwZjFlMTEsXG4weGIwYjA3YmNiLCAweDU0NTRhOGZjLCAweGJiYmI2ZGQ2LCAweDE2MTYyYzNhIF07XG5cbnZhciBUMyA9IFtcbjB4NjNjNmE1NjMsIDB4N2NmODg0N2MsIDB4NzdlZTk5NzcsIDB4N2JmNjhkN2IsXG4weGYyZmYwZGYyLCAweDZiZDZiZDZiLCAweDZmZGViMTZmLCAweGM1OTE1NGM1LFxuMHgzMDYwNTAzMCwgMHgwMTAyMDMwMSwgMHg2N2NlYTk2NywgMHgyYjU2N2QyYixcbjB4ZmVlNzE5ZmUsIDB4ZDdiNTYyZDcsIDB4YWI0ZGU2YWIsIDB4NzZlYzlhNzYsXG4weGNhOGY0NWNhLCAweDgyMWY5ZDgyLCAweGM5ODk0MGM5LCAweDdkZmE4NzdkLFxuMHhmYWVmMTVmYSwgMHg1OWIyZWI1OSwgMHg0NzhlYzk0NywgMHhmMGZiMGJmMCxcbjB4YWQ0MWVjYWQsIDB4ZDRiMzY3ZDQsIDB4YTI1ZmZkYTIsIDB4YWY0NWVhYWYsXG4weDljMjNiZjljLCAweGE0NTNmN2E0LCAweDcyZTQ5NjcyLCAweGMwOWI1YmMwLFxuMHhiNzc1YzJiNywgMHhmZGUxMWNmZCwgMHg5MzNkYWU5MywgMHgyNjRjNmEyNixcbjB4MzY2YzVhMzYsIDB4M2Y3ZTQxM2YsIDB4ZjdmNTAyZjcsIDB4Y2M4MzRmY2MsXG4weDM0Njg1YzM0LCAweGE1NTFmNGE1LCAweGU1ZDEzNGU1LCAweGYxZjkwOGYxLFxuMHg3MWUyOTM3MSwgMHhkOGFiNzNkOCwgMHgzMTYyNTMzMSwgMHgxNTJhM2YxNSxcbjB4MDQwODBjMDQsIDB4Yzc5NTUyYzcsIDB4MjM0NjY1MjMsIDB4YzM5ZDVlYzMsXG4weDE4MzAyODE4LCAweDk2MzdhMTk2LCAweDA1MGEwZjA1LCAweDlhMmZiNTlhLFxuMHgwNzBlMDkwNywgMHgxMjI0MzYxMiwgMHg4MDFiOWI4MCwgMHhlMmRmM2RlMixcbjB4ZWJjZDI2ZWIsIDB4Mjc0ZTY5MjcsIDB4YjI3ZmNkYjIsIDB4NzVlYTlmNzUsXG4weDA5MTIxYjA5LCAweDgzMWQ5ZTgzLCAweDJjNTg3NDJjLCAweDFhMzQyZTFhLFxuMHgxYjM2MmQxYiwgMHg2ZWRjYjI2ZSwgMHg1YWI0ZWU1YSwgMHhhMDViZmJhMCxcbjB4NTJhNGY2NTIsIDB4M2I3NjRkM2IsIDB4ZDZiNzYxZDYsIDB4YjM3ZGNlYjMsXG4weDI5NTI3YjI5LCAweGUzZGQzZWUzLCAweDJmNWU3MTJmLCAweDg0MTM5Nzg0LFxuMHg1M2E2ZjU1MywgMHhkMWI5NjhkMSwgMHgwMDAwMDAwMCwgMHhlZGMxMmNlZCxcbjB4MjA0MDYwMjAsIDB4ZmNlMzFmZmMsIDB4YjE3OWM4YjEsIDB4NWJiNmVkNWIsXG4weDZhZDRiZTZhLCAweGNiOGQ0NmNiLCAweGJlNjdkOWJlLCAweDM5NzI0YjM5LFxuMHg0YTk0ZGU0YSwgMHg0Yzk4ZDQ0YywgMHg1OGIwZTg1OCwgMHhjZjg1NGFjZixcbjB4ZDBiYjZiZDAsIDB4ZWZjNTJhZWYsIDB4YWE0ZmU1YWEsIDB4ZmJlZDE2ZmIsXG4weDQzODZjNTQzLCAweDRkOWFkNzRkLCAweDMzNjY1NTMzLCAweDg1MTE5NDg1LFxuMHg0NThhY2Y0NSwgMHhmOWU5MTBmOSwgMHgwMjA0MDYwMiwgMHg3ZmZlODE3ZixcbjB4NTBhMGYwNTAsIDB4M2M3ODQ0M2MsIDB4OWYyNWJhOWYsIDB4YTg0YmUzYTgsXG4weDUxYTJmMzUxLCAweGEzNWRmZWEzLCAweDQwODBjMDQwLCAweDhmMDU4YThmLFxuMHg5MjNmYWQ5MiwgMHg5ZDIxYmM5ZCwgMHgzODcwNDgzOCwgMHhmNWYxMDRmNSxcbjB4YmM2M2RmYmMsIDB4YjY3N2MxYjYsIDB4ZGFhZjc1ZGEsIDB4MjE0MjYzMjEsXG4weDEwMjAzMDEwLCAweGZmZTUxYWZmLCAweGYzZmQwZWYzLCAweGQyYmY2ZGQyLFxuMHhjZDgxNGNjZCwgMHgwYzE4MTQwYywgMHgxMzI2MzUxMywgMHhlY2MzMmZlYyxcbjB4NWZiZWUxNWYsIDB4OTczNWEyOTcsIDB4NDQ4OGNjNDQsIDB4MTcyZTM5MTcsXG4weGM0OTM1N2M0LCAweGE3NTVmMmE3LCAweDdlZmM4MjdlLCAweDNkN2E0NzNkLFxuMHg2NGM4YWM2NCwgMHg1ZGJhZTc1ZCwgMHgxOTMyMmIxOSwgMHg3M2U2OTU3MyxcbjB4NjBjMGEwNjAsIDB4ODExOTk4ODEsIDB4NGY5ZWQxNGYsIDB4ZGNhMzdmZGMsXG4weDIyNDQ2NjIyLCAweDJhNTQ3ZTJhLCAweDkwM2JhYjkwLCAweDg4MGI4Mzg4LFxuMHg0NjhjY2E0NiwgMHhlZWM3MjllZSwgMHhiODZiZDNiOCwgMHgxNDI4M2MxNCxcbjB4ZGVhNzc5ZGUsIDB4NWViY2UyNWUsIDB4MGIxNjFkMGIsIDB4ZGJhZDc2ZGIsXG4weGUwZGIzYmUwLCAweDMyNjQ1NjMyLCAweDNhNzQ0ZTNhLCAweDBhMTQxZTBhLFxuMHg0OTkyZGI0OSwgMHgwNjBjMGEwNiwgMHgyNDQ4NmMyNCwgMHg1Y2I4ZTQ1YyxcbjB4YzI5ZjVkYzIsIDB4ZDNiZDZlZDMsIDB4YWM0M2VmYWMsIDB4NjJjNGE2NjIsXG4weDkxMzlhODkxLCAweDk1MzFhNDk1LCAweGU0ZDMzN2U0LCAweDc5ZjI4Yjc5LFxuMHhlN2Q1MzJlNywgMHhjODhiNDNjOCwgMHgzNzZlNTkzNywgMHg2ZGRhYjc2ZCxcbjB4OGQwMThjOGQsIDB4ZDViMTY0ZDUsIDB4NGU5Y2QyNGUsIDB4YTk0OWUwYTksXG4weDZjZDhiNDZjLCAweDU2YWNmYTU2LCAweGY0ZjMwN2Y0LCAweGVhY2YyNWVhLFxuMHg2NWNhYWY2NSwgMHg3YWY0OGU3YSwgMHhhZTQ3ZTlhZSwgMHgwODEwMTgwOCxcbjB4YmE2ZmQ1YmEsIDB4NzhmMDg4NzgsIDB4MjU0YTZmMjUsIDB4MmU1YzcyMmUsXG4weDFjMzgyNDFjLCAweGE2NTdmMWE2LCAweGI0NzNjN2I0LCAweGM2OTc1MWM2LFxuMHhlOGNiMjNlOCwgMHhkZGExN2NkZCwgMHg3NGU4OWM3NCwgMHgxZjNlMjExZixcbjB4NGI5NmRkNGIsIDB4YmQ2MWRjYmQsIDB4OGIwZDg2OGIsIDB4OGEwZjg1OGEsXG4weDcwZTA5MDcwLCAweDNlN2M0MjNlLCAweGI1NzFjNGI1LCAweDY2Y2NhYTY2LFxuMHg0ODkwZDg0OCwgMHgwMzA2MDUwMywgMHhmNmY3MDFmNiwgMHgwZTFjMTIwZSxcbjB4NjFjMmEzNjEsIDB4MzU2YTVmMzUsIDB4NTdhZWY5NTcsIDB4Yjk2OWQwYjksXG4weDg2MTc5MTg2LCAweGMxOTk1OGMxLCAweDFkM2EyNzFkLCAweDllMjdiOTllLFxuMHhlMWQ5MzhlMSwgMHhmOGViMTNmOCwgMHg5ODJiYjM5OCwgMHgxMTIyMzMxMSxcbjB4NjlkMmJiNjksIDB4ZDlhOTcwZDksIDB4OGUwNzg5OGUsIDB4OTQzM2E3OTQsXG4weDliMmRiNjliLCAweDFlM2MyMjFlLCAweDg3MTU5Mjg3LCAweGU5YzkyMGU5LFxuMHhjZTg3NDljZSwgMHg1NWFhZmY1NSwgMHgyODUwNzgyOCwgMHhkZmE1N2FkZixcbjB4OGMwMzhmOGMsIDB4YTE1OWY4YTEsIDB4ODkwOTgwODksIDB4MGQxYTE3MGQsXG4weGJmNjVkYWJmLCAweGU2ZDczMWU2LCAweDQyODRjNjQyLCAweDY4ZDBiODY4LFxuMHg0MTgyYzM0MSwgMHg5OTI5YjA5OSwgMHgyZDVhNzcyZCwgMHgwZjFlMTEwZixcbjB4YjA3YmNiYjAsIDB4NTRhOGZjNTQsIDB4YmI2ZGQ2YmIsIDB4MTYyYzNhMTYgXTtcblxudmFyIFQ0ID0gW1xuMHhjNmE1NjM2MywgMHhmODg0N2M3YywgMHhlZTk5Nzc3NywgMHhmNjhkN2I3YixcbjB4ZmYwZGYyZjIsIDB4ZDZiZDZiNmIsIDB4ZGViMTZmNmYsIDB4OTE1NGM1YzUsXG4weDYwNTAzMDMwLCAweDAyMDMwMTAxLCAweGNlYTk2NzY3LCAweDU2N2QyYjJiLFxuMHhlNzE5ZmVmZSwgMHhiNTYyZDdkNywgMHg0ZGU2YWJhYiwgMHhlYzlhNzY3NixcbjB4OGY0NWNhY2EsIDB4MWY5ZDgyODIsIDB4ODk0MGM5YzksIDB4ZmE4NzdkN2QsXG4weGVmMTVmYWZhLCAweGIyZWI1OTU5LCAweDhlYzk0NzQ3LCAweGZiMGJmMGYwLFxuMHg0MWVjYWRhZCwgMHhiMzY3ZDRkNCwgMHg1ZmZkYTJhMiwgMHg0NWVhYWZhZixcbjB4MjNiZjljOWMsIDB4NTNmN2E0YTQsIDB4ZTQ5NjcyNzIsIDB4OWI1YmMwYzAsXG4weDc1YzJiN2I3LCAweGUxMWNmZGZkLCAweDNkYWU5MzkzLCAweDRjNmEyNjI2LFxuMHg2YzVhMzYzNiwgMHg3ZTQxM2YzZiwgMHhmNTAyZjdmNywgMHg4MzRmY2NjYyxcbjB4Njg1YzM0MzQsIDB4NTFmNGE1YTUsIDB4ZDEzNGU1ZTUsIDB4ZjkwOGYxZjEsXG4weGUyOTM3MTcxLCAweGFiNzNkOGQ4LCAweDYyNTMzMTMxLCAweDJhM2YxNTE1LFxuMHgwODBjMDQwNCwgMHg5NTUyYzdjNywgMHg0NjY1MjMyMywgMHg5ZDVlYzNjMyxcbjB4MzAyODE4MTgsIDB4MzdhMTk2OTYsIDB4MGEwZjA1MDUsIDB4MmZiNTlhOWEsXG4weDBlMDkwNzA3LCAweDI0MzYxMjEyLCAweDFiOWI4MDgwLCAweGRmM2RlMmUyLFxuMHhjZDI2ZWJlYiwgMHg0ZTY5MjcyNywgMHg3ZmNkYjJiMiwgMHhlYTlmNzU3NSxcbjB4MTIxYjA5MDksIDB4MWQ5ZTgzODMsIDB4NTg3NDJjMmMsIDB4MzQyZTFhMWEsXG4weDM2MmQxYjFiLCAweGRjYjI2ZTZlLCAweGI0ZWU1YTVhLCAweDViZmJhMGEwLFxuMHhhNGY2NTI1MiwgMHg3NjRkM2IzYiwgMHhiNzYxZDZkNiwgMHg3ZGNlYjNiMyxcbjB4NTI3YjI5MjksIDB4ZGQzZWUzZTMsIDB4NWU3MTJmMmYsIDB4MTM5Nzg0ODQsXG4weGE2ZjU1MzUzLCAweGI5NjhkMWQxLCAweDAwMDAwMDAwLCAweGMxMmNlZGVkLFxuMHg0MDYwMjAyMCwgMHhlMzFmZmNmYywgMHg3OWM4YjFiMSwgMHhiNmVkNWI1YixcbjB4ZDRiZTZhNmEsIDB4OGQ0NmNiY2IsIDB4NjdkOWJlYmUsIDB4NzI0YjM5MzksXG4weDk0ZGU0YTRhLCAweDk4ZDQ0YzRjLCAweGIwZTg1ODU4LCAweDg1NGFjZmNmLFxuMHhiYjZiZDBkMCwgMHhjNTJhZWZlZiwgMHg0ZmU1YWFhYSwgMHhlZDE2ZmJmYixcbjB4ODZjNTQzNDMsIDB4OWFkNzRkNGQsIDB4NjY1NTMzMzMsIDB4MTE5NDg1ODUsXG4weDhhY2Y0NTQ1LCAweGU5MTBmOWY5LCAweDA0MDYwMjAyLCAweGZlODE3ZjdmLFxuMHhhMGYwNTA1MCwgMHg3ODQ0M2MzYywgMHgyNWJhOWY5ZiwgMHg0YmUzYThhOCxcbjB4YTJmMzUxNTEsIDB4NWRmZWEzYTMsIDB4ODBjMDQwNDAsIDB4MDU4YThmOGYsXG4weDNmYWQ5MjkyLCAweDIxYmM5ZDlkLCAweDcwNDgzODM4LCAweGYxMDRmNWY1LFxuMHg2M2RmYmNiYywgMHg3N2MxYjZiNiwgMHhhZjc1ZGFkYSwgMHg0MjYzMjEyMSxcbjB4MjAzMDEwMTAsIDB4ZTUxYWZmZmYsIDB4ZmQwZWYzZjMsIDB4YmY2ZGQyZDIsXG4weDgxNGNjZGNkLCAweDE4MTQwYzBjLCAweDI2MzUxMzEzLCAweGMzMmZlY2VjLFxuMHhiZWUxNWY1ZiwgMHgzNWEyOTc5NywgMHg4OGNjNDQ0NCwgMHgyZTM5MTcxNyxcbjB4OTM1N2M0YzQsIDB4NTVmMmE3YTcsIDB4ZmM4MjdlN2UsIDB4N2E0NzNkM2QsXG4weGM4YWM2NDY0LCAweGJhZTc1ZDVkLCAweDMyMmIxOTE5LCAweGU2OTU3MzczLFxuMHhjMGEwNjA2MCwgMHgxOTk4ODE4MSwgMHg5ZWQxNGY0ZiwgMHhhMzdmZGNkYyxcbjB4NDQ2NjIyMjIsIDB4NTQ3ZTJhMmEsIDB4M2JhYjkwOTAsIDB4MGI4Mzg4ODgsXG4weDhjY2E0NjQ2LCAweGM3MjllZWVlLCAweDZiZDNiOGI4LCAweDI4M2MxNDE0LFxuMHhhNzc5ZGVkZSwgMHhiY2UyNWU1ZSwgMHgxNjFkMGIwYiwgMHhhZDc2ZGJkYixcbjB4ZGIzYmUwZTAsIDB4NjQ1NjMyMzIsIDB4NzQ0ZTNhM2EsIDB4MTQxZTBhMGEsXG4weDkyZGI0OTQ5LCAweDBjMGEwNjA2LCAweDQ4NmMyNDI0LCAweGI4ZTQ1YzVjLFxuMHg5ZjVkYzJjMiwgMHhiZDZlZDNkMywgMHg0M2VmYWNhYywgMHhjNGE2NjI2MixcbjB4MzlhODkxOTEsIDB4MzFhNDk1OTUsIDB4ZDMzN2U0ZTQsIDB4ZjI4Yjc5NzksXG4weGQ1MzJlN2U3LCAweDhiNDNjOGM4LCAweDZlNTkzNzM3LCAweGRhYjc2ZDZkLFxuMHgwMThjOGQ4ZCwgMHhiMTY0ZDVkNSwgMHg5Y2QyNGU0ZSwgMHg0OWUwYTlhOSxcbjB4ZDhiNDZjNmMsIDB4YWNmYTU2NTYsIDB4ZjMwN2Y0ZjQsIDB4Y2YyNWVhZWEsXG4weGNhYWY2NTY1LCAweGY0OGU3YTdhLCAweDQ3ZTlhZWFlLCAweDEwMTgwODA4LFxuMHg2ZmQ1YmFiYSwgMHhmMDg4Nzg3OCwgMHg0YTZmMjUyNSwgMHg1YzcyMmUyZSxcbjB4MzgyNDFjMWMsIDB4NTdmMWE2YTYsIDB4NzNjN2I0YjQsIDB4OTc1MWM2YzYsXG4weGNiMjNlOGU4LCAweGExN2NkZGRkLCAweGU4OWM3NDc0LCAweDNlMjExZjFmLFxuMHg5NmRkNGI0YiwgMHg2MWRjYmRiZCwgMHgwZDg2OGI4YiwgMHgwZjg1OGE4YSxcbjB4ZTA5MDcwNzAsIDB4N2M0MjNlM2UsIDB4NzFjNGI1YjUsIDB4Y2NhYTY2NjYsXG4weDkwZDg0ODQ4LCAweDA2MDUwMzAzLCAweGY3MDFmNmY2LCAweDFjMTIwZTBlLFxuMHhjMmEzNjE2MSwgMHg2YTVmMzUzNSwgMHhhZWY5NTc1NywgMHg2OWQwYjliOSxcbjB4MTc5MTg2ODYsIDB4OTk1OGMxYzEsIDB4M2EyNzFkMWQsIDB4MjdiOTllOWUsXG4weGQ5MzhlMWUxLCAweGViMTNmOGY4LCAweDJiYjM5ODk4LCAweDIyMzMxMTExLFxuMHhkMmJiNjk2OSwgMHhhOTcwZDlkOSwgMHgwNzg5OGU4ZSwgMHgzM2E3OTQ5NCxcbjB4MmRiNjliOWIsIDB4M2MyMjFlMWUsIDB4MTU5Mjg3ODcsIDB4YzkyMGU5ZTksXG4weDg3NDljZWNlLCAweGFhZmY1NTU1LCAweDUwNzgyODI4LCAweGE1N2FkZmRmLFxuMHgwMzhmOGM4YywgMHg1OWY4YTFhMSwgMHgwOTgwODk4OSwgMHgxYTE3MGQwZCxcbjB4NjVkYWJmYmYsIDB4ZDczMWU2ZTYsIDB4ODRjNjQyNDIsIDB4ZDBiODY4NjgsXG4weDgyYzM0MTQxLCAweDI5YjA5OTk5LCAweDVhNzcyZDJkLCAweDFlMTEwZjBmLFxuMHg3YmNiYjBiMCwgMHhhOGZjNTQ1NCwgMHg2ZGQ2YmJiYiwgMHgyYzNhMTYxNiBdO1xuXG5mdW5jdGlvbiBCMCh4KSB7IHJldHVybiAoeCYyNTUpOyB9XG5mdW5jdGlvbiBCMSh4KSB7IHJldHVybiAoKHg+PjgpJjI1NSk7IH1cbmZ1bmN0aW9uIEIyKHgpIHsgcmV0dXJuICgoeD4+MTYpJjI1NSk7IH1cbmZ1bmN0aW9uIEIzKHgpIHsgcmV0dXJuICgoeD4+MjQpJjI1NSk7IH1cblxuZnVuY3Rpb24gRjEoeDAsIHgxLCB4MiwgeDMpXG57XG4gIHJldHVybiBCMShUMVt4MCYyNTVdKSB8IChCMShUMVsoeDE+PjgpJjI1NV0pPDw4KVxuICAgICAgfCAoQjEoVDFbKHgyPj4xNikmMjU1XSk8PDE2KSB8IChCMShUMVt4Mz4+PjI0XSk8PDI0KTtcbn1cblxuZnVuY3Rpb24gcGFja0J5dGVzKG9jdGV0cylcbntcbiAgdmFyIGksIGo7XG4gIHZhciBsZW49b2N0ZXRzLmxlbmd0aDtcbiAgdmFyIGI9bmV3IEFycmF5KGxlbi80KTtcblxuICBpZiAoIW9jdGV0cyB8fCBsZW4gJSA0KSByZXR1cm47XG5cbiAgZm9yIChpPTAsIGo9MDsgajxsZW47IGorPSA0KVxuICAgICBiW2krK10gPSBvY3RldHNbal0gfCAob2N0ZXRzW2orMV08PDgpIHwgKG9jdGV0c1tqKzJdPDwxNikgfCAob2N0ZXRzW2orM108PDI0KTtcblxuICByZXR1cm4gYjsgIFxufVxuXG5mdW5jdGlvbiB1bnBhY2tCeXRlcyhwYWNrZWQpXG57XG4gIHZhciBqO1xuICB2YXIgaT0wLCBsID0gcGFja2VkLmxlbmd0aDtcbiAgdmFyIHIgPSBuZXcgQXJyYXkobCo0KTtcblxuICBmb3IgKGo9MDsgajxsOyBqKyspXG4gIHtcbiAgICByW2krK10gPSBCMChwYWNrZWRbal0pO1xuICAgIHJbaSsrXSA9IEIxKHBhY2tlZFtqXSk7XG4gICAgcltpKytdID0gQjIocGFja2VkW2pdKTtcbiAgICByW2krK10gPSBCMyhwYWNrZWRbal0pO1xuICB9XG4gIHJldHVybiByO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIG1heGtjPTg7XG52YXIgbWF4cms9MTQ7XG5cbmZ1bmN0aW9uIGtleUV4cGFuc2lvbihrZXkpXG57XG4gIHZhciBrYywgaSwgaiwgciwgdDtcbiAgdmFyIHJvdW5kcztcbiAgdmFyIGtleVNjaGVkPW5ldyBBcnJheShtYXhyaysxKTtcbiAgdmFyIGtleWxlbj1rZXkubGVuZ3RoO1xuICB2YXIgaz1uZXcgQXJyYXkobWF4a2MpO1xuICB2YXIgdGs9bmV3IEFycmF5KG1heGtjKTtcbiAgdmFyIHJjb25wb2ludGVyPTA7XG5cbiAgaWYoa2V5bGVuPT0xNilcbiAge1xuICAgcm91bmRzPTEwO1xuICAga2M9NDtcbiAgfVxuICBlbHNlIGlmKGtleWxlbj09MjQpXG4gIHtcbiAgIHJvdW5kcz0xMjtcbiAgIGtjPTY7XG4gIH1cbiAgZWxzZSBpZihrZXlsZW49PTMyKVxuICB7XG4gICByb3VuZHM9MTQ7XG4gICBrYz04O1xuICB9XG4gIGVsc2VcbiAge1xuXHR1dGlsLnByaW50X2Vycm9yKCdhZXMuanM6IEludmFsaWQga2V5LWxlbmd0aCBmb3IgQUVTIGtleTonK2tleWxlbik7XG4gICByZXR1cm47XG4gIH1cblxuICBmb3IoaT0wOyBpPG1heHJrKzE7IGkrKykga2V5U2NoZWRbaV09bmV3IEFycmF5KDQpO1xuXG4gIGZvcihpPTAsaj0wOyBqPGtleWxlbjsgaisrLGkrPTQpXG4gICAga1tqXSA9IGtleS5jaGFyQ29kZUF0KGkpIHwgKGtleS5jaGFyQ29kZUF0KGkrMSk8PDgpXG4gICAgICAgICAgICAgICAgICAgICB8IChrZXkuY2hhckNvZGVBdChpKzIpPDwxNikgfCAoa2V5LmNoYXJDb2RlQXQoaSszKTw8MjQpO1xuXG4gIGZvcihqPWtjLTE7IGo+PTA7IGotLSkgdGtbal0gPSBrW2pdO1xuXG4gIHI9MDtcbiAgdD0wO1xuICBmb3Ioaj0wOyAoajxrYykmJihyPHJvdW5kcysxKTsgKVxuICB7XG4gICAgZm9yKDsgKGo8a2MpJiYodDw0KTsgaisrLHQrKylcbiAgICB7XG4gICAgICBrZXlTY2hlZFtyXVt0XT10a1tqXTtcbiAgICB9XG4gICAgaWYodD09NClcbiAgICB7XG4gICAgICByKys7XG4gICAgICB0PTA7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUocjxyb3VuZHMrMSlcbiAge1xuICAgIHZhciB0ZW1wID0gdGtba2MtMV07XG5cbiAgICB0a1swXSBePSBTW0IxKHRlbXApXSB8IChTW0IyKHRlbXApXTw8OCkgfCAoU1tCMyh0ZW1wKV08PDE2KSB8IChTW0IwKHRlbXApXTw8MjQpO1xuICAgIHRrWzBdIF49IFJjb25bcmNvbnBvaW50ZXIrK107XG5cbiAgICBpZihrYyAhPSA4KVxuICAgIHtcbiAgICAgIGZvcihqPTE7IGo8a2M7IGorKykgdGtbal0gXj0gdGtbai0xXTtcbiAgICB9XG4gICAgZWxzZVxuICAgIHtcbiAgICAgIGZvcihqPTE7IGo8a2MvMjsgaisrKSB0a1tqXSBePSB0a1tqLTFdO1xuIFxuICAgICAgdGVtcCA9IHRrW2tjLzItMV07XG4gICAgICB0a1trYy8yXSBePSBTW0IwKHRlbXApXSB8IChTW0IxKHRlbXApXTw8OCkgfCAoU1tCMih0ZW1wKV08PDE2KSB8IChTW0IzKHRlbXApXTw8MjQpO1xuXG4gICAgICBmb3Ioaj1rYy8yKzE7IGo8a2M7IGorKykgdGtbal0gXj0gdGtbai0xXTtcbiAgICB9XG5cbiAgICBmb3Ioaj0wOyAoajxrYykmJihyPHJvdW5kcysxKTsgKVxuICAgIHtcbiAgICAgIGZvcig7IChqPGtjKSYmKHQ8NCk7IGorKyx0KyspXG4gICAgICB7XG4gICAgICAgIGtleVNjaGVkW3JdW3RdPXRrW2pdO1xuICAgICAgfVxuICAgICAgaWYodD09NClcbiAgICAgIHtcbiAgICAgICAgcisrO1xuICAgICAgICB0PTA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRoaXMucm91bmRzID0gcm91bmRzO1xuICB0aGlzLnJrID0ga2V5U2NoZWQ7XG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBBRVNlbmNyeXB0KGJsb2NrLCBjdHgpXG57XG4gIHZhciByO1xuICB2YXIgdDAsdDEsdDIsdDM7XG5cbiAgdmFyIGIgPSBwYWNrQnl0ZXMoYmxvY2spO1xuICB2YXIgcm91bmRzID0gY3R4LnJvdW5kcztcbiAgdmFyIGIwID0gYlswXTtcbiAgdmFyIGIxID0gYlsxXTtcbiAgdmFyIGIyID0gYlsyXTtcbiAgdmFyIGIzID0gYlszXTtcblxuICBmb3Iocj0wOyByPHJvdW5kcy0xOyByKyspXG4gIHtcbiAgICB0MCA9IGIwIF4gY3R4LnJrW3JdWzBdO1xuICAgIHQxID0gYjEgXiBjdHgucmtbcl1bMV07XG4gICAgdDIgPSBiMiBeIGN0eC5ya1tyXVsyXTtcbiAgICB0MyA9IGIzIF4gY3R4LnJrW3JdWzNdO1xuXG4gICAgYjAgPSBUMVt0MCYyNTVdIF4gVDJbKHQxPj44KSYyNTVdIF4gVDNbKHQyPj4xNikmMjU1XSBeIFQ0W3QzPj4+MjRdO1xuICAgIGIxID0gVDFbdDEmMjU1XSBeIFQyWyh0Mj4+OCkmMjU1XSBeIFQzWyh0Mz4+MTYpJjI1NV0gXiBUNFt0MD4+PjI0XTtcbiAgICBiMiA9IFQxW3QyJjI1NV0gXiBUMlsodDM+PjgpJjI1NV0gXiBUM1sodDA+PjE2KSYyNTVdIF4gVDRbdDE+Pj4yNF07XG4gICAgYjMgPSBUMVt0MyYyNTVdIF4gVDJbKHQwPj44KSYyNTVdIF4gVDNbKHQxPj4xNikmMjU1XSBeIFQ0W3QyPj4+MjRdO1xuICB9XG5cbiAgLy8gbGFzdCByb3VuZCBpcyBzcGVjaWFsXG4gIHIgPSByb3VuZHMtMTtcblxuICB0MCA9IGIwIF4gY3R4LnJrW3JdWzBdO1xuICB0MSA9IGIxIF4gY3R4LnJrW3JdWzFdO1xuICB0MiA9IGIyIF4gY3R4LnJrW3JdWzJdO1xuICB0MyA9IGIzIF4gY3R4LnJrW3JdWzNdO1xuXG4gIGJbMF0gPSBGMSh0MCwgdDEsIHQyLCB0MykgXiBjdHgucmtbcm91bmRzXVswXTtcbiAgYlsxXSA9IEYxKHQxLCB0MiwgdDMsIHQwKSBeIGN0eC5ya1tyb3VuZHNdWzFdO1xuICBiWzJdID0gRjEodDIsIHQzLCB0MCwgdDEpIF4gY3R4LnJrW3JvdW5kc11bMl07XG4gIGJbM10gPSBGMSh0MywgdDAsIHQxLCB0MikgXiBjdHgucmtbcm91bmRzXVszXTtcblxuICByZXR1cm4gdW5wYWNrQnl0ZXMoYik7XG59XG5cbmZ1bmN0aW9uIG1ha2VDbGFzcyhsZW5ndGgpIHtcblxuXHR2YXIgYyA9IGZ1bmN0aW9uKGtleSkge1xuXHRcdHRoaXMua2V5ID0ga2V5RXhwYW5zaW9uKGtleSk7XG5cblx0XHR0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbihibG9jaykge1xuXHRcdFx0cmV0dXJuIEFFU2VuY3J5cHQoYmxvY2ssIHRoaXMua2V5KTtcblx0XHR9XG5cdH1cblxuXHRjLmJsb2NrU2l6ZSA9IGMucHJvdG90eXBlLmJsb2NrU2l6ZSA9IDE2O1xuXHRjLmtleVNpemUgPSBjLnByb3RvdHlwZS5rZXlTaXplID0gbGVuZ3RoIC8gODtcblxuXHRyZXR1cm4gYztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7fVxuXG52YXIgdHlwZXMgPSBbMTI4LCAxOTIsIDI1Nl07XG5cbmZvcih2YXIgaSBpbiB0eXBlcyApIHtcblx0bW9kdWxlLmV4cG9ydHNbdHlwZXNbaV1dID0gbWFrZUNsYXNzKHR5cGVzW2ldKTtcbn1cbiIsIi8qIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSCBcbiAqIFxuICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IG5rbGVpbiBzb2Z0d2FyZSAobmtsZWluLmNvbSlcbiAqL1xuXG4vKiBcbiAqIEphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gQnJ1Y2UgU2NobmVpZXIncyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICpcbiAqIFRoZSBjb25zdHJ1Y3RvciBkb2Vzbid0IGRvIG11Y2ggb2YgYW55dGhpbmcuICBJdCdzIGp1c3QgaGVyZVxuICogc28gd2UgY2FuIHN0YXJ0IGRlZmluaW5nIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgYW5kIHN1Y2guXG4gKi9cbmZ1bmN0aW9uIEJsb3dmaXNoKCkge1xufTtcblxuLypcbiAqIERlY2xhcmUgdGhlIGJsb2NrIHNpemUgc28gdGhhdCBwcm90b2NvbHMga25vdyB3aGF0IHNpemVcbiAqIEluaXRpYWxpemF0aW9uIFZlY3RvciAoSVYpIHRoZXkgd2lsbCBuZWVkLlxuICovXG5CbG93ZmlzaC5wcm90b3R5cGUuQkxPQ0tTSVpFID0gODtcblxuLypcbiAqIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBTQk9YRVMuXG4gKi9cbkJsb3dmaXNoLnByb3RvdHlwZS5TQk9YRVMgPSBbXG4gICAgW1xuXHQweGQxMzEwYmE2LCAweDk4ZGZiNWFjLCAweDJmZmQ3MmRiLCAweGQwMWFkZmI3LCAweGI4ZTFhZmVkLCAweDZhMjY3ZTk2LFxuXHQweGJhN2M5MDQ1LCAweGYxMmM3Zjk5LCAweDI0YTE5OTQ3LCAweGIzOTE2Y2Y3LCAweDA4MDFmMmUyLCAweDg1OGVmYzE2LFxuXHQweDYzNjkyMGQ4LCAweDcxNTc0ZTY5LCAweGE0NThmZWEzLCAweGY0OTMzZDdlLCAweDBkOTU3NDhmLCAweDcyOGViNjU4LFxuXHQweDcxOGJjZDU4LCAweDgyMTU0YWVlLCAweDdiNTRhNDFkLCAweGMyNWE1OWI1LCAweDljMzBkNTM5LCAweDJhZjI2MDEzLFxuXHQweGM1ZDFiMDIzLCAweDI4NjA4NWYwLCAweGNhNDE3OTE4LCAweGI4ZGIzOGVmLCAweDhlNzlkY2IwLCAweDYwM2ExODBlLFxuXHQweDZjOWUwZThiLCAweGIwMWU4YTNlLCAweGQ3MTU3N2MxLCAweGJkMzE0YjI3LCAweDc4YWYyZmRhLCAweDU1NjA1YzYwLFxuXHQweGU2NTUyNWYzLCAweGFhNTVhYjk0LCAweDU3NDg5ODYyLCAweDYzZTgxNDQwLCAweDU1Y2EzOTZhLCAweDJhYWIxMGI2LFxuXHQweGI0Y2M1YzM0LCAweDExNDFlOGNlLCAweGExNTQ4NmFmLCAweDdjNzJlOTkzLCAweGIzZWUxNDExLCAweDYzNmZiYzJhLFxuXHQweDJiYTljNTVkLCAweDc0MTgzMWY2LCAweGNlNWMzZTE2LCAweDliODc5MzFlLCAweGFmZDZiYTMzLCAweDZjMjRjZjVjLFxuXHQweDdhMzI1MzgxLCAweDI4OTU4Njc3LCAweDNiOGY0ODk4LCAweDZiNGJiOWFmLCAweGM0YmZlODFiLCAweDY2MjgyMTkzLFxuXHQweDYxZDgwOWNjLCAweGZiMjFhOTkxLCAweDQ4N2NhYzYwLCAweDVkZWM4MDMyLCAweGVmODQ1ZDVkLCAweGU5ODU3NWIxLFxuXHQweGRjMjYyMzAyLCAweGViNjUxYjg4LCAweDIzODkzZTgxLCAweGQzOTZhY2M1LCAweDBmNmQ2ZmYzLCAweDgzZjQ0MjM5LFxuXHQweDJlMGI0NDgyLCAweGE0ODQyMDA0LCAweDY5YzhmMDRhLCAweDllMWY5YjVlLCAweDIxYzY2ODQyLCAweGY2ZTk2YzlhLFxuXHQweDY3MGM5YzYxLCAweGFiZDM4OGYwLCAweDZhNTFhMGQyLCAweGQ4NTQyZjY4LCAweDk2MGZhNzI4LCAweGFiNTEzM2EzLFxuXHQweDZlZWYwYjZjLCAweDEzN2EzYmU0LCAweGJhM2JmMDUwLCAweDdlZmIyYTk4LCAweGExZjE2NTFkLCAweDM5YWYwMTc2LFxuXHQweDY2Y2E1OTNlLCAweDgyNDMwZTg4LCAweDhjZWU4NjE5LCAweDQ1NmY5ZmI0LCAweDdkODRhNWMzLCAweDNiOGI1ZWJlLFxuXHQweGUwNmY3NWQ4LCAweDg1YzEyMDczLCAweDQwMWE0NDlmLCAweDU2YzE2YWE2LCAweDRlZDNhYTYyLCAweDM2M2Y3NzA2LFxuXHQweDFiZmVkZjcyLCAweDQyOWIwMjNkLCAweDM3ZDBkNzI0LCAweGQwMGExMjQ4LCAweGRiMGZlYWQzLCAweDQ5ZjFjMDliLFxuXHQweDA3NTM3MmM5LCAweDgwOTkxYjdiLCAweDI1ZDQ3OWQ4LCAweGY2ZThkZWY3LCAweGUzZmU1MDFhLCAweGI2Nzk0YzNiLFxuXHQweDk3NmNlMGJkLCAweDA0YzAwNmJhLCAweGMxYTk0ZmI2LCAweDQwOWY2MGM0LCAweDVlNWM5ZWMyLCAweDE5NmEyNDYzLFxuXHQweDY4ZmI2ZmFmLCAweDNlNmM1M2I1LCAweDEzMzliMmViLCAweDNiNTJlYzZmLCAweDZkZmM1MTFmLCAweDliMzA5NTJjLFxuXHQweGNjODE0NTQ0LCAweGFmNWViZDA5LCAweGJlZTNkMDA0LCAweGRlMzM0YWZkLCAweDY2MGYyODA3LCAweDE5MmU0YmIzLFxuXHQweGMwY2JhODU3LCAweDQ1Yzg3NDBmLCAweGQyMGI1ZjM5LCAweGI5ZDNmYmRiLCAweDU1NzljMGJkLCAweDFhNjAzMjBhLFxuXHQweGQ2YTEwMGM2LCAweDQwMmM3Mjc5LCAweDY3OWYyNWZlLCAweGZiMWZhM2NjLCAweDhlYTVlOWY4LCAweGRiMzIyMmY4LFxuXHQweDNjNzUxNmRmLCAweGZkNjE2YjE1LCAweDJmNTAxZWM4LCAweGFkMDU1MmFiLCAweDMyM2RiNWZhLCAweGZkMjM4NzYwLFxuXHQweDUzMzE3YjQ4LCAweDNlMDBkZjgyLCAweDllNWM1N2JiLCAweGNhNmY4Y2EwLCAweDFhODc1NjJlLCAweGRmMTc2OWRiLFxuXHQweGQ1NDJhOGY2LCAweDI4N2VmZmMzLCAweGFjNjczMmM2LCAweDhjNGY1NTczLCAweDY5NWIyN2IwLCAweGJiY2E1OGM4LFxuXHQweGUxZmZhMzVkLCAweGI4ZjAxMWEwLCAweDEwZmEzZDk4LCAweGZkMjE4M2I4LCAweDRhZmNiNTZjLCAweDJkZDFkMzViLFxuXHQweDlhNTNlNDc5LCAweGI2Zjg0NTY1LCAweGQyOGU0OWJjLCAweDRiZmI5NzkwLCAweGUxZGRmMmRhLCAweGE0Y2I3ZTMzLFxuXHQweDYyZmIxMzQxLCAweGNlZTRjNmU4LCAweGVmMjBjYWRhLCAweDM2Nzc0YzAxLCAweGQwN2U5ZWZlLCAweDJiZjExZmI0LFxuXHQweDk1ZGJkYTRkLCAweGFlOTA5MTk4LCAweGVhYWQ4ZTcxLCAweDZiOTNkNWEwLCAweGQwOGVkMWQwLCAweGFmYzcyNWUwLFxuXHQweDhlM2M1YjJmLCAweDhlNzU5NGI3LCAweDhmZjZlMmZiLCAweGYyMTIyYjY0LCAweDg4ODhiODEyLCAweDkwMGRmMDFjLFxuXHQweDRmYWQ1ZWEwLCAweDY4OGZjMzFjLCAweGQxY2ZmMTkxLCAweGIzYThjMWFkLCAweDJmMmYyMjE4LCAweGJlMGUxNzc3LFxuXHQweGVhNzUyZGZlLCAweDhiMDIxZmExLCAweGU1YTBjYzBmLCAweGI1NmY3NGU4LCAweDE4YWNmM2Q2LCAweGNlODllMjk5LFxuXHQweGI0YTg0ZmUwLCAweGZkMTNlMGI3LCAweDdjYzQzYjgxLCAweGQyYWRhOGQ5LCAweDE2NWZhMjY2LCAweDgwOTU3NzA1LFxuXHQweDkzY2M3MzE0LCAweDIxMWExNDc3LCAweGU2YWQyMDY1LCAweDc3YjVmYTg2LCAweGM3NTQ0MmY1LCAweGZiOWQzNWNmLFxuXHQweGViY2RhZjBjLCAweDdiM2U4OWEwLCAweGQ2NDExYmQzLCAweGFlMWU3ZTQ5LCAweDAwMjUwZTJkLCAweDIwNzFiMzVlLFxuXHQweDIyNjgwMGJiLCAweDU3YjhlMGFmLCAweDI0NjQzNjliLCAweGYwMDliOTFlLCAweDU1NjM5MTFkLCAweDU5ZGZhNmFhLFxuXHQweDc4YzE0Mzg5LCAweGQ5NWE1MzdmLCAweDIwN2Q1YmEyLCAweDAyZTViOWM1LCAweDgzMjYwMzc2LCAweDYyOTVjZmE5LFxuXHQweDExYzgxOTY4LCAweDRlNzM0YTQxLCAweGIzNDcyZGNhLCAweDdiMTRhOTRhLCAweDFiNTEwMDUyLCAweDlhNTMyOTE1LFxuXHQweGQ2MGY1NzNmLCAweGJjOWJjNmU0LCAweDJiNjBhNDc2LCAweDgxZTY3NDAwLCAweDA4YmE2ZmI1LCAweDU3MWJlOTFmLFxuXHQweGYyOTZlYzZiLCAweDJhMGRkOTE1LCAweGI2NjM2NTIxLCAweGU3YjlmOWI2LCAweGZmMzQwNTJlLCAweGM1ODU1NjY0LFxuXHQweDUzYjAyZDVkLCAweGE5OWY4ZmExLCAweDA4YmE0Nzk5LCAweDZlODUwNzZhXG4gICAgXSwgW1xuXHQweDRiN2E3MGU5LCAweGI1YjMyOTQ0LCAweGRiNzUwOTJlLCAweGM0MTkyNjIzLCAweGFkNmVhNmIwLCAweDQ5YTdkZjdkLFxuXHQweDljZWU2MGI4LCAweDhmZWRiMjY2LCAweGVjYWE4YzcxLCAweDY5OWExN2ZmLCAweDU2NjQ1MjZjLCAweGMyYjE5ZWUxLFxuXHQweDE5MzYwMmE1LCAweDc1MDk0YzI5LCAweGEwNTkxMzQwLCAweGU0MTgzYTNlLCAweDNmNTQ5ODlhLCAweDViNDI5ZDY1LFxuXHQweDZiOGZlNGQ2LCAweDk5ZjczZmQ2LCAweGExZDI5YzA3LCAweGVmZTgzMGY1LCAweDRkMmQzOGU2LCAweGYwMjU1ZGMxLFxuXHQweDRjZGQyMDg2LCAweDg0NzBlYjI2LCAweDYzODJlOWM2LCAweDAyMWVjYzVlLCAweDA5Njg2YjNmLCAweDNlYmFlZmM5LFxuXHQweDNjOTcxODE0LCAweDZiNmE3MGExLCAweDY4N2YzNTg0LCAweDUyYTBlMjg2LCAweGI3OWM1MzA1LCAweGFhNTAwNzM3LFxuXHQweDNlMDc4NDFjLCAweDdmZGVhZTVjLCAweDhlN2Q0NGVjLCAweDU3MTZmMmI4LCAweGIwM2FkYTM3LCAweGYwNTAwYzBkLFxuXHQweGYwMWMxZjA0LCAweDAyMDBiM2ZmLCAweGFlMGNmNTFhLCAweDNjYjU3NGIyLCAweDI1ODM3YTU4LCAweGRjMDkyMWJkLFxuXHQweGQxOTExM2Y5LCAweDdjYTkyZmY2LCAweDk0MzI0NzczLCAweDIyZjU0NzAxLCAweDNhZTVlNTgxLCAweDM3YzJkYWRjLFxuXHQweGM4YjU3NjM0LCAweDlhZjNkZGE3LCAweGE5NDQ2MTQ2LCAweDBmZDAwMzBlLCAweGVjYzhjNzNlLCAweGE0NzUxZTQxLFxuXHQweGUyMzhjZDk5LCAweDNiZWEwZTJmLCAweDMyODBiYmExLCAweDE4M2ViMzMxLCAweDRlNTQ4YjM4LCAweDRmNmRiOTA4LFxuXHQweDZmNDIwZDAzLCAweGY2MGEwNGJmLCAweDJjYjgxMjkwLCAweDI0OTc3Yzc5LCAweDU2NzliMDcyLCAweGJjYWY4OWFmLFxuXHQweGRlOWE3NzFmLCAweGQ5OTMwODEwLCAweGIzOGJhZTEyLCAweGRjY2YzZjJlLCAweDU1MTI3MjFmLCAweDJlNmI3MTI0LFxuXHQweDUwMWFkZGU2LCAweDlmODRjZDg3LCAweDdhNTg0NzE4LCAweDc0MDhkYTE3LCAweGJjOWY5YWJjLCAweGU5NGI3ZDhjLFxuXHQweGVjN2FlYzNhLCAweGRiODUxZGZhLCAweDYzMDk0MzY2LCAweGM0NjRjM2QyLCAweGVmMWMxODQ3LCAweDMyMTVkOTA4LFxuXHQweGRkNDMzYjM3LCAweDI0YzJiYTE2LCAweDEyYTE0ZDQzLCAweDJhNjVjNDUxLCAweDUwOTQwMDAyLCAweDEzM2FlNGRkLFxuXHQweDcxZGZmODllLCAweDEwMzE0ZTU1LCAweDgxYWM3N2Q2LCAweDVmMTExOTliLCAweDA0MzU1NmYxLCAweGQ3YTNjNzZiLFxuXHQweDNjMTExODNiLCAweDU5MjRhNTA5LCAweGYyOGZlNmVkLCAweDk3ZjFmYmZhLCAweDllYmFiZjJjLCAweDFlMTUzYzZlLFxuXHQweDg2ZTM0NTcwLCAweGVhZTk2ZmIxLCAweDg2MGU1ZTBhLCAweDVhM2UyYWIzLCAweDc3MWZlNzFjLCAweDRlM2QwNmZhLFxuXHQweDI5NjVkY2I5LCAweDk5ZTcxZDBmLCAweDgwM2U4OWQ2LCAweDUyNjZjODI1LCAweDJlNGNjOTc4LCAweDljMTBiMzZhLFxuXHQweGM2MTUwZWJhLCAweDk0ZTJlYTc4LCAweGE1ZmMzYzUzLCAweDFlMGEyZGY0LCAweGYyZjc0ZWE3LCAweDM2MWQyYjNkLFxuXHQweDE5MzkyNjBmLCAweDE5YzI3OTYwLCAweDUyMjNhNzA4LCAweGY3MTMxMmI2LCAweGViYWRmZTZlLCAweGVhYzMxZjY2LFxuXHQweGUzYmM0NTk1LCAweGE2N2JjODgzLCAweGIxN2YzN2QxLCAweDAxOGNmZjI4LCAweGMzMzJkZGVmLCAweGJlNmM1YWE1LFxuXHQweDY1NTgyMTg1LCAweDY4YWI5ODAyLCAweGVlY2VhNTBmLCAweGRiMmY5NTNiLCAweDJhZWY3ZGFkLCAweDViNmUyZjg0LFxuXHQweDE1MjFiNjI4LCAweDI5MDc2MTcwLCAweGVjZGQ0Nzc1LCAweDYxOWYxNTEwLCAweDEzY2NhODMwLCAweGViNjFiZDk2LFxuXHQweDAzMzRmZTFlLCAweGFhMDM2M2NmLCAweGI1NzM1YzkwLCAweDRjNzBhMjM5LCAweGQ1OWU5ZTBiLCAweGNiYWFkZTE0LFxuXHQweGVlY2M4NmJjLCAweDYwNjIyY2E3LCAweDljYWI1Y2FiLCAweGIyZjM4NDZlLCAweDY0OGIxZWFmLCAweDE5YmRmMGNhLFxuXHQweGEwMjM2OWI5LCAweDY1NWFiYjUwLCAweDQwNjg1YTMyLCAweDNjMmFiNGIzLCAweDMxOWVlOWQ1LCAweGMwMjFiOGY3LFxuXHQweDliNTQwYjE5LCAweDg3NWZhMDk5LCAweDk1Zjc5OTdlLCAweDYyM2Q3ZGE4LCAweGY4Mzc4ODlhLCAweDk3ZTMyZDc3LFxuXHQweDExZWQ5MzVmLCAweDE2NjgxMjgxLCAweDBlMzU4ODI5LCAweGM3ZTYxZmQ2LCAweDk2ZGVkZmExLCAweDc4NThiYTk5LFxuXHQweDU3ZjU4NGE1LCAweDFiMjI3MjYzLCAweDliODNjM2ZmLCAweDFhYzI0Njk2LCAweGNkYjMwYWViLCAweDUzMmUzMDU0LFxuXHQweDhmZDk0OGU0LCAweDZkYmMzMTI4LCAweDU4ZWJmMmVmLCAweDM0YzZmZmVhLCAweGZlMjhlZDYxLCAweGVlN2MzYzczLFxuXHQweDVkNGExNGQ5LCAweGU4NjRiN2UzLCAweDQyMTA1ZDE0LCAweDIwM2UxM2UwLCAweDQ1ZWVlMmI2LCAweGEzYWFhYmVhLFxuXHQweGRiNmM0ZjE1LCAweGZhY2I0ZmQwLCAweGM3NDJmNDQyLCAweGVmNmFiYmI1LCAweDY1NGYzYjFkLCAweDQxY2QyMTA1LFxuXHQweGQ4MWU3OTllLCAweDg2ODU0ZGM3LCAweGU0NGI0NzZhLCAweDNkODE2MjUwLCAweGNmNjJhMWYyLCAweDViOGQyNjQ2LFxuXHQweGZjODg4M2EwLCAweGMxYzdiNmEzLCAweDdmMTUyNGMzLCAweDY5Y2I3NDkyLCAweDQ3ODQ4YTBiLCAweDU2OTJiMjg1LFxuXHQweDA5NWJiZjAwLCAweGFkMTk0ODlkLCAweDE0NjJiMTc0LCAweDIzODIwZTAwLCAweDU4NDI4ZDJhLCAweDBjNTVmNWVhLFxuXHQweDFkYWRmNDNlLCAweDIzM2Y3MDYxLCAweDMzNzJmMDkyLCAweDhkOTM3ZTQxLCAweGQ2NWZlY2YxLCAweDZjMjIzYmRiLFxuXHQweDdjZGUzNzU5LCAweGNiZWU3NDYwLCAweDQwODVmMmE3LCAweGNlNzczMjZlLCAweGE2MDc4MDg0LCAweDE5Zjg1MDllLFxuXHQweGU4ZWZkODU1LCAweDYxZDk5NzM1LCAweGE5NjlhN2FhLCAweGM1MGMwNmMyLCAweDVhMDRhYmZjLCAweDgwMGJjYWRjLFxuXHQweDllNDQ3YTJlLCAweGMzNDUzNDg0LCAweGZkZDU2NzA1LCAweDBlMWU5ZWM5LCAweGRiNzNkYmQzLCAweDEwNTU4OGNkLFxuXHQweDY3NWZkYTc5LCAweGUzNjc0MzQwLCAweGM1YzQzNDY1LCAweDcxM2UzOGQ4LCAweDNkMjhmODllLCAweGYxNmRmZjIwLFxuXHQweDE1M2UyMWU3LCAweDhmYjAzZDRhLCAweGU2ZTM5ZjJiLCAweGRiODNhZGY3XG4gICAgXSwgW1xuXHQweGU5M2Q1YTY4LCAweDk0ODE0MGY3LCAweGY2NGMyNjFjLCAweDk0NjkyOTM0LCAweDQxMTUyMGY3LCAweDc2MDJkNGY3LFxuXHQweGJjZjQ2YjJlLCAweGQ0YTIwMDY4LCAweGQ0MDgyNDcxLCAweDMzMjBmNDZhLCAweDQzYjdkNGI3LCAweDUwMDA2MWFmLFxuXHQweDFlMzlmNjJlLCAweDk3MjQ0NTQ2LCAweDE0MjE0Zjc0LCAweGJmOGI4ODQwLCAweDRkOTVmYzFkLCAweDk2YjU5MWFmLFxuXHQweDcwZjRkZGQzLCAweDY2YTAyZjQ1LCAweGJmYmMwOWVjLCAweDAzYmQ5Nzg1LCAweDdmYWM2ZGQwLCAweDMxY2I4NTA0LFxuXHQweDk2ZWIyN2IzLCAweDU1ZmQzOTQxLCAweGRhMjU0N2U2LCAweGFiY2EwYTlhLCAweDI4NTA3ODI1LCAweDUzMDQyOWY0LFxuXHQweDBhMmM4NmRhLCAweGU5YjY2ZGZiLCAweDY4ZGMxNDYyLCAweGQ3NDg2OTAwLCAweDY4MGVjMGE0LCAweDI3YTE4ZGVlLFxuXHQweDRmM2ZmZWEyLCAweGU4ODdhZDhjLCAweGI1OGNlMDA2LCAweDdhZjRkNmI2LCAweGFhY2UxZTdjLCAweGQzMzc1ZmVjLFxuXHQweGNlNzhhMzk5LCAweDQwNmIyYTQyLCAweDIwZmU5ZTM1LCAweGQ5ZjM4NWI5LCAweGVlMzlkN2FiLCAweDNiMTI0ZThiLFxuXHQweDFkYzlmYWY3LCAweDRiNmQxODU2LCAweDI2YTM2NjMxLCAweGVhZTM5N2IyLCAweDNhNmVmYTc0LCAweGRkNWI0MzMyLFxuXHQweDY4NDFlN2Y3LCAweGNhNzgyMGZiLCAweGZiMGFmNTRlLCAweGQ4ZmViMzk3LCAweDQ1NDA1NmFjLCAweGJhNDg5NTI3LFxuXHQweDU1NTMzYTNhLCAweDIwODM4ZDg3LCAweGZlNmJhOWI3LCAweGQwOTY5NTRiLCAweDU1YTg2N2JjLCAweGExMTU5YTU4LFxuXHQweGNjYTkyOTYzLCAweDk5ZTFkYjMzLCAweGE2MmE0YTU2LCAweDNmMzEyNWY5LCAweDVlZjQ3ZTFjLCAweDkwMjkzMTdjLFxuXHQweGZkZjhlODAyLCAweDA0MjcyZjcwLCAweDgwYmIxNTVjLCAweDA1MjgyY2UzLCAweDk1YzExNTQ4LCAweGU0YzY2ZDIyLFxuXHQweDQ4YzExMzNmLCAweGM3MGY4NmRjLCAweDA3ZjljOWVlLCAweDQxMDQxZjBmLCAweDQwNDc3OWE0LCAweDVkODg2ZTE3LFxuXHQweDMyNWY1MWViLCAweGQ1OWJjMGQxLCAweGYyYmNjMThmLCAweDQxMTEzNTY0LCAweDI1N2I3ODM0LCAweDYwMmE5YzYwLFxuXHQweGRmZjhlOGEzLCAweDFmNjM2YzFiLCAweDBlMTJiNGMyLCAweDAyZTEzMjllLCAweGFmNjY0ZmQxLCAweGNhZDE4MTE1LFxuXHQweDZiMjM5NWUwLCAweDMzM2U5MmUxLCAweDNiMjQwYjYyLCAweGVlYmViOTIyLCAweDg1YjJhMjBlLCAweGU2YmEwZDk5LFxuXHQweGRlNzIwYzhjLCAweDJkYTJmNzI4LCAweGQwMTI3ODQ1LCAweDk1Yjc5NGZkLCAweDY0N2QwODYyLCAweGU3Y2NmNWYwLFxuXHQweDU0NDlhMzZmLCAweDg3N2Q0OGZhLCAweGMzOWRmZDI3LCAweGYzM2U4ZDFlLCAweDBhNDc2MzQxLCAweDk5MmVmZjc0LFxuXHQweDNhNmY2ZWFiLCAweGY0ZjhmZDM3LCAweGE4MTJkYzYwLCAweGExZWJkZGY4LCAweDk5MWJlMTRjLCAweGRiNmU2YjBkLFxuXHQweGM2N2I1NTEwLCAweDZkNjcyYzM3LCAweDI3NjVkNDNiLCAweGRjZDBlODA0LCAweGYxMjkwZGM3LCAweGNjMDBmZmEzLFxuXHQweGI1MzkwZjkyLCAweDY5MGZlZDBiLCAweDY2N2I5ZmZiLCAweGNlZGI3ZDljLCAweGEwOTFjZjBiLCAweGQ5MTU1ZWEzLFxuXHQweGJiMTMyZjg4LCAweDUxNWJhZDI0LCAweDdiOTQ3OWJmLCAweDc2M2JkNmViLCAweDM3MzkyZWIzLCAweGNjMTE1OTc5LFxuXHQweDgwMjZlMjk3LCAweGY0MmUzMTJkLCAweDY4NDJhZGE3LCAweGM2NmEyYjNiLCAweDEyNzU0Y2NjLCAweDc4MmVmMTFjLFxuXHQweDZhMTI0MjM3LCAweGI3OTI1MWU3LCAweDA2YTFiYmU2LCAweDRiZmI2MzUwLCAweDFhNmIxMDE4LCAweDExY2FlZGZhLFxuXHQweDNkMjViZGQ4LCAweGUyZTFjM2M5LCAweDQ0NDIxNjU5LCAweDBhMTIxMzg2LCAweGQ5MGNlYzZlLCAweGQ1YWJlYTJhLFxuXHQweDY0YWY2NzRlLCAweGRhODZhODVmLCAweGJlYmZlOTg4LCAweDY0ZTRjM2ZlLCAweDlkYmM4MDU3LCAweGYwZjdjMDg2LFxuXHQweDYwNzg3YmY4LCAweDYwMDM2MDRkLCAweGQxZmQ4MzQ2LCAweGY2MzgxZmIwLCAweDc3NDVhZTA0LCAweGQ3MzZmY2NjLFxuXHQweDgzNDI2YjMzLCAweGYwMWVhYjcxLCAweGIwODA0MTg3LCAweDNjMDA1ZTVmLCAweDc3YTA1N2JlLCAweGJkZThhZTI0LFxuXHQweDU1NDY0Mjk5LCAweGJmNTgyZTYxLCAweDRlNThmNDhmLCAweGYyZGRmZGEyLCAweGY0NzRlZjM4LCAweDg3ODliZGMyLFxuXHQweDUzNjZmOWMzLCAweGM4YjM4ZTc0LCAweGI0NzVmMjU1LCAweDQ2ZmNkOWI5LCAweDdhZWIyNjYxLCAweDhiMWRkZjg0LFxuXHQweDg0NmEwZTc5LCAweDkxNWY5NWUyLCAweDQ2NmU1OThlLCAweDIwYjQ1NzcwLCAweDhjZDU1NTkxLCAweGM5MDJkZTRjLFxuXHQweGI5MGJhY2UxLCAweGJiODIwNWQwLCAweDExYTg2MjQ4LCAweDc1NzRhOTllLCAweGI3N2YxOWI2LCAweGUwYTlkYzA5LFxuXHQweDY2MmQwOWExLCAweGM0MzI0NjMzLCAweGU4NWExZjAyLCAweDA5ZjBiZThjLCAweDRhOTlhMDI1LCAweDFkNmVmZTEwLFxuXHQweDFhYjkzZDFkLCAweDBiYTVhNGRmLCAweGExODZmMjBmLCAweDI4NjhmMTY5LCAweGRjYjdkYTgzLCAweDU3MzkwNmZlLFxuXHQweGExZTJjZTliLCAweDRmY2Q3ZjUyLCAweDUwMTE1ZTAxLCAweGE3MDY4M2ZhLCAweGEwMDJiNWM0LCAweDBkZTZkMDI3LFxuXHQweDlhZjg4YzI3LCAweDc3M2Y4NjQxLCAweGMzNjA0YzA2LCAweDYxYTgwNmI1LCAweGYwMTc3YTI4LCAweGMwZjU4NmUwLFxuXHQweDAwNjA1OGFhLCAweDMwZGM3ZDYyLCAweDExZTY5ZWQ3LCAweDIzMzhlYTYzLCAweDUzYzJkZDk0LCAweGMyYzIxNjM0LFxuXHQweGJiY2JlZTU2LCAweDkwYmNiNmRlLCAweGViZmM3ZGExLCAweGNlNTkxZDc2LCAweDZmMDVlNDA5LCAweDRiN2MwMTg4LFxuXHQweDM5NzIwYTNkLCAweDdjOTI3YzI0LCAweDg2ZTM3MjVmLCAweDcyNGQ5ZGI5LCAweDFhYzE1YmI0LCAweGQzOWViOGZjLFxuXHQweGVkNTQ1NTc4LCAweDA4ZmNhNWI1LCAweGQ4M2Q3Y2QzLCAweDRkYWQwZmM0LCAweDFlNTBlZjVlLCAweGIxNjFlNmY4LFxuXHQweGEyODUxNGQ5LCAweDZjNTExMzNjLCAweDZmZDVjN2U3LCAweDU2ZTE0ZWM0LCAweDM2MmFiZmNlLCAweGRkYzZjODM3LFxuXHQweGQ3OWEzMjM0LCAweDkyNjM4MjEyLCAweDY3MGVmYThlLCAweDQwNjAwMGUwXG4gICAgXSwgW1xuXHQweDNhMzljZTM3LCAweGQzZmFmNWNmLCAweGFiYzI3NzM3LCAweDVhYzUyZDFiLCAweDVjYjA2NzllLCAweDRmYTMzNzQyLFxuXHQweGQzODIyNzQwLCAweDk5YmM5YmJlLCAweGQ1MTE4ZTlkLCAweGJmMGY3MzE1LCAweGQ2MmQxYzdlLCAweGM3MDBjNDdiLFxuXHQweGI3OGMxYjZiLCAweDIxYTE5MDQ1LCAweGIyNmViMWJlLCAweDZhMzY2ZWI0LCAweDU3NDhhYjJmLCAweGJjOTQ2ZTc5LFxuXHQweGM2YTM3NmQyLCAweDY1NDljMmM4LCAweDUzMGZmOGVlLCAweDQ2OGRkZTdkLCAweGQ1NzMwYTFkLCAweDRjZDA0ZGM2LFxuXHQweDI5MzliYmRiLCAweGE5YmE0NjUwLCAweGFjOTUyNmU4LCAweGJlNWVlMzA0LCAweGExZmFkNWYwLCAweDZhMmQ1MTlhLFxuXHQweDYzZWY4Y2UyLCAweDlhODZlZTIyLCAweGMwODljMmI4LCAweDQzMjQyZWY2LCAweGE1MWUwM2FhLCAweDljZjJkMGE0LFxuXHQweDgzYzA2MWJhLCAweDliZTk2YTRkLCAweDhmZTUxNTUwLCAweGJhNjQ1YmQ2LCAweDI4MjZhMmY5LCAweGE3M2EzYWUxLFxuXHQweDRiYTk5NTg2LCAweGVmNTU2MmU5LCAweGM3MmZlZmQzLCAweGY3NTJmN2RhLCAweDNmMDQ2ZjY5LCAweDc3ZmEwYTU5LFxuXHQweDgwZTRhOTE1LCAweDg3YjA4NjAxLCAweDliMDllNmFkLCAweDNiM2VlNTkzLCAweGU5OTBmZDVhLCAweDllMzRkNzk3LFxuXHQweDJjZjBiN2Q5LCAweDAyMmI4YjUxLCAweDk2ZDVhYzNhLCAweDAxN2RhNjdkLCAweGQxY2YzZWQ2LCAweDdjN2QyZDI4LFxuXHQweDFmOWYyNWNmLCAweGFkZjJiODliLCAweDVhZDZiNDcyLCAweDVhODhmNTRjLCAweGUwMjlhYzcxLCAweGUwMTlhNWU2LFxuXHQweDQ3YjBhY2ZkLCAweGVkOTNmYTliLCAweGU4ZDNjNDhkLCAweDI4M2I1N2NjLCAweGY4ZDU2NjI5LCAweDc5MTMyZTI4LFxuXHQweDc4NWYwMTkxLCAweGVkNzU2MDU1LCAweGY3OTYwZTQ0LCAweGUzZDM1ZThjLCAweDE1MDU2ZGQ0LCAweDg4ZjQ2ZGJhLFxuXHQweDAzYTE2MTI1LCAweDA1NjRmMGJkLCAweGMzZWI5ZTE1LCAweDNjOTA1N2EyLCAweDk3MjcxYWVjLCAweGE5M2EwNzJhLFxuXHQweDFiM2Y2ZDliLCAweDFlNjMyMWY1LCAweGY1OWM2NmZiLCAweDI2ZGNmMzE5LCAweDc1MzNkOTI4LCAweGIxNTVmZGY1LFxuXHQweDAzNTYzNDgyLCAweDhhYmEzY2JiLCAweDI4NTE3NzExLCAweGMyMGFkOWY4LCAweGFiY2M1MTY3LCAweGNjYWQ5MjVmLFxuXHQweDRkZTgxNzUxLCAweDM4MzBkYzhlLCAweDM3OWQ1ODYyLCAweDkzMjBmOTkxLCAweGVhN2E5MGMyLCAweGZiM2U3YmNlLFxuXHQweDUxMjFjZTY0LCAweDc3NGZiZTMyLCAweGE4YjZlMzdlLCAweGMzMjkzZDQ2LCAweDQ4ZGU1MzY5LCAweDY0MTNlNjgwLFxuXHQweGEyYWUwODEwLCAweGRkNmRiMjI0LCAweDY5ODUyZGZkLCAweDA5MDcyMTY2LCAweGIzOWE0NjBhLCAweDY0NDVjMGRkLFxuXHQweDU4NmNkZWNmLCAweDFjMjBjOGFlLCAweDViYmVmN2RkLCAweDFiNTg4ZDQwLCAweGNjZDIwMTdmLCAweDZiYjRlM2JiLFxuXHQweGRkYTI2YTdlLCAweDNhNTlmZjQ1LCAweDNlMzUwYTQ0LCAweGJjYjRjZGQ1LCAweDcyZWFjZWE4LCAweGZhNjQ4NGJiLFxuXHQweDhkNjYxMmFlLCAweGJmM2M2ZjQ3LCAweGQyOWJlNDYzLCAweDU0MmY1ZDllLCAweGFlYzI3NzFiLCAweGY2NGU2MzcwLFxuXHQweDc0MGUwZDhkLCAweGU3NWIxMzU3LCAweGY4NzIxNjcxLCAweGFmNTM3ZDVkLCAweDQwNDBjYjA4LCAweDRlYjRlMmNjLFxuXHQweDM0ZDI0NjZhLCAweDAxMTVhZjg0LCAweGUxYjAwNDI4LCAweDk1OTgzYTFkLCAweDA2Yjg5ZmI0LCAweGNlNmVhMDQ4LFxuXHQweDZmM2YzYjgyLCAweDM1MjBhYjgyLCAweDAxMWExZDRiLCAweDI3NzIyN2Y4LCAweDYxMTU2MGIxLCAweGU3OTMzZmRjLFxuXHQweGJiM2E3OTJiLCAweDM0NDUyNWJkLCAweGEwODgzOWUxLCAweDUxY2U3OTRiLCAweDJmMzJjOWI3LCAweGEwMWZiYWM5LFxuXHQweGUwMWNjODdlLCAweGJjYzdkMWY2LCAweGNmMDExMWMzLCAweGExZThhYWM3LCAweDFhOTA4NzQ5LCAweGQ0NGZiZDlhLFxuXHQweGQwZGFkZWNiLCAweGQ1MGFkYTM4LCAweDAzMzljMzJhLCAweGM2OTEzNjY3LCAweDhkZjkzMTdjLCAweGUwYjEyYjRmLFxuXHQweGY3OWU1OWI3LCAweDQzZjViYjNhLCAweGYyZDUxOWZmLCAweDI3ZDk0NTljLCAweGJmOTcyMjJjLCAweDE1ZTZmYzJhLFxuXHQweDBmOTFmYzcxLCAweDliOTQxNTI1LCAweGZhZTU5MzYxLCAweGNlYjY5Y2ViLCAweGMyYTg2NDU5LCAweDEyYmFhOGQxLFxuXHQweGI2YzEwNzVlLCAweGUzMDU2YTBjLCAweDEwZDI1MDY1LCAweGNiMDNhNDQyLCAweGUwZWM2ZTBlLCAweDE2OThkYjNiLFxuXHQweDRjOThhMGJlLCAweDMyNzhlOTY0LCAweDlmMWY5NTMyLCAweGUwZDM5MmRmLCAweGQzYTAzNDJiLCAweDg5NzFmMjFlLFxuXHQweDFiMGE3NDQxLCAweDRiYTMzNDhjLCAweGM1YmU3MTIwLCAweGMzNzYzMmQ4LCAweGRmMzU5ZjhkLCAweDliOTkyZjJlLFxuXHQweGU2MGI2ZjQ3LCAweDBmZTNmMTFkLCAweGU1NGNkYTU0LCAweDFlZGFkODkxLCAweGNlNjI3OWNmLCAweGNkM2U3ZTZmLFxuXHQweDE2MThiMTY2LCAweGZkMmMxZDA1LCAweDg0OGZkMmM1LCAweGY2ZmIyMjk5LCAweGY1MjNmMzU3LCAweGE2MzI3NjIzLFxuXHQweDkzYTgzNTMxLCAweDU2Y2NjZDAyLCAweGFjZjA4MTYyLCAweDVhNzVlYmI1LCAweDZlMTYzNjk3LCAweDg4ZDI3M2NjLFxuXHQweGRlOTY2MjkyLCAweDgxYjk0OWQwLCAweDRjNTA5MDFiLCAweDcxYzY1NjE0LCAweGU2YzZjN2JkLCAweDMyN2ExNDBhLFxuXHQweDQ1ZTFkMDA2LCAweGMzZjI3YjlhLCAweGM5YWE1M2ZkLCAweDYyYTgwZjAwLCAweGJiMjViZmUyLCAweDM1YmRkMmY2LFxuXHQweDcxMTI2OTA1LCAweGIyMDQwMjIyLCAweGI2Y2JjZjdjLCAweGNkNzY5YzJiLCAweDUzMTEzZWMwLCAweDE2NDBlM2QzLFxuXHQweDM4YWJiZDYwLCAweDI1NDdhZGYwLCAweGJhMzgyMDljLCAweGY3NDZjZTc2LCAweDc3YWZhMWM1LCAweDIwNzU2MDYwLFxuXHQweDg1Y2JmZTRlLCAweDhhZTg4ZGQ4LCAweDdhYWFmOWIwLCAweDRjZjlhYTdlLCAweDE5NDhjMjVjLCAweDAyZmI4YThjLFxuXHQweDAxYzM2YWU0LCAweGQ2ZWJlMWY5LCAweDkwZDRmODY5LCAweGE2NWNkZWEwLCAweDNmMDkyNTJkLCAweGMyMDhlNjlmLFxuXHQweGI3NGU2MTMyLCAweGNlNzdlMjViLCAweDU3OGZkZmUzLCAweDNhYzM3MmU2XG4gICAgXVxuXTtcblxuLy8qXG4vLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBQQVJSQVlcbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLlBBUlJBWSA9IFtcbiAgICAweDI0M2Y2YTg4LCAweDg1YTMwOGQzLCAweDEzMTk4YTJlLCAweDAzNzA3MzQ0LCAweGE0MDkzODIyLCAweDI5OWYzMWQwLFxuICAgIDB4MDgyZWZhOTgsIDB4ZWM0ZTZjODksIDB4NDUyODIxZTYsIDB4MzhkMDEzNzcsIDB4YmU1NDY2Y2YsIDB4MzRlOTBjNmMsXG4gICAgMHhjMGFjMjliNywgMHhjOTdjNTBkZCwgMHgzZjg0ZDViNSwgMHhiNTQ3MDkxNywgMHg5MjE2ZDVkOSwgMHg4OTc5ZmIxYlxuXTtcblxuLy8qXG4vLyogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHJvdW5kcyB0aGUgY2lwaGVyIHdpbGwgZ29cbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLk5OID0gMTY7XG5cbi8vKlxuLy8qIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIGdldCByaWQgb2YgcHJvYmxlbXNcbi8vKiB3aXRoIHRoZSBoaWdoLWJpdCBnZXR0aW5nIHNldC4gIElmIHdlIGRvbid0IGRvXG4vLyogdGhpcywgdGhlbiBzb21ldGltZXMgKCBhYSAmIDB4MDBGRkZGRkZGRiApIGlzIG5vdFxuLy8qIGVxdWFsIHRvICggYmIgJiAweDAwRkZGRkZGRkYgKSBldmVuIHdoZW4gdGhleVxuLy8qIGFncmVlIGJpdC1mb3ItYml0IGZvciB0aGUgZmlyc3QgMzIgYml0cy5cbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLl9jbGVhbiA9IGZ1bmN0aW9uKCB4eCApIHtcbiAgICBpZiAoIHh4IDwgMCApIHtcblx0dmFyIHl5ID0geHggJiAweDdGRkZGRkZGO1xuXHR4eCA9IHl5ICsgMHg4MDAwMDAwMDtcbiAgICB9XG4gICAgcmV0dXJuIHh4O1xufTtcblxuLy8qXG4vLyogVGhpcyBpcyB0aGUgbWl4aW5nIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGUgc2JveGVzXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5fRiA9IGZ1bmN0aW9uICggeHggKSB7XG4gICAgdmFyIGFhO1xuICAgIHZhciBiYjtcbiAgICB2YXIgY2M7XG4gICAgdmFyIGRkO1xuICAgIHZhciB5eTtcblxuICAgIGRkID0geHggJiAweDAwRkY7XG4gICAgeHggPj4+PSA4O1xuICAgIGNjID0geHggJiAweDAwRkY7XG4gICAgeHggPj4+PSA4O1xuICAgIGJiID0geHggJiAweDAwRkY7XG4gICAgeHggPj4+PSA4O1xuICAgIGFhID0geHggJiAweDAwRkY7XG5cbiAgICB5eSA9IHRoaXMuc2JveGVzWyAwIF1bIGFhIF0gKyB0aGlzLnNib3hlc1sgMSBdWyBiYiBdO1xuICAgIHl5ID0geXkgXiB0aGlzLnNib3hlc1sgMiBdWyBjYyBdO1xuICAgIHl5ID0geXkgKyB0aGlzLnNib3hlc1sgMyBdWyBkZCBdO1xuXG4gICAgcmV0dXJuIHl5O1xufTtcblxuLy8qXG4vLyogVGhpcyBtZXRob2QgdGFrZXMgYW4gYXJyYXkgd2l0aCB0d28gdmFsdWVzLCBsZWZ0IGFuZCByaWdodFxuLy8qIGFuZCBkb2VzIE5OIHJvdW5kcyBvZiBCbG93ZmlzaCBvbiB0aGVtLlxuLy8qXG5CbG93ZmlzaC5wcm90b3R5cGUuX2VuY3J5cHRfYmxvY2sgPSBmdW5jdGlvbiAoIHZhbHMgKSB7XG4gICAgdmFyIGRhdGFMID0gdmFsc1sgMCBdO1xuICAgIHZhciBkYXRhUiA9IHZhbHNbIDEgXTtcblxuICAgIHZhciBpaTtcblxuICAgIGZvciAoIGlpPTA7IGlpIDwgdGhpcy5OTjsgKytpaSApIHtcblx0ZGF0YUwgPSBkYXRhTCBeIHRoaXMucGFycmF5WyBpaSBdO1xuXHRkYXRhUiA9IHRoaXMuX0YoIGRhdGFMICkgXiBkYXRhUjtcblxuXHR2YXIgdG1wID0gZGF0YUw7XG5cdGRhdGFMID0gZGF0YVI7XG5cdGRhdGFSID0gdG1wO1xuICAgIH1cblxuICAgIGRhdGFMID0gZGF0YUwgXiB0aGlzLnBhcnJheVsgdGhpcy5OTiArIDAgXTtcbiAgICBkYXRhUiA9IGRhdGFSIF4gdGhpcy5wYXJyYXlbIHRoaXMuTk4gKyAxIF07XG5cbiAgICB2YWxzWyAwIF0gPSB0aGlzLl9jbGVhbiggZGF0YVIgKTtcbiAgICB2YWxzWyAxIF0gPSB0aGlzLl9jbGVhbiggZGF0YUwgKTtcbn07XG5cbi8vKlxuLy8qIFRoaXMgbWV0aG9kIHRha2VzIGEgdmVjdG9yIG9mIG51bWJlcnMgYW5kIHR1cm5zIHRoZW1cbi8vKiBpbnRvIGxvbmcgd29yZHMgc28gdGhhdCB0aGV5IGNhbiBiZSBwcm9jZXNzZWQgYnkgdGhlXG4vLyogcmVhbCBhbGdvcml0aG0uXG4vLypcbi8vKiBNYXliZSBJIHNob3VsZCBtYWtlIHRoZSByZWFsIGFsZ29yaXRobSBhYm92ZSB0YWtlIGEgdmVjdG9yXG4vLyogaW5zdGVhZC4gIFRoYXQgd2lsbCBpbnZvbHZlIG1vcmUgbG9vcGluZywgYnV0IGl0IHdvbid0IHJlcXVpcmVcbi8vKiB0aGUgRigpIG1ldGhvZCB0byBkZWNvbnN0cnVjdCB0aGUgdmVjdG9yLlxuLy8qXG5CbG93ZmlzaC5wcm90b3R5cGUuZW5jcnlwdF9ibG9jayA9IGZ1bmN0aW9uICggdmVjdG9yICkge1xuICAgIHZhciBpaTtcbiAgICB2YXIgdmFscyA9IFsgMCwgMCBdO1xuICAgIHZhciBvZmYgID0gdGhpcy5CTE9DS1NJWkUvMjtcbiAgICBmb3IgKCBpaSA9IDA7IGlpIDwgdGhpcy5CTE9DS1NJWkUvMjsgKytpaSApIHtcblx0dmFsc1swXSA9ICggdmFsc1swXSA8PCA4ICkgfCAoIHZlY3RvclsgaWkgKyAwICAgXSAmIDB4MDBGRiApO1xuXHR2YWxzWzFdID0gKCB2YWxzWzFdIDw8IDggKSB8ICggdmVjdG9yWyBpaSArIG9mZiBdICYgMHgwMEZGICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW5jcnlwdF9ibG9jayggdmFscyApO1xuXG4gICAgdmFyIHJldCA9IFsgXTtcbiAgICBmb3IgKCBpaSA9IDA7IGlpIDwgdGhpcy5CTE9DS1NJWkUvMjsgKytpaSApIHtcblx0cmV0WyBpaSArIDAgICBdID0gKCB2YWxzWyAwIF0gPj4+ICgyNCAtIDgqKGlpKSkgJiAweDAwRkYgKTtcblx0cmV0WyBpaSArIG9mZiBdID0gKCB2YWxzWyAxIF0gPj4+ICgyNCAtIDgqKGlpKSkgJiAweDAwRkYgKTtcblx0Ly8gdmFsc1sgMCBdID0gKCB2YWxzWyAwIF0gPj4+IDggKTtcblx0Ly8gdmFsc1sgMSBdID0gKCB2YWxzWyAxIF0gPj4+IDggKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufTtcblxuLy8qXG4vLyogVGhpcyBtZXRob2QgdGFrZXMgYW4gYXJyYXkgd2l0aCB0d28gdmFsdWVzLCBsZWZ0IGFuZCByaWdodFxuLy8qIGFuZCB1bmRvZXMgTk4gcm91bmRzIG9mIEJsb3dmaXNoIG9uIHRoZW0uXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5fZGVjcnlwdF9ibG9jayA9IGZ1bmN0aW9uICggdmFscyApIHtcbiAgICB2YXIgZGF0YUwgPSB2YWxzWyAwIF07XG4gICAgdmFyIGRhdGFSID0gdmFsc1sgMSBdO1xuXG4gICAgdmFyIGlpO1xuXG4gICAgZm9yICggaWk9dGhpcy5OTisxOyBpaSA+IDE7IC0taWkgKSB7XG5cdGRhdGFMID0gZGF0YUwgXiB0aGlzLnBhcnJheVsgaWkgXTtcblx0ZGF0YVIgPSB0aGlzLl9GKCBkYXRhTCApIF4gZGF0YVI7XG5cblx0dmFyIHRtcCA9IGRhdGFMO1xuXHRkYXRhTCA9IGRhdGFSO1xuXHRkYXRhUiA9IHRtcDtcbiAgICB9XG5cbiAgICBkYXRhTCA9IGRhdGFMIF4gdGhpcy5wYXJyYXlbIDEgXTtcbiAgICBkYXRhUiA9IGRhdGFSIF4gdGhpcy5wYXJyYXlbIDAgXTtcblxuICAgIHZhbHNbIDAgXSA9IHRoaXMuX2NsZWFuKCBkYXRhUiApO1xuICAgIHZhbHNbIDEgXSA9IHRoaXMuX2NsZWFuKCBkYXRhTCApO1xufTtcblxuLy8qXG4vLyogVGhpcyBtZXRob2QgdGFrZXMgYSBrZXkgYXJyYXkgYW5kIGluaXRpYWxpemVzIHRoZVxuLy8qIHNib3hlcyBhbmQgcGFycmF5IGZvciB0aGlzIGVuY3J5cHRpb24uXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCBrZXkgKSB7XG4gICAgdmFyIGlpO1xuICAgIHZhciBqaiA9IDA7XG5cbiAgICB0aGlzLnBhcnJheSA9IFtdO1xuICAgIGZvciAoIGlpPTA7IGlpIDwgdGhpcy5OTiArIDI7ICsraWkgKSB7XG5cdHZhciBkYXRhID0gMHgwMDAwMDAwMDtcblx0dmFyIGtrO1xuXHRmb3IgKCBraz0wOyBrayA8IDQ7ICsra2sgKSB7XG5cdCAgICBkYXRhID0gKCBkYXRhIDw8IDggKSB8ICgga2V5WyBqaiBdICYgMHgwMEZGICk7XG5cdCAgICBpZiAoICsramogPj0ga2V5Lmxlbmd0aCApIHtcblx0XHRqaiA9IDA7XG5cdCAgICB9XG5cdH1cblx0dGhpcy5wYXJyYXlbIGlpIF0gPSB0aGlzLlBBUlJBWVsgaWkgXSBeIGRhdGE7XG4gICAgfVxuXG4gICAgdGhpcy5zYm94ZXMgPSBbXTtcbiAgICBmb3IgKCBpaT0wOyBpaSA8IDQ7ICsraWkgKSB7XG5cdHRoaXMuc2JveGVzWyBpaSBdID0gW107XG5cdGZvciAoIGpqPTA7IGpqIDwgMjU2OyArK2pqICkge1xuXHQgICAgdGhpcy5zYm94ZXNbIGlpIF1bIGpqIF0gPSB0aGlzLlNCT1hFU1sgaWkgXVsgamogXTtcblx0fVxuICAgIH1cblxuICAgIHZhciB2YWxzID0gWyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIF07XG5cbiAgICBmb3IgKCBpaT0wOyBpaSA8IHRoaXMuTk4rMjsgaWkgKz0gMiApIHtcblx0dGhpcy5fZW5jcnlwdF9ibG9jayggdmFscyApO1xuXHR0aGlzLnBhcnJheVsgaWkgKyAwIF0gPSB2YWxzWyAwIF07XG5cdHRoaXMucGFycmF5WyBpaSArIDEgXSA9IHZhbHNbIDEgXTtcbiAgICB9XG5cbiAgICBmb3IgKCBpaT0wOyBpaSA8IDQ7ICsraWkgKSB7XG5cdGZvciAoIGpqPTA7IGpqIDwgMjU2OyBqaiArPSAyICkge1xuXHQgICAgdGhpcy5fZW5jcnlwdF9ibG9jayggdmFscyApO1xuXHQgICAgdGhpcy5zYm94ZXNbIGlpIF1bIGpqICsgMCBdID0gdmFsc1sgMCBdO1xuXHQgICAgdGhpcy5zYm94ZXNbIGlpIF1bIGpqICsgMSBdID0gdmFsc1sgMSBdO1xuXHR9XG4gICAgfVxufTtcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyk7XG5cbi8vIGFkZGVkIGJ5IFJlY3VyaXR5IExhYnNcbmZ1bmN0aW9uIEJGZW5jcnlwdChibG9jayxrZXkpIHtcblx0dmFyIGJmID0gbmV3IEJsb3dmaXNoKCk7XG5cdGJmLmluaXQodXRpbC5zdHIyYmluKGtleSkpO1xuXHRyZXR1cm4gYmYuZW5jcnlwdF9ibG9jayhibG9jayk7XG59XG5cbmZ1bmN0aW9uIEJGKGtleSkge1xuXHR0aGlzLmJmID0gbmV3IEJsb3dmaXNoKCk7XG5cdHRoaXMuYmYuaW5pdCh1dGlsLnN0cjJiaW4oa2V5KSk7XG5cblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oYmxvY2spIHtcblx0XHRyZXR1cm4gdGhpcy5iZi5lbmNyeXB0X2Jsb2NrKGJsb2NrKTtcblx0fVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gQkY7XG5tb2R1bGUuZXhwb3J0cy5rZXlTaXplID0gQkYucHJvdG90eXBlLmtleVNpemUgPSAxNjtcbm1vZHVsZS5leHBvcnRzLmJsb2NrU2l6ZSA9IEJGLnByb3RvdHlwZS5ibG9ja1NpemUgPSAxNjtcblxuXG4iLCJcclxuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGVcclxuLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxyXG5cclxuLy8gQ29weXJpZ2h0IDIwMTAgcGphY29ic0B4ZWVrci5jb20gLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5cclxuLy8gTW9kaWZpZWQgYnkgUmVjdXJpdHkgTGFicyBHbWJIXHJcblxyXG4vLyBmaXhlZC9tb2RpZmllZCBieSBIZXJiZXJ0IEhhbmV3aW5rZWwsIHd3dy5oYW5lV0lOLmRlXHJcbi8vIGNoZWNrIHd3dy5oYW5lV0lOLmRlIGZvciB0aGUgbGF0ZXN0IHZlcnNpb25cclxuXHJcbi8vIGNhc3Q1LmpzIGlzIGEgSmF2YXNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiBDQVNULTEyOCwgYXMgZGVmaW5lZCBpbiBSRkMgMjE0NC5cclxuLy8gQ0FTVC0xMjggaXMgYSBjb21tb24gT3BlblBHUCBjaXBoZXIuXHJcblxyXG5cclxuLy8gQ0FTVDUgY29uc3RydWN0b3JcclxuXHJcblxyXG5cclxuZnVuY3Rpb24gb3BlbnBncF9zeW1lbmNfY2FzdDUoKSB7XHJcblx0dGhpcy5CbG9ja1NpemU9IDg7XHJcblx0dGhpcy5LZXlTaXplID0gMTY7XHJcblxyXG5cdHRoaXMuc2V0S2V5ID0gZnVuY3Rpb24gKGtleSkge1xyXG5cdFx0IHRoaXMubWFza2luZyA9IG5ldyBBcnJheSgxNik7XHJcblx0XHQgdGhpcy5yb3RhdGUgPSBuZXcgQXJyYXkoMTYpO1xyXG5cclxuXHRcdCB0aGlzLnJlc2V0KCk7XHJcblxyXG5cdFx0IGlmIChrZXkubGVuZ3RoID09IHRoaXMuS2V5U2l6ZSlcclxuXHRcdCB7XHJcblx0XHQgICB0aGlzLmtleVNjaGVkdWxlKGtleSk7XHJcblx0XHQgfVxyXG5cdFx0IGVsc2VcclxuXHRcdCB7XHJcblx0XHQgICB1dGlsLnByaW50X2Vycm9yKCdjYXN0NS5qczogQ0FTVC0xMjg6IGtleXMgbXVzdCBiZSAxNiBieXRlcycpO1xyXG5cdFx0ICAgcmV0dXJuIGZhbHNlO1xyXG5cdFx0IH1cclxuXHRcdCByZXR1cm4gdHJ1ZTtcclxuXHR9O1xyXG5cdFxyXG5cdHRoaXMucmVzZXQgPSBmdW5jdGlvbigpIHtcclxuXHRcdCBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXHJcblx0XHQge1xyXG5cdFx0ICB0aGlzLm1hc2tpbmdbaV0gPSAwO1xyXG5cdFx0ICB0aGlzLnJvdGF0ZVtpXSA9IDA7XHJcblx0XHQgfVxyXG5cdH07XHJcblxyXG5cdHRoaXMuZ2V0QmxvY2tTaXplID0gZnVuY3Rpb24oKSB7XHJcblx0XHQgcmV0dXJuIEJsb2NrU2l6ZTtcclxuXHR9O1xyXG5cclxuXHR0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbihzcmMpIHtcclxuXHRcdCB2YXIgZHN0ID0gbmV3IEFycmF5KHNyYy5sZW5ndGgpO1xyXG5cclxuXHRcdCBmb3IodmFyIGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSs9OClcclxuXHRcdCB7XHJcblx0XHQgIHZhciBsID0gc3JjW2ldPDwyNCB8IHNyY1tpKzFdPDwxNiB8IHNyY1tpKzJdPDw4IHwgc3JjW2krM107XHJcblx0XHQgIHZhciByID0gc3JjW2krNF08PDI0IHwgc3JjW2krNV08PDE2IHwgc3JjW2krNl08PDggfCBzcmNbaSs3XTtcclxuXHRcdCAgdmFyIHQ7XHJcblxyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjEociwgdGhpcy5tYXNraW5nWzBdLCB0aGlzLnJvdGF0ZVswXSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjIociwgdGhpcy5tYXNraW5nWzFdLCB0aGlzLnJvdGF0ZVsxXSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjMociwgdGhpcy5tYXNraW5nWzJdLCB0aGlzLnJvdGF0ZVsyXSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjEociwgdGhpcy5tYXNraW5nWzNdLCB0aGlzLnJvdGF0ZVszXSk7IGwgPSB0O1xyXG5cclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1s0XSwgdGhpcy5yb3RhdGVbNF0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYzKHIsIHRoaXMubWFza2luZ1s1XSwgdGhpcy5yb3RhdGVbNV0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1s2XSwgdGhpcy5yb3RhdGVbNl0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1s3XSwgdGhpcy5yb3RhdGVbN10pOyBsID0gdDtcclxuXHJcblx0XHQgIHQgPSByOyByID0gbF5mMyhyLCB0aGlzLm1hc2tpbmdbOF0sIHRoaXMucm90YXRlWzhdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbOV0sIHRoaXMucm90YXRlWzldKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMihyLCB0aGlzLm1hc2tpbmdbMTBdLCB0aGlzLnJvdGF0ZVsxMF0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYzKHIsIHRoaXMubWFza2luZ1sxMV0sIHRoaXMucm90YXRlWzExXSk7IGwgPSB0O1xyXG5cclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1sxMl0sIHRoaXMucm90YXRlWzEyXSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjIociwgdGhpcy5tYXNraW5nWzEzXSwgdGhpcy5yb3RhdGVbMTNdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMyhyLCB0aGlzLm1hc2tpbmdbMTRdLCB0aGlzLnJvdGF0ZVsxNF0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1sxNV0sIHRoaXMucm90YXRlWzE1XSk7IGwgPSB0O1xyXG5cclxuXHRcdCAgZHN0W2ldICAgPSAociA+Pj4gMjQpJjI1NTtcclxuXHRcdCAgZHN0W2krMV0gPSAociA+Pj4gMTYpJjI1NTtcclxuXHRcdCAgZHN0W2krMl0gPSAociA+Pj4gOCkmMjU1O1xyXG5cdFx0ICBkc3RbaSszXSA9IHImMjU1O1xyXG5cdFx0ICBkc3RbaSs0XSA9IChsID4+PiAyNCkmMjU1O1xyXG5cdFx0ICBkc3RbaSs1XSA9IChsID4+PiAxNikmMjU1O1xyXG5cdFx0ICBkc3RbaSs2XSA9IChsID4+PiA4KSYyNTU7XHJcblx0XHQgIGRzdFtpKzddID0gbCYyNTU7XHJcblx0XHQgfVxyXG5cclxuXHRcdCByZXR1cm4gZHN0O1xyXG5cdH07XHJcblx0XHJcblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24oc3JjKSB7XHJcblx0XHQgdmFyIGRzdCA9IG5ldyBBcnJheShzcmMubGVuZ3RoKTtcclxuXHJcblx0XHQgZm9yKHZhciBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrPTgpXHJcblx0XHQge1xyXG5cdFx0ICB2YXIgbCA9IHNyY1tpXTw8MjQgfCBzcmNbaSsxXTw8MTYgfCBzcmNbaSsyXTw8OCB8IHNyY1tpKzNdO1xyXG5cdFx0ICB2YXIgciA9IHNyY1tpKzRdPDwyNCB8IHNyY1tpKzVdPDwxNiB8IHNyY1tpKzZdPDw4IHwgc3JjW2krN107XHJcblx0XHQgIHZhciB0O1xyXG5cclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1sxNV0sIHRoaXMucm90YXRlWzE1XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjMociwgdGhpcy5tYXNraW5nWzE0XSwgdGhpcy5yb3RhdGVbMTRdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMihyLCB0aGlzLm1hc2tpbmdbMTNdLCB0aGlzLnJvdGF0ZVsxM10pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1sxMl0sIHRoaXMucm90YXRlWzEyXSk7IGwgPSB0O1xyXG5cclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYzKHIsIHRoaXMubWFza2luZ1sxMV0sIHRoaXMucm90YXRlWzExXSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjIociwgdGhpcy5tYXNraW5nWzEwXSwgdGhpcy5yb3RhdGVbMTBdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbOV0sIHRoaXMucm90YXRlWzldKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMyhyLCB0aGlzLm1hc2tpbmdbOF0sIHRoaXMucm90YXRlWzhdKTsgbCA9IHQ7XHJcblxyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjIociwgdGhpcy5tYXNraW5nWzddLCB0aGlzLnJvdGF0ZVs3XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjEociwgdGhpcy5tYXNraW5nWzZdLCB0aGlzLnJvdGF0ZVs2XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjMociwgdGhpcy5tYXNraW5nWzVdLCB0aGlzLnJvdGF0ZVs1XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjIociwgdGhpcy5tYXNraW5nWzRdLCB0aGlzLnJvdGF0ZVs0XSk7IGwgPSB0O1xyXG5cclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1szXSwgdGhpcy5yb3RhdGVbM10pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYzKHIsIHRoaXMubWFza2luZ1syXSwgdGhpcy5yb3RhdGVbMl0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1sxXSwgdGhpcy5yb3RhdGVbMV0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1swXSwgdGhpcy5yb3RhdGVbMF0pOyBsID0gdDtcclxuXHJcblx0XHQgIGRzdFtpXSAgID0gKHIgPj4+IDI0KSYyNTU7XHJcblx0XHQgIGRzdFtpKzFdID0gKHIgPj4+IDE2KSYyNTU7XHJcblx0XHQgIGRzdFtpKzJdID0gKHIgPj4+IDgpJjI1NTtcclxuXHRcdCAgZHN0W2krM10gPSByJjI1NTtcclxuXHRcdCAgZHN0W2krNF0gPSAobCA+Pj4gMjQpJjI1NTtcclxuXHRcdCAgZHN0W2krNV0gPSAobCA+PiAxNikmMjU1O1xyXG5cdFx0ICBkc3RbaSs2XSA9IChsID4+IDgpJjI1NTtcclxuXHRcdCAgZHN0W2krN10gPSBsJjI1NTtcclxuXHRcdCB9XHJcblxyXG5cdFx0IHJldHVybiBkc3Q7XHJcblx0XHR9O1xyXG5cdFx0dmFyIHNjaGVkdWxlQSA9IG5ldyBBcnJheSg0KTtcclxuXHJcblx0XHRzY2hlZHVsZUFbMF0gPSBuZXcgQXJyYXkoNCk7XHJcblx0XHRzY2hlZHVsZUFbMF1bMF0gPSBuZXcgQXJyYXkoNCwgMCwgMHhkLCAweGYsIDB4YywgMHhlLCAweDgpO1xyXG5cdFx0c2NoZWR1bGVBWzBdWzFdID0gbmV3IEFycmF5KDUsIDIsIDE2ICsgMCwgMTYgKyAyLCAxNiArIDEsIDE2ICsgMywgMHhhKTtcclxuXHRcdHNjaGVkdWxlQVswXVsyXSA9IG5ldyBBcnJheSg2LCAzLCAxNiArIDcsIDE2ICsgNiwgMTYgKyA1LCAxNiArIDQsIDkpO1xyXG5cdFx0c2NoZWR1bGVBWzBdWzNdID0gbmV3IEFycmF5KDcsIDEsIDE2ICsgMHhhLCAxNiArIDksIDE2ICsgMHhiLCAxNiArIDgsIDB4Yik7XHJcblxyXG5cdFx0c2NoZWR1bGVBWzFdID0gbmV3IEFycmF5KDQpO1xyXG5cdFx0c2NoZWR1bGVBWzFdWzBdID0gbmV3IEFycmF5KDAsIDYsIDE2ICsgNSwgMTYgKyA3LCAxNiArIDQsIDE2ICsgNiwgMTYgKyAwKTtcclxuXHRcdHNjaGVkdWxlQVsxXVsxXSA9IG5ldyBBcnJheSgxLCA0LCAwLCAyLCAxLCAzLCAxNiArIDIpO1xyXG5cdFx0c2NoZWR1bGVBWzFdWzJdID0gbmV3IEFycmF5KDIsIDUsIDcsIDYsIDUsIDQsIDE2ICsgMSk7XHJcblx0XHRzY2hlZHVsZUFbMV1bM10gPSBuZXcgQXJyYXkoMywgNywgMHhhLCA5LCAweGIsIDgsIDE2ICsgMyk7XHJcblxyXG5cdFx0c2NoZWR1bGVBWzJdID0gbmV3IEFycmF5KDQpO1xyXG5cdFx0c2NoZWR1bGVBWzJdWzBdID0gbmV3IEFycmF5KDQsIDAsIDB4ZCwgMHhmLCAweGMsIDB4ZSwgOCk7XHJcblx0XHRzY2hlZHVsZUFbMl1bMV0gPSBuZXcgQXJyYXkoNSwgMiwgMTYgKyAwLCAxNiArIDIsIDE2ICsgMSwgMTYgKyAzLCAweGEpO1xyXG5cdFx0c2NoZWR1bGVBWzJdWzJdID0gbmV3IEFycmF5KDYsIDMsIDE2ICsgNywgMTYgKyA2LCAxNiArIDUsIDE2ICsgNCwgOSk7XHJcblx0XHRzY2hlZHVsZUFbMl1bM10gPSBuZXcgQXJyYXkoNywgMSwgMTYgKyAweGEsIDE2ICsgOSwgMTYgKyAweGIsIDE2ICsgOCwgMHhiKTtcclxuXHJcblxyXG5cdFx0c2NoZWR1bGVBWzNdID0gbmV3IEFycmF5KDQpO1xyXG5cdFx0c2NoZWR1bGVBWzNdWzBdID0gbmV3IEFycmF5KDAsIDYsIDE2ICsgNSwgMTYgKyA3LCAxNiArIDQsIDE2ICsgNiwgMTYgKyAwKTtcclxuXHRcdHNjaGVkdWxlQVszXVsxXSA9IG5ldyBBcnJheSgxLCA0LCAwLCAyLCAxLCAzLCAxNiArIDIpO1xyXG5cdFx0c2NoZWR1bGVBWzNdWzJdID0gbmV3IEFycmF5KDIsIDUsIDcsIDYsIDUsIDQsIDE2ICsgMSk7XHJcblx0XHRzY2hlZHVsZUFbM11bM10gPSBuZXcgQXJyYXkoMywgNywgMHhhLCA5LCAweGIsIDgsIDE2ICsgMyk7XHJcblxyXG5cdFx0dmFyIHNjaGVkdWxlQiA9IG5ldyBBcnJheSg0KTtcclxuXHJcblx0XHRzY2hlZHVsZUJbMF0gPSBuZXcgQXJyYXkoNCk7XHJcblx0XHRzY2hlZHVsZUJbMF1bMF0gPSBuZXcgQXJyYXkoMTYgKyA4LCAxNiArIDksIDE2ICsgNywgMTYgKyA2LCAxNiArIDIpO1xyXG5cdFx0c2NoZWR1bGVCWzBdWzFdID0gbmV3IEFycmF5KDE2ICsgMHhhLCAxNiArIDB4YiwgMTYgKyA1LCAxNiArIDQsIDE2ICsgNik7XHJcblx0XHRzY2hlZHVsZUJbMF1bMl0gPSBuZXcgQXJyYXkoMTYgKyAweGMsIDE2ICsgMHhkLCAxNiArIDMsIDE2ICsgMiwgMTYgKyA5KTtcclxuXHRcdHNjaGVkdWxlQlswXVszXSA9IG5ldyBBcnJheSgxNiArIDB4ZSwgMTYgKyAweGYsIDE2ICsgMSwgMTYgKyAwLCAxNiArIDB4Yyk7XHJcblxyXG5cdFx0c2NoZWR1bGVCWzFdID0gbmV3IEFycmF5KDQpO1xyXG5cdFx0c2NoZWR1bGVCWzFdWzBdID0gbmV3IEFycmF5KDMsIDIsIDB4YywgMHhkLCA4KTtcclxuXHRcdHNjaGVkdWxlQlsxXVsxXSA9IG5ldyBBcnJheSgxLCAwLCAweGUsIDB4ZiwgMHhkKTtcclxuXHRcdHNjaGVkdWxlQlsxXVsyXSA9IG5ldyBBcnJheSg3LCA2LCA4LCA5LCAzKTtcclxuXHRcdHNjaGVkdWxlQlsxXVszXSA9IG5ldyBBcnJheSg1LCA0LCAweGEsIDB4YiwgNyk7XHJcblxyXG5cclxuXHRcdHNjaGVkdWxlQlsyXSA9IG5ldyBBcnJheSg0KTtcclxuXHRcdHNjaGVkdWxlQlsyXVswXSA9IG5ldyBBcnJheSgxNiArIDMsIDE2ICsgMiwgMTYgKyAweGMsIDE2ICsgMHhkLCAxNiArIDkpO1xyXG5cdFx0c2NoZWR1bGVCWzJdWzFdID0gbmV3IEFycmF5KDE2ICsgMSwgMTYgKyAwLCAxNiArIDB4ZSwgMTYgKyAweGYsIDE2ICsgMHhjKTtcclxuXHRcdHNjaGVkdWxlQlsyXVsyXSA9IG5ldyBBcnJheSgxNiArIDcsIDE2ICsgNiwgMTYgKyA4LCAxNiArIDksIDE2ICsgMik7XHJcblx0XHRzY2hlZHVsZUJbMl1bM10gPSBuZXcgQXJyYXkoMTYgKyA1LCAxNiArIDQsIDE2ICsgMHhhLCAxNiArIDB4YiwgMTYgKyA2KTtcclxuXHJcblxyXG5cdFx0c2NoZWR1bGVCWzNdID0gbmV3IEFycmF5KDQpO1xyXG5cdFx0c2NoZWR1bGVCWzNdWzBdID0gbmV3IEFycmF5KDgsIDksIDcsIDYsIDMpO1xyXG5cdFx0c2NoZWR1bGVCWzNdWzFdID0gbmV3IEFycmF5KDB4YSwgMHhiLCA1LCA0LCA3KTtcclxuXHRcdHNjaGVkdWxlQlszXVsyXSA9IG5ldyBBcnJheSgweGMsIDB4ZCwgMywgMiwgOCk7XHJcblx0XHRzY2hlZHVsZUJbM11bM10gPSBuZXcgQXJyYXkoMHhlLCAweGYsIDEsIDAsIDB4ZCk7XHJcblxyXG5cdFx0Ly8gY2hhbmdlZCAnaW4nIHRvICdpbm4nIChpbiBqYXZhc2NyaXB0ICdpbicgaXMgYSByZXNlcnZlZCB3b3JkKVxyXG5cdFx0dGhpcy5rZXlTY2hlZHVsZSA9IGZ1bmN0aW9uKGlubilcclxuXHRcdHtcclxuXHRcdCB2YXIgdCA9IG5ldyBBcnJheSg4KTtcclxuXHRcdCB2YXIgayA9IG5ldyBBcnJheSgzMik7XHJcblxyXG5cdFx0IGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKVxyXG5cdFx0IHtcclxuXHRcdCAgdmFyIGogPSBpICogNDtcclxuXHRcdCAgdFtpXSA9IGlubltqXTw8MjQgfCBpbm5baisxXTw8MTYgfCBpbm5baisyXTw8OCB8IGlubltqKzNdO1xyXG5cdFx0IH1cclxuXHJcblx0XHQgdmFyIHggPSBbNiwgNywgNCwgNV07XHJcblx0XHQgdmFyIGtpID0gMDtcclxuXHJcblx0XHQgZm9yICh2YXIgaGFsZiA9IDA7IGhhbGYgPCAyOyBoYWxmKyspXHJcblx0XHQge1xyXG5cdFx0ICBmb3IgKHZhciByb3VuZCA9IDA7IHJvdW5kIDwgNDsgcm91bmQrKylcclxuXHRcdCAge1xyXG5cdFx0ICAgZm9yICh2YXIgaiA9IDA7IGogPCA0OyBqKyspXHJcblx0XHQgICB7XHJcblx0XHQgICAgdmFyIGEgPSBzY2hlZHVsZUFbcm91bmRdW2pdO1xyXG5cdFx0ICAgIHZhciB3ID0gdFthWzFdXTtcclxuXHJcblx0XHQgICAgdyBePSBzQm94WzRdWyh0W2FbMl0+Pj4yXT4+PigyNC04KihhWzJdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdyBePSBzQm94WzVdWyh0W2FbM10+Pj4yXT4+PigyNC04KihhWzNdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdyBePSBzQm94WzZdWyh0W2FbNF0+Pj4yXT4+PigyNC04KihhWzRdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdyBePSBzQm94WzddWyh0W2FbNV0+Pj4yXT4+PigyNC04KihhWzVdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdyBePSBzQm94W3hbal1dWyh0W2FbNl0+Pj4yXT4+PigyNC04KihhWzZdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdFthWzBdXSA9IHc7XHJcblx0XHQgICB9XHJcblxyXG5cdFx0ICAgZm9yICh2YXIgaiA9IDA7IGogPCA0OyBqKyspXHJcblx0XHQgICB7XHJcblx0XHQgICAgdmFyIGIgPSBzY2hlZHVsZUJbcm91bmRdW2pdO1xyXG5cdFx0ICAgIHZhciB3ID0gc0JveFs0XVsodFtiWzBdPj4+Ml0+Pj4oMjQtOCooYlswXSYzKSkpJjB4ZmZdO1xyXG5cclxuXHRcdCAgICB3IF49IHNCb3hbNV1bKHRbYlsxXT4+PjJdPj4+KDI0LTgqKGJbMV0mMykpKSYweGZmXTtcclxuXHRcdCAgICB3IF49IHNCb3hbNl1bKHRbYlsyXT4+PjJdPj4+KDI0LTgqKGJbMl0mMykpKSYweGZmXTtcclxuXHRcdCAgICB3IF49IHNCb3hbN11bKHRbYlszXT4+PjJdPj4+KDI0LTgqKGJbM10mMykpKSYweGZmXTtcclxuXHRcdCAgICB3IF49IHNCb3hbNCtqXVsodFtiWzRdPj4+Ml0+Pj4oMjQtOCooYls0XSYzKSkpJjB4ZmZdO1xyXG5cdFx0ICAgIGtba2ldID0gdztcclxuXHRcdCAgICBraSsrO1xyXG5cdFx0ICAgfVxyXG5cdFx0ICB9XHJcblx0XHQgfVxyXG5cclxuXHRcdCBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXHJcblx0XHQge1xyXG5cdFx0ICB0aGlzLm1hc2tpbmdbaV0gPSBrW2ldO1xyXG5cdFx0ICB0aGlzLnJvdGF0ZVtpXSAgPSBrWzE2K2ldICYgMHgxZjtcclxuXHRcdCB9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIFRoZXNlIGFyZSB0aGUgdGhyZWUgJ2YnIGZ1bmN0aW9ucy4gU2VlIFJGQyAyMTQ0LCBzZWN0aW9uIDIuMi5cclxuXHJcblx0XHRmdW5jdGlvbiBmMShkLCBtLCByKVxyXG5cdFx0e1xyXG5cdFx0IHZhciB0ID0gbSArIGQ7XHJcblx0XHQgdmFyIEkgPSAodCA8PCByKSB8ICh0ID4+PiAoMzIgLSByKSk7XHJcblx0XHQgcmV0dXJuICgoc0JveFswXVtJPj4+MjRdIF4gc0JveFsxXVsoST4+PjE2KSYyNTVdKSAtIHNCb3hbMl1bKEk+Pj44KSYyNTVdKSArIHNCb3hbM11bSSYyNTVdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGYyKGQsIG0sIHIpXHJcblx0XHR7XHJcblx0XHQgdmFyIHQgPSBtIF4gZDtcclxuXHRcdCB2YXIgSSA9ICh0IDw8IHIpIHwgKHQgPj4+ICgzMiAtIHIpKTtcclxuXHRcdCByZXR1cm4gKChzQm94WzBdW0k+Pj4yNF0gLSBzQm94WzFdWyhJPj4+MTYpJjI1NV0pICsgc0JveFsyXVsoST4+PjgpJjI1NV0pIF4gc0JveFszXVtJJjI1NV07XHJcblx0XHR9XHJcblxyXG5cdFx0ZnVuY3Rpb24gZjMoZCwgbSwgcilcclxuXHRcdHtcclxuXHRcdCB2YXIgdCA9IG0gLSBkO1xyXG5cdFx0IHZhciBJID0gKHQgPDwgcikgfCAodCA+Pj4gKDMyIC0gcikpO1xyXG5cdFx0IHJldHVybiAoKHNCb3hbMF1bST4+PjI0XSArIHNCb3hbMV1bKEk+Pj4xNikmMjU1XSkgXiBzQm94WzJdWyhJPj4+OCkmMjU1XSkgLSBzQm94WzNdW0kmMjU1XTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgc0JveCA9IG5ldyBBcnJheSg4KTtcclxuXHRcdHNCb3hbMF0gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4MzBmYjQwZDQsIDB4OWZhMGZmMGIsIDB4NmJlY2NkMmYsIDB4M2YyNThjN2EsIDB4MWUyMTNmMmYsIDB4OWMwMDRkZDMsIDB4NjAwM2U1NDAsIDB4Y2Y5ZmM5NDksXHJcblx0XHQgIDB4YmZkNGFmMjcsIDB4ODhiYmJkYjUsIDB4ZTIwMzQwOTAsIDB4OThkMDk2NzUsIDB4NmU2M2EwZTAsIDB4MTVjMzYxZDIsIDB4YzJlNzY2MWQsIDB4MjJkNGZmOGUsXHJcblx0XHQgIDB4Mjg2ODNiNmYsIDB4YzA3ZmQwNTksIDB4ZmYyMzc5YzgsIDB4Nzc1ZjUwZTIsIDB4NDNjMzQwZDMsIDB4ZGYyZjg2NTYsIDB4ODg3Y2E0MWEsIDB4YTJkMmJkMmQsXHJcblx0XHQgIDB4YTFjOWUwZDYsIDB4MzQ2YzQ4MTksIDB4NjFiNzZkODcsIDB4MjI1NDBmMmYsIDB4MmFiZTMyZTEsIDB4YWE1NDE2NmIsIDB4MjI1NjhlM2EsIDB4YTJkMzQxZDAsXHJcblx0XHQgIDB4NjZkYjQwYzgsIDB4YTc4NDM5MmYsIDB4MDA0ZGZmMmYsIDB4MmRiOWQyZGUsIDB4OTc5NDNmYWMsIDB4NGE5N2MxZDgsIDB4NTI3NjQ0YjcsIDB4YjVmNDM3YTcsXHJcblx0XHQgIDB4YjgyY2JhZWYsIDB4ZDc1MWQxNTksIDB4NmZmN2YwZWQsIDB4NWEwOTdhMWYsIDB4ODI3YjY4ZDAsIDB4OTBlY2Y1MmUsIDB4MjJiMGMwNTQsIDB4YmM4ZTU5MzUsXHJcblx0XHQgIDB4NGI2ZDJmN2YsIDB4NTBiYjY0YTIsIDB4ZDI2NjQ5MTAsIDB4YmVlNTgxMmQsIDB4YjczMzIyOTAsIDB4ZTkzYjE1OWYsIDB4YjQ4ZWU0MTEsIDB4NGJmZjM0NWQsXHJcblx0XHQgIDB4ZmQ0NWMyNDAsIDB4YWQzMTk3M2YsIDB4YzRmNmQwMmUsIDB4NTVmYzgxNjUsIDB4ZDViMWNhYWQsIDB4YTFhYzJkYWUsIDB4YTJkNGI3NmQsIDB4YzE5YjBjNTAsXHJcblx0XHQgIDB4ODgyMjQwZjIsIDB4MGM2ZTRmMzgsIDB4YTRlNGJmZDcsIDB4NGY1YmEyNzIsIDB4NTY0YzFkMmYsIDB4YzU5YzUzMTksIDB4Yjk0OWUzNTQsIDB4YjA0NjY5ZmUsXHJcblx0XHQgIDB4YjFiNmFiOGEsIDB4YzcxMzU4ZGQsIDB4NjM4NWM1NDUsIDB4MTEwZjkzNWQsIDB4NTc1MzhhZDUsIDB4NmEzOTA0OTMsIDB4ZTYzZDM3ZTAsIDB4MmE1NGY2YjMsXHJcblx0XHQgIDB4M2E3ODdkNWYsIDB4NjI3NmEwYjUsIDB4MTlhNmZjZGYsIDB4N2E0MjIwNmEsIDB4MjlmOWQ0ZDUsIDB4ZjYxYjE4OTEsIDB4YmI3MjI3NWUsIDB4YWE1MDgxNjcsXHJcblx0XHQgIDB4Mzg5MDEwOTEsIDB4YzZiNTA1ZWIsIDB4ODRjN2NiOGMsIDB4MmFkNzVhMGYsIDB4ODc0YTE0MjcsIDB4YTJkMTkzNmIsIDB4MmFkMjg2YWYsIDB4YWE1NmQyOTEsXHJcblx0XHQgIDB4ZDc4OTQzNjAsIDB4NDI1Yzc1MGQsIDB4OTNiMzllMjYsIDB4MTg3MTg0YzksIDB4NmMwMGIzMmQsIDB4NzNlMmJiMTQsIDB4YTBiZWJjM2MsIDB4NTQ2MjM3NzksXHJcblx0XHQgIDB4NjQ0NTllYWIsIDB4M2YzMjhiODIsIDB4NzcxOGNmODIsIDB4NTlhMmNlYTYsIDB4MDRlZTAwMmUsIDB4ODlmZTc4ZTYsIDB4M2ZhYjA5NTAsIDB4MzI1ZmY2YzIsXHJcblx0XHQgIDB4ODEzODNmMDUsIDB4Njk2M2M1YzgsIDB4NzZjYjVhZDYsIDB4ZDQ5OTc0YzksIDB4Y2ExODBkY2YsIDB4MzgwNzgyZDUsIDB4YzdmYTVjZjYsIDB4OGFjMzE1MTEsXHJcblx0XHQgIDB4MzVlNzllMTMsIDB4NDdkYTkxZDAsIDB4ZjQwZjkwODYsIDB4YTdlMjQxOWUsIDB4MzEzNjYyNDEsIDB4MDUxZWY0OTUsIDB4YWE1NzNiMDQsIDB4NGE4MDVkOGQsXHJcblx0XHQgIDB4NTQ4MzAwZDAsIDB4MDAzMjJhM2MsIDB4YmY2NGNkZGYsIDB4YmE1N2E2OGUsIDB4NzVjNjM3MmIsIDB4NTBhZmQzNDEsIDB4YTdjMTMyNzUsIDB4OTE1YTBiZjUsXHJcblx0XHQgIDB4NmI1NGJmYWIsIDB4MmIwYjE0MjYsIDB4YWI0Y2M5ZDcsIDB4NDQ5Y2NkODIsIDB4ZjdmYmYyNjUsIDB4YWI4NWM1ZjMsIDB4MWI1NWRiOTQsIDB4YWFkNGUzMjQsXHJcblx0XHQgIDB4Y2ZhNGJkM2YsIDB4MmRlYWEzZTIsIDB4OWUyMDRkMDIsIDB4YzhiZDI1YWMsIDB4ZWFkZjU1YjMsIDB4ZDViZDllOTgsIDB4ZTMxMjMxYjIsIDB4MmFkNWFkNmMsXHJcblx0XHQgIDB4OTU0MzI5ZGUsIDB4YWRiZTQ1MjgsIDB4ZDg3MTBmNjksIDB4YWE1MWM5MGYsIDB4YWE3ODZiZjYsIDB4MjI1MTNmMWUsIDB4YWE1MWE3OWIsIDB4MmFkMzQ0Y2MsXHJcblx0XHQgIDB4N2I1YTQxZjAsIDB4ZDM3Y2ZiYWQsIDB4MWIwNjk1MDUsIDB4NDFlY2U0OTEsIDB4YjRjMzMyZTYsIDB4MDMyMjY4ZDQsIDB4Yzk2MDBhY2MsIDB4Y2UzODdlNmQsXHJcblx0XHQgIDB4YmY2YmIxNmMsIDB4NmE3MGZiNzgsIDB4MGQwM2Q5YzksIDB4ZDRkZjM5ZGUsIDB4ZTAxMDYzZGEsIDB4NDczNmY0NjQsIDB4NWFkMzI4ZDgsIDB4YjM0N2NjOTYsXHJcblx0XHQgIDB4NzViYjBmYzMsIDB4OTg1MTFiZmIsIDB4NGZmYmNjMzUsIDB4YjU4YmNmNmEsIDB4ZTExZjBhYmMsIDB4YmZjNWZlNGEsIDB4YTcwYWVjMTAsIDB4YWMzOTU3MGEsXHJcblx0XHQgIDB4M2YwNDQ0MmYsIDB4NjE4OGIxNTMsIDB4ZTAzOTdhMmUsIDB4NTcyN2NiNzksIDB4OWNlYjQxOGYsIDB4MWNhY2Q2OGQsIDB4MmFkMzdjOTYsIDB4MDE3NWNiOWQsXHJcblx0XHQgIDB4YzY5ZGZmMDksIDB4Yzc1YjY1ZjAsIDB4ZDlkYjQwZDgsIDB4ZWMwZTc3NzksIDB4NDc0NGVhZDQsIDB4YjExYzMyNzQsIDB4ZGQyNGNiOWUsIDB4N2UxYzU0YmQsXHJcblx0XHQgIDB4ZjAxMTQ0ZjksIDB4ZDIyNDBlYjEsIDB4OTY3NWIzZmQsIDB4YTNhYzM3NTUsIDB4ZDQ3YzI3YWYsIDB4NTFjODVmNGQsIDB4NTY5MDc1OTYsIDB4YTViYjE1ZTYsXHJcblx0XHQgIDB4NTgwMzA0ZjAsIDB4Y2EwNDJjZjEsIDB4MDExYTM3ZWEsIDB4OGRiZmFhZGIsIDB4MzViYTNlNGEsIDB4MzUyNmZmYTAsIDB4YzM3YjRkMDksIDB4YmMzMDZlZDksXHJcblx0XHQgIDB4OThhNTI2NjYsIDB4NTY0OGY3MjUsIDB4ZmY1ZTU2OWQsIDB4MGNlZDYzZDAsIDB4N2M2M2IyY2YsIDB4NzAwYjQ1ZTEsIDB4ZDVlYTUwZjEsIDB4ODVhOTI4NzIsXHJcblx0XHQgIDB4YWYxZmJkYTcsIDB4ZDQyMzQ4NzAsIDB4YTc4NzBiZjMsIDB4MmQzYjRkNzksIDB4NDJlMDQxOTgsIDB4MGNkMGVkZTcsIDB4MjY0NzBkYjgsIDB4Zjg4MTgxNGMsXHJcblx0XHQgIDB4NDc0ZDZhZDcsIDB4N2MwYzVlNWMsIDB4ZDEyMzE5NTksIDB4MzgxYjcyOTgsIDB4ZjVkMmY0ZGIsIDB4YWI4Mzg2NTMsIDB4NmUyZjFlMjMsIDB4ODM3MTljOWUsXHJcblx0XHQgIDB4YmQ5MWUwNDYsIDB4OWE1NjQ1NmUsIDB4ZGMzOTIwMGMsIDB4MjBjOGM1NzEsIDB4OTYyYmRhMWMsIDB4ZTFlNjk2ZmYsIDB4YjE0MWFiMDgsIDB4N2NjYTg5YjksXHJcblx0XHQgIDB4MWE2OWU3ODMsIDB4MDJjYzQ4NDMsIDB4YTJmN2M1NzksIDB4NDI5ZWY0N2QsIDB4NDI3YjE2OWMsIDB4NWFjOWYwNDksIDB4ZGQ4ZjBmMDAsIDB4NWM4MTY1YmYpO1xyXG5cclxuXHRcdHNCb3hbMV0gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4MWYyMDEwOTQsIDB4ZWYwYmE3NWIsIDB4NjllM2NmN2UsIDB4MzkzZjQzODAsIDB4ZmU2MWNmN2EsIDB4ZWVjNTIwN2EsIDB4NTU4ODljOTQsIDB4NzJmYzA2NTEsXHJcblx0XHQgIDB4YWRhN2VmNzksIDB4NGUxZDcyMzUsIDB4ZDU1YTYzY2UsIDB4ZGUwNDM2YmEsIDB4OTljNDMwZWYsIDB4NWYwYzA3OTQsIDB4MThkY2RiN2QsIDB4YTFkNmVmZjMsXHJcblx0XHQgIDB4YTBiNTJmN2IsIDB4NTllODM2MDUsIDB4ZWUxNWIwOTQsIDB4ZTlmZmQ5MDksIDB4ZGM0NDAwODYsIDB4ZWY5NDQ0NTksIDB4YmE4M2NjYjMsIDB4ZTBjM2NkZmIsXHJcblx0XHQgIDB4ZDFkYTQxODEsIDB4M2IwOTJhYjEsIDB4Zjk5N2YxYzEsIDB4YTVlNmNmN2IsIDB4MDE0MjBkZGIsIDB4ZTRlN2VmNWIsIDB4MjVhMWZmNDEsIDB4ZTE4MGY4MDYsXHJcblx0XHQgIDB4MWZjNDEwODAsIDB4MTc5YmVlN2EsIDB4ZDM3YWM2YTksIDB4ZmU1ODMwYTQsIDB4OThkZThiN2YsIDB4NzdlODNmNGUsIDB4Nzk5MjkyNjksIDB4MjRmYTlmN2IsXHJcblx0XHQgIDB4ZTExM2M4NWIsIDB4YWNjNDAwODMsIDB4ZDc1MDM1MjUsIDB4ZjdlYTYxNWYsIDB4NjIxNDMxNTQsIDB4MGQ1NTRiNjMsIDB4NWQ2ODExMjEsIDB4Yzg2NmMzNTksXHJcblx0XHQgIDB4M2Q2M2NmNzMsIDB4Y2VlMjM0YzAsIDB4ZDRkODdlODcsIDB4NWM2NzJiMjEsIDB4MDcxZjYxODEsIDB4MzlmNzYyN2YsIDB4MzYxZTMwODQsIDB4ZTRlYjU3M2IsXHJcblx0XHQgIDB4NjAyZjY0YTQsIDB4ZDYzYWNkOWMsIDB4MWJiYzQ2MzUsIDB4OWU4MTAzMmQsIDB4MjcwMWY1MGMsIDB4OTk4NDdhYjQsIDB4YTBlM2RmNzksIDB4YmE2Y2YzOGMsXHJcblx0XHQgIDB4MTA4NDMwOTQsIDB4MjUzN2E5NWUsIDB4ZjQ2ZjZmZmUsIDB4YTFmZjNiMWYsIDB4MjA4Y2ZiNmEsIDB4OGY0NThjNzQsIDB4ZDllMGEyMjcsIDB4NGVjNzNhMzQsXHJcblx0XHQgIDB4ZmM4ODRmNjksIDB4M2U0ZGU4ZGYsIDB4ZWYwZTAwODgsIDB4MzU1OTY0OGQsIDB4OGE0NTM4OGMsIDB4MWQ4MDQzNjYsIDB4NzIxZDliZmQsIDB4YTU4Njg0YmIsXHJcblx0XHQgIDB4ZTgyNTYzMzMsIDB4ODQ0ZTgyMTIsIDB4MTI4ZDgwOTgsIDB4ZmVkMzNmYjQsIDB4Y2UyODBhZTEsIDB4MjdlMTliYTUsIDB4ZDVhNmMyNTIsIDB4ZTQ5NzU0YmQsXHJcblx0XHQgIDB4YzVkNjU1ZGQsIDB4ZWI2NjcwNjQsIDB4Nzc4NDBiNGQsIDB4YTFiNmE4MDEsIDB4ODRkYjI2YTksIDB4ZTBiNTY3MTQsIDB4MjFmMDQzYjcsIDB4ZTVkMDU4NjAsXHJcblx0XHQgIDB4NTRmMDMwODQsIDB4MDY2ZmY0NzIsIDB4YTMxYWExNTMsIDB4ZGFkYzQ3NTUsIDB4YjU2MjVkYmYsIDB4Njg1NjFiZTYsIDB4ODNjYTZiOTQsIDB4MmQ2ZWQyM2IsXHJcblx0XHQgIDB4ZWNjZjAxZGIsIDB4YTZkM2QwYmEsIDB4YjY4MDNkNWMsIDB4YWY3N2E3MDksIDB4MzNiNGEzNGMsIDB4Mzk3YmM4ZDYsIDB4NWVlMjJiOTUsIDB4NWYwZTUzMDQsXHJcblx0XHQgIDB4ODFlZDZmNjEsIDB4MjBlNzQzNjQsIDB4YjQ1ZTEzNzgsIDB4ZGUxODYzOWIsIDB4ODgxY2ExMjIsIDB4Yjk2NzI2ZDEsIDB4ODA0OWE3ZTgsIDB4MjJiN2RhN2IsXHJcblx0XHQgIDB4NWU1NTJkMjUsIDB4NTI3MmQyMzcsIDB4NzlkMjk1MWMsIDB4YzYwZDg5NGMsIDB4NDg4Y2I0MDIsIDB4MWJhNGZlNWIsIDB4YTRiMDlmNmIsIDB4MWNhODE1Y2YsXHJcblx0XHQgIDB4YTIwYzMwMDUsIDB4ODg3MWRmNjMsIDB4YjlkZTJmY2IsIDB4MGNjNmM5ZTksIDB4MGJlZWZmNTMsIDB4ZTMyMTQ1MTcsIDB4YjQ1NDI4MzUsIDB4OWY2MzI5M2MsXHJcblx0XHQgIDB4ZWU0MWU3MjksIDB4NmUxZDJkN2MsIDB4NTAwNDUyODYsIDB4MWU2Njg1ZjMsIDB4ZjMzNDAxYzYsIDB4MzBhMjJjOTUsIDB4MzFhNzA4NTAsIDB4NjA5MzBmMTMsXHJcblx0XHQgIDB4NzNmOTg0MTcsIDB4YTEyNjk4NTksIDB4ZWM2NDVjNDQsIDB4NTJjODc3YTksIDB4Y2RmZjMzYTYsIDB4YTAyYjE3NDEsIDB4N2NiYWQ5YTIsIDB4MjE4MDAzNmYsXHJcblx0XHQgIDB4NTBkOTljMDgsIDB4Y2IzZjQ4NjEsIDB4YzI2YmQ3NjUsIDB4NjRhM2Y2YWIsIDB4ODAzNDI2NzYsIDB4MjVhNzVlN2IsIDB4ZTRlNmQxZmMsIDB4MjBjNzEwZTYsXHJcblx0XHQgIDB4Y2RmMGI2ODAsIDB4MTc4NDRkM2IsIDB4MzFlZWY4NGQsIDB4N2UwODI0ZTQsIDB4MmNjYjQ5ZWIsIDB4ODQ2YTNiYWUsIDB4OGZmNzc4ODgsIDB4ZWU1ZDYwZjYsXHJcblx0XHQgIDB4N2FmNzU2NzMsIDB4MmZkZDVjZGIsIDB4YTExNjMxYzEsIDB4MzBmNjZmNDMsIDB4YjNmYWVjNTQsIDB4MTU3ZmQ3ZmEsIDB4ZWY4NTc5Y2MsIDB4ZDE1MmRlNTgsXHJcblx0XHQgIDB4ZGIyZmZkNWUsIDB4OGYzMmNlMTksIDB4MzA2YWY5N2EsIDB4MDJmMDNlZjgsIDB4OTkzMTlhZDUsIDB4YzI0MmZhMGYsIDB4YTdlM2ViYjAsIDB4YzY4ZTQ5MDYsXHJcblx0XHQgIDB4YjhkYTIzMGMsIDB4ODA4MjMwMjgsIDB4ZGNkZWYzYzgsIDB4ZDM1ZmIxNzEsIDB4MDg4YTFiYzgsIDB4YmVjMGM1NjAsIDB4NjFhM2M5ZTgsIDB4YmNhOGY1NGQsXHJcblx0XHQgIDB4YzcyZmVmZmEsIDB4MjI4MjJlOTksIDB4ODJjNTcwYjQsIDB4ZDhkOTRlODksIDB4OGIxYzM0YmMsIDB4MzAxZTE2ZTYsIDB4MjczYmU5NzksIDB4YjBmZmVhYTYsXHJcblx0XHQgIDB4NjFkOWI4YzYsIDB4MDBiMjQ4NjksIDB4YjdmZmNlM2YsIDB4MDhkYzI4M2IsIDB4NDNkYWY2NWEsIDB4ZjdlMTk3OTgsIDB4NzYxOWI3MmYsIDB4OGYxYzliYTQsXHJcblx0XHQgIDB4ZGM4NjM3YTAsIDB4MTZhN2QzYjEsIDB4OWZjMzkzYjcsIDB4YTcxMzZlZWIsIDB4YzZiY2M2M2UsIDB4MWE1MTM3NDIsIDB4ZWY2ODI4YmMsIDB4NTIwMzY1ZDYsXHJcblx0XHQgIDB4MmQ2YTc3YWIsIDB4MzUyN2VkNGIsIDB4ODIxZmQyMTYsIDB4MDk1YzZlMmUsIDB4ZGI5MmYyZmIsIDB4NWVlYTI5Y2IsIDB4MTQ1ODkyZjUsIDB4OTE1ODRmN2YsXHJcblx0XHQgIDB4NTQ4MzY5N2IsIDB4MjY2N2E4Y2MsIDB4ODUxOTYwNDgsIDB4OGM0YmFjZWEsIDB4ODMzODYwZDQsIDB4MGQyM2UwZjksIDB4NmMzODdlOGEsIDB4MGFlNmQyNDksXHJcblx0XHQgIDB4YjI4NDYwMGMsIDB4ZDgzNTczMWQsIDB4ZGNiMWM2NDcsIDB4YWM0YzU2ZWEsIDB4M2ViZDgxYjMsIDB4MjMwZWFiYjAsIDB4NjQzOGJjODcsIDB4ZjBiNWIxZmEsXHJcblx0XHQgIDB4OGY1ZWEyYjMsIDB4ZmMxODQ2NDIsIDB4MGEwMzZiN2EsIDB4NGZiMDg5YmQsIDB4NjQ5ZGE1ODksIDB4YTM0NTQxNWUsIDB4NWMwMzgzMjMsIDB4M2U1ZDNiYjksXHJcblx0XHQgIDB4NDNkNzk1NzIsIDB4N2U2ZGQwN2MsIDB4MDZkZmRmMWUsIDB4NmM2Y2M0ZWYsIDB4NzE2MGE1MzksIDB4NzNiZmJlNzAsIDB4ODM4Nzc2MDUsIDB4NDUyM2VjZjEpO1xyXG5cclxuXHRcdHNCb3hbMl0gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4OGRlZmMyNDAsIDB4MjVmYTVkOWYsIDB4ZWI5MDNkYmYsIDB4ZTgxMGM5MDcsIDB4NDc2MDdmZmYsIDB4MzY5ZmU0NGIsIDB4OGMxZmM2NDQsIDB4YWVjZWNhOTAsXHJcblx0XHQgIDB4YmViMWY5YmYsIDB4ZWVmYmNhZWEsIDB4ZThjZjE5NTAsIDB4NTFkZjA3YWUsIDB4OTIwZTg4MDYsIDB4ZjBhZDA1NDgsIDB4ZTEzYzhkODMsIDB4OTI3MDEwZDUsXHJcblx0XHQgIDB4MTExMDdkOWYsIDB4MDc2NDdkYjksIDB4YjJlM2U0ZDQsIDB4M2Q0ZjI4NWUsIDB4YjlhZmE4MjAsIDB4ZmFkZTgyZTAsIDB4YTA2NzI2OGIsIDB4ODI3Mjc5MmUsXHJcblx0XHQgIDB4NTUzZmIyYzAsIDB4NDg5YWUyMmIsIDB4ZDRlZjk3OTQsIDB4MTI1ZTNmYmMsIDB4MjFmZmZjZWUsIDB4ODI1YjFiZmQsIDB4OTI1NWM1ZWQsIDB4MTI1N2EyNDAsXHJcblx0XHQgIDB4NGUxYTgzMDIsIDB4YmFlMDdmZmYsIDB4NTI4MjQ2ZTcsIDB4OGU1NzE0MGUsIDB4MzM3M2Y3YmYsIDB4OGM5ZjgxODgsIDB4YTZmYzRlZTgsIDB4Yzk4MmI1YTUsXHJcblx0XHQgIDB4YThjMDFkYjcsIDB4NTc5ZmMyNjQsIDB4NjcwOTRmMzEsIDB4ZjJiZDNmNWYsIDB4NDBmZmY3YzEsIDB4MWZiNzhkZmMsIDB4OGU2YmQyYzEsIDB4NDM3YmU1OWIsXHJcblx0XHQgIDB4OTliMDNkYmYsIDB4YjVkYmM2NGIsIDB4NjM4ZGMwZTYsIDB4NTU4MTlkOTksIDB4YTE5N2M4MWMsIDB4NGEwMTJkNmUsIDB4YzU4ODRhMjgsIDB4Y2NjMzZmNzEsXHJcblx0XHQgIDB4Yjg0M2MyMTMsIDB4NmMwNzQzZjEsIDB4ODMwOTg5M2MsIDB4MGZlZGRkNWYsIDB4MmY3ZmU4NTAsIDB4ZDdjMDdmN2UsIDB4MDI1MDdmYmYsIDB4NWFmYjlhMDQsXHJcblx0XHQgIDB4YTc0N2QyZDAsIDB4MTY1MTE5MmUsIDB4YWY3MGJmM2UsIDB4NThjMzEzODAsIDB4NWY5ODMwMmUsIDB4NzI3Y2MzYzQsIDB4MGEwZmI0MDIsIDB4MGY3ZmVmODIsXHJcblx0XHQgIDB4OGM5NmZkYWQsIDB4NWQyYzJhYWUsIDB4OGVlOTlhNDksIDB4NTBkYTg4YjgsIDB4ODQyN2Y0YTAsIDB4MWVhYzU3OTAsIDB4Nzk2ZmI0NDksIDB4ODI1MmRjMTUsXHJcblx0XHQgIDB4ZWZiZDdkOWIsIDB4YTY3MjU5N2QsIDB4YWRhODQwZDgsIDB4NDVmNTQ1MDQsIDB4ZmE1ZDc0MDMsIDB4ZTgzZWMzMDUsIDB4NGY5MTc1MWEsIDB4OTI1NjY5YzIsXHJcblx0XHQgIDB4MjNlZmU5NDEsIDB4YTkwM2YxMmUsIDB4NjAyNzBkZjIsIDB4MDI3NmU0YjYsIDB4OTRmZDY1NzQsIDB4OTI3OTg1YjIsIDB4ODI3NmRiY2IsIDB4MDI3NzgxNzYsXHJcblx0XHQgIDB4ZjhhZjkxOGQsIDB4NGU0OGY3OWUsIDB4OGY2MTZkZGYsIDB4ZTI5ZDg0MGUsIDB4ODQyZjdkODMsIDB4MzQwY2U1YzgsIDB4OTZiYmI2ODIsIDB4OTNiNGIxNDgsXHJcblx0XHQgIDB4ZWYzMDNjYWIsIDB4OTg0ZmFmMjgsIDB4Nzc5ZmFmOWIsIDB4OTJkYzU2MGQsIDB4MjI0ZDFlMjAsIDB4ODQzN2FhODgsIDB4N2QyOWRjOTYsIDB4Mjc1NmQzZGMsXHJcblx0XHQgIDB4OGI5MDdjZWUsIDB4YjUxZmQyNDAsIDB4ZTdjMDdjZTMsIDB4ZTU2NmI0YTEsIDB4YzNlOTYxNWUsIDB4M2NmODIwOWQsIDB4NjA5NGQxZTMsIDB4Y2Q5Y2EzNDEsXHJcblx0XHQgIDB4NWM3NjQ2MGUsIDB4MDBlYTk4M2IsIDB4ZDRkNjc4ODEsIDB4ZmQ0NzU3MmMsIDB4Zjc2Y2VkZDksIDB4YmRhODIyOWMsIDB4MTI3ZGFkYWEsIDB4NDM4YTA3NGUsXHJcblx0XHQgIDB4MWY5N2MwOTAsIDB4MDgxYmRiOGEsIDB4OTNhMDdlYmUsIDB4YjkzOGNhMTUsIDB4OTdiMDNjZmYsIDB4M2RjMmMwZjgsIDB4OGQxYWIyZWMsIDB4NjQzODBlNTEsXHJcblx0XHQgIDB4NjhjYzdiZmIsIDB4ZDkwZjI3ODgsIDB4MTI0OTAxODEsIDB4NWRlNWZmZDQsIDB4ZGQ3ZWY4NmEsIDB4NzZhMmUyMTQsIDB4YjlhNDAzNjgsIDB4OTI1ZDk1OGYsXHJcblx0XHQgIDB4NGIzOWZmZmEsIDB4YmEzOWFlZTksIDB4YTRmZmQzMGIsIDB4ZmFmNzkzM2IsIDB4NmQ0OTg2MjMsIDB4MTkzY2JjZmEsIDB4Mjc2Mjc1NDUsIDB4ODI1Y2Y0N2EsXHJcblx0XHQgIDB4NjFiZDhiYTAsIDB4ZDExZTQyZDEsIDB4Y2VhZDA0ZjQsIDB4MTI3ZWEzOTIsIDB4MTA0MjhkYjcsIDB4ODI3MmE5NzIsIDB4OTI3MGM0YTgsIDB4MTI3ZGU1MGIsXHJcblx0XHQgIDB4Mjg1YmExYzgsIDB4M2M2MmY0NGYsIDB4MzVjMGVhYTUsIDB4ZTgwNWQyMzEsIDB4NDI4OTI5ZmIsIDB4YjRmY2RmODIsIDB4NGZiNjZhNTMsIDB4MGU3ZGMxNWIsXHJcblx0XHQgIDB4MWYwODFmYWIsIDB4MTA4NjE4YWUsIDB4ZmNmZDA4NmQsIDB4ZjlmZjI4ODksIDB4Njk0YmNjMTEsIDB4MjM2YTVjYWUsIDB4MTJkZWNhNGQsIDB4MmMzZjhjYzUsXHJcblx0XHQgIDB4ZDJkMDJkZmUsIDB4ZjhlZjU4OTYsIDB4ZTRjZjUyZGEsIDB4OTUxNTViNjcsIDB4NDk0YTQ4OGMsIDB4YjliNmE4MGMsIDB4NWM4ZjgyYmMsIDB4ODlkMzZiNDUsXHJcblx0XHQgIDB4M2E2MDk0MzcsIDB4ZWMwMGM5YTksIDB4NDQ3MTUyNTMsIDB4MGE4NzRiNDksIDB4ZDc3M2JjNDAsIDB4N2MzNDY3MWMsIDB4MDI3MTdlZjYsIDB4NGZlYjU1MzYsXHJcblx0XHQgIDB4YTJkMDJmZmYsIDB4ZDJiZjYwYzQsIDB4ZDQzZjAzYzAsIDB4NTBiNGVmNmQsIDB4MDc0NzhjZDEsIDB4MDA2ZTE4ODgsIDB4YTJlNTNmNTUsIDB4YjllNmQ0YmMsXHJcblx0XHQgIDB4YTIwNDgwMTYsIDB4OTc1NzM4MzMsIDB4ZDcyMDdkNjcsIDB4ZGUwZjhmM2QsIDB4NzJmODdiMzMsIDB4YWJjYzRmMzMsIDB4NzY4OGM1NWQsIDB4N2IwMGE2YjAsXHJcblx0XHQgIDB4OTQ3YjAwMDEsIDB4NTcwMDc1ZDIsIDB4ZjliYjg4ZjgsIDB4ODk0MjAxOWUsIDB4NDI2NGE1ZmYsIDB4ODU2MzAyZTAsIDB4NzJkYmQ5MmIsIDB4ZWU5NzFiNjksXHJcblx0XHQgIDB4NmVhMjJmZGUsIDB4NWYwOGFlMmIsIDB4YWY3YTYxNmQsIDB4ZTVjOTg3NjcsIDB4Y2YxZmViZDIsIDB4NjFlZmM4YzIsIDB4ZjFhYzI1NzEsIDB4Y2M4MjM5YzIsXHJcblx0XHQgIDB4NjcyMTRjYjgsIDB4YjFlNTgzZDEsIDB4YjdkYzNlNjIsIDB4N2YxMGJkY2UsIDB4ZjkwYTVjMzgsIDB4MGZmMDQ0M2QsIDB4NjA2ZTZkYzYsIDB4NjA1NDNhNDksXHJcblx0XHQgIDB4NTcyN2MxNDgsIDB4MmJlOThhMWQsIDB4OGFiNDE3MzgsIDB4MjBlMWJlMjQsIDB4YWY5NmRhMGYsIDB4Njg0NTg0MjUsIDB4OTk4MzNiZTUsIDB4NjAwZDQ1N2QsXHJcblx0XHQgIDB4MjgyZjkzNTAsIDB4ODMzNGIzNjIsIDB4ZDkxZDExMjAsIDB4MmI2ZDhkYTAsIDB4NjQyYjFlMzEsIDB4OWMzMDVhMDAsIDB4NTJiY2U2ODgsIDB4MWIwMzU4OGEsXHJcblx0XHQgIDB4ZjdiYWVmZDUsIDB4NDE0MmVkOWMsIDB4YTQzMTVjMTEsIDB4ODMzMjNlYzUsIDB4ZGZlZjQ2MzYsIDB4YTEzM2M1MDEsIDB4ZTlkMzUzMWMsIDB4ZWUzNTM3ODMpO1xyXG5cclxuXHRcdHNCb3hbM10gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4OWRiMzA0MjAsIDB4MWZiNmU5ZGUsIDB4YTdiZTdiZWYsIDB4ZDI3M2EyOTgsIDB4NGE0ZjdiZGIsIDB4NjRhZDhjNTcsIDB4ODU1MTA0NDMsIDB4ZmEwMjBlZDEsXHJcblx0XHQgIDB4N2UyODdhZmYsIDB4ZTYwZmI2NjMsIDB4MDk1ZjM1YTEsIDB4NzllYmYxMjAsIDB4ZmQwNTlkNDMsIDB4NjQ5N2I3YjEsIDB4ZjM2NDFmNjMsIDB4MjQxZTRhZGYsXHJcblx0XHQgIDB4MjgxNDdmNWYsIDB4NGZhMmI4Y2QsIDB4Yzk0MzAwNDAsIDB4MGNjMzIyMjAsIDB4ZmRkMzBiMzAsIDB4YzBhNTM3NGYsIDB4MWQyZDAwZDksIDB4MjQxNDdiMTUsXHJcblx0XHQgIDB4ZWU0ZDExMWEsIDB4MGZjYTUxNjcsIDB4NzFmZjkwNGMsIDB4MmQxOTVmZmUsIDB4MWEwNTY0NWYsIDB4MGMxM2ZlZmUsIDB4MDgxYjA4Y2EsIDB4MDUxNzAxMjEsXHJcblx0XHQgIDB4ODA1MzAxMDAsIDB4ZTgzZTVlZmUsIDB4YWM5YWY0ZjgsIDB4N2ZlNzI3MDEsIDB4ZDJiOGVlNWYsIDB4MDZkZjQyNjEsIDB4YmI5ZTliOGEsIDB4NzI5M2VhMjUsXHJcblx0XHQgIDB4Y2U4NGZmZGYsIDB4ZjU3MTg4MDEsIDB4M2RkNjRiMDQsIDB4YTI2ZjI2M2IsIDB4N2VkNDg0MDAsIDB4NTQ3ZWViZTYsIDB4NDQ2ZDRjYTAsIDB4NmNmM2Q2ZjUsXHJcblx0XHQgIDB4MjY0OWFiZGYsIDB4YWVhMGM3ZjUsIDB4MzYzMzhjYzEsIDB4NTAzZjdlOTMsIDB4ZDM3NzIwNjEsIDB4MTFiNjM4ZTEsIDB4NzI1MDBlMDMsIDB4ZjgwZWIyYmIsXHJcblx0XHQgIDB4YWJlMDUwMmUsIDB4ZWM4ZDc3ZGUsIDB4NTc5NzFlODEsIDB4ZTE0ZjY3NDYsIDB4YzkzMzU0MDAsIDB4NjkyMDMxOGYsIDB4MDgxZGJiOTksIDB4ZmZjMzA0YTUsXHJcblx0XHQgIDB4NGQzNTE4MDUsIDB4N2YzZDVjZTMsIDB4YTZjODY2YzYsIDB4NWQ1YmNjYTksIDB4ZGFlYzZmZWEsIDB4OWY5MjZmOTEsIDB4OWY0NjIyMmYsIDB4Mzk5MTQ2N2QsXHJcblx0XHQgIDB4YTViZjZkOGUsIDB4MTE0M2M0NGYsIDB4NDM5NTgzMDIsIDB4ZDAyMTRlZWIsIDB4MDIyMDgzYjgsIDB4M2ZiNjE4MGMsIDB4MThmODkzMWUsIDB4MjgxNjU4ZTYsXHJcblx0XHQgIDB4MjY0ODZlM2UsIDB4OGJkNzhhNzAsIDB4NzQ3N2U0YzEsIDB4YjUwNmUwN2MsIDB4ZjMyZDBhMjUsIDB4NzkwOThiMDIsIDB4ZTRlYWJiODEsIDB4MjgxMjNiMjMsXHJcblx0XHQgIDB4NjlkZWFkMzgsIDB4MTU3NGNhMTYsIDB4ZGY4NzFiNjIsIDB4MjExYzQwYjcsIDB4YTUxYTllZjksIDB4MDAxNDM3N2IsIDB4MDQxZThhYzgsIDB4MDkxMTQwMDMsXHJcblx0XHQgIDB4YmQ1OWU0ZDIsIDB4ZTNkMTU2ZDUsIDB4NGZlODc2ZDUsIDB4MmY5MWEzNDAsIDB4NTU3YmU4ZGUsIDB4MDBlYWU0YTcsIDB4MGNlNWMyZWMsIDB4NGRiNGJiYTYsXHJcblx0XHQgIDB4ZTc1NmJkZmYsIDB4ZGQzMzY5YWMsIDB4ZWMxN2IwMzUsIDB4MDY1NzIzMjcsIDB4OTlhZmM4YjAsIDB4NTZjOGMzOTEsIDB4NmI2NTgxMWMsIDB4NWUxNDYxMTksXHJcblx0XHQgIDB4NmU4NWNiNzUsIDB4YmUwN2MwMDIsIDB4YzIzMjU1NzcsIDB4ODkzZmY0ZWMsIDB4NWJiZmM5MmQsIDB4ZDBlYzNiMjUsIDB4Yjc4MDFhYjcsIDB4OGQ2ZDNiMjQsXHJcblx0XHQgIDB4MjBjNzYzZWYsIDB4YzM2NmE1ZmMsIDB4OWMzODI4ODAsIDB4MGFjZTMyMDUsIDB4YWFjOTU0OGEsIDB4ZWNhMWQ3YzcsIDB4MDQxYWZhMzIsIDB4MWQxNjYyNWEsXHJcblx0XHQgIDB4NjcwMTkwMmMsIDB4OWI3NTdhNTQsIDB4MzFkNDc3ZjcsIDB4OTEyNmIwMzEsIDB4MzZjYzZmZGIsIDB4YzcwYjhiNDYsIDB4ZDllNjZhNDgsIDB4NTZlNTVhNzksXHJcblx0XHQgIDB4MDI2YTRjZWIsIDB4NTI0MzdlZmYsIDB4MmY4Zjc2YjQsIDB4MGRmOTgwYTUsIDB4ODY3NGNkZTMsIDB4ZWRkYTA0ZWIsIDB4MTdhOWJlMDQsIDB4MmMxOGY0ZGYsXHJcblx0XHQgIDB4Yjc3NDdmOWQsIDB4YWIyYWY3YjQsIDB4ZWZjMzRkMjAsIDB4MmUwOTZiN2MsIDB4MTc0MWEyNTQsIDB4ZTViNmEwMzUsIDB4MjEzZDQyZjYsIDB4MmMxYzdjMjYsXHJcblx0XHQgIDB4NjFjMmY1MGYsIDB4NjU1MmRhZjksIDB4ZDJjMjMxZjgsIDB4MjUxMzBmNjksIDB4ZDgxNjdmYTIsIDB4MDQxOGYyYzgsIDB4MDAxYTk2YTYsIDB4MGQxNTI2YWIsXHJcblx0XHQgIDB4NjMzMTVjMjEsIDB4NWUwYTcyZWMsIDB4NDliYWZlZmQsIDB4MTg3OTA4ZDksIDB4OGQwZGJkODYsIDB4MzExMTcwYTcsIDB4M2U5YjY0MGMsIDB4Y2MzZTEwZDcsXHJcblx0XHQgIDB4ZDVjYWQzYjYsIDB4MGNhZWMzODgsIDB4ZjczMDAxZTEsIDB4NmM3MjhhZmYsIDB4NzFlYWUyYTEsIDB4MWY5YWYzNmUsIDB4Y2ZjYmQxMmYsIDB4YzFkZTg0MTcsXHJcblx0XHQgIDB4YWMwN2JlNmIsIDB4Y2I0NGExZDgsIDB4OGI5YjBmNTYsIDB4MDEzOTg4YzMsIDB4YjFjNTJmY2EsIDB4YjRiZTMxY2QsIDB4ZDg3ODI4MDYsIDB4MTJhM2E0ZTIsXHJcblx0XHQgIDB4NmY3ZGU1MzIsIDB4NThmZDdlYjYsIDB4ZDAxZWU5MDAsIDB4MjRhZGZmYzIsIDB4ZjQ5OTBmYzUsIDB4OTcxMWFhYzUsIDB4MDAxZDdiOTUsIDB4ODJlNWU3ZDIsXHJcblx0XHQgIDB4MTA5ODczZjYsIDB4MDA2MTMwOTYsIDB4YzMyZDk1MjEsIDB4YWRhMTIxZmYsIDB4Mjk5MDg0MTUsIDB4N2ZiYjk3N2YsIDB4YWY5ZWIzZGIsIDB4MjljOWVkMmEsXHJcblx0XHQgIDB4NWNlMmE0NjUsIDB4YTczMGYzMmMsIDB4ZDBhYTNmZTgsIDB4OGE1Y2MwOTEsIDB4ZDQ5ZTJjZTcsIDB4MGNlNDU0YTksIDB4ZDYwYWNkODYsIDB4MDE1ZjE5MTksXHJcblx0XHQgIDB4NzcwNzkxMDMsIDB4ZGVhMDNhZjYsIDB4NzhhODU2NWUsIDB4ZGVlMzU2ZGYsIDB4MjFmMDVjYmUsIDB4OGI3NWUzODcsIDB4YjNjNTA2NTEsIDB4YjhhNWMzZWYsXHJcblx0XHQgIDB4ZDhlZWI2ZDIsIDB4ZTUyM2JlNzcsIDB4YzIxNTQ1MjksIDB4MmY2OWVmZGYsIDB4YWZlNjdhZmIsIDB4ZjQ3MGM0YjIsIDB4ZjNlMGViNWIsIDB4ZDZjYzk4NzYsXHJcblx0XHQgIDB4MzllNDQ2MGMsIDB4MWZkYTg1MzgsIDB4MTk4NzgzMmYsIDB4Y2EwMDczNjcsIDB4YTk5MTQ0ZjgsIDB4Mjk2YjI5OWUsIDB4NDkyZmMyOTUsIDB4OTI2NmJlYWIsXHJcblx0XHQgIDB4YjU2NzZlNjksIDB4OWJkM2RkZGEsIDB4ZGY3ZTA1MmYsIDB4ZGIyNTcwMWMsIDB4MWI1ZTUxZWUsIDB4ZjY1MzI0ZTYsIDB4NmFmY2UzNmMsIDB4MDMxNmNjMDQsXHJcblx0XHQgIDB4ODY0NDIxM2UsIDB4YjdkYzU5ZDAsIDB4Nzk2NTI5MWYsIDB4Y2NkNmZkNDMsIDB4NDE4MjM5NzksIDB4OTMyYmNkZjYsIDB4YjY1N2MzNGQsIDB4NGVkZmQyODIsXHJcblx0XHQgIDB4N2FlNTI5MGMsIDB4M2NiOTUzNmIsIDB4ODUxZTIwZmUsIDB4OTgzMzU1N2UsIDB4MTNlY2YwYjAsIDB4ZDNmZmIzNzIsIDB4M2Y4NWM1YzEsIDB4MGFlZjdlZDIpO1xyXG5cclxuXHRcdHNCb3hbNF0gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4N2VjOTBjMDQsIDB4MmM2ZTc0YjksIDB4OWIwZTY2ZGYsIDB4YTYzMzc5MTEsIDB4Yjg2YTdmZmYsIDB4MWRkMzU4ZjUsIDB4NDRkZDlkNDQsIDB4MTczMTE2N2YsXHJcblx0XHQgIDB4MDhmYmYxZmEsIDB4ZTdmNTExY2MsIDB4ZDIwNTFiMDAsIDB4NzM1YWJhMDAsIDB4MmFiNzIyZDgsIDB4Mzg2MzgxY2IsIDB4YWNmNjI0M2EsIDB4NjliZWZkN2EsXHJcblx0XHQgIDB4ZTZhMmU3N2YsIDB4ZjBjNzIwY2QsIDB4YzQ0OTQ4MTYsIDB4Y2NmNWMxODAsIDB4Mzg4NTE2NDAsIDB4MTViMGE4NDgsIDB4ZTY4YjE4Y2IsIDB4NGNhYWRlZmYsXHJcblx0XHQgIDB4NWY0ODBhMDEsIDB4MDQxMmIyYWEsIDB4MjU5ODE0ZmMsIDB4NDFkMGVmZTIsIDB4NGU0MGI0OGQsIDB4MjQ4ZWI2ZmIsIDB4OGRiYTFjZmUsIDB4NDFhOTliMDIsXHJcblx0XHQgIDB4MWE1NTBhMDQsIDB4YmE4ZjY1Y2IsIDB4NzI1MWY0ZTcsIDB4OTVhNTE3MjUsIDB4YzEwNmVjZDcsIDB4OTdhNTk4MGEsIDB4YzUzOWI5YWEsIDB4NGQ3OWZlNmEsXHJcblx0XHQgIDB4ZjJmM2Y3NjMsIDB4NjhhZjgwNDAsIDB4ZWQwYzllNTYsIDB4MTFiNDk1OGIsIDB4ZTFlYjVhODgsIDB4ODcwOWU2YjAsIDB4ZDdlMDcxNTYsIDB4NGUyOWZlYTcsXHJcblx0XHQgIDB4NjM2NmU1MmQsIDB4MDJkMWMwMDAsIDB4YzRhYzhlMDUsIDB4OTM3N2Y1NzEsIDB4MGMwNTM3MmEsIDB4NTc4NTM1ZjIsIDB4MjI2MWJlMDIsIDB4ZDY0MmEwYzksXHJcblx0XHQgIDB4ZGYxM2EyODAsIDB4NzRiNTViZDIsIDB4NjgyMTk5YzAsIDB4ZDQyMWU1ZWMsIDB4NTNmYjNjZTgsIDB4YzhhZGVkYjMsIDB4MjhhODdmYzksIDB4M2Q5NTk5ODEsXHJcblx0XHQgIDB4NWMxZmY5MDAsIDB4ZmUzOGQzOTksIDB4MGM0ZWZmMGIsIDB4MDYyNDA3ZWEsIDB4YWEyZjRmYjEsIDB4NGZiOTY5NzYsIDB4OTBjNzk1MDUsIDB4YjBhOGE3NzQsXHJcblx0XHQgIDB4ZWY1NWExZmYsIDB4ZTU5Y2EyYzIsIDB4YTZiNjJkMjcsIDB4ZTY2YTQyNjMsIDB4ZGY2NTAwMWYsIDB4MGVjNTA5NjYsIDB4ZGZkZDU1YmMsIDB4MjlkZTA2NTUsXHJcblx0XHQgIDB4OTExZTczOWEsIDB4MTdhZjg5NzUsIDB4MzJjNzkxMWMsIDB4ODlmODk0NjgsIDB4MGQwMWU5ODAsIDB4NTI0NzU1ZjQsIDB4MDNiNjNjYzksIDB4MGNjODQ0YjIsXHJcblx0XHQgIDB4YmNmM2YwYWEsIDB4ODdhYzM2ZTksIDB4ZTUzYTc0MjYsIDB4MDFiM2Q4MmIsIDB4MWE5ZTc0NDksIDB4NjRlZTJkN2UsIDB4Y2RkYmIxZGEsIDB4MDFjOTQ5MTAsXHJcblx0XHQgIDB4Yjg2OGJmODAsIDB4MGQyNmYzZmQsIDB4OTM0MmVkZTcsIDB4MDRhNWMyODQsIDB4NjM2NzM3YjYsIDB4NTBmNWI2MTYsIDB4ZjI0NzY2ZTMsIDB4OGVjYTM2YzEsXHJcblx0XHQgIDB4MTM2ZTA1ZGIsIDB4ZmVmMTgzOTEsIDB4ZmI4ODdhMzcsIDB4ZDZlN2Y3ZDQsIDB4YzdmYjdkYzksIDB4MzA2M2ZjZGYsIDB4YjZmNTg5ZGUsIDB4ZWMyOTQxZGEsXHJcblx0XHQgIDB4MjZlNDY2OTUsIDB4Yjc1NjY0MTksIDB4ZjY1NGVmYzUsIDB4ZDA4ZDU4YjcsIDB4NDg5MjU0MDEsIDB4YzFiYWNiN2YsIDB4ZTVmZjU1MGYsIDB4YjYwODMwNDksXHJcblx0XHQgIDB4NWJiNWQwZTgsIDB4ODdkNzJlNWEsIDB4YWI2YTZlZTEsIDB4MjIzYTY2Y2UsIDB4YzYyYmYzY2QsIDB4OWUwODg1ZjksIDB4NjhjYjNlNDcsIDB4MDg2YzAxMGYsXHJcblx0XHQgIDB4YTIxZGU4MjAsIDB4ZDE4YjY5ZGUsIDB4ZjNmNjU3NzcsIDB4ZmEwMmMzZjYsIDB4NDA3ZWRhYzMsIDB4Y2JiM2Q1NTAsIDB4MTc5MzA4NGQsIDB4YjBkNzBlYmEsXHJcblx0XHQgIDB4MGFiMzc4ZDUsIDB4ZDk1MWZiMGMsIDB4ZGVkN2RhNTYsIDB4NDEyNGJiZTQsIDB4OTRjYTBiNTYsIDB4MGY1NzU1ZDEsIDB4ZTBlMWU1NmUsIDB4NjE4NGI1YmUsXHJcblx0XHQgIDB4NTgwYTI0OWYsIDB4OTRmNzRiYzAsIDB4ZTMyNzg4OGUsIDB4OWY3YjU1NjEsIDB4YzNkYzAyODAsIDB4MDU2ODc3MTUsIDB4NjQ2YzZiZDcsIDB4NDQ5MDRkYjMsXHJcblx0XHQgIDB4NjZiNGYwYTMsIDB4YzBmMTY0OGEsIDB4Njk3ZWQ1YWYsIDB4NDllOTJmZjYsIDB4MzA5ZTM3NGYsIDB4MmNiNjM1NmEsIDB4ODU4MDg1NzMsIDB4NDk5MWY4NDAsXHJcblx0XHQgIDB4NzZmMGFlMDIsIDB4MDgzYmU4NGQsIDB4Mjg0MjFjOWEsIDB4NDQ0ODk0MDYsIDB4NzM2ZTRjYjgsIDB4YzEwOTI5MTAsIDB4OGJjOTVmYzYsIDB4N2Q4NjljZjQsXHJcblx0XHQgIDB4MTM0ZjYxNmYsIDB4MmU3NzExOGQsIDB4YjMxYjJiZTEsIDB4YWE5MGI0NzIsIDB4M2NhNWQ3MTcsIDB4N2QxNjFiYmEsIDB4OWNhZDkwMTAsIDB4YWY0NjJiYTIsXHJcblx0XHQgIDB4OWZlNDU5ZDIsIDB4NDVkMzQ1NTksIDB4ZDlmMmRhMTMsIDB4ZGJjNjU0ODcsIDB4ZjNlNGY5NGUsIDB4MTc2ZDQ4NmYsIDB4MDk3YzEzZWEsIDB4NjMxZGE1YzcsXHJcblx0XHQgIDB4NDQ1ZjczODIsIDB4MTc1NjgzZjQsIDB4Y2RjNjZhOTcsIDB4NzBiZTAyODgsIDB4YjNjZGNmNzIsIDB4NmU1ZGQyZjMsIDB4MjA5MzYwNzksIDB4NDU5YjgwYTUsXHJcblx0XHQgIDB4YmU2MGUyZGIsIDB4YTljMjMxMDEsIDB4ZWJhNTMxNWMsIDB4MjI0ZTQyZjIsIDB4MWM1YzE1NzIsIDB4ZjY3MjFiMmMsIDB4MWFkMmZmZjMsIDB4OGMyNTQwNGUsXHJcblx0XHQgIDB4MzI0ZWQ3MmYsIDB4NDA2N2I3ZmQsIDB4MDUyMzEzOGUsIDB4NWNhM2JjNzgsIDB4ZGMwZmQ2NmUsIDB4NzU5MjIyODMsIDB4Nzg0ZDZiMTcsIDB4NThlYmIxNmUsXHJcblx0XHQgIDB4NDQwOTRmODUsIDB4M2Y0ODFkODcsIDB4ZmNmZWFlN2IsIDB4NzdiNWZmNzYsIDB4OGMyMzAyYmYsIDB4YWFmNDc1NTYsIDB4NWY0NmIwMmEsIDB4MmIwOTI4MDEsXHJcblx0XHQgIDB4M2QzOGY1ZjcsIDB4MGNhODFmMzYsIDB4NTJhZjRhOGEsIDB4NjZkNWU3YzAsIDB4ZGYzYjA4NzQsIDB4OTUwNTUxMTAsIDB4MWI1YWQ3YTgsIDB4ZjYxZWQ1YWQsXHJcblx0XHQgIDB4NmNmNmU0NzksIDB4MjA3NTgxODQsIDB4ZDBjZWZhNjUsIDB4ODhmN2JlNTgsIDB4NGEwNDY4MjYsIDB4MGZmNmY4ZjMsIDB4YTA5YzdmNzAsIDB4NTM0NmFiYTAsXHJcblx0XHQgIDB4NWNlOTZjMjgsIDB4ZTE3NmVkYTMsIDB4NmJhYzMwN2YsIDB4Mzc2ODI5ZDIsIDB4ODUzNjBmYTksIDB4MTdlM2ZlMmEsIDB4MjRiNzk3NjcsIDB4ZjVhOTZiMjAsXHJcblx0XHQgIDB4ZDZjZDI1OTUsIDB4NjhmZjFlYmYsIDB4NzU1NTQ0MmMsIDB4ZjE5ZjA2YmUsIDB4ZjllMDY1OWEsIDB4ZWViOTQ5MWQsIDB4MzQwMTA3MTgsIDB4YmIzMGNhYjgsXHJcblx0XHQgIDB4ZTgyMmZlMTUsIDB4ODg1NzA5ODMsIDB4NzUwZTYyNDksIDB4ZGE2MjdlNTUsIDB4NWU3NmZmYTgsIDB4YjE1MzQ1NDYsIDB4NmQ0N2RlMDgsIDB4ZWZlOWU3ZDQpO1xyXG5cclxuXHRcdHNCb3hbNV0gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4ZjZmYThmOWQsIDB4MmNhYzZjZTEsIDB4NGNhMzQ4NjcsIDB4ZTIzMzdmN2MsIDB4OTVkYjA4ZTcsIDB4MDE2ODQzYjQsIDB4ZWNlZDVjYmMsIDB4MzI1NTUzYWMsXHJcblx0XHQgIDB4YmY5ZjA5NjAsIDB4ZGZhMWUyZWQsIDB4ODNmMDU3OWQsIDB4NjNlZDg2YjksIDB4MWFiNmE2YjgsIDB4ZGU1ZWJlMzksIDB4ZjM4ZmY3MzIsIDB4ODk4OWIxMzgsXHJcblx0XHQgIDB4MzNmMTQ5NjEsIDB4YzAxOTM3YmQsIDB4ZjUwNmM2ZGEsIDB4ZTQ2MjVlN2UsIDB4YTMwOGVhOTksIDB4NGUyM2UzM2MsIDB4NzljYmQ3Y2MsIDB4NDhhMTQzNjcsXHJcblx0XHQgIDB4YTMxNDk2MTksIDB4ZmVjOTRiZDUsIDB4YTExNDE3NGEsIDB4ZWFhMDE4NjYsIDB4YTA4NGRiMmQsIDB4MDlhODQ4NmYsIDB4YTg4ODYxNGEsIDB4MjkwMGFmOTgsXHJcblx0XHQgIDB4MDE2NjU5OTEsIDB4ZTE5OTI4NjMsIDB4YzhmMzBjNjAsIDB4MmU3OGVmM2MsIDB4ZDBkNTE5MzIsIDB4Y2YwZmVjMTQsIDB4ZjdjYTA3ZDIsIDB4ZDBhODIwNzIsXHJcblx0XHQgIDB4ZmQ0MTE5N2UsIDB4OTMwNWE2YjAsIDB4ZTg2YmUzZGEsIDB4NzRiZWQzY2QsIDB4MzcyZGE1M2MsIDB4NGM3ZjQ0NDgsIDB4ZGFiNWQ0NDAsIDB4NmRiYTBlYzMsXHJcblx0XHQgIDB4MDgzOTE5YTcsIDB4OWZiYWVlZDksIDB4NDlkYmNmYjAsIDB4NGU2NzBjNTMsIDB4NWMzZDljMDEsIDB4NjRiZGI5NDEsIDB4MmMwZTYzNmEsIDB4YmE3ZGQ5Y2QsXHJcblx0XHQgIDB4ZWE2ZjczODgsIDB4ZTcwYmM3NjIsIDB4MzVmMjlhZGIsIDB4NWM0Y2RkOGQsIDB4ZjBkNDhkOGMsIDB4Yjg4MTUzZTIsIDB4MDhhMTk4NjYsIDB4MWFlMmVhYzgsXHJcblx0XHQgIDB4Mjg0Y2FmODksIDB4YWE5MjgyMjMsIDB4OTMzNGJlNTMsIDB4M2IzYTIxYmYsIDB4MTY0MzRiZTMsIDB4OWFlYTM5MDYsIDB4ZWZlOGMzNmUsIDB4Zjg5MGNkZDksXHJcblx0XHQgIDB4ODAyMjZkYWUsIDB4YzM0MGE0YTMsIDB4ZGY3ZTljMDksIDB4YTY5NGE4MDcsIDB4NWI3YzVlY2MsIDB4MjIxZGIzYTYsIDB4OWE2OWEwMmYsIDB4Njg4MThhNTQsXHJcblx0XHQgIDB4Y2ViMjI5NmYsIDB4NTNjMDg0M2EsIDB4ZmU4OTM2NTUsIDB4MjViZmU2OGEsIDB4YjQ2MjhhYmMsIDB4Y2YyMjJlYmYsIDB4MjVhYzZmNDgsIDB4YTlhOTkzODcsXHJcblx0XHQgIDB4NTNiZGRiNjUsIDB4ZTc2ZmZiZTcsIDB4ZTk2N2ZkNzgsIDB4MGJhOTM1NjMsIDB4OGUzNDJiYzEsIDB4ZThhMTFiZTksIDB4NDk4MDc0MGQsIDB4YzgwODdkZmMsXHJcblx0XHQgIDB4OGRlNGJmOTksIDB4YTExMTAxYTAsIDB4N2ZkMzc5NzUsIDB4ZGE1YTI2YzAsIDB4ZTgxZjk5NGYsIDB4OTUyOGNkODksIDB4ZmQzMzlmZWQsIDB4Yjg3ODM0YmYsXHJcblx0XHQgIDB4NWYwNDQ1NmQsIDB4MjIyNTg2OTgsIDB4YzljNGM4M2IsIDB4MmRjMTU2YmUsIDB4NGY2MjhkYWEsIDB4NTdmNTVlYzUsIDB4ZTIyMjBhYmUsIDB4ZDI5MTZlYmYsXHJcblx0XHQgIDB4NGVjNzViOTUsIDB4MjRmMmMzYzAsIDB4NDJkMTVkOTksIDB4Y2QwZDdmYTAsIDB4N2I2ZTI3ZmYsIDB4YThkYzhhZjAsIDB4NzM0NWMxMDYsIDB4ZjQxZTIzMmYsXHJcblx0XHQgIDB4MzUxNjIzODYsIDB4ZTZlYTg5MjYsIDB4MzMzM2IwOTQsIDB4MTU3ZWM2ZjIsIDB4MzcyYjc0YWYsIDB4NjkyNTczZTQsIDB4ZTlhOWQ4NDgsIDB4ZjMxNjAyODksXHJcblx0XHQgIDB4M2E2MmVmMWQsIDB4YTc4N2UyMzgsIDB4ZjNhNWY2NzYsIDB4NzQzNjQ4NTMsIDB4MjA5NTEwNjMsIDB4NDU3NjY5OGQsIDB4YjZmYWQ0MDcsIDB4NTkyYWY5NTAsXHJcblx0XHQgIDB4MzZmNzM1MjMsIDB4NGNmYjZlODcsIDB4N2RhNGNlYzAsIDB4NmMxNTJkYWEsIDB4Y2IwMzk2YTgsIDB4YzUwZGZlNWQsIDB4ZmNkNzA3YWIsIDB4MDkyMWM0MmYsXHJcblx0XHQgIDB4ODlkZmYwYmIsIDB4NWZlMmJlNzgsIDB4NDQ4ZjRmMzMsIDB4NzU0NjEzYzksIDB4MmIwNWQwOGQsIDB4NDhiOWQ1ODUsIDB4ZGMwNDk0NDEsIDB4YzgwOThmOWIsXHJcblx0XHQgIDB4N2RlZGU3ODYsIDB4YzM5YTMzNzMsIDB4NDI0MTAwMDUsIDB4NmEwOTE3NTEsIDB4MGVmM2M4YTYsIDB4ODkwMDcyZDYsIDB4MjgyMDc2ODIsIDB4YTlhOWY3YmUsXHJcblx0XHQgIDB4YmYzMjY3OWQsIDB4ZDQ1YjViNzUsIDB4YjM1M2ZkMDAsIDB4Y2JiMGUzNTgsIDB4ODMwZjIyMGEsIDB4MWY4ZmIyMTQsIDB4ZDM3MmNmMDgsIDB4Y2MzYzRhMTMsXHJcblx0XHQgIDB4OGNmNjMxNjYsIDB4MDYxYzg3YmUsIDB4ODhjOThmODgsIDB4NjA2MmUzOTcsIDB4NDdjZjhlN2EsIDB4YjZjODUyODMsIDB4M2NjMmFjZmIsIDB4M2ZjMDY5NzYsXHJcblx0XHQgIDB4NGU4ZjAyNTIsIDB4NjRkODMxNGQsIDB4ZGEzODcwZTMsIDB4MWU2NjU0NTksIDB4YzEwOTA4ZjAsIDB4NTEzMDIxYTUsIDB4NmM1YjY4YjcsIDB4ODIyZjhhYTAsXHJcblx0XHQgIDB4MzAwN2NkM2UsIDB4NzQ3MTllZWYsIDB4ZGM4NzI2ODEsIDB4MDczMzQwZDQsIDB4N2U0MzJmZDksIDB4MGM1ZWMyNDEsIDB4ODgwOTI4NmMsIDB4ZjU5MmQ4OTEsXHJcblx0XHQgIDB4MDhhOTMwZjYsIDB4OTU3ZWYzMDUsIDB4YjdmYmZmYmQsIDB4YzI2NmU5NmYsIDB4NmZlNGFjOTgsIDB4YjE3M2VjYzAsIDB4YmM2MGI0MmEsIDB4OTUzNDk4ZGEsXHJcblx0XHQgIDB4ZmJhMWFlMTIsIDB4MmQ0YmQ3MzYsIDB4MGYyNWZhYWIsIDB4YTRmM2ZjZWIsIDB4ZTI5NjkxMjMsIDB4MjU3ZjBjM2QsIDB4OTM0OGFmNDksIDB4MzYxNDAwYmMsXHJcblx0XHQgIDB4ZTg4MTZmNGEsIDB4MzgxNGYyMDAsIDB4YTNmOTQwNDMsIDB4OWM3YTU0YzIsIDB4YmM3MDRmNTcsIDB4ZGE0MWU3ZjksIDB4YzI1YWQzM2EsIDB4NTRmNGEwODQsXHJcblx0XHQgIDB4YjE3ZjU1MDUsIDB4NTkzNTdjYmUsIDB4ZWRiZDE1YzgsIDB4N2Y5N2M1YWIsIDB4YmE1YWM3YjUsIDB4YjZmNmRlYWYsIDB4M2E0NzljM2EsIDB4NTMwMmRhMjUsXHJcblx0XHQgIDB4NjUzZDdlNmEsIDB4NTQyNjhkNDksIDB4NTFhNDc3ZWEsIDB4NTAxN2Q1NWIsIDB4ZDdkMjVkODgsIDB4NDQxMzZjNzYsIDB4MDQwNGE4YzgsIDB4YjhlNWExMjEsXHJcblx0XHQgIDB4YjgxYTkyOGEsIDB4NjBlZDU4NjksIDB4OTdjNTViOTYsIDB4ZWFlYzk5MWIsIDB4Mjk5MzU5MTMsIDB4MDFmZGI3ZjEsIDB4MDg4ZThkZmEsIDB4OWFiNmY2ZjUsXHJcblx0XHQgIDB4M2I0Y2JmOWYsIDB4NGE1ZGUzYWIsIDB4ZTYwNTFkMzUsIDB4YTBlMWQ4NTUsIDB4ZDM2YjRjZjEsIDB4ZjU0NGVkZWIsIDB4YjBlOTM1MjQsIDB4YmViYjhmYmQsXHJcblx0XHQgIDB4YTJkNzYyY2YsIDB4NDljOTJmNTQsIDB4MzhiNWYzMzEsIDB4NzEyOGE0NTQsIDB4NDgzOTI5MDUsIDB4YTY1YjFkYjgsIDB4ODUxYzk3YmQsIDB4ZDY3NWNmMmYpO1xyXG5cclxuXHRcdHNCb3hbNl0gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4ODVlMDQwMTksIDB4MzMyYmY1NjcsIDB4NjYyZGJmZmYsIDB4Y2ZjNjU2OTMsIDB4MmE4ZDdmNmYsIDB4YWI5YmM5MTIsIDB4ZGU2MDA4YTEsIDB4MjAyOGRhMWYsXHJcblx0XHQgIDB4MDIyN2JjZTcsIDB4NGQ2NDI5MTYsIDB4MThmYWMzMDAsIDB4NTBmMThiODIsIDB4MmNiMmNiMTEsIDB4YjIzMmU3NWMsIDB4NGIzNjk1ZjIsIDB4YjI4NzA3ZGUsXHJcblx0XHQgIDB4YTA1ZmJjZjYsIDB4Y2Q0MTgxZTksIDB4ZTE1MDIxMGMsIDB4ZTI0ZWYxYmQsIDB4YjE2OGMzODEsIDB4ZmRlNGU3ODksIDB4NWM3OWIwZDgsIDB4MWU4YmZkNDMsXHJcblx0XHQgIDB4NGQ0OTUwMDEsIDB4MzhiZTQzNDEsIDB4OTEzY2VlMWQsIDB4OTJhNzljM2YsIDB4MDg5NzY2YmUsIDB4YmFlZWFkZjQsIDB4MTI4NmJlY2YsIDB4YjZlYWNiMTksXHJcblx0XHQgIDB4MjY2MGMyMDAsIDB4NzU2NWJkZTQsIDB4NjQyNDFmN2EsIDB4ODI0OGRjYTksIDB4YzNiM2FkNjYsIDB4MjgxMzYwODYsIDB4MGJkOGRmYTgsIDB4MzU2ZDFjZjIsXHJcblx0XHQgIDB4MTA3Nzg5YmUsIDB4YjNiMmU5Y2UsIDB4MDUwMmFhOGYsIDB4MGJjMDM1MWUsIDB4MTY2YmY1MmEsIDB4ZWIxMmZmODIsIDB4ZTM0ODY5MTEsIDB4ZDM0ZDc1MTYsXHJcblx0XHQgIDB4NGU3YjNhZmYsIDB4NWY0MzY3MWIsIDB4OWNmNmUwMzcsIDB4NDk4MWFjODMsIDB4MzM0MjY2Y2UsIDB4OGM5MzQxYjcsIDB4ZDBkODU0YzAsIDB4Y2IzYTZjODgsXHJcblx0XHQgIDB4NDdiYzI4MjksIDB4NDcyNWJhMzcsIDB4YTY2YWQyMmIsIDB4N2FkNjFmMWUsIDB4MGM1Y2JhZmEsIDB4NDQzN2YxMDcsIDB4YjZlNzk5NjIsIDB4NDJkMmQ4MTYsXHJcblx0XHQgIDB4MGE5NjEyODgsIDB4ZTFhNWMwNmUsIDB4MTM3NDllNjcsIDB4NzJmYzA4MWEsIDB4YjFkMTM5ZjcsIDB4Zjk1ODM3NDUsIDB4Y2YxOWRmNTgsIDB4YmVjM2Y3NTYsXHJcblx0XHQgIDB4YzA2ZWJhMzAsIDB4MDcyMTFiMjQsIDB4NDVjMjg4MjksIDB4Yzk1ZTMxN2YsIDB4YmM4ZWM1MTEsIDB4MzhiYzQ2ZTksIDB4YzZlNmZhMTQsIDB4YmFlODU4NGEsXHJcblx0XHQgIDB4YWQ0ZWJjNDYsIDB4NDY4ZjUwOGIsIDB4NzgyOTQzNWYsIDB4ZjEyNDE4M2IsIDB4ODIxZGJhOWYsIDB4YWZmNjBmZjQsIDB4ZWEyYzRlNmQsIDB4MTZlMzkyNjQsXHJcblx0XHQgIDB4OTI1NDRhOGIsIDB4MDA5YjRmYzMsIDB4YWJhNjhjZWQsIDB4OWFjOTZmNzgsIDB4MDZhNWI3OWEsIDB4YjI4NTZlNmUsIDB4MWFlYzNjYTksIDB4YmU4Mzg2ODgsXHJcblx0XHQgIDB4MGUwODA0ZTksIDB4NTVmMWJlNTYsIDB4ZTdlNTM2M2IsIDB4YjNhMWYyNWQsIDB4ZjdkZWJiODUsIDB4NjFmZTAzM2MsIDB4MTY3NDYyMzMsIDB4M2MwMzRjMjgsXHJcblx0XHQgIDB4ZGE2ZDBjNzQsIDB4NzlhYWM1NmMsIDB4M2NlNGUxYWQsIDB4NTFmMGM4MDIsIDB4OThmOGYzNWEsIDB4MTYyNmE0OWYsIDB4ZWVkODJiMjksIDB4MWQzODJmZTMsXHJcblx0XHQgIDB4MGM0ZmI5OWEsIDB4YmIzMjU3NzgsIDB4M2VjNmQ5N2IsIDB4NmU3N2E2YTksIDB4Y2I2NThiNWMsIDB4ZDQ1MjMwYzcsIDB4MmJkMTQwOGIsIDB4NjBjMDNlYjcsXHJcblx0XHQgIDB4YjkwNjhkNzgsIDB4YTMzNzU0ZjQsIDB4ZjQzMGM4N2QsIDB4YzhhNzEzMDIsIDB4Yjk2ZDhjMzIsIDB4ZWJkNGU3YmUsIDB4YmU4YjlkMmQsIDB4Nzk3OWZiMDYsXHJcblx0XHQgIDB4ZTcyMjUzMDgsIDB4OGI3NWNmNzcsIDB4MTFlZjhkYTQsIDB4ZTA4M2M4NTgsIDB4OGQ2Yjc4NmYsIDB4NWE2MzE3YTYsIDB4ZmE1Y2Y3YTAsIDB4NWRkYTAwMzMsXHJcblx0XHQgIDB4ZjI4ZWJmYjAsIDB4ZjViOWMzMTAsIDB4YTBlYWMyODAsIDB4MDhiOTc2N2EsIDB4YTNkOWQyYjAsIDB4NzlkMzQyMTcsIDB4MDIxYTcxOGQsIDB4OWFjNjMzNmEsXHJcblx0XHQgIDB4MjcxMWZkNjAsIDB4NDM4MDUwZTMsIDB4MDY5OTA4YTgsIDB4M2Q3ZmVkYzQsIDB4ODI2ZDJiZWYsIDB4NGVlYjg0NzYsIDB4NDg4ZGNmMjUsIDB4MzZjOWQ1NjYsXHJcblx0XHQgIDB4MjhlNzRlNDEsIDB4YzI2MTBhY2EsIDB4M2Q0OWE5Y2YsIDB4YmFlM2I5ZGYsIDB4YjY1ZjhkZTYsIDB4OTJhZWFmNjQsIDB4M2FjN2Q1ZTYsIDB4OWVhODA1MDksXHJcblx0XHQgIDB4ZjIyYjAxN2QsIDB4YTQxNzNmNzAsIDB4ZGQxZTE2YzMsIDB4MTVlMGQ3ZjksIDB4NTBiMWI4ODcsIDB4MmI5ZjRmZDUsIDB4NjI1YWJhODIsIDB4NmEwMTc5NjIsXHJcblx0XHQgIDB4MmVjMDFiOWMsIDB4MTU0ODhhYTksIDB4ZDcxNmU3NDAsIDB4NDAwNTVhMmMsIDB4OTNkMjlhMjIsIDB4ZTMyZGJmOWEsIDB4MDU4NzQ1YjksIDB4MzQ1M2RjMWUsXHJcblx0XHQgIDB4ZDY5OTI5NmUsIDB4NDk2Y2ZmNmYsIDB4MWM5ZjQ5ODYsIDB4ZGZlMmVkMDcsIDB4Yjg3MjQyZDEsIDB4MTlkZTdlYWUsIDB4MDUzZTU2MWEsIDB4MTVhZDZmOGMsXHJcblx0XHQgIDB4NjY2MjZjMWMsIDB4NzE1NGMyNGMsIDB4ZWEwODJiMmEsIDB4OTNlYjI5MzksIDB4MTdkY2IwZjAsIDB4NThkNGYyYWUsIDB4OWVhMjk0ZmIsIDB4NTJjZjU2NGMsXHJcblx0XHQgIDB4OTg4M2ZlNjYsIDB4MmVjNDA1ODEsIDB4NzYzOTUzYzMsIDB4MDFkNjY5MmUsIDB4ZDNhMGMxMDgsIDB4YTFlNzE2MGUsIDB4ZTRmMmRmYTYsIDB4NjkzZWQyODUsXHJcblx0XHQgIDB4NzQ5MDQ2OTgsIDB4NGMyYjBlZGQsIDB4NGY3NTc2NTYsIDB4NWQzOTMzNzgsIDB4YTEzMjIzNGYsIDB4M2QzMjFjNWQsIDB4YzNmNWUxOTQsIDB4NGIyNjkzMDEsXHJcblx0XHQgIDB4Yzc5ZjAyMmYsIDB4M2M5OTdlN2UsIDB4NWU0Zjk1MDQsIDB4M2ZmYWZiYmQsIDB4NzZmN2FkMGUsIDB4Mjk2NjkzZjQsIDB4M2QxZmNlNmYsIDB4YzYxZTQ1YmUsXHJcblx0XHQgIDB4ZDNiNWFiMzQsIDB4ZjcyYmY5YjcsIDB4MWIwNDM0YzAsIDB4NGU3MmI1NjcsIDB4NTU5MmEzM2QsIDB4YjUyMjkzMDEsIDB4Y2ZkMmE4N2YsIDB4NjBhZWI3NjcsXHJcblx0XHQgIDB4MTgxNDM4NmIsIDB4MzBiY2MzM2QsIDB4MzhhMGMwN2QsIDB4ZmQxNjA2ZjIsIDB4YzM2MzUxOWIsIDB4NTg5ZGQzOTAsIDB4NTQ3OWY4ZTYsIDB4MWNiOGQ2NDcsXHJcblx0XHQgIDB4OTdmZDYxYTksIDB4ZWE3NzU5ZjQsIDB4MmQ1NzUzOWQsIDB4NTY5YTU4Y2YsIDB4ZTg0ZTYzYWQsIDB4NDYyZTFiNzgsIDB4NjU4MGY4N2UsIDB4ZjM4MTc5MTQsXHJcblx0XHQgIDB4OTFkYTU1ZjQsIDB4NDBhMjMwZjMsIDB4ZDE5ODhmMzUsIDB4YjZlMzE4ZDIsIDB4M2ZmYTUwYmMsIDB4M2Q0MGYwMjEsIDB4YzNjMGJkYWUsIDB4NDk1OGMyNGMsXHJcblx0XHQgIDB4NTE4ZjM2YjIsIDB4ODRiMWQzNzAsIDB4MGZlZGNlODMsIDB4ODc4ZGRhZGEsIDB4ZjJhMjc5YzcsIDB4OTRlMDFiZTgsIDB4OTA3MTZmNGIsIDB4OTU0YjhhYTMpO1xyXG5cclxuXHRcdHNCb3hbN10gPSBuZXcgQXJyYXkoXHJcblx0XHQgIDB4ZTIxNjMwMGQsIDB4YmJkZGZmZmMsIDB4YTdlYmRhYmQsIDB4MzU2NDgwOTUsIDB4Nzc4OWY4YjcsIDB4ZTZjMTEyMWIsIDB4MGUyNDE2MDAsIDB4MDUyY2U4YjUsXHJcblx0XHQgIDB4MTFhOWNmYjAsIDB4ZTU5NTJmMTEsIDB4ZWNlNzk5MGEsIDB4OTM4NmQxNzQsIDB4MmE0MjkzMWMsIDB4NzZlMzgxMTEsIDB4YjEyZGVmM2EsIDB4MzdkZGRkZmMsXHJcblx0XHQgIDB4ZGU5YWRlYjEsIDB4MGEwY2MzMmMsIDB4YmUxOTcwMjksIDB4ODRhMDA5NDAsIDB4YmIyNDNhMGYsIDB4YjRkMTM3Y2YsIDB4YjQ0ZTc5ZjAsIDB4MDQ5ZWVkZmQsXHJcblx0XHQgIDB4MGIxNWExNWQsIDB4NDgwZDMxNjgsIDB4OGJiYmRlNWEsIDB4NjY5ZGVkNDIsIDB4YzdlY2U4MzEsIDB4M2Y4Zjk1ZTcsIDB4NzJkZjE5MWIsIDB4NzU4MDMzMGQsXHJcblx0XHQgIDB4OTQwNzQyNTEsIDB4NWM3ZGNkZmEsIDB4YWJiZTZkNjMsIDB4YWE0MDIxNjQsIDB4YjMwMWQ0MGEsIDB4MDJlN2QxY2EsIDB4NTM1NzFkYWUsIDB4N2EzMTgyYTIsXHJcblx0XHQgIDB4MTJhOGRkZWMsIDB4ZmRhYTMzNWQsIDB4MTc2ZjQzZTgsIDB4NzFmYjQ2ZDQsIDB4MzgxMjkwMjIsIDB4Y2U5NDlhZDQsIDB4Yjg0NzY5YWQsIDB4OTY1YmQ4NjIsXHJcblx0XHQgIDB4ODJmM2QwNTUsIDB4NjZmYjk3NjcsIDB4MTViODBiNGUsIDB4MWQ1YjQ3YTAsIDB4NGNmZGUwNmYsIDB4YzI4ZWM0YjgsIDB4NTdlODcyNmUsIDB4NjQ3YTc4ZmMsXHJcblx0XHQgIDB4OTk4NjVkNDQsIDB4NjA4YmQ1OTMsIDB4NmMyMDBlMDMsIDB4MzlkYzVmZjYsIDB4NWQwYjAwYTMsIDB4YWU2M2FmZjIsIDB4N2U4YmQ2MzIsIDB4NzAxMDhjMGMsXHJcblx0XHQgIDB4YmJkMzUwNDksIDB4Mjk5OGRmMDQsIDB4OTgwY2Y0MmEsIDB4OWI2ZGY0OTEsIDB4OWU3ZWRkNTMsIDB4MDY5MTg1NDgsIDB4NThjYjdlMDcsIDB4M2I3NGVmMmUsXHJcblx0XHQgIDB4NTIyZmZmYjEsIDB4ZDI0NzA4Y2MsIDB4MWM3ZTI3Y2QsIDB4YTRlYjIxNWIsIDB4M2NmMWQyZTIsIDB4MTliNDdhMzgsIDB4NDI0Zjc2MTgsIDB4MzU4NTYwMzksXHJcblx0XHQgIDB4OWQxN2RlZTcsIDB4MjdlYjM1ZTYsIDB4YzlhZmY2N2IsIDB4MzZiYWY1YjgsIDB4MDljNDY3Y2QsIDB4YzE4OTEwYjEsIDB4ZTExZGJmN2IsIDB4MDZjZDFhZjgsXHJcblx0XHQgIDB4NzE3MGM2MDgsIDB4MmQ1ZTMzNTQsIDB4ZDRkZTQ5NWEsIDB4NjRjNmQwMDYsIDB4YmNjMGM2MmMsIDB4M2RkMDBkYjMsIDB4NzA4ZjhmMzQsIDB4NzdkNTFiNDIsXHJcblx0XHQgIDB4MjY0ZjYyMGYsIDB4MjRiOGQyYmYsIDB4MTVjMWI3OWUsIDB4NDZhNTI1NjQsIDB4ZjhkN2U1NGUsIDB4M2UzNzgxNjAsIDB4Nzg5NWNkYTUsIDB4ODU5YzE1YTUsXHJcblx0XHQgIDB4ZTY0NTk3ODgsIDB4YzM3YmM3NWYsIDB4ZGIwN2JhMGMsIDB4MDY3NmEzYWIsIDB4N2YyMjliMWUsIDB4MzE4NDJlN2IsIDB4MjQyNTlmZDcsIDB4ZjhiZWY0NzIsXHJcblx0XHQgIDB4ODM1ZmZjYjgsIDB4NmRmNGMxZjIsIDB4OTZmNWIxOTUsIDB4ZmQwYWYwZmMsIDB4YjBmZTEzNGMsIDB4ZTI1MDZkM2QsIDB4NGY5YjEyZWEsIDB4ZjIxNWYyMjUsXHJcblx0XHQgIDB4YTIyMzczNmYsIDB4OWZiNGM0MjgsIDB4MjVkMDQ5NzksIDB4MzRjNzEzZjgsIDB4YzQ2MTgxODcsIDB4ZWE3YTZlOTgsIDB4N2NkMTZlZmMsIDB4MTQzNjg3NmMsXHJcblx0XHQgIDB4ZjE1NDQxMDcsIDB4YmVkZWVlMTQsIDB4NTZlOWFmMjcsIDB4YTA0YWE0NDEsIDB4M2NmN2M4OTksIDB4OTJlY2JhZTYsIDB4ZGQ2NzAxNmQsIDB4MTUxNjgyZWIsXHJcblx0XHQgIDB4YTg0MmVlZGYsIDB4ZmRiYTYwYjQsIDB4ZjE5MDdiNzUsIDB4MjBlMzAzMGYsIDB4MjRkOGMyOWUsIDB4ZTEzOTY3M2IsIDB4ZWZhNjNmYjgsIDB4NzE4NzMwNTQsXHJcblx0XHQgIDB4YjZmMmNmM2IsIDB4OWYzMjY0NDIsIDB4Y2IxNWE0Y2MsIDB4YjAxYTQ1MDQsIDB4ZjFlNDdkOGQsIDB4ODQ0YTFiZTUsIDB4YmFlN2RmZGMsIDB4NDJjYmRhNzAsXHJcblx0XHQgIDB4Y2Q3ZGFlMGEsIDB4NTdlODViN2EsIDB4ZDUzZjVhZjYsIDB4MjBjZjRkOGMsIDB4Y2VhNGQ0MjgsIDB4NzlkMTMwYTQsIDB4MzQ4NmViZmIsIDB4MzNkM2NkZGMsXHJcblx0XHQgIDB4Nzc4NTNiNTMsIDB4MzdlZmZjYjUsIDB4YzUwNjg3NzgsIDB4ZTU4MGIzZTYsIDB4NGU2OGI4ZjQsIDB4YzVjOGIzN2UsIDB4MGQ4MDllYTIsIDB4Mzk4ZmViN2MsXHJcblx0XHQgIDB4MTMyYTRmOTQsIDB4NDNiNzk1MGUsIDB4MmZlZTdkMWMsIDB4MjIzNjEzYmQsIDB4ZGQwNmNhYTIsIDB4MzdkZjkzMmIsIDB4YzQyNDgyODksIDB4YWNmM2ViYzMsXHJcblx0XHQgIDB4NTcxNWY2YjcsIDB4ZWYzNDc4ZGQsIDB4ZjI2NzYxNmYsIDB4YzE0OGNiZTQsIDB4OTA1MjgxNWUsIDB4NWU0MTBmYWIsIDB4YjQ4YTI0NjUsIDB4MmVkYTdmYTQsXHJcblx0XHQgIDB4ZTg3YjQwZTQsIDB4ZTk4ZWEwODQsIDB4NTg4OWU5ZTEsIDB4ZWZkMzkwZmMsIDB4ZGQwN2QzNWIsIDB4ZGI0ODU2OTQsIDB4MzhkN2U1YjIsIDB4NTc3MjAxMDEsXHJcblx0XHQgIDB4NzMwZWRlYmMsIDB4NWI2NDMxMTMsIDB4OTQ5MTdlNGYsIDB4NTAzYzJmYmEsIDB4NjQ2ZjEyODIsIDB4NzUyM2QyNGEsIDB4ZTA3Nzk2OTUsIDB4ZjljMTdhOGYsXHJcblx0XHQgIDB4N2E1YjIxMjEsIDB4ZDE4N2I4OTYsIDB4MjkyNjNhNGQsIDB4YmE1MTBjZGYsIDB4ODFmNDdjOWYsIDB4YWQxMTYzZWQsIDB4ZWE3YjU5NjUsIDB4MWEwMDcyNmUsXHJcblx0XHQgIDB4MTE0MDMwOTIsIDB4MDBkYTZkNzcsIDB4NGEwY2RkNjEsIDB4YWQxZjQ2MDMsIDB4NjA1YmRmYjAsIDB4OWVlZGMzNjQsIDB4MjJlYmU2YTgsIDB4Y2VlN2QyOGEsXHJcblx0XHQgIDB4YTBlNzM2YTAsIDB4NTU2NGE2YjksIDB4MTA4NTMyMDksIDB4YzdlYjhmMzcsIDB4MmRlNzA1Y2EsIDB4ODk1MTU3MGYsIDB4ZGYwOTgyMmIsIDB4YmQ2OTFhNmMsXHJcblx0XHQgIDB4YWExMmU0ZjIsIDB4ODc0NTFjMGYsIDB4ZTBmNmEyN2EsIDB4M2FkYTQ4MTksIDB4NGNmMTc2NGYsIDB4MGQ3NzFjMmIsIDB4NjdjZGIxNTYsIDB4MzUwZDgzODQsXHJcblx0XHQgIDB4NTkzOGZhMGYsIDB4NDIzOTllZjMsIDB4MzY5OTdiMDcsIDB4MGU4NDA5M2QsIDB4NGFhOTNlNjEsIDB4ODM2MGQ4N2IsIDB4MWZhOThiMGMsIDB4MTE0OTM4MmMsXHJcblx0XHQgIDB4ZTk3NjI1YTUsIDB4MDYxNGQxYjcsIDB4MGUyNTI0NGIsIDB4MGM3NjgzNDcsIDB4NTg5ZThkODIsIDB4MGQyMDU5ZDEsIDB4YTQ2NmJiMWUsIDB4ZjhkYTBhODIsXHJcblx0XHQgIDB4MDRmMTkxMzAsIDB4YmE2ZTRlYzAsIDB4OTkyNjUxNjQsIDB4MWVlNzIzMGQsIDB4NTBiMmFkODAsIDB4ZWFlZTY4MDEsIDB4OGRiMmEyODMsIDB4ZWE4YmY1OWUpO1xyXG5cclxufTtcclxuXHJcbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbCcpO1xyXG5cclxuZnVuY3Rpb24gY2FzdDUoa2V5KSB7XHJcblx0dGhpcy5jYXN0NSA9IG5ldyBvcGVucGdwX3N5bWVuY19jYXN0NSgpO1xyXG5cdHRoaXMuY2FzdDUuc2V0S2V5KHV0aWwuc3RyMmJpbihrZXkpKTtcclxuXHJcblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oYmxvY2spIHtcclxuXHRcdHJldHVybiB0aGlzLmNhc3Q1LmVuY3J5cHQoYmxvY2spO1xyXG5cdH1cclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjYXN0NTtcclxubW9kdWxlLmV4cG9ydHMuYmxvY2tTaXplID0gY2FzdDUucHJvdG90eXBlLmJsb2NrU2l6ZSA9IDg7XHJcbm1vZHVsZS5leHBvcnRzLmtleVNpemUgPSBjYXN0NS5wcm90b3R5cGUua2V5U2l6ZSA9IDE2O1xyXG4iLCIvL1BhdWwgVGVybywgSnVseSAyMDAxXG4vL2h0dHA6Ly93d3cudGVyby5jby51ay9kZXMvXG4vL1xuLy9PcHRpbWlzZWQgZm9yIHBlcmZvcm1hbmNlIHdpdGggbGFyZ2UgYmxvY2tzIGJ5IE1pY2hhZWwgSGF5d29ydGgsIE5vdmVtYmVyIDIwMDFcbi8vaHR0cDovL3d3dy5uZXRkZWFsaW5nLmNvbVxuLy9cbi8vIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSFxuXG4vL1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORFxuLy9BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbi8vSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Vcbi8vQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbi8vRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbi8vREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFNcbi8vT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pXG4vL0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUXG4vL0xJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVlcbi8vT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRlxuLy9TVUNIIERBTUFHRS5cblxuLy9kZXNcbi8vdGhpcyB0YWtlcyB0aGUga2V5LCB0aGUgbWVzc2FnZSwgYW5kIHdoZXRoZXIgdG8gZW5jcnlwdCBvciBkZWNyeXB0XG5cblxuXG5cbmZ1bmN0aW9uIGRlcyAoa2V5cywgbWVzc2FnZSwgZW5jcnlwdCwgbW9kZSwgaXYsIHBhZGRpbmcpIHtcbiAgLy9kZWNsYXJpbmcgdGhpcyBsb2NhbGx5IHNwZWVkcyB0aGluZ3MgdXAgYSBiaXRcbiAgdmFyIHNwZnVuY3Rpb24xID0gbmV3IEFycmF5ICgweDEwMTA0MDAsMCwweDEwMDAwLDB4MTAxMDQwNCwweDEwMTAwMDQsMHgxMDQwNCwweDQsMHgxMDAwMCwweDQwMCwweDEwMTA0MDAsMHgxMDEwNDA0LDB4NDAwLDB4MTAwMDQwNCwweDEwMTAwMDQsMHgxMDAwMDAwLDB4NCwweDQwNCwweDEwMDA0MDAsMHgxMDAwNDAwLDB4MTA0MDAsMHgxMDQwMCwweDEwMTAwMDAsMHgxMDEwMDAwLDB4MTAwMDQwNCwweDEwMDA0LDB4MTAwMDAwNCwweDEwMDAwMDQsMHgxMDAwNCwwLDB4NDA0LDB4MTA0MDQsMHgxMDAwMDAwLDB4MTAwMDAsMHgxMDEwNDA0LDB4NCwweDEwMTAwMDAsMHgxMDEwNDAwLDB4MTAwMDAwMCwweDEwMDAwMDAsMHg0MDAsMHgxMDEwMDA0LDB4MTAwMDAsMHgxMDQwMCwweDEwMDAwMDQsMHg0MDAsMHg0LDB4MTAwMDQwNCwweDEwNDA0LDB4MTAxMDQwNCwweDEwMDA0LDB4MTAxMDAwMCwweDEwMDA0MDQsMHgxMDAwMDA0LDB4NDA0LDB4MTA0MDQsMHgxMDEwNDAwLDB4NDA0LDB4MTAwMDQwMCwweDEwMDA0MDAsMCwweDEwMDA0LDB4MTA0MDAsMCwweDEwMTAwMDQpO1xuICB2YXIgc3BmdW5jdGlvbjIgPSBuZXcgQXJyYXkgKC0weDdmZWY3ZmUwLC0weDdmZmY4MDAwLDB4ODAwMCwweDEwODAyMCwweDEwMDAwMCwweDIwLC0weDdmZWZmZmUwLC0weDdmZmY3ZmUwLC0weDdmZmZmZmUwLC0weDdmZWY3ZmUwLC0weDdmZWY4MDAwLC0weDgwMDAwMDAwLC0weDdmZmY4MDAwLDB4MTAwMDAwLDB4MjAsLTB4N2ZlZmZmZTAsMHgxMDgwMDAsMHgxMDAwMjAsLTB4N2ZmZjdmZTAsMCwtMHg4MDAwMDAwMCwweDgwMDAsMHgxMDgwMjAsLTB4N2ZmMDAwMDAsMHgxMDAwMjAsLTB4N2ZmZmZmZTAsMCwweDEwODAwMCwweDgwMjAsLTB4N2ZlZjgwMDAsLTB4N2ZmMDAwMDAsMHg4MDIwLDAsMHgxMDgwMjAsLTB4N2ZlZmZmZTAsMHgxMDAwMDAsLTB4N2ZmZjdmZTAsLTB4N2ZmMDAwMDAsLTB4N2ZlZjgwMDAsMHg4MDAwLC0weDdmZjAwMDAwLC0weDdmZmY4MDAwLDB4MjAsLTB4N2ZlZjdmZTAsMHgxMDgwMjAsMHgyMCwweDgwMDAsLTB4ODAwMDAwMDAsMHg4MDIwLC0weDdmZWY4MDAwLDB4MTAwMDAwLC0weDdmZmZmZmUwLDB4MTAwMDIwLC0weDdmZmY3ZmUwLC0weDdmZmZmZmUwLDB4MTAwMDIwLDB4MTA4MDAwLDAsLTB4N2ZmZjgwMDAsMHg4MDIwLC0weDgwMDAwMDAwLC0weDdmZWZmZmUwLC0weDdmZWY3ZmUwLDB4MTA4MDAwKTtcbiAgdmFyIHNwZnVuY3Rpb24zID0gbmV3IEFycmF5ICgweDIwOCwweDgwMjAyMDAsMCwweDgwMjAwMDgsMHg4MDAwMjAwLDAsMHgyMDIwOCwweDgwMDAyMDAsMHgyMDAwOCwweDgwMDAwMDgsMHg4MDAwMDA4LDB4MjAwMDAsMHg4MDIwMjA4LDB4MjAwMDgsMHg4MDIwMDAwLDB4MjA4LDB4ODAwMDAwMCwweDgsMHg4MDIwMjAwLDB4MjAwLDB4MjAyMDAsMHg4MDIwMDAwLDB4ODAyMDAwOCwweDIwMjA4LDB4ODAwMDIwOCwweDIwMjAwLDB4MjAwMDAsMHg4MDAwMjA4LDB4OCwweDgwMjAyMDgsMHgyMDAsMHg4MDAwMDAwLDB4ODAyMDIwMCwweDgwMDAwMDAsMHgyMDAwOCwweDIwOCwweDIwMDAwLDB4ODAyMDIwMCwweDgwMDAyMDAsMCwweDIwMCwweDIwMDA4LDB4ODAyMDIwOCwweDgwMDAyMDAsMHg4MDAwMDA4LDB4MjAwLDAsMHg4MDIwMDA4LDB4ODAwMDIwOCwweDIwMDAwLDB4ODAwMDAwMCwweDgwMjAyMDgsMHg4LDB4MjAyMDgsMHgyMDIwMCwweDgwMDAwMDgsMHg4MDIwMDAwLDB4ODAwMDIwOCwweDIwOCwweDgwMjAwMDAsMHgyMDIwOCwweDgsMHg4MDIwMDA4LDB4MjAyMDApO1xuICB2YXIgc3BmdW5jdGlvbjQgPSBuZXcgQXJyYXkgKDB4ODAyMDAxLDB4MjA4MSwweDIwODEsMHg4MCwweDgwMjA4MCwweDgwMDA4MSwweDgwMDAwMSwweDIwMDEsMCwweDgwMjAwMCwweDgwMjAwMCwweDgwMjA4MSwweDgxLDAsMHg4MDAwODAsMHg4MDAwMDEsMHgxLDB4MjAwMCwweDgwMDAwMCwweDgwMjAwMSwweDgwLDB4ODAwMDAwLDB4MjAwMSwweDIwODAsMHg4MDAwODEsMHgxLDB4MjA4MCwweDgwMDA4MCwweDIwMDAsMHg4MDIwODAsMHg4MDIwODEsMHg4MSwweDgwMDA4MCwweDgwMDAwMSwweDgwMjAwMCwweDgwMjA4MSwweDgxLDAsMCwweDgwMjAwMCwweDIwODAsMHg4MDAwODAsMHg4MDAwODEsMHgxLDB4ODAyMDAxLDB4MjA4MSwweDIwODEsMHg4MCwweDgwMjA4MSwweDgxLDB4MSwweDIwMDAsMHg4MDAwMDEsMHgyMDAxLDB4ODAyMDgwLDB4ODAwMDgxLDB4MjAwMSwweDIwODAsMHg4MDAwMDAsMHg4MDIwMDEsMHg4MCwweDgwMDAwMCwweDIwMDAsMHg4MDIwODApO1xuICB2YXIgc3BmdW5jdGlvbjUgPSBuZXcgQXJyYXkgKDB4MTAwLDB4MjA4MDEwMCwweDIwODAwMDAsMHg0MjAwMDEwMCwweDgwMDAwLDB4MTAwLDB4NDAwMDAwMDAsMHgyMDgwMDAwLDB4NDAwODAxMDAsMHg4MDAwMCwweDIwMDAxMDAsMHg0MDA4MDEwMCwweDQyMDAwMTAwLDB4NDIwODAwMDAsMHg4MDEwMCwweDQwMDAwMDAwLDB4MjAwMDAwMCwweDQwMDgwMDAwLDB4NDAwODAwMDAsMCwweDQwMDAwMTAwLDB4NDIwODAxMDAsMHg0MjA4MDEwMCwweDIwMDAxMDAsMHg0MjA4MDAwMCwweDQwMDAwMTAwLDAsMHg0MjAwMDAwMCwweDIwODAxMDAsMHgyMDAwMDAwLDB4NDIwMDAwMDAsMHg4MDEwMCwweDgwMDAwLDB4NDIwMDAxMDAsMHgxMDAsMHgyMDAwMDAwLDB4NDAwMDAwMDAsMHgyMDgwMDAwLDB4NDIwMDAxMDAsMHg0MDA4MDEwMCwweDIwMDAxMDAsMHg0MDAwMDAwMCwweDQyMDgwMDAwLDB4MjA4MDEwMCwweDQwMDgwMTAwLDB4MTAwLDB4MjAwMDAwMCwweDQyMDgwMDAwLDB4NDIwODAxMDAsMHg4MDEwMCwweDQyMDAwMDAwLDB4NDIwODAxMDAsMHgyMDgwMDAwLDAsMHg0MDA4MDAwMCwweDQyMDAwMDAwLDB4ODAxMDAsMHgyMDAwMTAwLDB4NDAwMDAxMDAsMHg4MDAwMCwwLDB4NDAwODAwMDAsMHgyMDgwMTAwLDB4NDAwMDAxMDApO1xuICB2YXIgc3BmdW5jdGlvbjYgPSBuZXcgQXJyYXkgKDB4MjAwMDAwMTAsMHgyMDQwMDAwMCwweDQwMDAsMHgyMDQwNDAxMCwweDIwNDAwMDAwLDB4MTAsMHgyMDQwNDAxMCwweDQwMDAwMCwweDIwMDA0MDAwLDB4NDA0MDEwLDB4NDAwMDAwLDB4MjAwMDAwMTAsMHg0MDAwMTAsMHgyMDAwNDAwMCwweDIwMDAwMDAwLDB4NDAxMCwwLDB4NDAwMDEwLDB4MjAwMDQwMTAsMHg0MDAwLDB4NDA0MDAwLDB4MjAwMDQwMTAsMHgxMCwweDIwNDAwMDEwLDB4MjA0MDAwMTAsMCwweDQwNDAxMCwweDIwNDA0MDAwLDB4NDAxMCwweDQwNDAwMCwweDIwNDA0MDAwLDB4MjAwMDAwMDAsMHgyMDAwNDAwMCwweDEwLDB4MjA0MDAwMTAsMHg0MDQwMDAsMHgyMDQwNDAxMCwweDQwMDAwMCwweDQwMTAsMHgyMDAwMDAxMCwweDQwMDAwMCwweDIwMDA0MDAwLDB4MjAwMDAwMDAsMHg0MDEwLDB4MjAwMDAwMTAsMHgyMDQwNDAxMCwweDQwNDAwMCwweDIwNDAwMDAwLDB4NDA0MDEwLDB4MjA0MDQwMDAsMCwweDIwNDAwMDEwLDB4MTAsMHg0MDAwLDB4MjA0MDAwMDAsMHg0MDQwMTAsMHg0MDAwLDB4NDAwMDEwLDB4MjAwMDQwMTAsMCwweDIwNDA0MDAwLDB4MjAwMDAwMDAsMHg0MDAwMTAsMHgyMDAwNDAxMCk7XG4gIHZhciBzcGZ1bmN0aW9uNyA9IG5ldyBBcnJheSAoMHgyMDAwMDAsMHg0MjAwMDAyLDB4NDAwMDgwMiwwLDB4ODAwLDB4NDAwMDgwMiwweDIwMDgwMiwweDQyMDA4MDAsMHg0MjAwODAyLDB4MjAwMDAwLDAsMHg0MDAwMDAyLDB4MiwweDQwMDAwMDAsMHg0MjAwMDAyLDB4ODAyLDB4NDAwMDgwMCwweDIwMDgwMiwweDIwMDAwMiwweDQwMDA4MDAsMHg0MDAwMDAyLDB4NDIwMDAwMCwweDQyMDA4MDAsMHgyMDAwMDIsMHg0MjAwMDAwLDB4ODAwLDB4ODAyLDB4NDIwMDgwMiwweDIwMDgwMCwweDIsMHg0MDAwMDAwLDB4MjAwODAwLDB4NDAwMDAwMCwweDIwMDgwMCwweDIwMDAwMCwweDQwMDA4MDIsMHg0MDAwODAyLDB4NDIwMDAwMiwweDQyMDAwMDIsMHgyLDB4MjAwMDAyLDB4NDAwMDAwMCwweDQwMDA4MDAsMHgyMDAwMDAsMHg0MjAwODAwLDB4ODAyLDB4MjAwODAyLDB4NDIwMDgwMCwweDgwMiwweDQwMDAwMDIsMHg0MjAwODAyLDB4NDIwMDAwMCwweDIwMDgwMCwwLDB4MiwweDQyMDA4MDIsMCwweDIwMDgwMiwweDQyMDAwMDAsMHg4MDAsMHg0MDAwMDAyLDB4NDAwMDgwMCwweDgwMCwweDIwMDAwMik7XG4gIHZhciBzcGZ1bmN0aW9uOCA9IG5ldyBBcnJheSAoMHgxMDAwMTA0MCwweDEwMDAsMHg0MDAwMCwweDEwMDQxMDQwLDB4MTAwMDAwMDAsMHgxMDAwMTA0MCwweDQwLDB4MTAwMDAwMDAsMHg0MDA0MCwweDEwMDQwMDAwLDB4MTAwNDEwNDAsMHg0MTAwMCwweDEwMDQxMDAwLDB4NDEwNDAsMHgxMDAwLDB4NDAsMHgxMDA0MDAwMCwweDEwMDAwMDQwLDB4MTAwMDEwMDAsMHgxMDQwLDB4NDEwMDAsMHg0MDA0MCwweDEwMDQwMDQwLDB4MTAwNDEwMDAsMHgxMDQwLDAsMCwweDEwMDQwMDQwLDB4MTAwMDAwNDAsMHgxMDAwMTAwMCwweDQxMDQwLDB4NDAwMDAsMHg0MTA0MCwweDQwMDAwLDB4MTAwNDEwMDAsMHgxMDAwLDB4NDAsMHgxMDA0MDA0MCwweDEwMDAsMHg0MTA0MCwweDEwMDAxMDAwLDB4NDAsMHgxMDAwMDA0MCwweDEwMDQwMDAwLDB4MTAwNDAwNDAsMHgxMDAwMDAwMCwweDQwMDAwLDB4MTAwMDEwNDAsMCwweDEwMDQxMDQwLDB4NDAwNDAsMHgxMDAwMDA0MCwweDEwMDQwMDAwLDB4MTAwMDEwMDAsMHgxMDAwMTA0MCwwLDB4MTAwNDEwNDAsMHg0MTAwMCwweDQxMDAwLDB4MTA0MCwweDEwNDAsMHg0MDA0MCwweDEwMDAwMDAwLDB4MTAwNDEwMDApO1xuXG4gIC8vY3JlYXRlIHRoZSAxNiBvciA0OCBzdWJrZXlzIHdlIHdpbGwgbmVlZFxuICB2YXIgbT0wLCBpLCBqLCB0ZW1wLCB0ZW1wMiwgcmlnaHQxLCByaWdodDIsIGxlZnQsIHJpZ2h0LCBsb29waW5nO1xuICB2YXIgY2JjbGVmdCwgY2JjbGVmdDIsIGNiY3JpZ2h0LCBjYmNyaWdodDJcbiAgdmFyIGVuZGxvb3AsIGxvb3BpbmM7XG4gIHZhciBsZW4gPSBtZXNzYWdlLmxlbmd0aDtcbiAgdmFyIGNodW5rID0gMDtcbiAgLy9zZXQgdXAgdGhlIGxvb3BzIGZvciBzaW5nbGUgYW5kIHRyaXBsZSBkZXNcbiAgdmFyIGl0ZXJhdGlvbnMgPSBrZXlzLmxlbmd0aCA9PSAzMiA/IDMgOiA5OyAvL3NpbmdsZSBvciB0cmlwbGUgZGVzXG4gIGlmIChpdGVyYXRpb25zID09IDMpIHtsb29waW5nID0gZW5jcnlwdCA/IG5ldyBBcnJheSAoMCwgMzIsIDIpIDogbmV3IEFycmF5ICgzMCwgLTIsIC0yKTt9XG4gIGVsc2Uge2xvb3BpbmcgPSBlbmNyeXB0ID8gbmV3IEFycmF5ICgwLCAzMiwgMiwgNjIsIDMwLCAtMiwgNjQsIDk2LCAyKSA6IG5ldyBBcnJheSAoOTQsIDYyLCAtMiwgMzIsIDY0LCAyLCAzMCwgLTIsIC0yKTt9XG5cbiAgLy9wYWQgdGhlIG1lc3NhZ2UgZGVwZW5kaW5nIG9uIHRoZSBwYWRkaW5nIHBhcmFtZXRlclxuICAvL29ubHkgYWRkIHBhZGRpbmcgaWYgZW5jcnlwdGluZyAtIG5vdGUgdGhhdCB5b3UgbmVlZCB0byB1c2UgdGhlIHNhbWUgcGFkZGluZyBvcHRpb24gZm9yIGJvdGggZW5jcnlwdCBhbmQgZGVjcnlwdFxyXG4gIGlmIChlbmNyeXB0KSB7XHJcbiAgICBtZXNzYWdlID0gZGVzX2FkZFBhZGRpbmcobWVzc2FnZSwgcGFkZGluZyk7XHJcbiAgICBsZW4gPSBtZXNzYWdlLmxlbmd0aDtcclxuICB9XHJcblxuICAvL3N0b3JlIHRoZSByZXN1bHQgaGVyZVxuICByZXN1bHQgPSBcIlwiO1xuICB0ZW1wcmVzdWx0ID0gXCJcIjtcblxuICBpZiAobW9kZSA9PSAxKSB7IC8vQ0JDIG1vZGVcbiAgICBjYmNsZWZ0ID0gKGl2LmNoYXJDb2RlQXQobSsrKSA8PCAyNCkgfCAoaXYuY2hhckNvZGVBdChtKyspIDw8IDE2KSB8IChpdi5jaGFyQ29kZUF0KG0rKykgPDwgOCkgfCBpdi5jaGFyQ29kZUF0KG0rKyk7XG4gICAgY2JjcmlnaHQgPSAoaXYuY2hhckNvZGVBdChtKyspIDw8IDI0KSB8IChpdi5jaGFyQ29kZUF0KG0rKykgPDwgMTYpIHwgKGl2LmNoYXJDb2RlQXQobSsrKSA8PCA4KSB8IGl2LmNoYXJDb2RlQXQobSsrKTtcbiAgICBtPTA7XG4gIH1cblxuICAvL2xvb3AgdGhyb3VnaCBlYWNoIDY0IGJpdCBjaHVuayBvZiB0aGUgbWVzc2FnZVxuICB3aGlsZSAobSA8IGxlbikge1xuICAgIGxlZnQgPSAobWVzc2FnZS5jaGFyQ29kZUF0KG0rKykgPDwgMjQpIHwgKG1lc3NhZ2UuY2hhckNvZGVBdChtKyspIDw8IDE2KSB8IChtZXNzYWdlLmNoYXJDb2RlQXQobSsrKSA8PCA4KSB8IG1lc3NhZ2UuY2hhckNvZGVBdChtKyspO1xuICAgIHJpZ2h0ID0gKG1lc3NhZ2UuY2hhckNvZGVBdChtKyspIDw8IDI0KSB8IChtZXNzYWdlLmNoYXJDb2RlQXQobSsrKSA8PCAxNikgfCAobWVzc2FnZS5jaGFyQ29kZUF0KG0rKykgPDwgOCkgfCBtZXNzYWdlLmNoYXJDb2RlQXQobSsrKTtcblxuICAgIC8vZm9yIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlLCB4b3IgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcHJldmlvdXMgcmVzdWx0XG4gICAgaWYgKG1vZGUgPT0gMSkge2lmIChlbmNyeXB0KSB7bGVmdCBePSBjYmNsZWZ0OyByaWdodCBePSBjYmNyaWdodDt9IGVsc2Uge2NiY2xlZnQyID0gY2JjbGVmdDsgY2JjcmlnaHQyID0gY2JjcmlnaHQ7IGNiY2xlZnQgPSBsZWZ0OyBjYmNyaWdodCA9IHJpZ2h0O319XG5cbiAgICAvL2ZpcnN0IGVhY2ggNjQgYnV0IGNodW5rIG9mIHRoZSBtZXNzYWdlIG11c3QgYmUgcGVybXV0ZWQgYWNjb3JkaW5nIHRvIElQXG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gNCkgXiByaWdodCkgJiAweDBmMGYwZjBmOyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDQpO1xuICAgIHRlbXAgPSAoKGxlZnQgPj4+IDE2KSBeIHJpZ2h0KSAmIDB4MDAwMGZmZmY7IHJpZ2h0IF49IHRlbXA7IGxlZnQgXj0gKHRlbXAgPDwgMTYpO1xuICAgIHRlbXAgPSAoKHJpZ2h0ID4+PiAyKSBeIGxlZnQpICYgMHgzMzMzMzMzMzsgbGVmdCBePSB0ZW1wOyByaWdodCBePSAodGVtcCA8PCAyKTtcbiAgICB0ZW1wID0gKChyaWdodCA+Pj4gOCkgXiBsZWZ0KSAmIDB4MDBmZjAwZmY7IGxlZnQgXj0gdGVtcDsgcmlnaHQgXj0gKHRlbXAgPDwgOCk7XG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gMSkgXiByaWdodCkgJiAweDU1NTU1NTU1OyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDEpO1xuXG4gICAgbGVmdCA9ICgobGVmdCA8PCAxKSB8IChsZWZ0ID4+PiAzMSkpOyBcbiAgICByaWdodCA9ICgocmlnaHQgPDwgMSkgfCAocmlnaHQgPj4+IDMxKSk7IFxuXG4gICAgLy9kbyB0aGlzIGVpdGhlciAxIG9yIDMgdGltZXMgZm9yIGVhY2ggY2h1bmsgb2YgdGhlIG1lc3NhZ2VcbiAgICBmb3IgKGo9MDsgajxpdGVyYXRpb25zOyBqKz0zKSB7XG4gICAgICBlbmRsb29wID0gbG9vcGluZ1tqKzFdO1xuICAgICAgbG9vcGluYyA9IGxvb3BpbmdbaisyXTtcbiAgICAgIC8vbm93IGdvIHRocm91Z2ggYW5kIHBlcmZvcm0gdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiAgXG4gICAgICBmb3IgKGk9bG9vcGluZ1tqXTsgaSE9ZW5kbG9vcDsgaSs9bG9vcGluYykgeyAvL2ZvciBlZmZpY2llbmN5XG4gICAgICAgIHJpZ2h0MSA9IHJpZ2h0IF4ga2V5c1tpXTsgXG4gICAgICAgIHJpZ2h0MiA9ICgocmlnaHQgPj4+IDQpIHwgKHJpZ2h0IDw8IDI4KSkgXiBrZXlzW2krMV07XG4gICAgICAgIC8vdGhlIHJlc3VsdCBpcyBhdHRhaW5lZCBieSBwYXNzaW5nIHRoZXNlIGJ5dGVzIHRocm91Z2ggdGhlIFMgc2VsZWN0aW9uIGZ1bmN0aW9uc1xuICAgICAgICB0ZW1wID0gbGVmdDtcbiAgICAgICAgbGVmdCA9IHJpZ2h0O1xuICAgICAgICByaWdodCA9IHRlbXAgXiAoc3BmdW5jdGlvbjJbKHJpZ2h0MSA+Pj4gMjQpICYgMHgzZl0gfCBzcGZ1bmN0aW9uNFsocmlnaHQxID4+PiAxNikgJiAweDNmXVxuICAgICAgICAgICAgICB8IHNwZnVuY3Rpb242WyhyaWdodDEgPj4+ICA4KSAmIDB4M2ZdIHwgc3BmdW5jdGlvbjhbcmlnaHQxICYgMHgzZl1cbiAgICAgICAgICAgICAgfCBzcGZ1bmN0aW9uMVsocmlnaHQyID4+PiAyNCkgJiAweDNmXSB8IHNwZnVuY3Rpb24zWyhyaWdodDIgPj4+IDE2KSAmIDB4M2ZdXG4gICAgICAgICAgICAgIHwgc3BmdW5jdGlvbjVbKHJpZ2h0MiA+Pj4gIDgpICYgMHgzZl0gfCBzcGZ1bmN0aW9uN1tyaWdodDIgJiAweDNmXSk7XG4gICAgICB9XG4gICAgICB0ZW1wID0gbGVmdDsgbGVmdCA9IHJpZ2h0OyByaWdodCA9IHRlbXA7IC8vdW5yZXZlcnNlIGxlZnQgYW5kIHJpZ2h0XG4gICAgfSAvL2ZvciBlaXRoZXIgMSBvciAzIGl0ZXJhdGlvbnNcblxuICAgIC8vbW92ZSB0aGVuIGVhY2ggb25lIGJpdCB0byB0aGUgcmlnaHRcbiAgICBsZWZ0ID0gKChsZWZ0ID4+PiAxKSB8IChsZWZ0IDw8IDMxKSk7IFxuICAgIHJpZ2h0ID0gKChyaWdodCA+Pj4gMSkgfCAocmlnaHQgPDwgMzEpKTsgXG5cbiAgICAvL25vdyBwZXJmb3JtIElQLTEsIHdoaWNoIGlzIElQIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cbiAgICB0ZW1wID0gKChsZWZ0ID4+PiAxKSBeIHJpZ2h0KSAmIDB4NTU1NTU1NTU7IHJpZ2h0IF49IHRlbXA7IGxlZnQgXj0gKHRlbXAgPDwgMSk7XG4gICAgdGVtcCA9ICgocmlnaHQgPj4+IDgpIF4gbGVmdCkgJiAweDAwZmYwMGZmOyBsZWZ0IF49IHRlbXA7IHJpZ2h0IF49ICh0ZW1wIDw8IDgpO1xuICAgIHRlbXAgPSAoKHJpZ2h0ID4+PiAyKSBeIGxlZnQpICYgMHgzMzMzMzMzMzsgbGVmdCBePSB0ZW1wOyByaWdodCBePSAodGVtcCA8PCAyKTtcbiAgICB0ZW1wID0gKChsZWZ0ID4+PiAxNikgXiByaWdodCkgJiAweDAwMDBmZmZmOyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDE2KTtcbiAgICB0ZW1wID0gKChsZWZ0ID4+PiA0KSBeIHJpZ2h0KSAmIDB4MGYwZjBmMGY7IHJpZ2h0IF49IHRlbXA7IGxlZnQgXj0gKHRlbXAgPDwgNCk7XG5cbiAgICAvL2ZvciBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZSwgeG9yIHRoZSBtZXNzYWdlIHdpdGggdGhlIHByZXZpb3VzIHJlc3VsdFxuICAgIGlmIChtb2RlID09IDEpIHtpZiAoZW5jcnlwdCkge2NiY2xlZnQgPSBsZWZ0OyBjYmNyaWdodCA9IHJpZ2h0O30gZWxzZSB7bGVmdCBePSBjYmNsZWZ0MjsgcmlnaHQgXj0gY2JjcmlnaHQyO319XG4gICAgdGVtcHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlICgobGVmdD4+PjI0KSwgKChsZWZ0Pj4+MTYpICYgMHhmZiksICgobGVmdD4+PjgpICYgMHhmZiksIChsZWZ0ICYgMHhmZiksIChyaWdodD4+PjI0KSwgKChyaWdodD4+PjE2KSAmIDB4ZmYpLCAoKHJpZ2h0Pj4+OCkgJiAweGZmKSwgKHJpZ2h0ICYgMHhmZikpO1xuXG4gICAgY2h1bmsgKz0gODtcbiAgICBpZiAoY2h1bmsgPT0gNTEyKSB7cmVzdWx0ICs9IHRlbXByZXN1bHQ7IHRlbXByZXN1bHQgPSBcIlwiOyBjaHVuayA9IDA7fVxuICB9IC8vZm9yIGV2ZXJ5IDggY2hhcmFjdGVycywgb3IgNjQgYml0cyBpbiB0aGUgbWVzc2FnZVxuXG4gIC8vcmV0dXJuIHRoZSByZXN1bHQgYXMgYW4gYXJyYXlcbiAgcmVzdWx0ICs9IHRlbXByZXN1bHQ7XG4gICAgXHJcbiAgLy9vbmx5IHJlbW92ZSBwYWRkaW5nIGlmIGRlY3J5cHRpbmcgLSBub3RlIHRoYXQgeW91IG5lZWQgdG8gdXNlIHRoZSBzYW1lIHBhZGRpbmcgb3B0aW9uIGZvciBib3RoIGVuY3J5cHQgYW5kIGRlY3J5cHRcclxuICBpZiAoIWVuY3J5cHQpIHtcclxuICAgIHJlc3VsdCA9IGRlc19yZW1vdmVQYWRkaW5nKHJlc3VsdCwgcGFkZGluZyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0O1xufSAvL2VuZCBvZiBkZXNcblxuXG5cbi8vZGVzX2NyZWF0ZUtleXNcbi8vdGhpcyB0YWtlcyBhcyBpbnB1dCBhIDY0IGJpdCBrZXkgKGV2ZW4gdGhvdWdoIG9ubHkgNTYgYml0cyBhcmUgdXNlZClcbi8vYXMgYW4gYXJyYXkgb2YgMiBpbnRlZ2VycywgYW5kIHJldHVybnMgMTYgNDggYml0IGtleXNcbmZ1bmN0aW9uIGRlc19jcmVhdGVLZXlzIChrZXkpIHtcbiAgLy9kZWNsYXJpbmcgdGhpcyBsb2NhbGx5IHNwZWVkcyB0aGluZ3MgdXAgYSBiaXRcbiAgcGMyYnl0ZXMwICA9IG5ldyBBcnJheSAoMCwweDQsMHgyMDAwMDAwMCwweDIwMDAwMDA0LDB4MTAwMDAsMHgxMDAwNCwweDIwMDEwMDAwLDB4MjAwMTAwMDQsMHgyMDAsMHgyMDQsMHgyMDAwMDIwMCwweDIwMDAwMjA0LDB4MTAyMDAsMHgxMDIwNCwweDIwMDEwMjAwLDB4MjAwMTAyMDQpO1xuICBwYzJieXRlczEgID0gbmV3IEFycmF5ICgwLDB4MSwweDEwMDAwMCwweDEwMDAwMSwweDQwMDAwMDAsMHg0MDAwMDAxLDB4NDEwMDAwMCwweDQxMDAwMDEsMHgxMDAsMHgxMDEsMHgxMDAxMDAsMHgxMDAxMDEsMHg0MDAwMTAwLDB4NDAwMDEwMSwweDQxMDAxMDAsMHg0MTAwMTAxKTtcbiAgcGMyYnl0ZXMyICA9IG5ldyBBcnJheSAoMCwweDgsMHg4MDAsMHg4MDgsMHgxMDAwMDAwLDB4MTAwMDAwOCwweDEwMDA4MDAsMHgxMDAwODA4LDAsMHg4LDB4ODAwLDB4ODA4LDB4MTAwMDAwMCwweDEwMDAwMDgsMHgxMDAwODAwLDB4MTAwMDgwOCk7XG4gIHBjMmJ5dGVzMyAgPSBuZXcgQXJyYXkgKDAsMHgyMDAwMDAsMHg4MDAwMDAwLDB4ODIwMDAwMCwweDIwMDAsMHgyMDIwMDAsMHg4MDAyMDAwLDB4ODIwMjAwMCwweDIwMDAwLDB4MjIwMDAwLDB4ODAyMDAwMCwweDgyMjAwMDAsMHgyMjAwMCwweDIyMjAwMCwweDgwMjIwMDAsMHg4MjIyMDAwKTtcbiAgcGMyYnl0ZXM0ICA9IG5ldyBBcnJheSAoMCwweDQwMDAwLDB4MTAsMHg0MDAxMCwwLDB4NDAwMDAsMHgxMCwweDQwMDEwLDB4MTAwMCwweDQxMDAwLDB4MTAxMCwweDQxMDEwLDB4MTAwMCwweDQxMDAwLDB4MTAxMCwweDQxMDEwKTtcbiAgcGMyYnl0ZXM1ICA9IG5ldyBBcnJheSAoMCwweDQwMCwweDIwLDB4NDIwLDAsMHg0MDAsMHgyMCwweDQyMCwweDIwMDAwMDAsMHgyMDAwNDAwLDB4MjAwMDAyMCwweDIwMDA0MjAsMHgyMDAwMDAwLDB4MjAwMDQwMCwweDIwMDAwMjAsMHgyMDAwNDIwKTtcbiAgcGMyYnl0ZXM2ICA9IG5ldyBBcnJheSAoMCwweDEwMDAwMDAwLDB4ODAwMDAsMHgxMDA4MDAwMCwweDIsMHgxMDAwMDAwMiwweDgwMDAyLDB4MTAwODAwMDIsMCwweDEwMDAwMDAwLDB4ODAwMDAsMHgxMDA4MDAwMCwweDIsMHgxMDAwMDAwMiwweDgwMDAyLDB4MTAwODAwMDIpO1xuICBwYzJieXRlczcgID0gbmV3IEFycmF5ICgwLDB4MTAwMDAsMHg4MDAsMHgxMDgwMCwweDIwMDAwMDAwLDB4MjAwMTAwMDAsMHgyMDAwMDgwMCwweDIwMDEwODAwLDB4MjAwMDAsMHgzMDAwMCwweDIwODAwLDB4MzA4MDAsMHgyMDAyMDAwMCwweDIwMDMwMDAwLDB4MjAwMjA4MDAsMHgyMDAzMDgwMCk7XG4gIHBjMmJ5dGVzOCAgPSBuZXcgQXJyYXkgKDAsMHg0MDAwMCwwLDB4NDAwMDAsMHgyLDB4NDAwMDIsMHgyLDB4NDAwMDIsMHgyMDAwMDAwLDB4MjA0MDAwMCwweDIwMDAwMDAsMHgyMDQwMDAwLDB4MjAwMDAwMiwweDIwNDAwMDIsMHgyMDAwMDAyLDB4MjA0MDAwMik7XG4gIHBjMmJ5dGVzOSAgPSBuZXcgQXJyYXkgKDAsMHgxMDAwMDAwMCwweDgsMHgxMDAwMDAwOCwwLDB4MTAwMDAwMDAsMHg4LDB4MTAwMDAwMDgsMHg0MDAsMHgxMDAwMDQwMCwweDQwOCwweDEwMDAwNDA4LDB4NDAwLDB4MTAwMDA0MDAsMHg0MDgsMHgxMDAwMDQwOCk7XG4gIHBjMmJ5dGVzMTAgPSBuZXcgQXJyYXkgKDAsMHgyMCwwLDB4MjAsMHgxMDAwMDAsMHgxMDAwMjAsMHgxMDAwMDAsMHgxMDAwMjAsMHgyMDAwLDB4MjAyMCwweDIwMDAsMHgyMDIwLDB4MTAyMDAwLDB4MTAyMDIwLDB4MTAyMDAwLDB4MTAyMDIwKTtcbiAgcGMyYnl0ZXMxMSA9IG5ldyBBcnJheSAoMCwweDEwMDAwMDAsMHgyMDAsMHgxMDAwMjAwLDB4MjAwMDAwLDB4MTIwMDAwMCwweDIwMDIwMCwweDEyMDAyMDAsMHg0MDAwMDAwLDB4NTAwMDAwMCwweDQwMDAyMDAsMHg1MDAwMjAwLDB4NDIwMDAwMCwweDUyMDAwMDAsMHg0MjAwMjAwLDB4NTIwMDIwMCk7XG4gIHBjMmJ5dGVzMTIgPSBuZXcgQXJyYXkgKDAsMHgxMDAwLDB4ODAwMDAwMCwweDgwMDEwMDAsMHg4MDAwMCwweDgxMDAwLDB4ODA4MDAwMCwweDgwODEwMDAsMHgxMCwweDEwMTAsMHg4MDAwMDEwLDB4ODAwMTAxMCwweDgwMDEwLDB4ODEwMTAsMHg4MDgwMDEwLDB4ODA4MTAxMCk7XG4gIHBjMmJ5dGVzMTMgPSBuZXcgQXJyYXkgKDAsMHg0LDB4MTAwLDB4MTA0LDAsMHg0LDB4MTAwLDB4MTA0LDB4MSwweDUsMHgxMDEsMHgxMDUsMHgxLDB4NSwweDEwMSwweDEwNSk7XG5cbiAgLy9ob3cgbWFueSBpdGVyYXRpb25zICgxIGZvciBkZXMsIDMgZm9yIHRyaXBsZSBkZXMpXG4gIHZhciBpdGVyYXRpb25zID0ga2V5Lmxlbmd0aCA+IDggPyAzIDogMTsgLy9jaGFuZ2VkIGJ5IFBhdWwgMTYvNi8yMDA3IHRvIHVzZSBUcmlwbGUgREVTIGZvciA5KyBieXRlIGtleXNcbiAgLy9zdG9yZXMgdGhlIHJldHVybiBrZXlzXG4gIHZhciBrZXlzID0gbmV3IEFycmF5ICgzMiAqIGl0ZXJhdGlvbnMpO1xuICAvL25vdyBkZWZpbmUgdGhlIGxlZnQgc2hpZnRzIHdoaWNoIG5lZWQgdG8gYmUgZG9uZVxuICB2YXIgc2hpZnRzID0gbmV3IEFycmF5ICgwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwKTtcbiAgLy9vdGhlciB2YXJpYWJsZXNcbiAgdmFyIGxlZnR0ZW1wLCByaWdodHRlbXAsIG09MCwgbj0wLCB0ZW1wO1xuXG4gIGZvciAodmFyIGo9MDsgajxpdGVyYXRpb25zOyBqKyspIHsgLy9laXRoZXIgMSBvciAzIGl0ZXJhdGlvbnNcbiAgICBsZWZ0ID0gKGtleS5jaGFyQ29kZUF0KG0rKykgPDwgMjQpIHwgKGtleS5jaGFyQ29kZUF0KG0rKykgPDwgMTYpIHwgKGtleS5jaGFyQ29kZUF0KG0rKykgPDwgOCkgfCBrZXkuY2hhckNvZGVBdChtKyspO1xuICAgIHJpZ2h0ID0gKGtleS5jaGFyQ29kZUF0KG0rKykgPDwgMjQpIHwgKGtleS5jaGFyQ29kZUF0KG0rKykgPDwgMTYpIHwgKGtleS5jaGFyQ29kZUF0KG0rKykgPDwgOCkgfCBrZXkuY2hhckNvZGVBdChtKyspO1xuXG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gNCkgXiByaWdodCkgJiAweDBmMGYwZjBmOyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDQpO1xuICAgIHRlbXAgPSAoKHJpZ2h0ID4+PiAtMTYpIF4gbGVmdCkgJiAweDAwMDBmZmZmOyBsZWZ0IF49IHRlbXA7IHJpZ2h0IF49ICh0ZW1wIDw8IC0xNik7XG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gMikgXiByaWdodCkgJiAweDMzMzMzMzMzOyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDIpO1xuICAgIHRlbXAgPSAoKHJpZ2h0ID4+PiAtMTYpIF4gbGVmdCkgJiAweDAwMDBmZmZmOyBsZWZ0IF49IHRlbXA7IHJpZ2h0IF49ICh0ZW1wIDw8IC0xNik7XG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gMSkgXiByaWdodCkgJiAweDU1NTU1NTU1OyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDEpO1xuICAgIHRlbXAgPSAoKHJpZ2h0ID4+PiA4KSBeIGxlZnQpICYgMHgwMGZmMDBmZjsgbGVmdCBePSB0ZW1wOyByaWdodCBePSAodGVtcCA8PCA4KTtcbiAgICB0ZW1wID0gKChsZWZ0ID4+PiAxKSBeIHJpZ2h0KSAmIDB4NTU1NTU1NTU7IHJpZ2h0IF49IHRlbXA7IGxlZnQgXj0gKHRlbXAgPDwgMSk7XG5cbiAgICAvL3RoZSByaWdodCBzaWRlIG5lZWRzIHRvIGJlIHNoaWZ0ZWQgYW5kIHRvIGdldCB0aGUgbGFzdCBmb3VyIGJpdHMgb2YgdGhlIGxlZnQgc2lkZVxuICAgIHRlbXAgPSAobGVmdCA8PCA4KSB8ICgocmlnaHQgPj4+IDIwKSAmIDB4MDAwMDAwZjApO1xuICAgIC8vbGVmdCBuZWVkcyB0byBiZSBwdXQgdXBzaWRlIGRvd25cbiAgICBsZWZ0ID0gKHJpZ2h0IDw8IDI0KSB8ICgocmlnaHQgPDwgOCkgJiAweGZmMDAwMCkgfCAoKHJpZ2h0ID4+PiA4KSAmIDB4ZmYwMCkgfCAoKHJpZ2h0ID4+PiAyNCkgJiAweGYwKTtcbiAgICByaWdodCA9IHRlbXA7XG5cbiAgICAvL25vdyBnbyB0aHJvdWdoIGFuZCBwZXJmb3JtIHRoZXNlIHNoaWZ0cyBvbiB0aGUgbGVmdCBhbmQgcmlnaHQga2V5c1xuICAgIGZvciAoaT0wOyBpIDwgc2hpZnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvL3NoaWZ0IHRoZSBrZXlzIGVpdGhlciBvbmUgb3IgdHdvIGJpdHMgdG8gdGhlIGxlZnRcbiAgICAgIGlmIChzaGlmdHNbaV0pIHtsZWZ0ID0gKGxlZnQgPDwgMikgfCAobGVmdCA+Pj4gMjYpOyByaWdodCA9IChyaWdodCA8PCAyKSB8IChyaWdodCA+Pj4gMjYpO31cbiAgICAgIGVsc2Uge2xlZnQgPSAobGVmdCA8PCAxKSB8IChsZWZ0ID4+PiAyNyk7IHJpZ2h0ID0gKHJpZ2h0IDw8IDEpIHwgKHJpZ2h0ID4+PiAyNyk7fVxuICAgICAgbGVmdCAmPSAtMHhmOyByaWdodCAmPSAtMHhmO1xuXG4gICAgICAvL25vdyBhcHBseSBQQy0yLCBpbiBzdWNoIGEgd2F5IHRoYXQgRSBpcyBlYXNpZXIgd2hlbiBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmdcbiAgICAgIC8vdGhpcyBjb252ZXJzaW9uIHdpbGwgbG9vayBsaWtlIFBDLTIgZXhjZXB0IG9ubHkgdGhlIGxhc3QgNiBiaXRzIG9mIGVhY2ggYnl0ZSBhcmUgdXNlZFxuICAgICAgLy9yYXRoZXIgdGhhbiA0OCBjb25zZWN1dGl2ZSBiaXRzIGFuZCB0aGUgb3JkZXIgb2YgbGluZXMgd2lsbCBiZSBhY2NvcmRpbmcgdG8gXG4gICAgICAvL2hvdyB0aGUgUyBzZWxlY3Rpb24gZnVuY3Rpb25zIHdpbGwgYmUgYXBwbGllZDogUzIsIFM0LCBTNiwgUzgsIFMxLCBTMywgUzUsIFM3XG4gICAgICBsZWZ0dGVtcCA9IHBjMmJ5dGVzMFtsZWZ0ID4+PiAyOF0gfCBwYzJieXRlczFbKGxlZnQgPj4+IDI0KSAmIDB4Zl1cbiAgICAgICAgICAgICAgfCBwYzJieXRlczJbKGxlZnQgPj4+IDIwKSAmIDB4Zl0gfCBwYzJieXRlczNbKGxlZnQgPj4+IDE2KSAmIDB4Zl1cbiAgICAgICAgICAgICAgfCBwYzJieXRlczRbKGxlZnQgPj4+IDEyKSAmIDB4Zl0gfCBwYzJieXRlczVbKGxlZnQgPj4+IDgpICYgMHhmXVxuICAgICAgICAgICAgICB8IHBjMmJ5dGVzNlsobGVmdCA+Pj4gNCkgJiAweGZdO1xuICAgICAgcmlnaHR0ZW1wID0gcGMyYnl0ZXM3W3JpZ2h0ID4+PiAyOF0gfCBwYzJieXRlczhbKHJpZ2h0ID4+PiAyNCkgJiAweGZdXG4gICAgICAgICAgICAgICAgfCBwYzJieXRlczlbKHJpZ2h0ID4+PiAyMCkgJiAweGZdIHwgcGMyYnl0ZXMxMFsocmlnaHQgPj4+IDE2KSAmIDB4Zl1cbiAgICAgICAgICAgICAgICB8IHBjMmJ5dGVzMTFbKHJpZ2h0ID4+PiAxMikgJiAweGZdIHwgcGMyYnl0ZXMxMlsocmlnaHQgPj4+IDgpICYgMHhmXVxuICAgICAgICAgICAgICAgIHwgcGMyYnl0ZXMxM1socmlnaHQgPj4+IDQpICYgMHhmXTtcbiAgICAgIHRlbXAgPSAoKHJpZ2h0dGVtcCA+Pj4gMTYpIF4gbGVmdHRlbXApICYgMHgwMDAwZmZmZjsgXG4gICAgICBrZXlzW24rK10gPSBsZWZ0dGVtcCBeIHRlbXA7IGtleXNbbisrXSA9IHJpZ2h0dGVtcCBeICh0ZW1wIDw8IDE2KTtcbiAgICB9XG4gIH0gLy9mb3IgZWFjaCBpdGVyYXRpb25zXG4gIC8vcmV0dXJuIHRoZSBrZXlzIHdlJ3ZlIGNyZWF0ZWRcbiAgcmV0dXJuIGtleXM7XG59IC8vZW5kIG9mIGRlc19jcmVhdGVLZXlzXG5cblxyXG5mdW5jdGlvbiBkZXNfYWRkUGFkZGluZyhtZXNzYWdlLCBwYWRkaW5nKSB7XHJcbiAgICB2YXIgcGFkTGVuZ3RoID0gOCAtIChtZXNzYWdlLmxlbmd0aCAlIDgpO1xyXG4gICAgaWYgKChwYWRkaW5nID09IDIpICYmIChwYWRMZW5ndGggPCA4KSkgeyAgICAgICAgICAgIC8vcGFkIHRoZSBtZXNzYWdlIHdpdGggc3BhY2VzXHJcbiAgICAgICAgbWVzc2FnZSArPSBcIiAgICAgICAgXCIuc3Vic3RyKDAsIHBhZExlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChwYWRkaW5nID09IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QS0NTNyBwYWRkaW5nXHJcbiAgICAgICAgbWVzc2FnZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhZExlbmd0aCwgcGFkTGVuZ3RoLCBwYWRMZW5ndGgsIHBhZExlbmd0aCwgcGFkTGVuZ3RoLCBwYWRMZW5ndGgsIHBhZExlbmd0aCwgcGFkTGVuZ3RoKS5zdWJzdHIoMCwgcGFkTGVuZ3RoKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKCFwYWRkaW5nICYmIChwYWRMZW5ndGggPCA4KSkgeyAgICAgICAgICAgICAvL3BhZCB0aGUgbWVzc2FnZSBvdXQgd2l0aCBudWxsIGJ5dGVzXHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcMFxcMFxcMFxcMFxcMFxcMFxcMFxcMFwiLnN1YnN0cigwLCBwYWRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1lc3NhZ2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlc19yZW1vdmVQYWRkaW5nKG1lc3NhZ2UsIHBhZGRpbmcpIHtcclxuICAgIGlmIChwYWRkaW5nID09IDIpIHsgICAgICAgICAvLyBzcGFjZSBwYWRkZWRcclxuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC8gKiQvZywgXCJcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChwYWRkaW5nID09IDEpIHsgICAgLy8gUEtDUzdcclxuICAgICAgICB2YXIgcGFkQ291bnQgPSBtZXNzYWdlLmNoYXJDb2RlQXQobWVzc2FnZS5sZW5ndGggLSAxKTtcclxuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5zdWJzdHIoMCwgbWVzc2FnZS5sZW5ndGggLSBwYWRDb3VudCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghcGFkZGluZykgeyAgICAgICAgLy8gbnVsbCBwYWRkaW5nXHJcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFwwKiQvZywgXCJcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWVzc2FnZTtcclxufVxyXG5cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyk7XG5cbi8vIGFkZGVkIGJ5IFJlY3VyaXR5IExhYnNcbmZ1bmN0aW9uIERlcyhrZXkpIHtcblx0dGhpcy5rZXkgPSBbXTtcblxuXHRmb3IodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dGhpcy5rZXkucHVzaChrZXkuc3Vic3RyKGkgKiA4LCA4KSk7XG5cdH1cblxuXHR0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbihibG9jaykge1xuXHRcdHJldHVybiB1dGlsLnN0cjJiaW4oZGVzKGRlc19jcmVhdGVLZXlzKHRoaXMua2V5WzJdKSxcblx0XHRcdGRlcyhkZXNfY3JlYXRlS2V5cyh0aGlzLmtleVsxXSksXG5cdFx0XHRkZXMoZGVzX2NyZWF0ZUtleXModGhpcy5rZXlbMF0pLFxuXHRcdFx0dXRpbC5iaW4yc3RyKGJsb2NrKSwgdHJ1ZSwgMCxudWxsLG51bGwpLCBcblx0XHRcdGZhbHNlLCAwLG51bGwsbnVsbCksIHRydWUsIDAsbnVsbCxudWxsKSk7XG5cdH1cbn1cblxuRGVzLmtleVNpemUgPSBEZXMucHJvdG90eXBlLmtleVNpemUgPSAyNDtcbkRlcy5ibG9ja1NpemUgPSBEZXMucHJvdG90eXBlLmJsb2NrU2l6ZSA9IDg7XG5cbi8vIFRoaXMgaXMgXCJvcmlnaW5hbFwiIERFUyAtIERlcyBpcyBhY3R1YWxseSBUcmlwbGUgREVTLlxuLy8gVGhpcyBpcyBvbmx5IGV4cG9ydGVkIHNvIHdlIGNhbiB1bml0IHRlc3QuXG5mdW5jdGlvbiBPcmlnaW5hbERlcyhrZXkpIHtcclxuICAgIHRoaXMua2V5ID0ga2V5O1xuXG4gICAgdGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24gKGJsb2NrLCBwYWRkaW5nKSB7XHJcbiAgICAgICAgdmFyIGtleXMgPSBkZXNfY3JlYXRlS2V5cyh0aGlzLmtleSk7XHJcbiAgICAgICAgcmV0dXJuIHV0aWwuc3RyMmJpbihkZXMoa2V5cywgdXRpbC5iaW4yc3RyKGJsb2NrKSwgdHJ1ZSwgMCwgbnVsbCwgcGFkZGluZykpO1xyXG4gICAgfVxyXG5cbiAgICB0aGlzLmRlY3J5cHQgPSBmdW5jdGlvbiAoYmxvY2ssIHBhZGRpbmcpIHtcclxuICAgICAgICB2YXIga2V5cyA9IGRlc19jcmVhdGVLZXlzKHRoaXMua2V5KTtcclxuICAgICAgICByZXR1cm4gdXRpbC5zdHIyYmluKGRlcyhrZXlzLCB1dGlsLmJpbjJzdHIoYmxvY2spLCBmYWxzZSwgMCwgbnVsbCwgcGFkZGluZykpO1xyXG4gICAgfVxyXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgZGVzOiBEZXMsXG4gICAgb3JpZ2luYWxEZXM6IE9yaWdpbmFsRGVzXHJcbn1cblxuIiwiXG52YXIgZGVzTW9kdWxlID0gcmVxdWlyZSgnLi9kZXMuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZGVzOiBkZXNNb2R1bGVbJ2RlcyddLFxuICAgIG9yaWdpbmFsRGVzOiBkZXNNb2R1bGVbJ29yaWdpbmFsRGVzJ10sXG5cdGNhc3Q1OiByZXF1aXJlKCcuL2Nhc3Q1LmpzJyksXG5cdHR3b2Zpc2g6IHJlcXVpcmUoJy4vdHdvZmlzaC5qcycpLFxuXHRibG93ZmlzaDogcmVxdWlyZSgnLi9ibG93ZmlzaC5qcycpXG59XG5cbnZhciBhZXMgPSByZXF1aXJlKCcuL2Flcy5qcycpO1xuXG5mb3IodmFyIGkgaW4gYWVzKSB7XG5cdG1vZHVsZS5leHBvcnRzWydhZXMnICsgaV0gPSBhZXNbaV07XG59XG4iLCIvKiBNb2RpZmllZCBieSBSZWN1cml0eSBMYWJzIEdtYkggXG4gKiBcbiAqIENpcGhlci5qc1xuICogQSBibG9jay1jaXBoZXIgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIG9uIEphdmFTY3JpcHRcbiAqIFNlZSBDaXBoZXIucmVhZG1lLnR4dCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cbiAqXG4gKiBDb3B5cmlnaHQoYykgMjAwOSBBdHN1c2hpIE9rYSBbIGh0dHA6Ly9va2EubnUvIF1cbiAqIFRoaXMgc2NyaXB0IGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExHUExcbiAqXG4gKiBBQ0tOT1dMRURHTUVOVFxuICpcbiAqICAgICBUaGUgbWFpbiBzdWJyb3V0aW5lcyBhcmUgd3JpdHRlbiBieSBNaWNoaWVsIHZhbiBFdmVyZGluZ2VuLlxuICogXG4gKiAgICAgTWljaGllbCB2YW4gRXZlcmRpbmdlblxuICogICAgIGh0dHA6Ly9ob21lLnZlcnNhdGVsLm5sL01BdmFuRXZlcmRpbmdlbi9pbmRleC5odG1sXG4gKiBcbiAqICAgICBBbGwgcmlnaHRzIGZvciB0aGVzZSByb3V0aW5lcyBhcmUgcmVzZXJ2ZWQgdG8gTWljaGllbCB2YW4gRXZlcmRpbmdlbi5cbiAqXG4gKi9cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9NYXRoXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIE1BWElOVCA9IDB4RkZGRkZGRkY7XG5cbmZ1bmN0aW9uIHJvdGIoYixuKXsgcmV0dXJuICggYjw8biB8IGI+Pj4oIDgtbikgKSAmIDB4RkY7IH1cbmZ1bmN0aW9uIHJvdHcodyxuKXsgcmV0dXJuICggdzw8biB8IHc+Pj4oMzItbikgKSAmIE1BWElOVDsgfVxuZnVuY3Rpb24gZ2V0VyhhLGkpeyByZXR1cm4gYVtpXXxhW2krMV08PDh8YVtpKzJdPDwxNnxhW2krM108PDI0OyB9XG5mdW5jdGlvbiBzZXRXKGEsaSx3KXsgYS5zcGxpY2UoaSw0LHcmMHhGRiwodz4+PjgpJjB4RkYsKHc+Pj4xNikmMHhGRiwodz4+PjI0KSYweEZGKTsgfVxuZnVuY3Rpb24gc2V0V0ludihhLGksdyl7IGEuc3BsaWNlKGksNCwodz4+PjI0KSYweEZGLCh3Pj4+MTYpJjB4RkYsKHc+Pj44KSYweEZGLHcmMHhGRik7IH1cbmZ1bmN0aW9uIGdldEIoeCxuKXsgcmV0dXJuICh4Pj4+KG4qOCkpJjB4RkY7IH1cblxuZnVuY3Rpb24gZ2V0TnJCaXRzKGkpeyB2YXIgbj0wOyB3aGlsZSAoaT4wKXsgbisrOyBpPj4+PTE7IH0gcmV0dXJuIG47IH1cbmZ1bmN0aW9uIGdldE1hc2sobil7IHJldHVybiAoMTw8biktMTsgfVxuXG4vL2FkZGVkIDIwMDgvMTEvMTMgWFhYIE1VU1QgVVNFIE9ORS1XQVkgSEFTSCBGVU5DVElPTiBGT1IgU0VDVVJJVFkgUkVBU09OXG5mdW5jdGlvbiByYW5kQnl0ZSgpIHtcbiByZXR1cm4gTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqIDI1NiApO1xufVxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVHdvZmlzaFxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5mdW5jdGlvbiBjcmVhdGVUd29maXNoKCkge1xuXHQvL1xuXHR2YXIga2V5Qnl0ZXMgPSBudWxsO1xuXHR2YXIgZGF0YUJ5dGVzID0gbnVsbDtcblx0dmFyIGRhdGFPZmZzZXQgPSAtMTtcblx0Ly8gdmFyIGRhdGFMZW5ndGggPSAtMTtcblx0dmFyIGFsZ29yaXRobU5hbWUgPSBudWxsO1xuXHQvLyB2YXIgaWR4MiA9IC0xO1xuXHQvL1xuXG5cdGFsZ29yaXRobU5hbWUgPSBcInR3b2Zpc2hcIjtcblxuXHR2YXIgdGZzS2V5ID0gW107XG5cdHZhciB0ZnNNID0gWyBbXSwgW10sIFtdLCBbXSBdO1xuXG5cdGZ1bmN0aW9uIHRmc0luaXQoa2V5KSB7XG5cdFx0a2V5Qnl0ZXMgPSBrZXk7XG5cdFx0dmFyIGksIGEsIGIsIGMsIGQsIG1lS2V5ID0gW10sIG1vS2V5ID0gW10sIGluS2V5ID0gW107XG5cdFx0dmFyIGtMZW47XG5cdFx0dmFyIHNLZXkgPSBbXTtcblx0XHR2YXIgZjAxLCBmNWIsIGZlZjtcblxuXHRcdHZhciBxMCA9IFsgWyA4LCAxLCA3LCAxMywgNiwgMTUsIDMsIDIsIDAsIDExLCA1LCA5LCAxNCwgMTIsIDEwLCA0IF0sXG5cdFx0XHRcdFsgMiwgOCwgMTEsIDEzLCAxNSwgNywgNiwgMTQsIDMsIDEsIDksIDQsIDAsIDEwLCAxMiwgNSBdIF07XG5cdFx0dmFyIHExID0gWyBbIDE0LCAxMiwgMTEsIDgsIDEsIDIsIDMsIDUsIDE1LCA0LCAxMCwgNiwgNywgMCwgOSwgMTMgXSxcblx0XHRcdFx0WyAxLCAxNCwgMiwgMTEsIDQsIDEyLCAzLCA3LCA2LCAxMywgMTAsIDUsIDE1LCA5LCAwLCA4IF0gXTtcblx0XHR2YXIgcTIgPSBbIFsgMTEsIDEwLCA1LCAxNCwgNiwgMTMsIDksIDAsIDEyLCA4LCAxNSwgMywgMiwgNCwgNywgMSBdLFxuXHRcdFx0XHRbIDQsIDEyLCA3LCA1LCAxLCA2LCA5LCAxMCwgMCwgMTQsIDEzLCA4LCAyLCAxMSwgMywgMTUgXSBdO1xuXHRcdHZhciBxMyA9IFsgWyAxMywgNywgMTUsIDQsIDEsIDIsIDYsIDE0LCA5LCAxMSwgMywgMCwgOCwgNSwgMTIsIDEwIF0sXG5cdFx0XHRcdFsgMTEsIDksIDUsIDEsIDEyLCAzLCAxMywgMTQsIDYsIDQsIDcsIDE1LCAyLCAwLCA4LCAxMCBdIF07XG5cdFx0dmFyIHJvcjQgPSBbIDAsIDgsIDEsIDksIDIsIDEwLCAzLCAxMSwgNCwgMTIsIDUsIDEzLCA2LCAxNCwgNywgMTUgXTtcblx0XHR2YXIgYXNoeCA9IFsgMCwgOSwgMiwgMTEsIDQsIDEzLCA2LCAxNSwgOCwgMSwgMTAsIDMsIDEyLCA1LCAxNCwgNyBdO1xuXHRcdHZhciBxID0gWyBbXSwgW10gXTtcblx0XHR2YXIgbSA9IFsgW10sIFtdLCBbXSwgW10gXTtcblxuXHRcdGZ1bmN0aW9uIGZmbTViKHgpIHtcblx0XHRcdHJldHVybiB4IF4gKHggPj4gMikgXiBbIDAsIDkwLCAxODAsIDIzOCBdW3ggJiAzXTtcblx0XHR9XG5cdFx0ZnVuY3Rpb24gZmZtRWYoeCkge1xuXHRcdFx0cmV0dXJuIHggXiAoeCA+PiAxKSBeICh4ID4+IDIpIF4gWyAwLCAyMzgsIDE4MCwgOTAgXVt4ICYgM107XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gbWRzUmVtKHAsIHEpIHtcblx0XHRcdHZhciBpLCB0LCB1O1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IDg7IGkrKykge1xuXHRcdFx0XHR0ID0gcSA+Pj4gMjQ7XG5cdFx0XHRcdHEgPSAoKHEgPDwgOCkgJiBNQVhJTlQpIHwgcCA+Pj4gMjQ7XG5cdFx0XHRcdHAgPSAocCA8PCA4KSAmIE1BWElOVDtcblx0XHRcdFx0dSA9IHQgPDwgMTtcblx0XHRcdFx0aWYgKHQgJiAxMjgpIHtcblx0XHRcdFx0XHR1IF49IDMzMztcblx0XHRcdFx0fVxuXHRcdFx0XHRxIF49IHQgXiAodSA8PCAxNik7XG5cdFx0XHRcdHUgXj0gdCA+Pj4gMTtcblx0XHRcdFx0aWYgKHQgJiAxKSB7XG5cdFx0XHRcdFx0dSBePSAxNjY7XG5cdFx0XHRcdH1cblx0XHRcdFx0cSBePSB1IDw8IDI0IHwgdSA8PCA4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHE7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcXAobiwgeCkge1xuXHRcdFx0dmFyIGEsIGIsIGMsIGQ7XG5cdFx0XHRhID0geCA+PiA0O1xuXHRcdFx0YiA9IHggJiAxNTtcblx0XHRcdGMgPSBxMFtuXVthIF4gYl07XG5cdFx0XHRkID0gcTFbbl1bcm9yNFtiXSBeIGFzaHhbYV1dO1xuXHRcdFx0cmV0dXJuIHEzW25dW3JvcjRbZF0gXiBhc2h4W2NdXSA8PCA0IHwgcTJbbl1bYyBeIGRdO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGhGdW4oeCwga2V5KSB7XG5cdFx0XHR2YXIgYSA9IGdldEIoeCwgMCksIGIgPSBnZXRCKHgsIDEpLCBjID0gZ2V0Qih4LCAyKSwgZCA9IGdldEIoeCwgMyk7XG5cdFx0XHRzd2l0Y2ggKGtMZW4pIHtcblx0XHRcdGNhc2UgNDpcblx0XHRcdFx0YSA9IHFbMV1bYV0gXiBnZXRCKGtleVszXSwgMCk7XG5cdFx0XHRcdGIgPSBxWzBdW2JdIF4gZ2V0QihrZXlbM10sIDEpO1xuXHRcdFx0XHRjID0gcVswXVtjXSBeIGdldEIoa2V5WzNdLCAyKTtcblx0XHRcdFx0ZCA9IHFbMV1bZF0gXiBnZXRCKGtleVszXSwgMyk7XG5cdFx0XHRjYXNlIDM6XG5cdFx0XHRcdGEgPSBxWzFdW2FdIF4gZ2V0QihrZXlbMl0sIDApO1xuXHRcdFx0XHRiID0gcVsxXVtiXSBeIGdldEIoa2V5WzJdLCAxKTtcblx0XHRcdFx0YyA9IHFbMF1bY10gXiBnZXRCKGtleVsyXSwgMik7XG5cdFx0XHRcdGQgPSBxWzBdW2RdIF4gZ2V0QihrZXlbMl0sIDMpO1xuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRhID0gcVswXVtxWzBdW2FdIF4gZ2V0QihrZXlbMV0sIDApXSBeIGdldEIoa2V5WzBdLCAwKTtcblx0XHRcdFx0YiA9IHFbMF1bcVsxXVtiXSBeIGdldEIoa2V5WzFdLCAxKV0gXiBnZXRCKGtleVswXSwgMSk7XG5cdFx0XHRcdGMgPSBxWzFdW3FbMF1bY10gXiBnZXRCKGtleVsxXSwgMildIF4gZ2V0QihrZXlbMF0sIDIpO1xuXHRcdFx0XHRkID0gcVsxXVtxWzFdW2RdIF4gZ2V0QihrZXlbMV0sIDMpXSBeIGdldEIoa2V5WzBdLCAzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtWzBdW2FdIF4gbVsxXVtiXSBeIG1bMl1bY10gXiBtWzNdW2RdO1xuXHRcdH1cblxuXHRcdGtleUJ5dGVzID0ga2V5Qnl0ZXMuc2xpY2UoMCwgMzIpO1xuXHRcdGkgPSBrZXlCeXRlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKGkgIT0gMTYgJiYgaSAhPSAyNCAmJiBpICE9IDMyKVxuXHRcdFx0a2V5Qnl0ZXNbaSsrXSA9IDA7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwga2V5Qnl0ZXMubGVuZ3RoOyBpICs9IDQpIHtcblx0XHRcdGluS2V5W2kgPj4gMl0gPSBnZXRXKGtleUJ5dGVzLCBpKTtcblx0XHR9XG5cdFx0Zm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdFx0XHRxWzBdW2ldID0gcXAoMCwgaSk7XG5cdFx0XHRxWzFdW2ldID0gcXAoMSwgaSk7XG5cdFx0fVxuXHRcdGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHRcdFx0ZjAxID0gcVsxXVtpXTtcblx0XHRcdGY1YiA9IGZmbTViKGYwMSk7XG5cdFx0XHRmZWYgPSBmZm1FZihmMDEpO1xuXHRcdFx0bVswXVtpXSA9IGYwMSArIChmNWIgPDwgOCkgKyAoZmVmIDw8IDE2KSArIChmZWYgPDwgMjQpO1xuXHRcdFx0bVsyXVtpXSA9IGY1YiArIChmZWYgPDwgOCkgKyAoZjAxIDw8IDE2KSArIChmZWYgPDwgMjQpO1xuXHRcdFx0ZjAxID0gcVswXVtpXTtcblx0XHRcdGY1YiA9IGZmbTViKGYwMSk7XG5cdFx0XHRmZWYgPSBmZm1FZihmMDEpO1xuXHRcdFx0bVsxXVtpXSA9IGZlZiArIChmZWYgPDwgOCkgKyAoZjViIDw8IDE2KSArIChmMDEgPDwgMjQpO1xuXHRcdFx0bVszXVtpXSA9IGY1YiArIChmMDEgPDwgOCkgKyAoZmVmIDw8IDE2KSArIChmNWIgPDwgMjQpO1xuXHRcdH1cblxuXHRcdGtMZW4gPSBpbktleS5sZW5ndGggLyAyO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBrTGVuOyBpKyspIHtcblx0XHRcdGEgPSBpbktleVtpICsgaV07XG5cdFx0XHRtZUtleVtpXSA9IGE7XG5cdFx0XHRiID0gaW5LZXlbaSArIGkgKyAxXTtcblx0XHRcdG1vS2V5W2ldID0gYjtcblx0XHRcdHNLZXlba0xlbiAtIGkgLSAxXSA9IG1kc1JlbShhLCBiKTtcblx0XHR9XG5cdFx0Zm9yIChpID0gMDsgaSA8IDQwOyBpICs9IDIpIHtcblx0XHRcdGEgPSAweDEwMTAxMDEgKiBpO1xuXHRcdFx0YiA9IGEgKyAweDEwMTAxMDE7XG5cdFx0XHRhID0gaEZ1bihhLCBtZUtleSk7XG5cdFx0XHRiID0gcm90dyhoRnVuKGIsIG1vS2V5KSwgOCk7XG5cdFx0XHR0ZnNLZXlbaV0gPSAoYSArIGIpICYgTUFYSU5UO1xuXHRcdFx0dGZzS2V5W2kgKyAxXSA9IHJvdHcoYSArIDIgKiBiLCA5KTtcblx0XHR9XG5cdFx0Zm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdFx0XHRhID0gYiA9IGMgPSBkID0gaTtcblx0XHRcdHN3aXRjaCAoa0xlbikge1xuXHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRhID0gcVsxXVthXSBeIGdldEIoc0tleVszXSwgMCk7XG5cdFx0XHRcdGIgPSBxWzBdW2JdIF4gZ2V0QihzS2V5WzNdLCAxKTtcblx0XHRcdFx0YyA9IHFbMF1bY10gXiBnZXRCKHNLZXlbM10sIDIpO1xuXHRcdFx0XHRkID0gcVsxXVtkXSBeIGdldEIoc0tleVszXSwgMyk7XG5cdFx0XHRjYXNlIDM6XG5cdFx0XHRcdGEgPSBxWzFdW2FdIF4gZ2V0QihzS2V5WzJdLCAwKTtcblx0XHRcdFx0YiA9IHFbMV1bYl0gXiBnZXRCKHNLZXlbMl0sIDEpO1xuXHRcdFx0XHRjID0gcVswXVtjXSBeIGdldEIoc0tleVsyXSwgMik7XG5cdFx0XHRcdGQgPSBxWzBdW2RdIF4gZ2V0QihzS2V5WzJdLCAzKTtcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0dGZzTVswXVtpXSA9IG1bMF1bcVswXVtxWzBdW2FdIF4gZ2V0QihzS2V5WzFdLCAwKV1cblx0XHRcdFx0XHRcdF4gZ2V0QihzS2V5WzBdLCAwKV07XG5cdFx0XHRcdHRmc01bMV1baV0gPSBtWzFdW3FbMF1bcVsxXVtiXSBeIGdldEIoc0tleVsxXSwgMSldXG5cdFx0XHRcdFx0XHReIGdldEIoc0tleVswXSwgMSldO1xuXHRcdFx0XHR0ZnNNWzJdW2ldID0gbVsyXVtxWzFdW3FbMF1bY10gXiBnZXRCKHNLZXlbMV0sIDIpXVxuXHRcdFx0XHRcdFx0XiBnZXRCKHNLZXlbMF0sIDIpXTtcblx0XHRcdFx0dGZzTVszXVtpXSA9IG1bM11bcVsxXVtxWzFdW2RdIF4gZ2V0QihzS2V5WzFdLCAzKV1cblx0XHRcdFx0XHRcdF4gZ2V0QihzS2V5WzBdLCAzKV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gdGZzRzAoeCkge1xuXHRcdHJldHVybiB0ZnNNWzBdW2dldEIoeCwgMCldIF4gdGZzTVsxXVtnZXRCKHgsIDEpXSBeIHRmc01bMl1bZ2V0Qih4LCAyKV1cblx0XHRcdFx0XiB0ZnNNWzNdW2dldEIoeCwgMyldO1xuXHR9XG5cdGZ1bmN0aW9uIHRmc0cxKHgpIHtcblx0XHRyZXR1cm4gdGZzTVswXVtnZXRCKHgsIDMpXSBeIHRmc01bMV1bZ2V0Qih4LCAwKV0gXiB0ZnNNWzJdW2dldEIoeCwgMSldXG5cdFx0XHRcdF4gdGZzTVszXVtnZXRCKHgsIDIpXTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRmc0ZybmQociwgYmxrKSB7XG5cdFx0dmFyIGEgPSB0ZnNHMChibGtbMF0pO1xuXHRcdHZhciBiID0gdGZzRzEoYmxrWzFdKTtcblx0XHRibGtbMl0gPSByb3R3KGJsa1syXSBeIChhICsgYiArIHRmc0tleVs0ICogciArIDhdKSAmIE1BWElOVCwgMzEpO1xuXHRcdGJsa1szXSA9IHJvdHcoYmxrWzNdLCAxKSBeIChhICsgMiAqIGIgKyB0ZnNLZXlbNCAqIHIgKyA5XSkgJiBNQVhJTlQ7XG5cdFx0YSA9IHRmc0cwKGJsa1syXSk7XG5cdFx0YiA9IHRmc0cxKGJsa1szXSk7XG5cdFx0YmxrWzBdID0gcm90dyhibGtbMF0gXiAoYSArIGIgKyB0ZnNLZXlbNCAqIHIgKyAxMF0pICYgTUFYSU5ULCAzMSk7XG5cdFx0YmxrWzFdID0gcm90dyhibGtbMV0sIDEpIF4gKGEgKyAyICogYiArIHRmc0tleVs0ICogciArIDExXSkgJiBNQVhJTlQ7XG5cdH1cblxuXHRmdW5jdGlvbiB0ZnNJcm5kKGksIGJsaykge1xuXHRcdHZhciBhID0gdGZzRzAoYmxrWzBdKTtcblx0XHR2YXIgYiA9IHRmc0cxKGJsa1sxXSk7XG5cdFx0YmxrWzJdID0gcm90dyhibGtbMl0sIDEpIF4gKGEgKyBiICsgdGZzS2V5WzQgKiBpICsgMTBdKSAmIE1BWElOVDtcblx0XHRibGtbM10gPSByb3R3KGJsa1szXSBeIChhICsgMiAqIGIgKyB0ZnNLZXlbNCAqIGkgKyAxMV0pICYgTUFYSU5ULCAzMSk7XG5cdFx0YSA9IHRmc0cwKGJsa1syXSk7XG5cdFx0YiA9IHRmc0cxKGJsa1szXSk7XG5cdFx0YmxrWzBdID0gcm90dyhibGtbMF0sIDEpIF4gKGEgKyBiICsgdGZzS2V5WzQgKiBpICsgOF0pICYgTUFYSU5UO1xuXHRcdGJsa1sxXSA9IHJvdHcoYmxrWzFdIF4gKGEgKyAyICogYiArIHRmc0tleVs0ICogaSArIDldKSAmIE1BWElOVCwgMzEpO1xuXHR9XG5cblx0ZnVuY3Rpb24gdGZzQ2xvc2UoKSB7XG5cdFx0dGZzS2V5ID0gW107XG5cdFx0dGZzTSA9IFsgW10sIFtdLCBbXSwgW10gXTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRmc0VuY3J5cHQoZGF0YSwgb2Zmc2V0KSB7XG5cdFx0ZGF0YUJ5dGVzID0gZGF0YTtcblx0XHRkYXRhT2Zmc2V0ID0gb2Zmc2V0O1xuXHRcdHZhciBibGsgPSBbIGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0KSBeIHRmc0tleVswXSxcblx0XHRcdFx0Z2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyA0KSBeIHRmc0tleVsxXSxcblx0XHRcdFx0Z2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyA4KSBeIHRmc0tleVsyXSxcblx0XHRcdFx0Z2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyAxMikgXiB0ZnNLZXlbM10gXTtcblx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcblx0XHRcdHRmc0ZybmQoaiwgYmxrKTtcblx0XHR9XG5cdFx0c2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQsIGJsa1syXSBeIHRmc0tleVs0XSk7XG5cdFx0c2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyA0LCBibGtbM10gXiB0ZnNLZXlbNV0pO1xuXHRcdHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgOCwgYmxrWzBdIF4gdGZzS2V5WzZdKTtcblx0XHRzZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDEyLCBibGtbMV0gXiB0ZnNLZXlbN10pO1xuXHRcdGRhdGFPZmZzZXQgKz0gMTY7XG5cdFx0cmV0dXJuIGRhdGFCeXRlcztcblx0fVxuXG5cdGZ1bmN0aW9uIHRmc0RlY3J5cHQoZGF0YSwgb2Zmc2V0KSB7XG5cdFx0ZGF0YUJ5dGVzID0gZGF0YTtcblx0XHRkYXRhT2Zmc2V0ID0gb2Zmc2V0O1xuXHRcdHZhciBibGsgPSBbIGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0KSBeIHRmc0tleVs0XSxcblx0XHRcdFx0Z2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyA0KSBeIHRmc0tleVs1XSxcblx0XHRcdFx0Z2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyA4KSBeIHRmc0tleVs2XSxcblx0XHRcdFx0Z2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyAxMikgXiB0ZnNLZXlbN10gXTtcblx0XHRmb3IgKCB2YXIgaiA9IDc7IGogPj0gMDsgai0tKSB7XG5cdFx0XHR0ZnNJcm5kKGosIGJsayk7XG5cdFx0fVxuXHRcdHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0LCBibGtbMl0gXiB0ZnNLZXlbMF0pO1xuXHRcdHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgNCwgYmxrWzNdIF4gdGZzS2V5WzFdKTtcblx0XHRzZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDgsIGJsa1swXSBeIHRmc0tleVsyXSk7XG5cdFx0c2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyAxMiwgYmxrWzFdIF4gdGZzS2V5WzNdKTtcblx0XHRkYXRhT2Zmc2V0ICs9IDE2O1xuXHR9XG5cdFxuXHQvLyBhZGRlZCBieSBSZWN1cml0eSBMYWJzXG5cdGZ1bmN0aW9uIHRmc0ZpbmFsKCkge1xuXHRcdHJldHVybiBkYXRhQnl0ZXM7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG5hbWUgOiBcInR3b2Zpc2hcIixcblx0XHRibG9ja3NpemUgOiAxMjggLyA4LFxuXHRcdG9wZW4gOiB0ZnNJbml0LFxuXHRcdGNsb3NlIDogdGZzQ2xvc2UsXG5cdFx0ZW5jcnlwdCA6IHRmc0VuY3J5cHQsXG5cdFx0ZGVjcnlwdCA6IHRmc0RlY3J5cHQsXG5cdFx0Ly8gYWRkZWQgYnkgUmVjdXJpdHkgTGFic1xuXHRcdGZpbmFsaXplOiB0ZnNGaW5hbFxuXHR9O1xufVxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwnKTtcblxuLy8gYWRkZWQgYnkgUmVjdXJpdHkgTGFic1xuZnVuY3Rpb24gVEZlbmNyeXB0KGJsb2NrLCBrZXkpIHtcblx0dmFyIGJsb2NrX2NvcHkgPSBbXS5jb25jYXQoYmxvY2spO1xuXHR2YXIgdGYgPSBjcmVhdGVUd29maXNoKCk7XG5cdHRmLm9wZW4odXRpbC5zdHIyYmluKGtleSksMCk7XG5cdHZhciByZXN1bHQgPSB0Zi5lbmNyeXB0KGJsb2NrX2NvcHksIDApO1xuXHR0Zi5jbG9zZSgpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBURihrZXkpIHtcblx0dGhpcy50ZiA9IGNyZWF0ZVR3b2Zpc2goKTtcblx0dGhpcy50Zi5vcGVuKHV0aWwuc3RyMmJpbihrZXkpLDApO1xuXG5cdHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uKGJsb2NrKSB7XG5cdFx0cmV0dXJuIHRoaXMudGYuZW5jcnlwdChbXS5jb25jYXQoYmxvY2spLCAwKTtcblx0fVxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gVEY7XG5tb2R1bGUuZXhwb3J0cy5rZXlTaXplID0gVEYucHJvdG90eXBlLmtleVNpemUgPSAzMjtcbm1vZHVsZS5leHBvcnRzLmJsb2NrU2l6ZSA9IFRGLnByb3RvdHlwZS5ibG9ja1NpemUgPSAxNjtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBIFxuXG4vLyBUaGUgR1BHNEJyb3dzZXJzIGNyeXB0byBpbnRlcmZhY2VcblxudmFyIHJhbmRvbSA9IHJlcXVpcmUoJy4vcmFuZG9tLmpzJyksXG4gIGNpcGhlciA9IHJlcXVpcmUoJy4vY2lwaGVyJyksXG4gIHB1YmxpY0tleSA9IHJlcXVpcmUoJy4vcHVibGljX2tleScpLFxuICB0eXBlX21waSA9IHJlcXVpcmUoJy4uL3R5cGUvbXBpLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuLyoqXG4gKiBFbmNyeXB0cyBkYXRhIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VycyBcbiAqIGFuZCB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gYWxnbyBBbGdvcml0aG0gdG8gYmUgdXNlZCAoU2VlIFJGQzQ4ODAgOS4xKVxuICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpW119IHB1YmxpY01QSXMgQWxnb3JpdGhtIGRlcGVuZGVudCBtdWx0aXByZWNpc2lvbiBpbnRlZ2Vyc1xuICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpfSBkYXRhIERhdGEgdG8gYmUgZW5jcnlwdGVkIGFzIE1QSVxuICogQHJldHVybiB7b3BlbnBncF90eXBlX21waVtdfSBpZiBSU0EgYW4gb3BlbnBncF90eXBlX21waTsgXG4gKiBpZiBlbGdhbWFsIGVuY3J5cHRpb24gYW4gYXJyYXkgb2YgdHdvIG9wZW5wZ3BfdHlwZV9tcGkgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSBudWxsXG4gKi9cbnB1YmxpY0tleUVuY3J5cHQ6IGZ1bmN0aW9uKGFsZ28sIHB1YmxpY01QSXMsIGRhdGEpIHtcbiAgdmFyIHJlc3VsdCA9IChmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2goYWxnbykge1xuICAgIGNhc2UgJ3JzYV9lbmNyeXB0JzpcbiAgICBjYXNlICdyc2FfZW5jcnlwdF9zaWduJzpcbiAgICAgIHZhciByc2EgPSBuZXcgcHVibGljS2V5LnJzYSgpO1xuICAgICAgdmFyIG4gPSBwdWJsaWNNUElzWzBdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIGUgPSBwdWJsaWNNUElzWzFdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIG0gPSBkYXRhLnRvQmlnSW50ZWdlcigpO1xuICAgICAgcmV0dXJuIFtyc2EuZW5jcnlwdChtLGUsbildO1xuXG4gICAgY2FzZSAnZWxnYW1hbCc6XG4gICAgICB2YXIgZWxnYW1hbCA9IG5ldyBwdWJsaWNLZXkuZWxnYW1hbCgpO1xuICAgICAgdmFyIHAgPSBwdWJsaWNNUElzWzBdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIGcgPSBwdWJsaWNNUElzWzFdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIHkgPSBwdWJsaWNNUElzWzJdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIG0gPSBkYXRhLnRvQmlnSW50ZWdlcigpO1xuICAgICAgcmV0dXJuIGVsZ2FtYWwuZW5jcnlwdChtLGcscCx5KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiByZXN1bHQubWFwKGZ1bmN0aW9uKGJuKSB7XG4gICAgdmFyIG1waSA9IG5ldyB0eXBlX21waSgpO1xuICAgIG1waS5mcm9tQmlnSW50ZWdlcihibik7XG4gICAgcmV0dXJuIG1waTtcbiAgfSk7XG59LFxuXG4vKipcbiAqIERlY3J5cHRzIGRhdGEgdXNpbmcgdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5IG11bHRpcHJlY2lzaW9uIGludGVnZXJzIG9mIHRoZSBwcml2YXRlIGtleSxcbiAqIHRoZSBzcGVjaWZpZWQgc2VjcmV0TVBJcyBvZiB0aGUgcHJpdmF0ZSBrZXkgYW5kIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLlxuICogQHBhcmFtIHtJbnRlZ2VyfSBhbGdvIEFsZ29yaXRobSB0byBiZSB1c2VkIChTZWUgUkZDNDg4MCA5LjEpXG4gKiBAcGFyYW0ge29wZW5wZ3BfdHlwZV9tcGlbXX0gcHVibGljTVBJcyBBbGdvcml0aG0gZGVwZW5kZW50IG11bHRpcHJlY2lzaW9uIGludGVnZXJzIFxuICogb2YgdGhlIHB1YmxpYyBrZXkgcGFydCBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waVtdfSBzZWNyZXRNUElzIEFsZ29yaXRobSBkZXBlbmRlbnQgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgXG4gKiBvZiB0aGUgcHJpdmF0ZSBrZXkgdXNlZFxuICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpfSBkYXRhIERhdGEgdG8gYmUgZW5jcnlwdGVkIGFzIE1QSVxuICogQHJldHVybiB7b3BlbnBncF90eXBlX21waX0gcmV0dXJucyBhIGJpZyBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIGRlY3J5cHRlZCBkYXRhOyBvdGhlcndpc2UgbnVsbFxuICovXG5cbnB1YmxpY0tleURlY3J5cHQ6IGZ1bmN0aW9uIChhbGdvLCBrZXlJbnRlZ2VycywgZGF0YUludGVnZXJzKSB7XG4gIHZhciBibiA9IChmdW5jdGlvbigpIHtcbiAgICBzd2l0Y2goYWxnbykge1xuICAgIGNhc2UgJ3JzYV9lbmNyeXB0X3NpZ24nOlxuICAgIGNhc2UgJ3JzYV9lbmNyeXB0JzpcbiAgICAgIHZhciByc2EgPSBuZXcgcHVibGljS2V5LnJzYSgpO1xuICAgICAgLy8gMCBhbmQgMSBhcmUgdGhlIHB1YmxpYyBrZXkuXG4gICAgICB2YXIgZCA9IGtleUludGVnZXJzWzJdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIHAgPSBrZXlJbnRlZ2Vyc1szXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBxID0ga2V5SW50ZWdlcnNbNF0udG9CaWdJbnRlZ2VyKCk7XG4gICAgICB2YXIgdSA9IGtleUludGVnZXJzWzVdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIG0gPSBkYXRhSW50ZWdlcnNbMF0udG9CaWdJbnRlZ2VyKCk7XG4gICAgICByZXR1cm4gcnNhLmRlY3J5cHQobSwgZCwgcCwgcSwgdSk7XG4gICAgY2FzZSAnZWxnYW1hbCc6XG4gICAgICB2YXIgZWxnYW1hbCA9IG5ldyBwdWJsaWNLZXkuZWxnYW1hbCgpO1xuICAgICAgdmFyIHggPSBrZXlJbnRlZ2Vyc1szXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBjMSA9IGRhdGFJbnRlZ2Vyc1swXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBjMiA9IGRhdGFJbnRlZ2Vyc1sxXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBwID0ga2V5SW50ZWdlcnNbMF0udG9CaWdJbnRlZ2VyKCk7XG4gICAgICByZXR1cm4gZWxnYW1hbC5kZWNyeXB0KGMxLGMyLHAseCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSkoKTtcblxuICB2YXIgcmVzdWx0ID0gbmV3IHR5cGVfbXBpKCk7XG4gIHJlc3VsdC5mcm9tQmlnSW50ZWdlcihibik7XG4gIHJldHVybiByZXN1bHQ7XG59LFxuXG4vKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGludGVnZXJzIGNvbXByaXNpbmcgdGhlIHByaXZhdGUga2V5IG9mIGFuIGFsZ29yaXRobVxuICogQHBhcmFtIHtvcGVucGdwLnB1YmxpY2tleX0gYWxnbyBUaGUgcHVibGljIGtleSBhbGdvcml0aG1cbiAqIEByZXR1cm4ge0ludGVnZXJ9IFRoZSBudW1iZXIgb2YgaW50ZWdlcnMuXG4gKi9cbmdldFByaXZhdGVNcGlDb3VudDogZnVuY3Rpb24oYWxnbykge1xuICBzd2l0Y2goYWxnbykge1xuICAgIGNhc2UgJ3JzYV9lbmNyeXB0JzpcbiAgICBjYXNlICdyc2FfZW5jcnlwdF9zaWduJzpcbiAgICBjYXNlICdyc2Ffc2lnbic6XG4gICAgLy8gICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBSU0Egc2VjcmV0IGtleXM6XG4gICAgLy8gICAtIG11bHRpcHJlY2lzaW9uIGludGVnZXIgKE1QSSkgb2YgUlNBIHNlY3JldCBleHBvbmVudCBkLlxuICAgIC8vICAgLSBNUEkgb2YgUlNBIHNlY3JldCBwcmltZSB2YWx1ZSBwLlxuICAgIC8vICAgLSBNUEkgb2YgUlNBIHNlY3JldCBwcmltZSB2YWx1ZSBxIChwIDwgcSkuXG4gICAgLy8gICAtIE1QSSBvZiB1LCB0aGUgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBvZiBwLCBtb2QgcS5cbiAgICByZXR1cm4gNDtcbiAgY2FzZSAnZWxnYW1hbCc6XG4gICAgLy8gQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRWxnYW1hbCBzZWNyZXQga2V5czpcbiAgICAvLyAgIC0gTVBJIG9mIEVsZ2FtYWwgc2VjcmV0IGV4cG9uZW50IHguXG4gICAgcmV0dXJuIDE7XG4gIGNhc2UgJ2RzYSc6XG4gICAgLy8gQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRFNBIHNlY3JldCBrZXlzOlxuICAgIC8vICAgLSBNUEkgb2YgRFNBIHNlY3JldCBleHBvbmVudCB4LlxuICAgIHJldHVybiAxO1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBhbGdvcml0aG0nKTtcbiAgfVxufSxcbiAgXG5nZXRQdWJsaWNNcGlDb3VudDogZnVuY3Rpb24oYWxnbykge1xuICAvLyAtIEEgc2VyaWVzIG9mIG11bHRpcHJlY2lzaW9uIGludGVnZXJzIGNvbXByaXNpbmcgdGhlIGtleSBtYXRlcmlhbDpcbiAgLy8gICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBSU0EgcHVibGljIGtleXM6XG4gIC8vICAgICAgIC0gYSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VyIChNUEkpIG9mIFJTQSBwdWJsaWMgbW9kdWx1cyBuO1xuICAvLyAgICAgICAtIGFuIE1QSSBvZiBSU0EgcHVibGljIGVuY3J5cHRpb24gZXhwb25lbnQgZS5cbiAgc3dpdGNoKGFsZ28pIHtcbiAgICBjYXNlICdyc2FfZW5jcnlwdCc6XG4gICAgY2FzZSAncnNhX2VuY3J5cHRfc2lnbic6XG4gICAgY2FzZSAncnNhX3NpZ24nOlxuICAgIHJldHVybiAyO1xuXG4gIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRWxnYW1hbCBwdWJsaWMga2V5czpcbiAgLy8gICAgIC0gTVBJIG9mIEVsZ2FtYWwgcHJpbWUgcDtcbiAgLy8gICAgIC0gTVBJIG9mIEVsZ2FtYWwgZ3JvdXAgZ2VuZXJhdG9yIGc7XG4gIC8vICAgICAtIE1QSSBvZiBFbGdhbWFsIHB1YmxpYyBrZXkgdmFsdWUgeSAoPSBnKip4IG1vZCBwIHdoZXJlIHggIGlzIHNlY3JldCkuXG4gICAgY2FzZSAnZWxnYW1hbCc6XG4gICAgcmV0dXJuIDM7XG5cbiAgLy8gICBBbGdvcml0aG0tU3BlY2lmaWMgRmllbGRzIGZvciBEU0EgcHVibGljIGtleXM6XG4gIC8vICAgICAgIC0gTVBJIG9mIERTQSBwcmltZSBwO1xuICAvLyAgICAgICAtIE1QSSBvZiBEU0EgZ3JvdXAgb3JkZXIgcSAocSBpcyBhIHByaW1lIGRpdmlzb3Igb2YgcC0xKTtcbiAgLy8gICAgICAgLSBNUEkgb2YgRFNBIGdyb3VwIGdlbmVyYXRvciBnO1xuICAvLyAgICAgICAtIE1QSSBvZiBEU0EgcHVibGljLWtleSB2YWx1ZSB5ICg9IGcqKnggbW9kIHAgd2hlcmUgeCAgaXMgc2VjcmV0KS5cbiAgICBjYXNlICdkc2EnOlxuICAgIHJldHVybiA0O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBhbGdvcml0aG0uJyk7XG4gIH1cbn0sXG5cblxuLyoqXG4gKiBnZW5lcmF0ZSByYW5kb20gYnl0ZSBwcmVmaXggYXMgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobVxuICogQHBhcmFtIHtJbnRlZ2VyfSBhbGdvIEFsZ29yaXRobSB0byB1c2UgKHNlZSBSRkM0ODgwIDkuMilcbiAqIEByZXR1cm4ge1N0cmluZ30gUmFuZG9tIGJ5dGVzIHdpdGggbGVuZ3RoIGVxdWFsIHRvIHRoZSBibG9ja1xuICogc2l6ZSBvZiB0aGUgY2lwaGVyXG4gKi9cbmdldFByZWZpeFJhbmRvbTogZnVuY3Rpb24oYWxnbykge1xuICByZXR1cm4gcmFuZG9tLmdldFJhbmRvbUJ5dGVzKGNpcGhlclthbGdvXS5ibG9ja1NpemUpO1xufSxcblxuLyoqXG4gKiBHZW5lcmF0aW5nIGEgc2Vzc2lvbiBrZXkgZm9yIHRoZSBzcGVjaWZpZWQgc3ltbWV0cmljIGFsZ29yaXRobVxuICogQHBhcmFtIHtJbnRlZ2VyfSBhbGdvIEFsZ29yaXRobSB0byB1c2UgKHNlZSBSRkM0ODgwIDkuMilcbiAqIEByZXR1cm4ge1N0cmluZ30gUmFuZG9tIGJ5dGVzIGFzIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgYSBrZXlcbiAqL1xuZ2VuZXJhdGVTZXNzaW9uS2V5OiBmdW5jdGlvbihhbGdvKSB7XG4gIHJldHVybiByYW5kb20uZ2V0UmFuZG9tQnl0ZXMoY2lwaGVyW2FsZ29dLmtleVNpemUpOyBcbn0sXG5cbn07XG4iLCJcbnZhciBzaGEgPSByZXF1aXJlKCcuL3NoYS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0bWQ1OiByZXF1aXJlKCcuL21kNS5qcycpLFxuXHRzaGExOiBzaGEuc2hhMSxcblx0c2hhMjU2OiBzaGEuc2hhMjU2LFxuXHRzaGEyMjQ6IHNoYS5zaGEyMjQsXG5cdHNoYTM4NDogc2hhLnNoYTM4NCxcblx0c2hhNTEyOiBzaGEuc2hhNTEyLFxuXHRyaXBlbWQ6IHJlcXVpcmUoJy4vcmlwZS1tZC5qcycpLFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBoYXNoIG9uIHRoZSBzcGVjaWZpZWQgZGF0YSB1c2luZyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGFsZ28gSGFzaCBhbGdvcml0aG0gdHlwZSAoc2VlIFJGQzQ4ODAgOS40KVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGJlIGhhc2hlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IGhhc2ggdmFsdWVcblx0ICovXG5cdGRpZ2VzdDogZnVuY3Rpb24oYWxnbywgZGF0YSkge1xuXHRcdHN3aXRjaChhbGdvKSB7XG5cdFx0Y2FzZSAxOiAvLyAtIE1ENSBbSEFDXVxuXHRcdFx0cmV0dXJuIHRoaXMubWQ1KGRhdGEpO1xuXHRcdGNhc2UgMjogLy8gLSBTSEEtMSBbRklQUzE4MF1cblx0XHRcdHJldHVybiB0aGlzLnNoYTEoZGF0YSk7XG5cdFx0Y2FzZSAzOiAvLyAtIFJJUEUtTUQvMTYwIFtIQUNdXG5cdFx0XHRyZXR1cm4gdGhpcy5yaXBlbWQoZGF0YSk7XG5cdFx0Y2FzZSA4OiAvLyAtIFNIQTI1NiBbRklQUzE4MF1cblx0XHRcdHJldHVybiB0aGlzLnNoYTI1NihkYXRhKTtcblx0XHRjYXNlIDk6IC8vIC0gU0hBMzg0IFtGSVBTMTgwXVxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhMzg0KGRhdGEpO1xuXHRcdGNhc2UgMTA6Ly8gLSBTSEE1MTIgW0ZJUFMxODBdXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGE1MTIoZGF0YSk7XG5cdFx0Y2FzZSAxMTovLyAtIFNIQTIyNCBbRklQUzE4MF1cblx0XHRcdHJldHVybiB0aGlzLnNoYTIyNChkYXRhKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhhc2ggZnVuY3Rpb24uJyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBoYXNoIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNwZWNpZmllZCBoYXNoIGFsZ29yaXRobSB0eXBlXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gYWxnbyBIYXNoIGFsZ29yaXRobSB0eXBlIChTZWUgUkZDNDg4MCA5LjQpXG5cdCAqIEByZXR1cm4ge0ludGVnZXJ9IFNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBoYXNoXG5cdCAqL1xuXHRnZXRIYXNoQnl0ZUxlbmd0aDogZnVuY3Rpb24oYWxnbykge1xuXHRcdHN3aXRjaChhbGdvKSB7XG5cdFx0Y2FzZSAxOiAvLyAtIE1ENSBbSEFDXVxuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdGNhc2UgMjogLy8gLSBTSEEtMSBbRklQUzE4MF1cblx0XHRjYXNlIDM6IC8vIC0gUklQRS1NRC8xNjAgW0hBQ11cblx0XHRcdHJldHVybiAyMDtcblx0XHRjYXNlIDg6IC8vIC0gU0hBMjU2IFtGSVBTMTgwXVxuXHRcdFx0cmV0dXJuIDMyO1xuXHRcdGNhc2UgOTogLy8gLSBTSEEzODQgW0ZJUFMxODBdXG5cdFx0XHRyZXR1cm4gNDhcblx0XHRjYXNlIDEwOi8vIC0gU0hBNTEyIFtGSVBTMTgwXVxuXHRcdFx0cmV0dXJuIDY0O1xuXHRcdGNhc2UgMTE6Ly8gLSBTSEEyMjQgW0ZJUFMxODBdXG5cdFx0XHRyZXR1cm4gMjg7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoYXNoIGFsZ29yaXRobS4nKTtcblx0XHR9XG5cdH1cblxufVxuXG4iLCIvKipcbiAqIEEgZmFzdCBNRDUgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvblxuICogQ29weXJpZ2h0IChjKSAyMDEyIEpvc2VwaCBNeWVyc1xuICogaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sXG4gKlxuICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZVxuICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZXMgYW5kIHdpdGhvdXRcbiAqIGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0IG5vdGljZVxuICogYXBwZWFycyBpbiBhbGwgY29waWVzLlxuICpcbiAqIE9mIGNvdXJzZSwgdGhpcyBzb2Z0IGlzIHByb3ZpZGVkIFwiYXMgaXNcIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZFxuICogd2FycmFudHkgb2YgYW55IGtpbmQuXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwuanMnKTtcblxuZnVuY3Rpb24gTUQ1KGVudHJlZSkge1xuXHR2YXIgaGV4ID0gbWQ1KGVudHJlZSk7XG5cdHZhciBiaW4gPSB1dGlsLmhleDJiaW4oaGV4KTtcblx0cmV0dXJuIGJpbjtcbn1cblxuZnVuY3Rpb24gbWQ1Y3ljbGUoeCwgaykge1xudmFyIGEgPSB4WzBdLCBiID0geFsxXSwgYyA9IHhbMl0sIGQgPSB4WzNdO1xuXG5hID0gZmYoYSwgYiwgYywgZCwga1swXSwgNywgLTY4MDg3NjkzNik7XG5kID0gZmYoZCwgYSwgYiwgYywga1sxXSwgMTIsIC0zODk1NjQ1ODYpO1xuYyA9IGZmKGMsIGQsIGEsIGIsIGtbMl0sIDE3LCAgNjA2MTA1ODE5KTtcbmIgPSBmZihiLCBjLCBkLCBhLCBrWzNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuYSA9IGZmKGEsIGIsIGMsIGQsIGtbNF0sIDcsIC0xNzY0MTg4OTcpO1xuZCA9IGZmKGQsIGEsIGIsIGMsIGtbNV0sIDEyLCAgMTIwMDA4MDQyNik7XG5jID0gZmYoYywgZCwgYSwgYiwga1s2XSwgMTcsIC0xNDczMjMxMzQxKTtcbmIgPSBmZihiLCBjLCBkLCBhLCBrWzddLCAyMiwgLTQ1NzA1OTgzKTtcbmEgPSBmZihhLCBiLCBjLCBkLCBrWzhdLCA3LCAgMTc3MDAzNTQxNik7XG5kID0gZmYoZCwgYSwgYiwgYywga1s5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbmMgPSBmZihjLCBkLCBhLCBiLCBrWzEwXSwgMTcsIC00MjA2Myk7XG5iID0gZmYoYiwgYywgZCwgYSwga1sxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG5hID0gZmYoYSwgYiwgYywgZCwga1sxMl0sIDcsICAxODA0NjAzNjgyKTtcbmQgPSBmZihkLCBhLCBiLCBjLCBrWzEzXSwgMTIsIC00MDM0MTEwMSk7XG5jID0gZmYoYywgZCwgYSwgYiwga1sxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG5iID0gZmYoYiwgYywgZCwgYSwga1sxNV0sIDIyLCAgMTIzNjUzNTMyOSk7XG5cbmEgPSBnZyhhLCBiLCBjLCBkLCBrWzFdLCA1LCAtMTY1Nzk2NTEwKTtcbmQgPSBnZyhkLCBhLCBiLCBjLCBrWzZdLCA5LCAtMTA2OTUwMTYzMik7XG5jID0gZ2coYywgZCwgYSwgYiwga1sxMV0sIDE0LCAgNjQzNzE3NzEzKTtcbmIgPSBnZyhiLCBjLCBkLCBhLCBrWzBdLCAyMCwgLTM3Mzg5NzMwMik7XG5hID0gZ2coYSwgYiwgYywgZCwga1s1XSwgNSwgLTcwMTU1ODY5MSk7XG5kID0gZ2coZCwgYSwgYiwgYywga1sxMF0sIDksICAzODAxNjA4Myk7XG5jID0gZ2coYywgZCwgYSwgYiwga1sxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbmIgPSBnZyhiLCBjLCBkLCBhLCBrWzRdLCAyMCwgLTQwNTUzNzg0OCk7XG5hID0gZ2coYSwgYiwgYywgZCwga1s5XSwgNSwgIDU2ODQ0NjQzOCk7XG5kID0gZ2coZCwgYSwgYiwgYywga1sxNF0sIDksIC0xMDE5ODAzNjkwKTtcbmMgPSBnZyhjLCBkLCBhLCBiLCBrWzNdLCAxNCwgLTE4NzM2Mzk2MSk7XG5iID0gZ2coYiwgYywgZCwgYSwga1s4XSwgMjAsICAxMTYzNTMxNTAxKTtcbmEgPSBnZyhhLCBiLCBjLCBkLCBrWzEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuZCA9IGdnKGQsIGEsIGIsIGMsIGtbMl0sIDksIC01MTQwMzc4NCk7XG5jID0gZ2coYywgZCwgYSwgYiwga1s3XSwgMTQsICAxNzM1MzI4NDczKTtcbmIgPSBnZyhiLCBjLCBkLCBhLCBrWzEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcblxuYSA9IGhoKGEsIGIsIGMsIGQsIGtbNV0sIDQsIC0zNzg1NTgpO1xuZCA9IGhoKGQsIGEsIGIsIGMsIGtbOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG5jID0gaGgoYywgZCwgYSwgYiwga1sxMV0sIDE2LCAgMTgzOTAzMDU2Mik7XG5iID0gaGgoYiwgYywgZCwgYSwga1sxNF0sIDIzLCAtMzUzMDk1NTYpO1xuYSA9IGhoKGEsIGIsIGMsIGQsIGtbMV0sIDQsIC0xNTMwOTkyMDYwKTtcbmQgPSBoaChkLCBhLCBiLCBjLCBrWzRdLCAxMSwgIDEyNzI4OTMzNTMpO1xuYyA9IGhoKGMsIGQsIGEsIGIsIGtbN10sIDE2LCAtMTU1NDk3NjMyKTtcbmIgPSBoaChiLCBjLCBkLCBhLCBrWzEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbmEgPSBoaChhLCBiLCBjLCBkLCBrWzEzXSwgNCwgIDY4MTI3OTE3NCk7XG5kID0gaGgoZCwgYSwgYiwgYywga1swXSwgMTEsIC0zNTg1MzcyMjIpO1xuYyA9IGhoKGMsIGQsIGEsIGIsIGtbM10sIDE2LCAtNzIyNTIxOTc5KTtcbmIgPSBoaChiLCBjLCBkLCBhLCBrWzZdLCAyMywgIDc2MDI5MTg5KTtcbmEgPSBoaChhLCBiLCBjLCBkLCBrWzldLCA0LCAtNjQwMzY0NDg3KTtcbmQgPSBoaChkLCBhLCBiLCBjLCBrWzEyXSwgMTEsIC00MjE4MTU4MzUpO1xuYyA9IGhoKGMsIGQsIGEsIGIsIGtbMTVdLCAxNiwgIDUzMDc0MjUyMCk7XG5iID0gaGgoYiwgYywgZCwgYSwga1syXSwgMjMsIC05OTUzMzg2NTEpO1xuXG5hID0gaWkoYSwgYiwgYywgZCwga1swXSwgNiwgLTE5ODYzMDg0NCk7XG5kID0gaWkoZCwgYSwgYiwgYywga1s3XSwgMTAsICAxMTI2ODkxNDE1KTtcbmMgPSBpaShjLCBkLCBhLCBiLCBrWzE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbmIgPSBpaShiLCBjLCBkLCBhLCBrWzVdLCAyMSwgLTU3NDM0MDU1KTtcbmEgPSBpaShhLCBiLCBjLCBkLCBrWzEyXSwgNiwgIDE3MDA0ODU1NzEpO1xuZCA9IGlpKGQsIGEsIGIsIGMsIGtbM10sIDEwLCAtMTg5NDk4NjYwNik7XG5jID0gaWkoYywgZCwgYSwgYiwga1sxMF0sIDE1LCAtMTA1MTUyMyk7XG5iID0gaWkoYiwgYywgZCwgYSwga1sxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbmEgPSBpaShhLCBiLCBjLCBkLCBrWzhdLCA2LCAgMTg3MzMxMzM1OSk7XG5kID0gaWkoZCwgYSwgYiwgYywga1sxNV0sIDEwLCAtMzA2MTE3NDQpO1xuYyA9IGlpKGMsIGQsIGEsIGIsIGtbNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG5iID0gaWkoYiwgYywgZCwgYSwga1sxM10sIDIxLCAgMTMwOTE1MTY0OSk7XG5hID0gaWkoYSwgYiwgYywgZCwga1s0XSwgNiwgLTE0NTUyMzA3MCk7XG5kID0gaWkoZCwgYSwgYiwgYywga1sxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG5jID0gaWkoYywgZCwgYSwgYiwga1syXSwgMTUsICA3MTg3ODcyNTkpO1xuYiA9IGlpKGIsIGMsIGQsIGEsIGtbOV0sIDIxLCAtMzQzNDg1NTUxKTtcblxueFswXSA9IGFkZDMyKGEsIHhbMF0pO1xueFsxXSA9IGFkZDMyKGIsIHhbMV0pO1xueFsyXSA9IGFkZDMyKGMsIHhbMl0pO1xueFszXSA9IGFkZDMyKGQsIHhbM10pO1xuXG59XG5cbmZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7XG5hID0gYWRkMzIoYWRkMzIoYSwgcSksIGFkZDMyKHgsIHQpKTtcbnJldHVybiBhZGQzMigoYSA8PCBzKSB8IChhID4+PiAoMzIgLSBzKSksIGIpO1xufVxuXG5mdW5jdGlvbiBmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG5yZXR1cm4gY21uKChiICYgYykgfCAoKH5iKSAmIGQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gZ2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xucmV0dXJuIGNtbigoYiAmIGQpIHwgKGMgJiAofmQpKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIGhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbnJldHVybiBjbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gaWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xucmV0dXJuIGNtbihjIF4gKGIgfCAofmQpKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNTEocykge1xudHh0ID0gJyc7XG52YXIgbiA9IHMubGVuZ3RoLFxuc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sIGk7XG5mb3IgKGk9NjQ7IGk8PXMubGVuZ3RoOyBpKz02NCkge1xubWQ1Y3ljbGUoc3RhdGUsIG1kNWJsayhzLnN1YnN0cmluZyhpLTY0LCBpKSkpO1xufVxucyA9IHMuc3Vic3RyaW5nKGktNjQpO1xudmFyIHRhaWwgPSBbMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMF07XG5mb3IgKGk9MDsgaTxzLmxlbmd0aDsgaSsrKVxudGFpbFtpPj4yXSB8PSBzLmNoYXJDb2RlQXQoaSkgPDwgKChpJTQpIDw8IDMpO1xudGFpbFtpPj4yXSB8PSAweDgwIDw8ICgoaSU0KSA8PCAzKTtcbmlmIChpID4gNTUpIHtcbm1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcbmZvciAoaT0wOyBpPDE2OyBpKyspIHRhaWxbaV0gPSAwO1xufVxudGFpbFsxNF0gPSBuKjg7XG5tZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG5yZXR1cm4gc3RhdGU7XG59XG5cbi8qIHRoZXJlIG5lZWRzIHRvIGJlIHN1cHBvcnQgZm9yIFVuaWNvZGUgaGVyZSxcbiAqIHVubGVzcyB3ZSBwcmV0ZW5kIHRoYXQgd2UgY2FuIHJlZGVmaW5lIHRoZSBNRC01XG4gKiBhbGdvcml0aG0gZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVycyAocGVyaGFwc1xuICogYnkgYWRkaW5nIGV2ZXJ5IGZvdXIgMTYtYml0IGNoYXJhY3RlcnMgYW5kXG4gKiBzaG9ydGVuaW5nIHRoZSBzdW0gdG8gMzIgYml0cykuIE90aGVyd2lzZVxuICogSSBzdWdnZXN0IHBlcmZvcm1pbmcgTUQtNSBhcyBpZiBldmVyeSBjaGFyYWN0ZXJcbiAqIHdhcyB0d28gYnl0ZXMtLWUuZy4sIDAwNDAgMDAyNSA9IEAlLS1idXQgdGhlblxuICogaG93IHdpbGwgYW4gb3JkaW5hcnkgTUQtNSBzdW0gYmUgbWF0Y2hlZD9cbiAqIFRoZXJlIGlzIG5vIHdheSB0byBzdGFuZGFyZGl6ZSB0ZXh0IHRvIHNvbWV0aGluZ1xuICogbGlrZSBVVEYtOCBiZWZvcmUgdHJhbnNmb3JtYXRpb247IHNwZWVkIGNvc3QgaXNcbiAqIHV0dGVybHkgcHJvaGliaXRpdmUuIFRoZSBKYXZhU2NyaXB0IHN0YW5kYXJkXG4gKiBpdHNlbGYgbmVlZHMgdG8gbG9vayBhdCB0aGlzOiBpdCBzaG91bGQgc3RhcnRcbiAqIHByb3ZpZGluZyBhY2Nlc3MgdG8gc3RyaW5ncyBhcyBwcmVmb3JtZWQgVVRGLThcbiAqIDgtYml0IHVuc2lnbmVkIHZhbHVlIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gbWQ1YmxrKHMpIHsgLyogSSBmaWd1cmVkIGdsb2JhbCB3YXMgZmFzdGVyLiAgICovXG52YXIgbWQ1YmxrcyA9IFtdLCBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi9cbmZvciAoaT0wOyBpPDY0OyBpKz00KSB7XG5tZDVibGtzW2k+PjJdID0gcy5jaGFyQ29kZUF0KGkpXG4rIChzLmNoYXJDb2RlQXQoaSsxKSA8PCA4KVxuKyAocy5jaGFyQ29kZUF0KGkrMikgPDwgMTYpXG4rIChzLmNoYXJDb2RlQXQoaSszKSA8PCAyNCk7XG59XG5yZXR1cm4gbWQ1Ymxrcztcbn1cblxudmFyIGhleF9jaHIgPSAnMDEyMzQ1Njc4OWFiY2RlZicuc3BsaXQoJycpO1xuXG5mdW5jdGlvbiByaGV4KG4pXG57XG52YXIgcz0nJywgaj0wO1xuZm9yKDsgajw0OyBqKyspXG5zICs9IGhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl1cbisgaGV4X2NoclsobiA+PiAoaiAqIDgpKSAmIDB4MEZdO1xucmV0dXJuIHM7XG59XG5cbmZ1bmN0aW9uIGhleCh4KSB7XG5mb3IgKHZhciBpPTA7IGk8eC5sZW5ndGg7IGkrKylcbnhbaV0gPSByaGV4KHhbaV0pO1xucmV0dXJuIHguam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIG1kNShzKSB7XG5yZXR1cm4gaGV4KG1kNTEocykpO1xufVxuXG4vKiB0aGlzIGZ1bmN0aW9uIGlzIG11Y2ggZmFzdGVyLFxuc28gaWYgcG9zc2libGUgd2UgdXNlIGl0LiBTb21lIElFc1xuYXJlIHRoZSBvbmx5IG9uZXMgSSBrbm93IG9mIHRoYXRcbm5lZWQgdGhlIGlkaW90aWMgc2Vjb25kIGZ1bmN0aW9uLFxuZ2VuZXJhdGVkIGJ5IGFuIGlmIGNsYXVzZS4gICovXG5cbmZ1bmN0aW9uIGFkZDMyKGEsIGIpIHtcbnJldHVybiAoYSArIGIpICYgMHhGRkZGRkZGRjtcbn1cblxuaWYgKG1kNSgnaGVsbG8nKSAhPSAnNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTInKSB7XG5mdW5jdGlvbiBhZGQzMih4LCB5KSB7XG52YXIgbHN3ID0gKHggJiAweEZGRkYpICsgKHkgJiAweEZGRkYpLFxubXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG5yZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcbn1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNRDVcbiIsIi8qXG4gKiBDcnlwdG9NWCBUb29sc1xuICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNiBEZXJlayBCdWl0ZW5odWlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyXG4gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuXG4gKi9cblxuLyogTW9kaWZpZWQgYnkgUmVjdXJpdHkgTGFicyBHbWJIXG4gKi9cblxudmFyIFJNRHNpemUgICA9IDE2MDtcbnZhciBYID0gbmV3IEFycmF5KCk7XG5cbmZ1bmN0aW9uIFJPTCh4LCBuKVxue1xuICByZXR1cm4gbmV3IE51bWJlciAoKHggPDwgbikgfCAoIHggPj4+ICgzMiAtIG4pKSk7XG59XG5cbmZ1bmN0aW9uIEYoeCwgeSwgeilcbntcbiAgcmV0dXJuIG5ldyBOdW1iZXIoeCBeIHkgXiB6KTtcbn1cblxuZnVuY3Rpb24gRyh4LCB5LCB6KVxue1xuICByZXR1cm4gbmV3IE51bWJlcigoeCAmIHkpIHwgKH54ICYgeikpO1xufVxuXG5mdW5jdGlvbiBIKHgsIHksIHopXG57XG4gIHJldHVybiBuZXcgTnVtYmVyKCh4IHwgfnkpIF4geik7XG59XG5cbmZ1bmN0aW9uIEkoeCwgeSwgeilcbntcbiAgcmV0dXJuIG5ldyBOdW1iZXIoKHggJiB6KSB8ICh5ICYgfnopKTtcbn1cblxuZnVuY3Rpb24gSih4LCB5LCB6KVxue1xuICByZXR1cm4gbmV3IE51bWJlcih4IF4gKHkgfCB+eikpO1xufVxuXG5mdW5jdGlvbiBtaXhPbmVSb3VuZChhLCBiLCBjLCBkLCBlLCB4LCBzLCByb3VuZE51bWJlcilcbntcbiAgc3dpdGNoIChyb3VuZE51bWJlcilcbiAge1xuICAgIGNhc2UgMCA6IGEgKz0gRihiLCBjLCBkKSArIHggKyAweDAwMDAwMDAwOyBicmVhaztcbiAgICBjYXNlIDEgOiBhICs9IEcoYiwgYywgZCkgKyB4ICsgMHg1YTgyNzk5OTsgYnJlYWs7XG4gICAgY2FzZSAyIDogYSArPSBIKGIsIGMsIGQpICsgeCArIDB4NmVkOWViYTE7IGJyZWFrO1xuICAgIGNhc2UgMyA6IGEgKz0gSShiLCBjLCBkKSArIHggKyAweDhmMWJiY2RjOyBicmVhaztcbiAgICBjYXNlIDQgOiBhICs9IEooYiwgYywgZCkgKyB4ICsgMHhhOTUzZmQ0ZTsgYnJlYWs7XG4gICAgY2FzZSA1IDogYSArPSBKKGIsIGMsIGQpICsgeCArIDB4NTBhMjhiZTY7IGJyZWFrO1xuICAgIGNhc2UgNiA6IGEgKz0gSShiLCBjLCBkKSArIHggKyAweDVjNGRkMTI0OyBicmVhaztcbiAgICBjYXNlIDcgOiBhICs9IEgoYiwgYywgZCkgKyB4ICsgMHg2ZDcwM2VmMzsgYnJlYWs7XG4gICAgY2FzZSA4IDogYSArPSBHKGIsIGMsIGQpICsgeCArIDB4N2E2ZDc2ZTk7IGJyZWFrO1xuICAgIGNhc2UgOSA6IGEgKz0gRihiLCBjLCBkKSArIHggKyAweDAwMDAwMDAwOyBicmVhaztcbiAgICBcbiAgICBkZWZhdWx0IDogZG9jdW1lbnQud3JpdGUoXCJCb2d1cyByb3VuZCBudW1iZXJcIik7IGJyZWFrO1xuICB9ICBcbiAgXG4gIGEgPSBST0woYSwgcykgKyBlO1xuICBjID0gUk9MKGMsIDEwKTtcblxuICBhICY9IDB4ZmZmZmZmZmY7XG4gIGIgJj0gMHhmZmZmZmZmZjtcbiAgYyAmPSAweGZmZmZmZmZmO1xuICBkICY9IDB4ZmZmZmZmZmY7XG4gIGUgJj0gMHhmZmZmZmZmZjtcblxuICB2YXIgcmV0QmxvY2sgPSBuZXcgQXJyYXkoKTtcbiAgcmV0QmxvY2tbMF0gPSBhO1xuICByZXRCbG9ja1sxXSA9IGI7XG4gIHJldEJsb2NrWzJdID0gYztcbiAgcmV0QmxvY2tbM10gPSBkO1xuICByZXRCbG9ja1s0XSA9IGU7XG4gIHJldEJsb2NrWzVdID0geDtcbiAgcmV0QmxvY2tbNl0gPSBzO1xuXG4gIHJldHVybiByZXRCbG9jaztcbn1cblxuZnVuY3Rpb24gTURpbml0IChNRGJ1ZilcbntcbiAgTURidWZbMF0gPSAweDY3NDUyMzAxO1xuICBNRGJ1ZlsxXSA9IDB4ZWZjZGFiODk7XG4gIE1EYnVmWzJdID0gMHg5OGJhZGNmZTtcbiAgTURidWZbM10gPSAweDEwMzI1NDc2O1xuICBNRGJ1Zls0XSA9IDB4YzNkMmUxZjA7XG59XG5cbnZhciBST0xzID0gW1xuICBbMTEsIDE0LCAxNSwgMTIsICA1LCAgOCwgIDcsICA5LCAxMSwgMTMsIDE0LCAxNSwgIDYsICA3LCAgOSwgIDhdLFxuICBbIDcsICA2LCAgOCwgMTMsIDExLCAgOSwgIDcsIDE1LCAgNywgMTIsIDE1LCAgOSwgMTEsICA3LCAxMywgMTJdLFxuICBbMTEsIDEzLCAgNiwgIDcsIDE0LCAgOSwgMTMsIDE1LCAxNCwgIDgsIDEzLCAgNiwgIDUsIDEyLCAgNywgIDVdLFxuICBbMTEsIDEyLCAxNCwgMTUsIDE0LCAxNSwgIDksICA4LCAgOSwgMTQsICA1LCAgNiwgIDgsICA2LCAgNSwgMTJdLFxuICBbIDksIDE1LCAgNSwgMTEsICA2LCAgOCwgMTMsIDEyLCAgNSwgMTIsIDEzLCAxNCwgMTEsICA4LCAgNSwgIDZdLFxuICBbIDgsICA5LCAgOSwgMTEsIDEzLCAxNSwgMTUsICA1LCAgNywgIDcsICA4LCAxMSwgMTQsIDE0LCAxMiwgIDZdLFxuICBbIDksIDEzLCAxNSwgIDcsIDEyLCAgOCwgIDksIDExLCAgNywgIDcsIDEyLCAgNywgIDYsIDE1LCAxMywgMTFdLFxuICBbIDksICA3LCAxNSwgMTEsICA4LCAgNiwgIDYsIDE0LCAxMiwgMTMsICA1LCAxNCwgMTMsIDEzLCAgNywgIDVdLFxuICBbMTUsICA1LCAgOCwgMTEsIDE0LCAxNCwgIDYsIDE0LCAgNiwgIDksIDEyLCAgOSwgMTIsICA1LCAxNSwgIDhdLFxuICBbIDgsICA1LCAxMiwgIDksIDEyLCAgNSwgMTQsICA2LCAgOCwgMTMsICA2LCAgNSwgMTUsIDEzLCAxMSwgMTFdXG5dO1xuXG52YXIgaW5kZXhlcyA9IFtcbiAgWyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1XSxcbiAgWyA3LCAgNCwgMTMsICAxLCAxMCwgIDYsIDE1LCAgMywgMTIsICAwLCAgOSwgIDUsICAyLCAxNCwgMTEsICA4XSxcbiAgWyAzLCAxMCwgMTQsICA0LCAgOSwgMTUsICA4LCAgMSwgIDIsICA3LCAgMCwgIDYsIDEzLCAxMSwgIDUsIDEyXSxcbiAgWyAxLCAgOSwgMTEsIDEwLCAgMCwgIDgsIDEyLCAgNCwgMTMsICAzLCAgNywgMTUsIDE0LCAgNSwgIDYsICAyXSxcbiAgWyA0LCAgMCwgIDUsICA5LCAgNywgMTIsICAyLCAxMCwgMTQsICAxLCAgMywgIDgsIDExLCAgNiwgMTUsIDEzXSxcbiAgWyA1LCAxNCwgIDcsICAwLCAgOSwgIDIsIDExLCAgNCwgMTMsICA2LCAxNSwgIDgsICAxLCAxMCwgIDMsIDEyXSxcbiAgWyA2LCAxMSwgIDMsICA3LCAgMCwgMTMsICA1LCAxMCwgMTQsIDE1LCAgOCwgMTIsICA0LCAgOSwgIDEsICAyXSxcbiAgWzE1LCAgNSwgIDEsICAzLCAgNywgMTQsICA2LCAgOSwgMTEsICA4LCAxMiwgIDIsIDEwLCAgMCwgIDQsIDEzXSxcbiAgWyA4LCAgNiwgIDQsICAxLCAgMywgMTEsIDE1LCAgMCwgIDUsIDEyLCAgMiwgMTMsICA5LCAgNywgMTAsIDE0XSxcbiAgWzEyLCAxNSwgMTAsICA0LCAgMSwgIDUsICA4LCAgNywgIDYsICAyLCAxMywgMTQsICAwLCAgMywgIDksIDExXVxuXTtcblxuZnVuY3Rpb24gY29tcHJlc3MgKE1EYnVmLCBYKVxue1xuICBibG9ja0EgPSBuZXcgQXJyYXkoKTtcbiAgYmxvY2tCID0gbmV3IEFycmF5KCk7XG5cbiAgdmFyIHJldEJsb2NrO1xuXG4gIGZvciAodmFyIGk9MDsgaSA8IDU7IGkrKylcbiAge1xuICAgIGJsb2NrQVtpXSA9IG5ldyBOdW1iZXIoTURidWZbaV0pO1xuICAgIGJsb2NrQltpXSA9IG5ldyBOdW1iZXIoTURidWZbaV0pO1xuICB9XG5cbiAgdmFyIHN0ZXAgPSAwO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IDU7IGorKylcbiAge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICB7XG4gICAgICByZXRCbG9jayA9IG1peE9uZVJvdW5kKFxuICAgICAgICBibG9ja0FbKHN0ZXArMCkgJSA1XSxcbiAgICAgICAgYmxvY2tBWyhzdGVwKzEpICUgNV0sICAgXG4gICAgICAgIGJsb2NrQVsoc3RlcCsyKSAlIDVdLCAgIFxuICAgICAgICBibG9ja0FbKHN0ZXArMykgJSA1XSwgICBcbiAgICAgICAgYmxvY2tBWyhzdGVwKzQpICUgNV0sICBcbiAgICAgICAgWFtpbmRleGVzW2pdW2ldXSwgXG4gICAgICAgIFJPTHNbal1baV0sXG4gICAgICAgIGpcbiAgICAgICk7XG5cbiAgICAgIGJsb2NrQVsoc3RlcCswKSAlIDVdID0gcmV0QmxvY2tbMF07XG4gICAgICBibG9ja0FbKHN0ZXArMSkgJSA1XSA9IHJldEJsb2NrWzFdO1xuICAgICAgYmxvY2tBWyhzdGVwKzIpICUgNV0gPSByZXRCbG9ja1syXTtcbiAgICAgIGJsb2NrQVsoc3RlcCszKSAlIDVdID0gcmV0QmxvY2tbM107XG4gICAgICBibG9ja0FbKHN0ZXArNCkgJSA1XSA9IHJldEJsb2NrWzRdO1xuXG4gICAgICBzdGVwICs9IDQ7XG4gICAgfVxuICB9XG5cbiAgc3RlcCA9IDA7XG4gIGZvciAodmFyIGogPSA1OyBqIDwgMTA7IGorKylcbiAge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICB7ICBcbiAgICAgIHJldEJsb2NrID0gbWl4T25lUm91bmQoXG4gICAgICAgIGJsb2NrQlsoc3RlcCswKSAlIDVdLCBcbiAgICAgICAgYmxvY2tCWyhzdGVwKzEpICUgNV0sIFxuICAgICAgICBibG9ja0JbKHN0ZXArMikgJSA1XSwgXG4gICAgICAgIGJsb2NrQlsoc3RlcCszKSAlIDVdLCBcbiAgICAgICAgYmxvY2tCWyhzdGVwKzQpICUgNV0sICBcbiAgICAgICAgWFtpbmRleGVzW2pdW2ldXSwgXG4gICAgICAgIFJPTHNbal1baV0sXG4gICAgICAgIGpcbiAgICAgICk7XG5cbiAgICAgIGJsb2NrQlsoc3RlcCswKSAlIDVdID0gcmV0QmxvY2tbMF07XG4gICAgICBibG9ja0JbKHN0ZXArMSkgJSA1XSA9IHJldEJsb2NrWzFdO1xuICAgICAgYmxvY2tCWyhzdGVwKzIpICUgNV0gPSByZXRCbG9ja1syXTtcbiAgICAgIGJsb2NrQlsoc3RlcCszKSAlIDVdID0gcmV0QmxvY2tbM107XG4gICAgICBibG9ja0JbKHN0ZXArNCkgJSA1XSA9IHJldEJsb2NrWzRdO1xuXG4gICAgICBzdGVwICs9IDQ7XG4gICAgfVxuICB9XG5cbiAgYmxvY2tCWzNdICs9IGJsb2NrQVsyXSArIE1EYnVmWzFdO1xuICBNRGJ1ZlsxXSAgPSBNRGJ1ZlsyXSArIGJsb2NrQVszXSArIGJsb2NrQls0XTtcbiAgTURidWZbMl0gID0gTURidWZbM10gKyBibG9ja0FbNF0gKyBibG9ja0JbMF07XG4gIE1EYnVmWzNdICA9IE1EYnVmWzRdICsgYmxvY2tBWzBdICsgYmxvY2tCWzFdO1xuICBNRGJ1Zls0XSAgPSBNRGJ1ZlswXSArIGJsb2NrQVsxXSArIGJsb2NrQlsyXTtcbiAgTURidWZbMF0gID0gYmxvY2tCWzNdO1xufVxuXG5mdW5jdGlvbiB6ZXJvWChYKVxue1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHsgWFtpXSA9IDA7IH1cbn1cblxuZnVuY3Rpb24gTURmaW5pc2ggKE1EYnVmLCBzdHJwdHIsIGxzd2xlbiwgbXN3bGVuKVxue1xuICB2YXIgWCA9IG5ldyBBcnJheSgxNik7XG4gIHplcm9YKFgpO1xuXG4gIHZhciBqID0gMDtcbiAgZm9yICh2YXIgaT0wOyBpIDwgKGxzd2xlbiAmIDYzKTsgaSsrKVxuICB7XG4gICAgWFtpID4+PiAyXSBePSAoc3RycHRyLmNoYXJDb2RlQXQoaisrKSAmIDI1NSkgPDwgKDggKiAoaSAmIDMpKTtcbiAgfVxuXG4gIFhbKGxzd2xlbiA+Pj4gMikgJiAxNV0gXj0gMSA8PCAoOCAqIChsc3dsZW4gJiAzKSArIDcpO1xuXG4gIGlmICgobHN3bGVuICYgNjMpID4gNTUpXG4gIHtcbiAgICBjb21wcmVzcyhNRGJ1ZiwgWCk7XG4gICAgdmFyIFggPSBuZXcgQXJyYXkoMTYpO1xuICAgIHplcm9YKFgpO1xuICB9XG5cbiAgWFsxNF0gPSBsc3dsZW4gPDwgMztcbiAgWFsxNV0gPSAobHN3bGVuID4+PiAyOSkgfCAobXN3bGVuIDw8IDMpO1xuXG4gIGNvbXByZXNzKE1EYnVmLCBYKTtcbn1cblxuZnVuY3Rpb24gQllURVNfVE9fRFdPUkQoZm91ckNoYXJzKVxue1xuICB2YXIgdG1wICA9IChmb3VyQ2hhcnMuY2hhckNvZGVBdCgzKSAmIDI1NSkgPDwgMjQ7XG4gIHRtcCAgIHw9IChmb3VyQ2hhcnMuY2hhckNvZGVBdCgyKSAmIDI1NSkgPDwgMTY7XG4gIHRtcCAgIHw9IChmb3VyQ2hhcnMuY2hhckNvZGVBdCgxKSAmIDI1NSkgPDwgODtcbiAgdG1wICAgfD0gKGZvdXJDaGFycy5jaGFyQ29kZUF0KDApICYgMjU1KTsgIFxuXG4gIHJldHVybiB0bXA7XG59XG5cbmZ1bmN0aW9uIFJNRChtZXNzYWdlKVxue1xuICB2YXIgTURidWYgICA9IG5ldyBBcnJheShSTURzaXplIC8gMzIpO1xuICB2YXIgaGFzaGNvZGUgICA9IG5ldyBBcnJheShSTURzaXplIC8gOCk7XG4gIHZhciBsZW5ndGg7ICBcbiAgdmFyIG5ieXRlcztcblxuICBNRGluaXQoTURidWYpO1xuICBsZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblxuICB2YXIgWCA9IG5ldyBBcnJheSgxNik7XG4gIHplcm9YKFgpO1xuXG4gIHZhciBqPTA7XG4gIGZvciAodmFyIG5ieXRlcz1sZW5ndGg7IG5ieXRlcyA+IDYzOyBuYnl0ZXMgLT0gNjQpXG4gIHtcbiAgICBmb3IgKHZhciBpPTA7IGkgPCAxNjsgaSsrKVxuICAgIHtcbiAgICAgIFhbaV0gPSBCWVRFU19UT19EV09SRChtZXNzYWdlLnN1YnN0cihqLCA0KSk7XG4gICAgICBqICs9IDQ7XG4gICAgfVxuICAgIGNvbXByZXNzKE1EYnVmLCBYKTtcbiAgfVxuXG4gIE1EZmluaXNoKE1EYnVmLCBtZXNzYWdlLnN1YnN0cihqKSwgbGVuZ3RoLCAwKTtcblxuICBmb3IgKHZhciBpPTA7IGkgPCBSTURzaXplIC8gODsgaSArPSA0KVxuICB7XG4gICAgaGFzaGNvZGVbaV0gICA9ICBNRGJ1ZltpID4+PiAyXSAgICYgMjU1O1xuICAgIGhhc2hjb2RlW2krMV0gPSAoTURidWZbaSA+Pj4gMl0gPj4+IDgpICAgJiAyNTU7XG4gICAgaGFzaGNvZGVbaSsyXSA9IChNRGJ1ZltpID4+PiAyXSA+Pj4gMTYpICYgMjU1O1xuICAgIGhhc2hjb2RlW2krM10gPSAoTURidWZbaSA+Pj4gMl0gPj4+IDI0KSAmIDI1NTtcbiAgfVxuXG4gIHJldHVybiBoYXNoY29kZTtcbn1cblxuXG5mdW5jdGlvbiBSTURzdHJpbmcobWVzc2FnZSlcbntcbiAgdmFyIGhhc2hjb2RlID0gUk1EKG1lc3NhZ2UpO1xuICB2YXIgcmV0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKHZhciBpPTA7IGkgPCBSTURzaXplLzg7IGkrKylcbiAge1xuICAgIHJldFN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGhhc2hjb2RlW2ldKTtcbiAgfSAgXG5cbiAgcmV0dXJuIHJldFN0cmluZzsgIFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJNRHN0cmluZztcbiIsIi8qIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0hBIGZhbWlseSBvZiBoYXNoZXMsIGFzIGRlZmluZWQgaW4gRklQUyBcbiAqIFBVQiAxODAtMiBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIEhNQUMgaW1wbGVtZW50YXRpb24gYXMgZGVmaW5lZCBpblxuICogRklQUyBQVUIgMTk4YVxuICpcbiAqIFZlcnNpb24gMS4zIENvcHlyaWdodCBCcmlhbiBUdXJlayAyMDA4LTIwMTBcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9qc3NoYS5zb3VyY2Vmb3JnZS5uZXQvIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gKlxuICogU2V2ZXJhbCBmdW5jdGlvbnMgdGFrZW4gZnJvbSBQYXVsIEpvaG5zb25cbiAqL1xuXG4vKiBNb2RpZmllZCBieSBSZWN1cml0eSBMYWJzIEdtYkhcbiAqIFxuICogVGhpcyBjb2RlIGhhcyBiZWVuIHNsaWdodGx5IG1vZGlmaWVkIGRpcmVjdCBzdHJpbmcgb3V0cHV0OlxuICogLSBiaW4yYnN0ciBoYXMgYmVlbiBhZGRlZFxuICogLSBmb2xsb3dpbmcgd3JhcHBlcnMgb2YgdGhpcyBsaWJyYXJ5IGhhdmUgYmVlbiBhZGRlZDpcbiAqICAgLSBzdHJfc2hhMVxuICogICAtIHN0cl9zaGEyNTZcbiAqICAgLSBzdHJfc2hhMjI0XG4gKiAgIC0gc3RyX3NoYTM4NFxuICogICAtIHN0cl9zaGE1MTJcbiAqL1xuXG52YXIganNTSEEgPSAoZnVuY3Rpb24gKCkge1xuXHRcblx0Lypcblx0ICogQ29uZmlndXJhYmxlIHZhcmlhYmxlcy4gRGVmYXVsdHMgdHlwaWNhbGx5IHdvcmtcblx0ICovXG5cdC8qIE51bWJlciBvZiBCaXRzIFBlciBjaGFyYWN0ZXIgKDggZm9yIEFTQ0lJLCAxNiBmb3IgVW5pY29kZSkgKi9cblx0dmFyIGNoYXJTaXplID0gOCwgXG5cdC8qIGJhc2UtNjQgcGFkIGNoYXJhY3Rlci4gXCI9XCIgZm9yIHN0cmljdCBSRkMgY29tcGxpYW5jZSAqL1xuXHRiNjRwYWQgPSBcIlwiLCBcblx0LyogaGV4IG91dHB1dCBmb3JtYXQuIDAgLSBsb3dlcmNhc2U7IDEgLSB1cHBlcmNhc2UgKi9cblx0aGV4Q2FzZSA9IDAsIFxuXG5cdC8qXG5cdCAqIEludF82NCBpcyBhIG9iamVjdCBmb3IgMiAzMi1iaXQgbnVtYmVycyBlbXVsYXRpbmcgYSA2NC1iaXQgbnVtYmVyXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge051bWJlcn0gbXNpbnRfMzIgVGhlIG1vc3Qgc2lnbmlmaWNhbnQgMzItYml0cyBvZiBhIDY0LWJpdCBudW1iZXJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGxzaW50XzMyIFRoZSBsZWFzdCBzaWduaWZpY2FudCAzMi1iaXRzIG9mIGEgNjQtYml0IG51bWJlclxuXHQgKi9cblx0SW50XzY0ID0gZnVuY3Rpb24gKG1zaW50XzMyLCBsc2ludF8zMilcblx0e1xuXHRcdHRoaXMuaGlnaE9yZGVyID0gbXNpbnRfMzI7XG5cdFx0dGhpcy5sb3dPcmRlciA9IGxzaW50XzMyO1xuXHR9LFxuXG5cdC8qXG5cdCAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgYmlnLWVuZGlhbiB3b3Jkc1xuXHQgKiBJZiBjaGFyU2l6ZSBpcyBBU0NJSSwgY2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGktYnl0ZSBzaWxlbnRseVxuXHQgKiBpZ25vcmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gYmluYXJ5IHJlcHJlc2VudGF0aW9uXG5cdCAqIEByZXR1cm4gSW50ZWdlciBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyXG5cdCAqL1xuXHRzdHIyYmluYiA9IGZ1bmN0aW9uIChzdHIpXG5cdHtcblx0XHR2YXIgYmluID0gW10sIG1hc2sgPSAoMSA8PCBjaGFyU2l6ZSkgLSAxLFxuXHRcdFx0bGVuZ3RoID0gc3RyLmxlbmd0aCAqIGNoYXJTaXplLCBpO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBjaGFyU2l6ZSlcblx0XHR7XG5cdFx0XHRiaW5baSA+PiA1XSB8PSAoc3RyLmNoYXJDb2RlQXQoaSAvIGNoYXJTaXplKSAmIG1hc2spIDw8XG5cdFx0XHRcdCgzMiAtIGNoYXJTaXplIC0gKGkgJSAzMikpO1xuXHRcdH1cblxuXHRcdHJldHVybiBiaW47XG5cdH0sXG5cblx0Lypcblx0ICogQ29udmVydCBhIGhleCBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgYmlnLWVuZGlhbiB3b3Jkc1xuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gYmluYXJ5IHJlcHJlc2VudGF0aW9uXG5cdCAqIEByZXR1cm4gSW50ZWdlciBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyXG5cdCAqL1xuXHRoZXgyYmluYiA9IGZ1bmN0aW9uIChzdHIpXG5cdHtcblx0XHR2YXIgYmluID0gW10sIGxlbmd0aCA9IHN0ci5sZW5ndGgsIGksIG51bTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMilcblx0XHR7XG5cdFx0XHRudW0gPSBwYXJzZUludChzdHIuc3Vic3RyKGksIDIpLCAxNik7XG5cdFx0XHRpZiAoIWlzTmFOKG51bSkpXG5cdFx0XHR7XG5cdFx0XHRcdGJpbltpID4+IDNdIHw9IG51bSA8PCAoMjQgLSAoNCAqIChpICUgOCkpKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuIFwiSU5WQUxJRCBIRVggU1RSSU5HXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJpbjtcblx0fSxcblxuXHQvKlxuXHQgKiBDb252ZXJ0IGFuIGFycmF5IG9mIGJpZy1lbmRpYW4gd29yZHMgdG8gYSBoZXggc3RyaW5nLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBiaW5hcnJheSBBcnJheSBvZiBpbnRlZ2VycyB0byBiZSBjb252ZXJ0ZWQgdG8gaGV4aWRlY2ltYWxcblx0ICpcdCByZXByZXNlbnRhdGlvblxuXHQgKiBAcmV0dXJuIEhleGlkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgaW4gU3RyaW5nIGZvcm1cblx0ICovXG5cdGJpbmIyaGV4ID0gZnVuY3Rpb24gKGJpbmFycmF5KVxuXHR7XG5cdFx0dmFyIGhleF90YWIgPSAoaGV4Q2FzZSkgPyBcIjAxMjM0NTY3ODlBQkNERUZcIiA6IFwiMDEyMzQ1Njc4OWFiY2RlZlwiLFxuXHRcdFx0c3RyID0gXCJcIiwgbGVuZ3RoID0gYmluYXJyYXkubGVuZ3RoICogNCwgaSwgc3JjQnl0ZTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSlcblx0XHR7XG5cdFx0XHRzcmNCeXRlID0gYmluYXJyYXlbaSA+PiAyXSA+PiAoKDMgLSAoaSAlIDQpKSAqIDgpO1xuXHRcdFx0c3RyICs9IGhleF90YWIuY2hhckF0KChzcmNCeXRlID4+IDQpICYgMHhGKSArXG5cdFx0XHRcdGhleF90YWIuY2hhckF0KHNyY0J5dGUgJiAweEYpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzdHI7XG5cdH0sXG5cblx0Lypcblx0ICogQ29udmVydCBhbiBhcnJheSBvZiBiaWctZW5kaWFuIHdvcmRzIHRvIGEgYmFzZS02NCBzdHJpbmdcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYmluYXJyYXkgQXJyYXkgb2YgaW50ZWdlcnMgdG8gYmUgY29udmVydGVkIHRvIGJhc2UtNjRcblx0ICpcdCByZXByZXNlbnRhdGlvblxuXHQgKiBAcmV0dXJuIEJhc2UtNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIGluIFN0cmluZyBmb3JtXG5cdCAqL1xuXHRiaW5iMmI2NCA9IGZ1bmN0aW9uIChiaW5hcnJheSlcblx0e1xuXHRcdHZhciB0YWIgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIiArXG5cdFx0XHRcIjAxMjM0NTY3ODkrL1wiLCBzdHIgPSBcIlwiLCBsZW5ndGggPSBiaW5hcnJheS5sZW5ndGggKiA0LCBpLCBqLFxuXHRcdFx0dHJpcGxldDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMylcblx0XHR7XG5cdFx0XHR0cmlwbGV0ID0gKCgoYmluYXJyYXlbaSA+PiAyXSA+PiA4ICogKDMgLSBpICUgNCkpICYgMHhGRikgPDwgMTYpIHxcblx0XHRcdFx0KCgoYmluYXJyYXlbaSArIDEgPj4gMl0gPj4gOCAqICgzIC0gKGkgKyAxKSAlIDQpKSAmIDB4RkYpIDw8IDgpIHxcblx0XHRcdFx0KChiaW5hcnJheVtpICsgMiA+PiAyXSA+PiA4ICogKDMgLSAoaSArIDIpICUgNCkpICYgMHhGRik7XG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgNDsgaiArPSAxKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoaSAqIDggKyBqICogNiA8PSBiaW5hcnJheS5sZW5ndGggKiAzMilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHN0ciArPSB0YWIuY2hhckF0KCh0cmlwbGV0ID4+IDYgKiAoMyAtIGopKSAmIDB4M0YpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHN0ciArPSBiNjRwYWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0cjtcblx0fSxcblxuXHQvKlxuXHQgKiBDb252ZXJ0IGFuIGFycmF5IG9mIGJpZy1lbmRpYW4gd29yZHMgdG8gYSBzdHJpbmdcblx0ICovXG5cdGJpbmIyc3RyID0gZnVuY3Rpb24gKGJpbilcblx0e1xuXHQgIHZhciBzdHIgPSBcIlwiO1xuXHQgIHZhciBtYXNrID0gKDEgPDwgOCkgLSAxO1xuXHQgIGZvcih2YXIgaSA9IDA7IGkgPCBiaW4ubGVuZ3RoICogMzI7IGkgKz0gOClcblx0ICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChiaW5baT4+NV0gPj4+ICgyNCAtIGklMzIpKSAmIG1hc2spO1xuXHQgIHJldHVybiBzdHI7XG5cdH0sXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgY2lyY3VsYXIgcm90YXRlIGxlZnRcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdFxuXHQgKiBAcmV0dXJuIFRoZSB4IHNoaWZ0ZWQgY2lyY3VsYXJseSBieSBuIGJpdHNcblx0ICovXG5cdHJvdGxfMzIgPSBmdW5jdGlvbiAoeCwgbilcblx0e1xuXHRcdHJldHVybiAoeCA8PCBuKSB8ICh4ID4+PiAoMzIgLSBuKSk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDMyLWJpdCBpbXBsZW1lbnRhdGlvbiBvZiBjaXJjdWxhciByb3RhdGUgcmlnaHRcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdFxuXHQgKiBAcmV0dXJuIFRoZSB4IHNoaWZ0ZWQgY2lyY3VsYXJseSBieSBuIGJpdHNcblx0ICovXG5cdHJvdHJfMzIgPSBmdW5jdGlvbiAoeCwgbilcblx0e1xuXHRcdHJldHVybiAoeCA+Pj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDY0LWJpdCBpbXBsZW1lbnRhdGlvbiBvZiBjaXJjdWxhciByb3RhdGUgcmlnaHRcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJbnRfNjR9IHggVGhlIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdFxuXHQgKiBAcmV0dXJuIFRoZSB4IHNoaWZ0ZWQgY2lyY3VsYXJseSBieSBuIGJpdHNcblx0ICovXG5cdHJvdHJfNjQgPSBmdW5jdGlvbiAoeCwgbilcblx0e1xuXHRcdGlmIChuIDw9IDMyKVxuXHRcdHtcblx0XHRcdHJldHVybiBuZXcgSW50XzY0KFxuXHRcdFx0XHRcdCh4LmhpZ2hPcmRlciA+Pj4gbikgfCAoeC5sb3dPcmRlciA8PCAoMzIgLSBuKSksXG5cdFx0XHRcdFx0KHgubG93T3JkZXIgPj4+IG4pIHwgKHguaGlnaE9yZGVyIDw8ICgzMiAtIG4pKVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cmV0dXJuIG5ldyBJbnRfNjQoXG5cdFx0XHRcdFx0KHgubG93T3JkZXIgPj4+IG4pIHwgKHguaGlnaE9yZGVyIDw8ICgzMiAtIG4pKSxcblx0XHRcdFx0XHQoeC5oaWdoT3JkZXIgPj4+IG4pIHwgKHgubG93T3JkZXIgPDwgKDMyIC0gbikpXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2Ygc2hpZnQgcmlnaHRcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdFxuXHQgKiBAcmV0dXJuIFRoZSB4IHNoaWZ0ZWQgYnkgbiBiaXRzXG5cdCAqL1xuXHRzaHJfMzIgPSBmdW5jdGlvbiAoeCwgbilcblx0e1xuXHRcdHJldHVybiB4ID4+PiBuO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSA2NC1iaXQgaW1wbGVtZW50YXRpb24gb2Ygc2hpZnQgcmlnaHRcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJbnRfNjR9IHggVGhlIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdFxuXHQgKiBAcmV0dXJuIFRoZSB4IHNoaWZ0ZWQgYnkgbiBiaXRzXG5cdCAqL1xuXHRzaHJfNjQgPSBmdW5jdGlvbiAoeCwgbilcblx0e1xuXHRcdGlmIChuIDw9IDMyKVxuXHRcdHtcblx0XHRcdHJldHVybiBuZXcgSW50XzY0KFxuXHRcdFx0XHRcdHguaGlnaE9yZGVyID4+PiBuLFxuXHRcdFx0XHRcdHgubG93T3JkZXIgPj4+IG4gfCAoeC5oaWdoT3JkZXIgPDwgKDMyIC0gbikpXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdHguaGlnaE9yZGVyIDw8ICgzMiAtIG4pXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIFBhcml0eSBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0geCBUaGUgZmlyc3QgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHkgVGhlIHNlY29uZCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0geiBUaGUgdGhpcmQgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0cGFyaXR5XzMyID0gZnVuY3Rpb24gKHgsIHksIHopXG5cdHtcblx0XHRyZXR1cm4geCBeIHkgXiB6O1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIENoIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSBmaXJzdCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0geSBUaGUgc2Vjb25kIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB6IFRoZSB0aGlyZCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRjaF8zMiA9IGZ1bmN0aW9uICh4LCB5LCB6KVxuXHR7XG5cdFx0cmV0dXJuICh4ICYgeSkgXiAofnggJiB6KTtcblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgNjQtYml0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBOSVNUIHNwZWNpZmllZCBDaCBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0ludF82NH0geCBUaGUgZmlyc3QgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHBhcmFtIHtJbnRfNjR9IHkgVGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge0ludF82NH0geiBUaGUgdGhpcmQgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0Y2hfNjQgPSBmdW5jdGlvbiAoeCwgeSwgeilcblx0e1xuXHRcdHJldHVybiBuZXcgSW50XzY0KFxuXHRcdFx0XHQoeC5oaWdoT3JkZXIgJiB5LmhpZ2hPcmRlcikgXiAofnguaGlnaE9yZGVyICYgei5oaWdoT3JkZXIpLFxuXHRcdFx0XHQoeC5sb3dPcmRlciAmIHkubG93T3JkZXIpIF4gKH54Lmxvd09yZGVyICYgei5sb3dPcmRlcilcblx0XHRcdCk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDMyLWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgTWFqIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSBmaXJzdCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0geSBUaGUgc2Vjb25kIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB6IFRoZSB0aGlyZCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRtYWpfMzIgPSBmdW5jdGlvbiAoeCwgeSwgeilcblx0e1xuXHRcdHJldHVybiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDY0LWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgTWFqIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSB4IFRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge0ludF82NH0geSBUaGUgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7SW50XzY0fSB6IFRoZSB0aGlyZCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRtYWpfNjQgPSBmdW5jdGlvbiAoeCwgeSwgeilcblx0e1xuXHRcdHJldHVybiBuZXcgSW50XzY0KFxuXHRcdFx0XHQoeC5oaWdoT3JkZXIgJiB5LmhpZ2hPcmRlcikgXlxuXHRcdFx0XHQoeC5oaWdoT3JkZXIgJiB6LmhpZ2hPcmRlcikgXlxuXHRcdFx0XHQoeS5oaWdoT3JkZXIgJiB6LmhpZ2hPcmRlciksXG5cdFx0XHRcdCh4Lmxvd09yZGVyICYgeS5sb3dPcmRlcikgXlxuXHRcdFx0XHQoeC5sb3dPcmRlciAmIHoubG93T3JkZXIpIF5cblx0XHRcdFx0KHkubG93T3JkZXIgJiB6Lmxvd09yZGVyKVxuXHRcdFx0KTtcblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgMzItYml0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBOSVNUIHNwZWNpZmllZCBTaWdtYTAgZnVuY3Rpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEByZXR1cm4gVGhlIE5JU1Qgc3BlY2lmaWVkIG91dHB1dCBvZiB0aGUgZnVuY3Rpb25cblx0ICovXG5cdHNpZ21hMF8zMiA9IGZ1bmN0aW9uICh4KVxuXHR7XG5cdFx0cmV0dXJuIHJvdHJfMzIoeCwgMikgXiByb3RyXzMyKHgsIDEzKSBeIHJvdHJfMzIoeCwgMjIpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSA2NC1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIFNpZ21hMCBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0ludF82NH0geCBUaGUgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0c2lnbWEwXzY0ID0gZnVuY3Rpb24gKHgpXG5cdHtcblx0XHR2YXIgcm90cjI4ID0gcm90cl82NCh4LCAyOCksIHJvdHIzNCA9IHJvdHJfNjQoeCwgMzQpLFxuXHRcdFx0cm90cjM5ID0gcm90cl82NCh4LCAzOSk7XG5cblx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0cm90cjI4LmhpZ2hPcmRlciBeIHJvdHIzNC5oaWdoT3JkZXIgXiByb3RyMzkuaGlnaE9yZGVyLFxuXHRcdFx0XHRyb3RyMjgubG93T3JkZXIgXiByb3RyMzQubG93T3JkZXIgXiByb3RyMzkubG93T3JkZXIpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIFNpZ21hMSBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0geCBUaGUgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0c2lnbWExXzMyID0gZnVuY3Rpb24gKHgpXG5cdHtcblx0XHRyZXR1cm4gcm90cl8zMih4LCA2KSBeIHJvdHJfMzIoeCwgMTEpIF4gcm90cl8zMih4LCAyNSk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDY0LWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgU2lnbWExIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSB4IFRoZSA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRzaWdtYTFfNjQgPSBmdW5jdGlvbiAoeClcblx0e1xuXHRcdHZhciByb3RyMTQgPSByb3RyXzY0KHgsIDE0KSwgcm90cjE4ID0gcm90cl82NCh4LCAxOCksXG5cdFx0XHRyb3RyNDEgPSByb3RyXzY0KHgsIDQxKTtcblxuXHRcdHJldHVybiBuZXcgSW50XzY0KFxuXHRcdFx0XHRyb3RyMTQuaGlnaE9yZGVyIF4gcm90cjE4LmhpZ2hPcmRlciBeIHJvdHI0MS5oaWdoT3JkZXIsXG5cdFx0XHRcdHJvdHIxNC5sb3dPcmRlciBeIHJvdHIxOC5sb3dPcmRlciBeIHJvdHI0MS5sb3dPcmRlcik7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDMyLWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgR2FtbWEwIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRnYW1tYTBfMzIgPSBmdW5jdGlvbiAoeClcblx0e1xuXHRcdHJldHVybiByb3RyXzMyKHgsIDcpIF4gcm90cl8zMih4LCAxOCkgXiBzaHJfMzIoeCwgMyk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDY0LWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgR2FtbWEwIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSB4IFRoZSA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRnYW1tYTBfNjQgPSBmdW5jdGlvbiAoeClcblx0e1xuXHRcdHZhciByb3RyMSA9IHJvdHJfNjQoeCwgMSksIHJvdHI4ID0gcm90cl82NCh4LCA4KSwgc2hyNyA9IHNocl82NCh4LCA3KTtcblxuXHRcdHJldHVybiBuZXcgSW50XzY0KFxuXHRcdFx0XHRyb3RyMS5oaWdoT3JkZXIgXiByb3RyOC5oaWdoT3JkZXIgXiBzaHI3LmhpZ2hPcmRlcixcblx0XHRcdFx0cm90cjEubG93T3JkZXIgXiByb3RyOC5sb3dPcmRlciBeIHNocjcubG93T3JkZXJcblx0XHRcdCk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDMyLWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgR2FtbWExIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRnYW1tYTFfMzIgPSBmdW5jdGlvbiAoeClcblx0e1xuXHRcdHJldHVybiByb3RyXzMyKHgsIDE3KSBeIHJvdHJfMzIoeCwgMTkpIF4gc2hyXzMyKHgsIDEwKTtcblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgNjQtYml0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBOSVNUIHNwZWNpZmllZCBHYW1tYTEgZnVuY3Rpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJbnRfNjR9IHggVGhlIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEByZXR1cm4gVGhlIE5JU1Qgc3BlY2lmaWVkIG91dHB1dCBvZiB0aGUgZnVuY3Rpb25cblx0ICovXG5cdGdhbW1hMV82NCA9IGZ1bmN0aW9uICh4KVxuXHR7XG5cdFx0dmFyIHJvdHIxOSA9IHJvdHJfNjQoeCwgMTkpLCByb3RyNjEgPSByb3RyXzY0KHgsIDYxKSxcblx0XHRcdHNocjYgPSBzaHJfNjQoeCwgNik7XG5cblx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0cm90cjE5LmhpZ2hPcmRlciBeIHJvdHI2MS5oaWdoT3JkZXIgXiBzaHI2LmhpZ2hPcmRlcixcblx0XHRcdFx0cm90cjE5Lmxvd09yZGVyIF4gcm90cjYxLmxvd09yZGVyIF4gc2hyNi5sb3dPcmRlclxuXHRcdFx0KTtcblx0fSxcblxuXHQvKlxuXHQgKiBBZGQgdHdvIDMyLWJpdCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zXG5cdCAqIGludGVybmFsbHkgdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIGZpcnN0IDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB5IFRoZSBzZWNvbmQgMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybiBUaGUgc3VtIG9mIHggKyB5XG5cdCAqL1xuXHRzYWZlQWRkXzMyXzIgPSBmdW5jdGlvbiAoeCwgeSlcblx0e1xuXHRcdHZhciBsc3cgPSAoeCAmIDB4RkZGRikgKyAoeSAmIDB4RkZGRiksXG5cdFx0XHRtc3cgPSAoeCA+Pj4gMTYpICsgKHkgPj4+IDE2KSArIChsc3cgPj4+IDE2KTtcblxuXHRcdHJldHVybiAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cdH0sXG5cblx0Lypcblx0ICogQWRkIGZvdXIgMzItYml0IGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnNcblx0ICogaW50ZXJuYWxseSB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgdGhpcmQgMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGQgVGhlIGZvdXJ0aCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcmV0dXJuIFRoZSBzdW0gb2YgYSArIGIgKyBjICsgZFxuXHQgKi9cblx0c2FmZUFkZF8zMl80ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpXG5cdHtcblx0XHR2YXIgbHN3ID0gKGEgJiAweEZGRkYpICsgKGIgJiAweEZGRkYpICsgKGMgJiAweEZGRkYpICsgKGQgJiAweEZGRkYpLFxuXHRcdFx0bXN3ID0gKGEgPj4+IDE2KSArIChiID4+PiAxNikgKyAoYyA+Pj4gMTYpICsgKGQgPj4+IDE2KSArXG5cdFx0XHRcdChsc3cgPj4+IDE2KTtcblxuXHRcdHJldHVybiAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cdH0sXG5cblx0Lypcblx0ICogQWRkIGZpdmUgMzItYml0IGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnNcblx0ICogaW50ZXJuYWxseSB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgdGhpcmQgMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGQgVGhlIGZvdXJ0aCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge051bWJlcn0gZSBUaGUgZmlmdGggMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybiBUaGUgc3VtIG9mIGEgKyBiICsgYyArIGQgKyBlXG5cdCAqL1xuXHRzYWZlQWRkXzMyXzUgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSlcblx0e1xuXHRcdHZhciBsc3cgPSAoYSAmIDB4RkZGRikgKyAoYiAmIDB4RkZGRikgKyAoYyAmIDB4RkZGRikgKyAoZCAmIDB4RkZGRikgK1xuXHRcdFx0XHQoZSAmIDB4RkZGRiksXG5cdFx0XHRtc3cgPSAoYSA+Pj4gMTYpICsgKGIgPj4+IDE2KSArIChjID4+PiAxNikgKyAoZCA+Pj4gMTYpICtcblx0XHRcdFx0KGUgPj4+IDE2KSArIChsc3cgPj4+IDE2KTtcblxuXHRcdHJldHVybiAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cdH0sXG5cblx0Lypcblx0ICogQWRkIHR3byA2NC1iaXQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeNjQuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9uc1xuXHQgKiBpbnRlcm5hbGx5IHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSB4IFRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge0ludF82NH0geSBUaGUgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm4gVGhlIHN1bSBvZiB4ICsgeVxuXHQgKi9cblx0c2FmZUFkZF82NF8yID0gZnVuY3Rpb24gKHgsIHkpXG5cdHtcblx0XHR2YXIgbHN3LCBtc3csIGxvd09yZGVyLCBoaWdoT3JkZXI7XG5cblx0XHRsc3cgPSAoeC5sb3dPcmRlciAmIDB4RkZGRikgKyAoeS5sb3dPcmRlciAmIDB4RkZGRik7XG5cdFx0bXN3ID0gKHgubG93T3JkZXIgPj4+IDE2KSArICh5Lmxvd09yZGVyID4+PiAxNikgKyAobHN3ID4+PiAxNik7XG5cdFx0bG93T3JkZXIgPSAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cblx0XHRsc3cgPSAoeC5oaWdoT3JkZXIgJiAweEZGRkYpICsgKHkuaGlnaE9yZGVyICYgMHhGRkZGKSArIChtc3cgPj4+IDE2KTtcblx0XHRtc3cgPSAoeC5oaWdoT3JkZXIgPj4+IDE2KSArICh5LmhpZ2hPcmRlciA+Pj4gMTYpICsgKGxzdyA+Pj4gMTYpO1xuXHRcdGhpZ2hPcmRlciA9ICgobXN3ICYgMHhGRkZGKSA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcblxuXHRcdHJldHVybiBuZXcgSW50XzY0KGhpZ2hPcmRlciwgbG93T3JkZXIpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEFkZCBmb3VyIDY0LWJpdCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl42NC4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zXG5cdCAqIGludGVybmFsbHkgdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJbnRfNjR9IGEgVGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBiIFRoZSBzZWNvbmQgNjQtYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtJbnRfNjR9IGMgVGhlIHRoaXJkIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBkIFRoZSBmb3V0aCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcmV0dXJuIFRoZSBzdW0gb2YgYSArIGIgKyBjICsgZFxuXHQgKi9cblx0c2FmZUFkZF82NF80ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpXG5cdHtcblx0XHR2YXIgbHN3LCBtc3csIGxvd09yZGVyLCBoaWdoT3JkZXI7XG5cblx0XHRsc3cgPSAoYS5sb3dPcmRlciAmIDB4RkZGRikgKyAoYi5sb3dPcmRlciAmIDB4RkZGRikgK1xuXHRcdFx0KGMubG93T3JkZXIgJiAweEZGRkYpICsgKGQubG93T3JkZXIgJiAweEZGRkYpO1xuXHRcdG1zdyA9IChhLmxvd09yZGVyID4+PiAxNikgKyAoYi5sb3dPcmRlciA+Pj4gMTYpICtcblx0XHRcdChjLmxvd09yZGVyID4+PiAxNikgKyAoZC5sb3dPcmRlciA+Pj4gMTYpICsgKGxzdyA+Pj4gMTYpO1xuXHRcdGxvd09yZGVyID0gKChtc3cgJiAweEZGRkYpIDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuXG5cdFx0bHN3ID0gKGEuaGlnaE9yZGVyICYgMHhGRkZGKSArIChiLmhpZ2hPcmRlciAmIDB4RkZGRikgK1xuXHRcdFx0KGMuaGlnaE9yZGVyICYgMHhGRkZGKSArIChkLmhpZ2hPcmRlciAmIDB4RkZGRikgKyAobXN3ID4+PiAxNik7XG5cdFx0bXN3ID0gKGEuaGlnaE9yZGVyID4+PiAxNikgKyAoYi5oaWdoT3JkZXIgPj4+IDE2KSArXG5cdFx0XHQoYy5oaWdoT3JkZXIgPj4+IDE2KSArIChkLmhpZ2hPcmRlciA+Pj4gMTYpICsgKGxzdyA+Pj4gMTYpO1xuXHRcdGhpZ2hPcmRlciA9ICgobXN3ICYgMHhGRkZGKSA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcblxuXHRcdHJldHVybiBuZXcgSW50XzY0KGhpZ2hPcmRlciwgbG93T3JkZXIpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEFkZCBmaXZlIDY0LWJpdCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl42NC4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zXG5cdCAqIGludGVybmFsbHkgdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJbnRfNjR9IGEgVGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBiIFRoZSBzZWNvbmQgNjQtYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtJbnRfNjR9IGMgVGhlIHRoaXJkIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBkIFRoZSBmb3V0aCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge0ludF82NH0gZSBUaGUgZm91dGggNjQtYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybiBUaGUgc3VtIG9mIGEgKyBiICsgYyArIGQgKyBlXG5cdCAqL1xuXHRzYWZlQWRkXzY0XzUgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSlcblx0e1xuXHRcdHZhciBsc3csIG1zdywgbG93T3JkZXIsIGhpZ2hPcmRlcjtcblxuXHRcdGxzdyA9IChhLmxvd09yZGVyICYgMHhGRkZGKSArIChiLmxvd09yZGVyICYgMHhGRkZGKSArXG5cdFx0XHQoYy5sb3dPcmRlciAmIDB4RkZGRikgKyAoZC5sb3dPcmRlciAmIDB4RkZGRikgK1xuXHRcdFx0KGUubG93T3JkZXIgJiAweEZGRkYpO1xuXHRcdG1zdyA9IChhLmxvd09yZGVyID4+PiAxNikgKyAoYi5sb3dPcmRlciA+Pj4gMTYpICtcblx0XHRcdChjLmxvd09yZGVyID4+PiAxNikgKyAoZC5sb3dPcmRlciA+Pj4gMTYpICsgKGUubG93T3JkZXIgPj4+IDE2KSArXG5cdFx0XHQobHN3ID4+PiAxNik7XG5cdFx0bG93T3JkZXIgPSAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cblx0XHRsc3cgPSAoYS5oaWdoT3JkZXIgJiAweEZGRkYpICsgKGIuaGlnaE9yZGVyICYgMHhGRkZGKSArXG5cdFx0XHQoYy5oaWdoT3JkZXIgJiAweEZGRkYpICsgKGQuaGlnaE9yZGVyICYgMHhGRkZGKSArXG5cdFx0XHQoZS5oaWdoT3JkZXIgJiAweEZGRkYpICsgKG1zdyA+Pj4gMTYpO1xuXHRcdG1zdyA9IChhLmhpZ2hPcmRlciA+Pj4gMTYpICsgKGIuaGlnaE9yZGVyID4+PiAxNikgK1xuXHRcdFx0KGMuaGlnaE9yZGVyID4+PiAxNikgKyAoZC5oaWdoT3JkZXIgPj4+IDE2KSArXG5cdFx0XHQoZS5oaWdoT3JkZXIgPj4+IDE2KSArIChsc3cgPj4+IDE2KTtcblx0XHRoaWdoT3JkZXIgPSAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cblx0XHRyZXR1cm4gbmV3IEludF82NChoaWdoT3JkZXIsIGxvd09yZGVyKTtcblx0fSxcblxuXHQvKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBTSEEtMSBoYXNoIG9mIHRoZSBzdHJpbmcgc2V0IGF0IGluc3RhbnRpYXRpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gbWVzc2FnZSBUaGUgYmluYXJ5IGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdHJpbmcgdG9cblx0ICpcdCBoYXNoXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBtZXNzYWdlTGVuIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgbWVzc2FnZVxuXHQgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIFNIQS0xIGhhc2ggb2YgbWVzc2FnZVxuXHQgKi9cblx0Y29yZVNIQTEgPSBmdW5jdGlvbiAobWVzc2FnZSwgbWVzc2FnZUxlbilcblx0e1xuXHRcdHZhciBXID0gW10sIGEsIGIsIGMsIGQsIGUsIFQsIGNoID0gY2hfMzIsIHBhcml0eSA9IHBhcml0eV8zMixcblx0XHRcdG1haiA9IG1hal8zMiwgcm90bCA9IHJvdGxfMzIsIHNhZmVBZGRfMiA9IHNhZmVBZGRfMzJfMiwgaSwgdCxcblx0XHRcdHNhZmVBZGRfNSA9IHNhZmVBZGRfMzJfNSwgYXBwZW5kZWRNZXNzYWdlTGVuZ3RoLFxuXHRcdFx0SCA9IFtcblx0XHRcdFx0MHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMFxuXHRcdFx0XSxcblx0XHRcdEsgPSBbXG5cdFx0XHRcdDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksXG5cdFx0XHRcdDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksXG5cdFx0XHRcdDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksXG5cdFx0XHRcdDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksXG5cdFx0XHRcdDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksIDB4NWE4Mjc5OTksXG5cdFx0XHRcdDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsXG5cdFx0XHRcdDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsXG5cdFx0XHRcdDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsXG5cdFx0XHRcdDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsXG5cdFx0XHRcdDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsXG5cdFx0XHRcdDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsXG5cdFx0XHRcdDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsXG5cdFx0XHRcdDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsXG5cdFx0XHRcdDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsXG5cdFx0XHRcdDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsIDB4OGYxYmJjZGMsXG5cdFx0XHRcdDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsXG5cdFx0XHRcdDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsXG5cdFx0XHRcdDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsXG5cdFx0XHRcdDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsXG5cdFx0XHRcdDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDYsIDB4Y2E2MmMxZDZcblx0XHRcdF07XG5cblx0XHQvKiBBcHBlbmQgJzEnIGF0IHRoZSBlbmQgb2YgdGhlIGJpbmFyeSBzdHJpbmcgKi9cblx0XHRtZXNzYWdlW21lc3NhZ2VMZW4gPj4gNV0gfD0gMHg4MCA8PCAoMjQgLSAobWVzc2FnZUxlbiAlIDMyKSk7XG5cdFx0LyogQXBwZW5kIGxlbmd0aCBvZiBiaW5hcnkgc3RyaW5nIGluIHRoZSBwb3NpdGlvbiBzdWNoIHRoYXQgdGhlIG5ld1xuXHRcdGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDUxMi4gIExvZ2ljIGRvZXMgbm90IHdvcmsgZm9yIGV2ZW4gbXVsdGlwbGVzXG5cdFx0b2YgNTEyIGJ1dCB0aGVyZSBjYW4gbmV2ZXIgYmUgZXZlbiBtdWx0aXBsZXMgb2YgNTEyICovXG5cdFx0bWVzc2FnZVsoKChtZXNzYWdlTGVuICsgNjUpID4+IDkpIDw8IDQpICsgMTVdID0gbWVzc2FnZUxlbjtcblxuXHRcdGFwcGVuZGVkTWVzc2FnZUxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGFwcGVuZGVkTWVzc2FnZUxlbmd0aDsgaSArPSAxNilcblx0XHR7XG5cdFx0XHRhID0gSFswXTtcblx0XHRcdGIgPSBIWzFdO1xuXHRcdFx0YyA9IEhbMl07XG5cdFx0XHRkID0gSFszXTtcblx0XHRcdGUgPSBIWzRdO1xuXG5cdFx0XHRmb3IgKHQgPSAwOyB0IDwgODA7IHQgKz0gMSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHQgPCAxNilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFdbdF0gPSBtZXNzYWdlW3QgKyBpXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRXW3RdID0gcm90bChXW3QgLSAzXSBeIFdbdCAtIDhdIF4gV1t0IC0gMTRdIF4gV1t0IC0gMTZdLCAxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0IDwgMjApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRUID0gc2FmZUFkZF81KHJvdGwoYSwgNSksIGNoKGIsIGMsIGQpLCBlLCBLW3RdLCBXW3RdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0IDwgNDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRUID0gc2FmZUFkZF81KHJvdGwoYSwgNSksIHBhcml0eShiLCBjLCBkKSwgZSwgS1t0XSwgV1t0XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAodCA8IDYwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0VCA9IHNhZmVBZGRfNShyb3RsKGEsIDUpLCBtYWooYiwgYywgZCksIGUsIEtbdF0sIFdbdF0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFQgPSBzYWZlQWRkXzUocm90bChhLCA1KSwgcGFyaXR5KGIsIGMsIGQpLCBlLCBLW3RdLCBXW3RdKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGUgPSBkO1xuXHRcdFx0XHRkID0gYztcblx0XHRcdFx0YyA9IHJvdGwoYiwgMzApO1xuXHRcdFx0XHRiID0gYTtcblx0XHRcdFx0YSA9IFQ7XG5cdFx0XHR9XG5cblx0XHRcdEhbMF0gPSBzYWZlQWRkXzIoYSwgSFswXSk7XG5cdFx0XHRIWzFdID0gc2FmZUFkZF8yKGIsIEhbMV0pO1xuXHRcdFx0SFsyXSA9IHNhZmVBZGRfMihjLCBIWzJdKTtcblx0XHRcdEhbM10gPSBzYWZlQWRkXzIoZCwgSFszXSk7XG5cdFx0XHRIWzRdID0gc2FmZUFkZF8yKGUsIEhbNF0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBIO1xuXHR9LFxuXG5cdC8qXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGRlc2lyZWQgU0hBLTIgaGFzaCBvZiB0aGUgc3RyaW5nIHNldCBhdCBpbnN0YW50aWF0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IFRoZSBiaW5hcnkgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cmluZyB0byBoYXNoXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gbWVzc2FnZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdmFyaWFudCBUaGUgZGVzaXJlZCBTSEEtMiB2YXJpYW50XG5cdCAqIEByZXR1cm4gVGhlIGFycmF5IG9mIGludGVnZXJzIHJlcHJlc2VudGluZyB0aGUgU0hBLTIgaGFzaCBvZiBtZXNzYWdlXG5cdCAqL1xuXHRjb3JlU0hBMiA9IGZ1bmN0aW9uIChtZXNzYWdlLCBtZXNzYWdlTGVuLCB2YXJpYW50KVxuXHR7XG5cdFx0dmFyIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIFQxLCBUMiwgSCwgbnVtUm91bmRzLCBsZW5ndGhQb3NpdGlvbiwgaSwgdCxcblx0XHRcdGJpbmFyeVN0cmluZ0luYywgYmluYXJ5U3RyaW5nTXVsdCwgc2FmZUFkZF8yLCBzYWZlQWRkXzQsIHNhZmVBZGRfNSxcblx0XHRcdGdhbW1hMCwgZ2FtbWExLCBzaWdtYTAsIHNpZ21hMSwgY2gsIG1haiwgSW50LCBLLCBXID0gW10sXG5cdFx0XHRhcHBlbmRlZE1lc3NhZ2VMZW5ndGg7XG5cblx0XHQvKiBTZXQgdXAgdGhlIHZhcmlvdXMgZnVuY3Rpb24gaGFuZGxlcyBhbmQgdmFyaWFibGUgZm9yIHRoZSBzcGVjaWZpYyBcblx0XHQgKiB2YXJpYW50ICovXG5cdFx0aWYgKHZhcmlhbnQgPT09IFwiU0hBLTIyNFwiIHx8IHZhcmlhbnQgPT09IFwiU0hBLTI1NlwiKVxuXHRcdHtcblx0XHRcdC8qIDMyLWJpdCB2YXJpYW50ICovXG5cdFx0XHRudW1Sb3VuZHMgPSA2NDtcblx0XHRcdGxlbmd0aFBvc2l0aW9uID0gKCgobWVzc2FnZUxlbiArIDY1KSA+PiA5KSA8PCA0KSArIDE1O1xuXHRcdFx0YmluYXJ5U3RyaW5nSW5jID0gMTY7XG5cdFx0XHRiaW5hcnlTdHJpbmdNdWx0ID0gMTtcblx0XHRcdEludCA9IE51bWJlcjtcblx0XHRcdHNhZmVBZGRfMiA9IHNhZmVBZGRfMzJfMjtcblx0XHRcdHNhZmVBZGRfNCA9IHNhZmVBZGRfMzJfNDtcblx0XHRcdHNhZmVBZGRfNSA9IHNhZmVBZGRfMzJfNTtcblx0XHRcdGdhbW1hMCA9IGdhbW1hMF8zMjtcblx0XHRcdGdhbW1hMSA9IGdhbW1hMV8zMjtcblx0XHRcdHNpZ21hMCA9IHNpZ21hMF8zMjtcblx0XHRcdHNpZ21hMSA9IHNpZ21hMV8zMjtcblx0XHRcdG1haiA9IG1hal8zMjtcblx0XHRcdGNoID0gY2hfMzI7XG5cdFx0XHRLID0gW1xuXHRcdFx0XHRcdDB4NDI4QTJGOTgsIDB4NzEzNzQ0OTEsIDB4QjVDMEZCQ0YsIDB4RTlCNURCQTUsXG5cdFx0XHRcdFx0MHgzOTU2QzI1QiwgMHg1OUYxMTFGMSwgMHg5MjNGODJBNCwgMHhBQjFDNUVENSxcblx0XHRcdFx0XHQweEQ4MDdBQTk4LCAweDEyODM1QjAxLCAweDI0MzE4NUJFLCAweDU1MEM3REMzLFxuXHRcdFx0XHRcdDB4NzJCRTVENzQsIDB4ODBERUIxRkUsIDB4OUJEQzA2QTcsIDB4QzE5QkYxNzQsXG5cdFx0XHRcdFx0MHhFNDlCNjlDMSwgMHhFRkJFNDc4NiwgMHgwRkMxOURDNiwgMHgyNDBDQTFDQyxcblx0XHRcdFx0XHQweDJERTkyQzZGLCAweDRBNzQ4NEFBLCAweDVDQjBBOURDLCAweDc2Rjk4OERBLFxuXHRcdFx0XHRcdDB4OTgzRTUxNTIsIDB4QTgzMUM2NkQsIDB4QjAwMzI3QzgsIDB4QkY1OTdGQzcsXG5cdFx0XHRcdFx0MHhDNkUwMEJGMywgMHhENUE3OTE0NywgMHgwNkNBNjM1MSwgMHgxNDI5Mjk2Nyxcblx0XHRcdFx0XHQweDI3QjcwQTg1LCAweDJFMUIyMTM4LCAweDREMkM2REZDLCAweDUzMzgwRDEzLFxuXHRcdFx0XHRcdDB4NjUwQTczNTQsIDB4NzY2QTBBQkIsIDB4ODFDMkM5MkUsIDB4OTI3MjJDODUsXG5cdFx0XHRcdFx0MHhBMkJGRThBMSwgMHhBODFBNjY0QiwgMHhDMjRCOEI3MCwgMHhDNzZDNTFBMyxcblx0XHRcdFx0XHQweEQxOTJFODE5LCAweEQ2OTkwNjI0LCAweEY0MEUzNTg1LCAweDEwNkFBMDcwLFxuXHRcdFx0XHRcdDB4MTlBNEMxMTYsIDB4MUUzNzZDMDgsIDB4Mjc0ODc3NEMsIDB4MzRCMEJDQjUsXG5cdFx0XHRcdFx0MHgzOTFDMENCMywgMHg0RUQ4QUE0QSwgMHg1QjlDQ0E0RiwgMHg2ODJFNkZGMyxcblx0XHRcdFx0XHQweDc0OEY4MkVFLCAweDc4QTU2MzZGLCAweDg0Qzg3ODE0LCAweDhDQzcwMjA4LFxuXHRcdFx0XHRcdDB4OTBCRUZGRkEsIDB4QTQ1MDZDRUIsIDB4QkVGOUEzRjcsIDB4QzY3MTc4RjJcblx0XHRcdFx0XTtcblxuXHRcdFx0aWYgKHZhcmlhbnQgPT09IFwiU0hBLTIyNFwiKVxuXHRcdFx0e1xuXHRcdFx0XHRIID0gW1xuXHRcdFx0XHRcdFx0MHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSxcblx0XHRcdFx0XHRcdDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTRcblx0XHRcdFx0XHRdO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRIID0gW1xuXHRcdFx0XHRcdFx0MHg2QTA5RTY2NywgMHhCQjY3QUU4NSwgMHgzQzZFRjM3MiwgMHhBNTRGRjUzQSxcblx0XHRcdFx0XHRcdDB4NTEwRTUyN0YsIDB4OUIwNTY4OEMsIDB4MUY4M0Q5QUIsIDB4NUJFMENEMTlcblx0XHRcdFx0XHRdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIGlmICh2YXJpYW50ID09PSBcIlNIQS0zODRcIiB8fCB2YXJpYW50ID09PSBcIlNIQS01MTJcIilcblx0XHR7XG5cdFx0XHQvKiA2NC1iaXQgdmFyaWFudCAqL1xuXHRcdFx0bnVtUm91bmRzID0gODA7XG5cdFx0XHRsZW5ndGhQb3NpdGlvbiA9ICgoKG1lc3NhZ2VMZW4gKyAxMjgpID4+IDEwKSA8PCA1KSArIDMxO1xuXHRcdFx0YmluYXJ5U3RyaW5nSW5jID0gMzI7XG5cdFx0XHRiaW5hcnlTdHJpbmdNdWx0ID0gMjtcblx0XHRcdEludCA9IEludF82NDtcblx0XHRcdHNhZmVBZGRfMiA9IHNhZmVBZGRfNjRfMjtcblx0XHRcdHNhZmVBZGRfNCA9IHNhZmVBZGRfNjRfNDtcblx0XHRcdHNhZmVBZGRfNSA9IHNhZmVBZGRfNjRfNTtcblx0XHRcdGdhbW1hMCA9IGdhbW1hMF82NDtcblx0XHRcdGdhbW1hMSA9IGdhbW1hMV82NDtcblx0XHRcdHNpZ21hMCA9IHNpZ21hMF82NDtcblx0XHRcdHNpZ21hMSA9IHNpZ21hMV82NDtcblx0XHRcdG1haiA9IG1hal82NDtcblx0XHRcdGNoID0gY2hfNjQ7XG5cblx0XHRcdEsgPSBbXG5cdFx0XHRcdG5ldyBJbnQoMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiksIG5ldyBJbnQoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksXG5cdFx0XHRcdG5ldyBJbnQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBJbnQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksXG5cdFx0XHRcdG5ldyBJbnQoMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCksIG5ldyBJbnQoMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSksXG5cdFx0XHRcdG5ldyBJbnQoMHg5MjNmODJhNCwgMHhhZjE5NGY5YiksIG5ldyBJbnQoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksXG5cdFx0XHRcdG5ldyBJbnQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBJbnQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksXG5cdFx0XHRcdG5ldyBJbnQoMHgyNDMxODViZSwgMHg0ZWU0YjI4YyksIG5ldyBJbnQoMHg1NTBjN2RjMywgMHhkNWZmYjRlMiksXG5cdFx0XHRcdG5ldyBJbnQoMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiksIG5ldyBJbnQoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksXG5cdFx0XHRcdG5ldyBJbnQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBJbnQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksXG5cdFx0XHRcdG5ldyBJbnQoMHhlNDliNjljMSwgMHg5ZWYxNGFkMiksIG5ldyBJbnQoMHhlZmJlNDc4NiwgMHgzODRmMjVlMyksXG5cdFx0XHRcdG5ldyBJbnQoMHgwZmMxOWRjNiwgMHg4YjhjZDViNSksIG5ldyBJbnQoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksXG5cdFx0XHRcdG5ldyBJbnQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBJbnQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksXG5cdFx0XHRcdG5ldyBJbnQoMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCksIG5ldyBJbnQoMHg3NmY5ODhkYSwgMHg4MzExNTNiNSksXG5cdFx0XHRcdG5ldyBJbnQoMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiksIG5ldyBJbnQoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksXG5cdFx0XHRcdG5ldyBJbnQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBJbnQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksXG5cdFx0XHRcdG5ldyBJbnQoMHhjNmUwMGJmMywgMHgzZGE4OGZjMiksIG5ldyBJbnQoMHhkNWE3OTE0NywgMHg5MzBhYTcyNSksXG5cdFx0XHRcdG5ldyBJbnQoMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiksIG5ldyBJbnQoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksXG5cdFx0XHRcdG5ldyBJbnQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBJbnQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksXG5cdFx0XHRcdG5ldyBJbnQoMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCksIG5ldyBJbnQoMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiksXG5cdFx0XHRcdG5ldyBJbnQoMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSksIG5ldyBJbnQoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksXG5cdFx0XHRcdG5ldyBJbnQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBJbnQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksXG5cdFx0XHRcdG5ldyBJbnQoMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCksIG5ldyBJbnQoMHhhODFhNjY0YiwgMHhiYzQyMzAwMSksXG5cdFx0XHRcdG5ldyBJbnQoMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSksIG5ldyBJbnQoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksXG5cdFx0XHRcdG5ldyBJbnQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBJbnQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksXG5cdFx0XHRcdG5ldyBJbnQoMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSksIG5ldyBJbnQoMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCksXG5cdFx0XHRcdG5ldyBJbnQoMHgxOWE0YzExNiwgMHhiOGQyZDBjOCksIG5ldyBJbnQoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksXG5cdFx0XHRcdG5ldyBJbnQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBJbnQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksXG5cdFx0XHRcdG5ldyBJbnQoMHgzOTFjMGNiMywgMHhjNWM5NWE2MyksIG5ldyBJbnQoMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiksXG5cdFx0XHRcdG5ldyBJbnQoMHg1YjljY2E0ZiwgMHg3NzYzZTM3MyksIG5ldyBJbnQoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksXG5cdFx0XHRcdG5ldyBJbnQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBJbnQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksXG5cdFx0XHRcdG5ldyBJbnQoMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiksIG5ldyBJbnQoMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyksXG5cdFx0XHRcdG5ldyBJbnQoMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCksIG5ldyBJbnQoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksXG5cdFx0XHRcdG5ldyBJbnQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBJbnQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksXG5cdFx0XHRcdG5ldyBJbnQoMHhjYTI3M2VjZSwgMHhlYTI2NjE5YyksIG5ldyBJbnQoMHhkMTg2YjhjNywgMHgyMWMwYzIwNyksXG5cdFx0XHRcdG5ldyBJbnQoMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSksIG5ldyBJbnQoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksXG5cdFx0XHRcdG5ldyBJbnQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBJbnQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksXG5cdFx0XHRcdG5ldyBJbnQoMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSksIG5ldyBJbnQoMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiksXG5cdFx0XHRcdG5ldyBJbnQoMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCksIG5ldyBJbnQoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksXG5cdFx0XHRcdG5ldyBJbnQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBJbnQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksXG5cdFx0XHRcdG5ldyBJbnQoMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiksIG5ldyBJbnQoMHg1OTdmMjk5YywgMHhmYzY1N2UyYSksXG5cdFx0XHRcdG5ldyBJbnQoMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYyksIG5ldyBJbnQoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNylcblx0XHRcdF07XG5cblx0XHRcdGlmICh2YXJpYW50ID09PSBcIlNIQS0zODRcIilcblx0XHRcdHtcblx0XHRcdFx0SCA9IFtcblx0XHRcdFx0XHRuZXcgSW50KDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgpLCBuZXcgSW50KDB4MDYyOWEyOTJhLCAweDM2N2NkNTA3KSxcblx0XHRcdFx0XHRuZXcgSW50KDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcpLCBuZXcgSW50KDB4MDE1MmZlY2Q4LCAweGY3MGU1OTM5KSxcblx0XHRcdFx0XHRuZXcgSW50KDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEpLCBuZXcgSW50KDB4OThlYjQ0YTg3LCAweDY4NTgxNTExKSxcblx0XHRcdFx0XHRuZXcgSW50KDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcpLCBuZXcgSW50KDB4MDQ3YjU0ODFkLCAweGJlZmE0ZmE0KVxuXHRcdFx0XHRdO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRIID0gW1xuXHRcdFx0XHRcdG5ldyBJbnQoMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCksIG5ldyBJbnQoMHhiYjY3YWU4NSwgMHg4NGNhYTczYiksXG5cdFx0XHRcdFx0bmV3IEludCgweDNjNmVmMzcyLCAweGZlOTRmODJiKSwgbmV3IEludCgweGE1NGZmNTNhLCAweDVmMWQzNmYxKSxcblx0XHRcdFx0XHRuZXcgSW50KDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEpLCBuZXcgSW50KDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYpLFxuXHRcdFx0XHRcdG5ldyBJbnQoMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YiksIG5ldyBJbnQoMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSlcblx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKiBBcHBlbmQgJzEnIGF0IHRoZSBlbmQgb2YgdGhlIGJpbmFyeSBzdHJpbmcgKi9cblx0XHRtZXNzYWdlW21lc3NhZ2VMZW4gPj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBtZXNzYWdlTGVuICUgMzIpO1xuXHRcdC8qIEFwcGVuZCBsZW5ndGggb2YgYmluYXJ5IHN0cmluZyBpbiB0aGUgcG9zaXRpb24gc3VjaCB0aGF0IHRoZSBuZXdcblx0XHQgKiBsZW5ndGggaXMgY29ycmVjdCAqL1xuXHRcdG1lc3NhZ2VbbGVuZ3RoUG9zaXRpb25dID0gbWVzc2FnZUxlbjtcblxuXHRcdGFwcGVuZGVkTWVzc2FnZUxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGFwcGVuZGVkTWVzc2FnZUxlbmd0aDsgaSArPSBiaW5hcnlTdHJpbmdJbmMpXG5cdFx0e1xuXHRcdFx0YSA9IEhbMF07XG5cdFx0XHRiID0gSFsxXTtcblx0XHRcdGMgPSBIWzJdO1xuXHRcdFx0ZCA9IEhbM107XG5cdFx0XHRlID0gSFs0XTtcblx0XHRcdGYgPSBIWzVdO1xuXHRcdFx0ZyA9IEhbNl07XG5cdFx0XHRoID0gSFs3XTtcblxuXHRcdFx0Zm9yICh0ID0gMDsgdCA8IG51bVJvdW5kczsgdCArPSAxKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAodCA8IDE2KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0LyogQml0IG9mIGEgaGFjayAtIGZvciAzMi1iaXQsIHRoZSBzZWNvbmQgdGVybSBpcyBpZ25vcmVkICovXG5cdFx0XHRcdFx0V1t0XSA9IG5ldyBJbnQobWVzc2FnZVt0ICogYmluYXJ5U3RyaW5nTXVsdCArIGldLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlW3QgKiBiaW5hcnlTdHJpbmdNdWx0ICsgaSArIDFdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRXW3RdID0gc2FmZUFkZF80KFxuXHRcdFx0XHRcdFx0XHRnYW1tYTEoV1t0IC0gMl0pLCBXW3QgLSA3XSxcblx0XHRcdFx0XHRcdFx0Z2FtbWEwKFdbdCAtIDE1XSksIFdbdCAtIDE2XVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdFQxID0gc2FmZUFkZF81KGgsIHNpZ21hMShlKSwgY2goZSwgZiwgZyksIEtbdF0sIFdbdF0pO1xuXHRcdFx0XHRUMiA9IHNhZmVBZGRfMihzaWdtYTAoYSksIG1haihhLCBiLCBjKSk7XG5cdFx0XHRcdGggPSBnO1xuXHRcdFx0XHRnID0gZjtcblx0XHRcdFx0ZiA9IGU7XG5cdFx0XHRcdGUgPSBzYWZlQWRkXzIoZCwgVDEpO1xuXHRcdFx0XHRkID0gYztcblx0XHRcdFx0YyA9IGI7XG5cdFx0XHRcdGIgPSBhO1xuXHRcdFx0XHRhID0gc2FmZUFkZF8yKFQxLCBUMik7XG5cdFx0XHR9XG5cblx0XHRcdEhbMF0gPSBzYWZlQWRkXzIoYSwgSFswXSk7XG5cdFx0XHRIWzFdID0gc2FmZUFkZF8yKGIsIEhbMV0pO1xuXHRcdFx0SFsyXSA9IHNhZmVBZGRfMihjLCBIWzJdKTtcblx0XHRcdEhbM10gPSBzYWZlQWRkXzIoZCwgSFszXSk7XG5cdFx0XHRIWzRdID0gc2FmZUFkZF8yKGUsIEhbNF0pO1xuXHRcdFx0SFs1XSA9IHNhZmVBZGRfMihmLCBIWzVdKTtcblx0XHRcdEhbNl0gPSBzYWZlQWRkXzIoZywgSFs2XSk7XG5cdFx0XHRIWzddID0gc2FmZUFkZF8yKGgsIEhbN10pO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAodmFyaWFudClcblx0XHR7XG5cdFx0Y2FzZSBcIlNIQS0yMjRcIjpcblx0XHRcdHJldHVyblx0W1xuXHRcdFx0XHRIWzBdLCBIWzFdLCBIWzJdLCBIWzNdLFxuXHRcdFx0XHRIWzRdLCBIWzVdLCBIWzZdXG5cdFx0XHRdO1xuXHRcdGNhc2UgXCJTSEEtMjU2XCI6XG5cdFx0XHRyZXR1cm4gSDtcblx0XHRjYXNlIFwiU0hBLTM4NFwiOlxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0SFswXS5oaWdoT3JkZXIsIEhbMF0ubG93T3JkZXIsXG5cdFx0XHRcdEhbMV0uaGlnaE9yZGVyLCBIWzFdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzJdLmhpZ2hPcmRlciwgSFsyXS5sb3dPcmRlcixcblx0XHRcdFx0SFszXS5oaWdoT3JkZXIsIEhbM10ubG93T3JkZXIsXG5cdFx0XHRcdEhbNF0uaGlnaE9yZGVyLCBIWzRdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzVdLmhpZ2hPcmRlciwgSFs1XS5sb3dPcmRlclxuXHRcdFx0XTtcblx0XHRjYXNlIFwiU0hBLTUxMlwiOlxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0SFswXS5oaWdoT3JkZXIsIEhbMF0ubG93T3JkZXIsXG5cdFx0XHRcdEhbMV0uaGlnaE9yZGVyLCBIWzFdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzJdLmhpZ2hPcmRlciwgSFsyXS5sb3dPcmRlcixcblx0XHRcdFx0SFszXS5oaWdoT3JkZXIsIEhbM10ubG93T3JkZXIsXG5cdFx0XHRcdEhbNF0uaGlnaE9yZGVyLCBIWzRdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzVdLmhpZ2hPcmRlciwgSFs1XS5sb3dPcmRlcixcblx0XHRcdFx0SFs2XS5oaWdoT3JkZXIsIEhbNl0ubG93T3JkZXIsXG5cdFx0XHRcdEhbN10uaGlnaE9yZGVyLCBIWzddLmxvd09yZGVyXG5cdFx0XHRdO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvKiBUaGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkICovXG5cdFx0XHRyZXR1cm4gW107IFxuXHRcdH1cblx0fSxcblxuXHQvKlxuXHQgKiBqc1NIQSBpcyB0aGUgd29ya2hvcnNlIG9mIHRoZSBsaWJyYXJ5LiAgSW5zdGFudGlhdGUgaXQgd2l0aCB0aGUgc3RyaW5nIHRvXG5cdCAqIGJlIGhhc2hlZCBhcyB0aGUgcGFyYW1ldGVyXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3JjU3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgaGFzaGVkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dEZvcm1hdCBUaGUgZm9ybWF0IG9mIHNyY1N0cmluZywgQVNDSUkgb3IgSEVYXG5cdCAqL1xuXHRqc1NIQSA9IGZ1bmN0aW9uIChzcmNTdHJpbmcsIGlucHV0Rm9ybWF0KVxuXHR7XG5cblx0XHR0aGlzLnNoYTEgPSBudWxsO1xuXHRcdHRoaXMuc2hhMjI0ID0gbnVsbDtcblx0XHR0aGlzLnNoYTI1NiA9IG51bGw7XG5cdFx0dGhpcy5zaGEzODQgPSBudWxsO1xuXHRcdHRoaXMuc2hhNTEyID0gbnVsbDtcblxuXHRcdHRoaXMuc3RyQmluTGVuID0gbnVsbDtcblx0XHR0aGlzLnN0clRvSGFzaCA9IG51bGw7XG5cblx0XHQvKiBDb252ZXJ0IHRoZSBpbnB1dCBzdHJpbmcgaW50byB0aGUgY29ycmVjdCB0eXBlICovXG5cdFx0aWYgKFwiSEVYXCIgPT09IGlucHV0Rm9ybWF0KVxuXHRcdHtcblx0XHRcdGlmICgwICE9PSAoc3JjU3RyaW5nLmxlbmd0aCAlIDIpKVxuXHRcdFx0e1xuXHRcdFx0XHRyZXR1cm4gXCJURVhUIE1VU1QgQkUgSU4gQllURSBJTkNSRU1FTlRTXCI7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnN0ckJpbkxlbiA9IHNyY1N0cmluZy5sZW5ndGggKiA0O1xuXHRcdFx0dGhpcy5zdHJUb0hhc2ggPSBoZXgyYmluYihzcmNTdHJpbmcpO1xuXHRcdH1cblx0XHRlbHNlIGlmICgoXCJBU0NJSVwiID09PSBpbnB1dEZvcm1hdCkgfHxcblx0XHRcdCAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZihpbnB1dEZvcm1hdCkpKVxuXHRcdHtcblx0XHRcdHRoaXMuc3RyQmluTGVuID0gc3JjU3RyaW5nLmxlbmd0aCAqIGNoYXJTaXplO1xuXHRcdFx0dGhpcy5zdHJUb0hhc2ggPSBzdHIyYmluYihzcmNTdHJpbmcpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cmV0dXJuIFwiVU5LTk9XTiBURVhUIElOUFVUIFRZUEVcIjtcblx0XHR9XG5cdH07XG5cblx0anNTSEEucHJvdG90eXBlID0ge1xuXHRcdC8qXG5cdFx0ICogUmV0dXJucyB0aGUgZGVzaXJlZCBTSEEgaGFzaCBvZiB0aGUgc3RyaW5nIHNwZWNpZmllZCBhdCBpbnN0YW50aWF0aW9uXG5cdFx0ICogdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gdmFyaWFudCBUaGUgZGVzaXJlZCBTSEEgdmFyaWFudCAoU0hBLTEsIFNIQS0yMjQsXG5cdFx0ICpcdCBTSEEtMjU2LCBTSEEtMzg0LCBvciBTSEEtNTEyKVxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXQgVGhlIGRlc2lyZWQgb3V0cHV0IGZvcm1hdHRpbmcgKEI2NCBvciBIRVgpXG5cdFx0ICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBoYXNoIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkXG5cdFx0ICovXG5cdFx0Z2V0SGFzaCA6IGZ1bmN0aW9uICh2YXJpYW50LCBmb3JtYXQpXG5cdFx0e1xuXHRcdFx0dmFyIGZvcm1hdEZ1bmMgPSBudWxsLCBtZXNzYWdlID0gdGhpcy5zdHJUb0hhc2guc2xpY2UoKTtcblxuXHRcdFx0c3dpdGNoIChmb3JtYXQpXG5cdFx0XHR7XG5cdFx0XHRjYXNlIFwiSEVYXCI6XG5cdFx0XHRcdGZvcm1hdEZ1bmMgPSBiaW5iMmhleDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQjY0XCI6XG5cdFx0XHRcdGZvcm1hdEZ1bmMgPSBiaW5iMmI2NDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQVNDSUlcIjpcblx0XHRcdFx0Zm9ybWF0RnVuYyA9IGJpbmIyc3RyO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBcIkZPUk1BVCBOT1QgUkVDT0dOSVpFRFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRzd2l0Y2ggKHZhcmlhbnQpXG5cdFx0XHR7XG5cdFx0XHRjYXNlIFwiU0hBLTFcIjpcblx0XHRcdFx0aWYgKG51bGwgPT09IHRoaXMuc2hhMSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuc2hhMSA9IGNvcmVTSEExKG1lc3NhZ2UsIHRoaXMuc3RyQmluTGVuKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZm9ybWF0RnVuYyh0aGlzLnNoYTEpO1xuXHRcdFx0Y2FzZSBcIlNIQS0yMjRcIjpcblx0XHRcdFx0aWYgKG51bGwgPT09IHRoaXMuc2hhMjI0KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5zaGEyMjQgPSBjb3JlU0hBMihtZXNzYWdlLCB0aGlzLnN0ckJpbkxlbiwgdmFyaWFudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZvcm1hdEZ1bmModGhpcy5zaGEyMjQpO1xuXHRcdFx0Y2FzZSBcIlNIQS0yNTZcIjpcblx0XHRcdFx0aWYgKG51bGwgPT09IHRoaXMuc2hhMjU2KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5zaGEyNTYgPSBjb3JlU0hBMihtZXNzYWdlLCB0aGlzLnN0ckJpbkxlbiwgdmFyaWFudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZvcm1hdEZ1bmModGhpcy5zaGEyNTYpO1xuXHRcdFx0Y2FzZSBcIlNIQS0zODRcIjpcblx0XHRcdFx0aWYgKG51bGwgPT09IHRoaXMuc2hhMzg0KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5zaGEzODQgPSBjb3JlU0hBMihtZXNzYWdlLCB0aGlzLnN0ckJpbkxlbiwgdmFyaWFudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZvcm1hdEZ1bmModGhpcy5zaGEzODQpO1xuXHRcdFx0Y2FzZSBcIlNIQS01MTJcIjpcblx0XHRcdFx0aWYgKG51bGwgPT09IHRoaXMuc2hhNTEyKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGhpcy5zaGE1MTIgPSBjb3JlU0hBMihtZXNzYWdlLCB0aGlzLnN0ckJpbkxlbiwgdmFyaWFudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZvcm1hdEZ1bmModGhpcy5zaGE1MTIpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFwiSEFTSCBOT1QgUkVDT0dOSVpFRFwiO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKlxuXHRcdCAqIFJldHVybnMgdGhlIGRlc2lyZWQgSE1BQyBvZiB0aGUgc3RyaW5nIHNwZWNpZmllZCBhdCBpbnN0YW50aWF0aW9uXG5cdFx0ICogdXNpbmcgdGhlIGtleSBhbmQgdmFyaWFudCBwYXJhbS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIGtleSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgSE1BQ1xuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dEZvcm1hdCBUaGUgZm9ybWF0IG9mIGtleSwgQVNDSUkgb3IgSEVYXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhcmlhbnQgVGhlIGRlc2lyZWQgU0hBIHZhcmlhbnQgKFNIQS0xLCBTSEEtMjI0LFxuXHRcdCAqXHQgU0hBLTI1NiwgU0hBLTM4NCwgb3IgU0hBLTUxMilcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0Rm9ybWF0IFRoZSBkZXNpcmVkIG91dHB1dCBmb3JtYXR0aW5nXG5cdFx0ICpcdCAoQjY0IG9yIEhFWClcblx0XHQgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGhhc2ggaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWRcblx0XHQgKi9cblx0XHRnZXRITUFDIDogZnVuY3Rpb24gKGtleSwgaW5wdXRGb3JtYXQsIHZhcmlhbnQsIG91dHB1dEZvcm1hdClcblx0XHR7XG5cdFx0XHR2YXIgZm9ybWF0RnVuYywga2V5VG9Vc2UsIGJsb2NrQnl0ZVNpemUsIGJsb2NrQml0U2l6ZSwgaSxcblx0XHRcdFx0cmV0VmFsLCBsYXN0QXJyYXlJbmRleCwga2V5QmluTGVuLCBoYXNoQml0U2l6ZSxcblx0XHRcdFx0a2V5V2l0aElQYWQgPSBbXSwga2V5V2l0aE9QYWQgPSBbXTtcblxuXHRcdFx0LyogVmFsaWRhdGUgdGhlIG91dHB1dCBmb3JtYXQgc2VsZWN0aW9uICovXG5cdFx0XHRzd2l0Y2ggKG91dHB1dEZvcm1hdClcblx0XHRcdHtcblx0XHRcdGNhc2UgXCJIRVhcIjpcblx0XHRcdFx0Zm9ybWF0RnVuYyA9IGJpbmIyaGV4O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJCNjRcIjpcblx0XHRcdFx0Zm9ybWF0RnVuYyA9IGJpbmIyYjY0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJBU0NJSVwiOlxuXHRcdFx0XHRmb3JtYXRGdW5jID0gYmluYjJzdHI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFwiRk9STUFUIE5PVCBSRUNPR05JWkVEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8qIFZhbGlkYXRlIHRoZSBoYXNoIHZhcmlhbnQgc2VsZWN0aW9uIGFuZCBzZXQgbmVlZGVkIHZhcmlhYmxlcyAqL1xuXHRcdFx0c3dpdGNoICh2YXJpYW50KVxuXHRcdFx0e1xuXHRcdFx0Y2FzZSBcIlNIQS0xXCI6XG5cdFx0XHRcdGJsb2NrQnl0ZVNpemUgPSA2NDtcblx0XHRcdFx0aGFzaEJpdFNpemUgPSAxNjA7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlNIQS0yMjRcIjpcblx0XHRcdFx0YmxvY2tCeXRlU2l6ZSA9IDY0O1xuXHRcdFx0XHRoYXNoQml0U2l6ZSA9IDIyNDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU0hBLTI1NlwiOlxuXHRcdFx0XHRibG9ja0J5dGVTaXplID0gNjQ7XG5cdFx0XHRcdGhhc2hCaXRTaXplID0gMjU2O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJTSEEtMzg0XCI6XG5cdFx0XHRcdGJsb2NrQnl0ZVNpemUgPSAxMjg7XG5cdFx0XHRcdGhhc2hCaXRTaXplID0gMzg0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJTSEEtNTEyXCI6XG5cdFx0XHRcdGJsb2NrQnl0ZVNpemUgPSAxMjg7XG5cdFx0XHRcdGhhc2hCaXRTaXplID0gNTEyO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBcIkhBU0ggTk9UIFJFQ09HTklaRURcIjtcblx0XHRcdH1cblxuXHRcdFx0LyogVmFsaWRhdGUgaW5wdXQgZm9ybWF0IHNlbGVjdGlvbiAqL1xuXHRcdFx0aWYgKFwiSEVYXCIgPT09IGlucHV0Rm9ybWF0KVxuXHRcdFx0e1xuXHRcdFx0XHQvKiBOaWJibGVzIG11c3QgY29tZSBpbiBwYWlycyAqL1xuXHRcdFx0XHRpZiAoMCAhPT0gKGtleS5sZW5ndGggJSAyKSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJldHVybiBcIktFWSBNVVNUIEJFIElOIEJZVEUgSU5DUkVNRU5UU1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGtleVRvVXNlID0gaGV4MmJpbmIoa2V5KTtcblx0XHRcdFx0a2V5QmluTGVuID0ga2V5Lmxlbmd0aCAqIDQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChcIkFTQ0lJXCIgPT09IGlucHV0Rm9ybWF0KVxuXHRcdFx0e1xuXHRcdFx0XHRrZXlUb1VzZSA9IHN0cjJiaW5iKGtleSk7XG5cdFx0XHRcdGtleUJpbkxlbiA9IGtleS5sZW5ndGggKiBjaGFyU2l6ZTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuIFwiVU5LTk9XTiBLRVkgSU5QVVQgVFlQRVwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBUaGVzZSBhcmUgdXNlZCBtdWx0aXBsZSB0aW1lcywgY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGVtICovXG5cdFx0XHRibG9ja0JpdFNpemUgPSBibG9ja0J5dGVTaXplICogODtcblx0XHRcdGxhc3RBcnJheUluZGV4ID0gKGJsb2NrQnl0ZVNpemUgLyA0KSAtIDE7XG5cblx0XHRcdC8qIEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoZSBrZXkgYmFzZWQgb24gaXRzIHNpemUgcmVsYXRpdmUgdG9cblx0XHRcdCAqIHRoZSBoYXNoJ3MgYmxvY2sgc2l6ZSAqL1xuXHRcdFx0aWYgKGJsb2NrQnl0ZVNpemUgPCAoa2V5QmluTGVuIC8gOCkpXG5cdFx0XHR7XG5cdFx0XHRcdGlmIChcIlNIQS0xXCIgPT09IHZhcmlhbnQpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXlUb1VzZSA9IGNvcmVTSEExKGtleVRvVXNlLCBrZXlCaW5MZW4pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleVRvVXNlID0gY29yZVNIQTIoa2V5VG9Vc2UsIGtleUJpbkxlbiwgdmFyaWFudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0LyogRm9yIGFsbCB2YXJpYW50cywgdGhlIGJsb2NrIHNpemUgaXMgYmlnZ2VyIHRoYW4gdGhlIG91dHB1dFxuXHRcdFx0XHQgKiBzaXplIHNvIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYSB1c2VmdWwgYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZVxuXHRcdFx0XHQgKiBzdHJpbmcgKi9cblx0XHRcdFx0a2V5VG9Vc2VbbGFzdEFycmF5SW5kZXhdICY9IDB4RkZGRkZGMDA7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChibG9ja0J5dGVTaXplID4gKGtleUJpbkxlbiAvIDgpKVxuXHRcdFx0e1xuXHRcdFx0XHQvKiBJZiB0aGUgYmxvY2tCeXRlU2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGtleSBsZW5ndGgsIHRoZXJlXG5cdFx0XHRcdCAqIHdpbGwgYWx3YXlzIGJlIGF0IExFQVNUIG9uZSBcInVzZWxlc3NcIiBieXRlIGF0IHRoZSBlbmQgb2YgdGhlXG5cdFx0XHRcdCAqIHN0cmluZyAqL1xuXHRcdFx0XHRrZXlUb1VzZVtsYXN0QXJyYXlJbmRleF0gJj0gMHhGRkZGRkYwMDtcblx0XHRcdH1cblxuXHRcdFx0LyogQ3JlYXRlIGlwYWQgYW5kIG9wYWQgKi9cblx0XHRcdGZvciAoaSA9IDA7IGkgPD0gbGFzdEFycmF5SW5kZXg7IGkgKz0gMSlcblx0XHRcdHtcblx0XHRcdFx0a2V5V2l0aElQYWRbaV0gPSBrZXlUb1VzZVtpXSBeIDB4MzYzNjM2MzY7XG5cdFx0XHRcdGtleVdpdGhPUGFkW2ldID0ga2V5VG9Vc2VbaV0gXiAweDVDNUM1QzVDO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBDYWxjdWxhdGUgdGhlIEhNQUMgKi9cblx0XHRcdGlmIChcIlNIQS0xXCIgPT09IHZhcmlhbnQpXG5cdFx0XHR7XG5cdFx0XHRcdHJldFZhbCA9IGNvcmVTSEExKFxuXHRcdFx0XHRcdFx0XHRrZXlXaXRoSVBhZC5jb25jYXQodGhpcy5zdHJUb0hhc2gpLFxuXHRcdFx0XHRcdFx0XHRibG9ja0JpdFNpemUgKyB0aGlzLnN0ckJpbkxlbik7XG5cdFx0XHRcdHJldFZhbCA9IGNvcmVTSEExKFxuXHRcdFx0XHRcdFx0XHRrZXlXaXRoT1BhZC5jb25jYXQocmV0VmFsKSxcblx0XHRcdFx0XHRcdFx0YmxvY2tCaXRTaXplICsgaGFzaEJpdFNpemUpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRyZXRWYWwgPSBjb3JlU0hBMihcblx0XHRcdFx0XHRcdFx0a2V5V2l0aElQYWQuY29uY2F0KHRoaXMuc3RyVG9IYXNoKSxcblx0XHRcdFx0XHRcdFx0YmxvY2tCaXRTaXplICsgdGhpcy5zdHJCaW5MZW4sIHZhcmlhbnQpO1xuXHRcdFx0XHRyZXRWYWwgPSBjb3JlU0hBMihcblx0XHRcdFx0XHRcdFx0a2V5V2l0aE9QYWQuY29uY2F0KHJldFZhbCksXG5cdFx0XHRcdFx0XHRcdGJsb2NrQml0U2l6ZSArIGhhc2hCaXRTaXplLCB2YXJpYW50KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIChmb3JtYXRGdW5jKHJldFZhbCkpO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4ganNTSEE7XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c2hhMTogZnVuY3Rpb24oc3RyKSB7XG5cdFx0dmFyIHNoYU9iaiA9IG5ldyBqc1NIQShzdHIsIFwiQVNDSUlcIik7XG5cdFx0cmV0dXJuIHNoYU9iai5nZXRIYXNoKFwiU0hBLTFcIiwgXCJBU0NJSVwiKTtcblx0fSxcblx0c2hhMjI0OiBmdW5jdGlvbihzdHIpIHtcblx0XHR2YXIgc2hhT2JqID0gbmV3IGpzU0hBKHN0ciwgXCJBU0NJSVwiKTtcblx0XHRyZXR1cm4gc2hhT2JqLmdldEhhc2goXCJTSEEtMjI0XCIsIFwiQVNDSUlcIik7XG5cdH0sXG5cdHNoYTI1NjogZnVuY3Rpb24oc3RyKSB7XG5cdFx0dmFyIHNoYU9iaiA9IG5ldyBqc1NIQShzdHIsIFwiQVNDSUlcIik7XG5cdFx0cmV0dXJuIHNoYU9iai5nZXRIYXNoKFwiU0hBLTI1NlwiLCBcIkFTQ0lJXCIpO1xuXHR9LFxuXHRzaGEzODQ6IGZ1bmN0aW9uKHN0cikge1xuXHRcdHZhciBzaGFPYmogPSBuZXcganNTSEEoc3RyLCBcIkFTQ0lJXCIpO1xuXHRcdHJldHVybiBzaGFPYmouZ2V0SGFzaChcIlNIQS0zODRcIiwgXCJBU0NJSVwiKTtcblxuXHR9LFxuXHRzaGE1MTI6IGZ1bmN0aW9uKHN0cikge1xuXHRcdHZhciBzaGFPYmogPSBuZXcganNTSEEoc3RyLCBcIkFTQ0lJXCIpO1xuXHRcdHJldHVybiBzaGFPYmouZ2V0SGFzaChcIlNIQS01MTJcIiwgXCJBU0NJSVwiKTtcblx0fVxufVxuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Y2lwaGVyOiByZXF1aXJlKCcuL2NpcGhlcicpLFxuXHRoYXNoOiByZXF1aXJlKCcuL2hhc2gnKSxcblx0Y2ZiOiByZXF1aXJlKCcuL2NmYi5qcycpLFxuXHRwdWJsaWNLZXk6IHJlcXVpcmUoJy4vcHVibGljX2tleScpLFxuXHRzaWduYXR1cmU6IHJlcXVpcmUoJy4vc2lnbmF0dXJlLmpzJyksXG5cdHJhbmRvbTogcmVxdWlyZSgnLi9yYW5kb20uanMnKSxcblx0cGtjczE6IHJlcXVpcmUoJy4vcGtjczEuanMnKVxuXG59XG5cbnZhciBjcnlwdG8gPSByZXF1aXJlKCcuL2NyeXB0by5qcycpO1xuXG5mb3IodmFyIGkgaW4gY3J5cHRvKVxuXHRtb2R1bGUuZXhwb3J0c1tpXSA9IGNyeXB0b1tpXTtcblxuXG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQVNOMSBvYmplY3QgaWRlbnRpZmllcnMgZm9yIGhhc2hlcyAoU2VlIFJGQzQ4ODAgNS4yLjIpXG4gKi9cbmhhc2hfaGVhZGVycyA9IG5ldyBBcnJheSgpO1xuaGFzaF9oZWFkZXJzWzFdICA9IFsweDMwLDB4MjAsMHgzMCwweDBjLDB4MDYsMHgwOCwweDJhLDB4ODYsMHg0OCwweDg2LDB4ZjcsMHgwZCwweDAyLDB4MDUsMHgwNSwweDAwLDB4MDQsMHgxMF07XG5oYXNoX2hlYWRlcnNbM10gID0gWzB4MzAsMHgyMSwweDMwLDB4MDksMHgwNiwweDA1LDB4MkIsMHgyNCwweDAzLDB4MDIsMHgwMSwweDA1LDB4MDAsMHgwNCwweDE0XTtcbmhhc2hfaGVhZGVyc1syXSAgPSBbMHgzMCwweDIxLDB4MzAsMHgwOSwweDA2LDB4MDUsMHgyYiwweDBlLDB4MDMsMHgwMiwweDFhLDB4MDUsMHgwMCwweDA0LDB4MTRdO1xuaGFzaF9oZWFkZXJzWzhdICA9IFsweDMwLDB4MzEsMHgzMCwweDBkLDB4MDYsMHgwOSwweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDIsMHgwMSwweDA1LDB4MDAsMHgwNCwweDIwXTtcbmhhc2hfaGVhZGVyc1s5XSAgPSBbMHgzMCwweDQxLDB4MzAsMHgwZCwweDA2LDB4MDksMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAyLDB4MDIsMHgwNSwweDAwLDB4MDQsMHgzMF07XG5oYXNoX2hlYWRlcnNbMTBdID0gWzB4MzAsMHg1MSwweDMwLDB4MGQsMHgwNiwweDA5LDB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMiwweDAzLDB4MDUsMHgwMCwweDA0LDB4NDBdO1xuaGFzaF9oZWFkZXJzWzExXSA9IFsweDMwLDB4MzEsMHgzMCwweDBkLDB4MDYsMHgwOSwweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDIsMHgwNCwweDA1LDB4MDAsMHgwNCwweDFDXTtcblxuXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnLi9jcnlwdG8uanMnKSxcblx0cmFuZG9tID0gcmVxdWlyZSgnLi9yYW5kb20uanMnKSxcblx0dXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKSxcblx0QmlnSW50ZWdlciA9IHJlcXVpcmUoJy4vcHVibGljX2tleS9qc2JuLmpzJyksXG5cdGhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKTtcblx0XG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZW1lOiB7XG5cdC8qKlxuXHQgKiBjcmVhdGUgYSBFTUUtUEtDUzEtdjFfNSBwYWRkaW5nIChTZWUgUkZDNDg4MCAxMy4xLjEpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgcGFkZGVkXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIExlbmd0aCB0byB0aGUgcmVzdWx0aW5nIG1lc3NhZ2Vcblx0ICogQHJldHVybiB7U3RyaW5nfSBFTUUtUEtDUzEgcGFkZGVkIG1lc3NhZ2Vcblx0ICovXG5cdGVuY29kZTogZnVuY3Rpb24obWVzc2FnZSwgbGVuZ3RoKSB7XG5cdFx0aWYgKG1lc3NhZ2UubGVuZ3RoID4gbGVuZ3RoLTExKVxuXHRcdFx0cmV0dXJuIC0xO1xuXHRcdHZhciByZXN1bHQgPSBcIlwiO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDApO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDIpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoIC0gbWVzc2FnZS5sZW5ndGggLSAzOyBpKyspIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJhbmRvbS5nZXRQc2V1ZG9SYW5kb20oMSwyNTUpKTtcblx0XHR9XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XG5cdFx0cmVzdWx0ICs9IG1lc3NhZ2U7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHQvKipcblx0ICogZGVjb2RlcyBhIEVNRS1QS0NTMS12MV81IHBhZGRpbmcgKFNlZSBSRkM0ODgwIDEzLjEuMilcblx0ICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgRU1FLVBLQ1MxIHBhZGRlZCBtZXNzYWdlXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gZGVjb2RlZCBtZXNzYWdlIFxuXHQgKi9cblx0IGRlY29kZTogZnVuY3Rpb24obWVzc2FnZSwgbGVuKSB7XG5cdFx0aWYgKG1lc3NhZ2UubGVuZ3RoIDwgbGVuKVxuXHRcdFx0bWVzc2FnZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCkrbWVzc2FnZTtcblx0XHRpZiAobWVzc2FnZS5sZW5ndGggPCAxMiB8fCBtZXNzYWdlLmNoYXJDb2RlQXQoMCkgIT0gMCB8fCBtZXNzYWdlLmNoYXJDb2RlQXQoMSkgIT0gMilcblx0XHRcdHJldHVybiAtMTtcblx0XHR2YXIgaSA9IDI7XG5cdFx0d2hpbGUgKG1lc3NhZ2UuY2hhckNvZGVBdChpKSAhPSAwICYmIG1lc3NhZ2UubGVuZ3RoID4gaSlcblx0XHRcdGkrKztcblx0XHRyZXR1cm4gbWVzc2FnZS5zdWJzdHJpbmcoaSsxLCBtZXNzYWdlLmxlbmd0aCk7XG5cdH0sXG5cdH0sXG5cblx0ZW1zYToge1xuXG5cdC8qKlxuXHQgKiBjcmVhdGUgYSBFTVNBLVBLQ1MxLXYxXzUgcGFkZGluZyAoU2VlIFJGQzQ4ODAgMTMuMS4zKVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGFsZ28gSGFzaCBhbGdvcml0aG0gdHlwZSB1c2VkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIERhdGEgdG8gYmUgaGFzaGVkXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0ga2V5bGVuZ3RoIEtleSBzaXplIG9mIHRoZSBwdWJsaWMgbXBpIGluIGJ5dGVzXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IEhhc2hjb2RlIHdpdGggcGtjczFwYWRkaW5nIGFzIHN0cmluZ1xuXHQgKi9cblx0ZW5jb2RlOiBmdW5jdGlvbihhbGdvLCBkYXRhLCBrZXlsZW5ndGgpIHtcblx0XHR2YXIgZGF0YTIgPSBcIlwiO1xuXHRcdGRhdGEyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgwMCk7XG5cdFx0ZGF0YTIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweDAxKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IChrZXlsZW5ndGggLSBoYXNoX2hlYWRlcnNbYWxnb10ubGVuZ3RoIC0gMyAtIFxuXHRcdFx0aGFzaC5nZXRIYXNoQnl0ZUxlbmd0aChhbGdvKSk7IGkrKylcblxuXHRcdFx0ZGF0YTIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGZmKTtcblxuXHRcdGRhdGEyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgwMCk7XG5cdFx0XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBoYXNoX2hlYWRlcnNbYWxnb10ubGVuZ3RoOyBpKyspXG5cdFx0XHRkYXRhMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGhhc2hfaGVhZGVyc1thbGdvXVtpXSk7XG5cdFx0XG5cdFx0ZGF0YTIgKz0gaGFzaC5kaWdlc3QoYWxnbywgZGF0YSk7XG5cdFx0cmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHV0aWwuaGV4c3RyZHVtcChkYXRhMiksMTYpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBleHRyYWN0IHRoZSBoYXNoIG91dCBvZiBhbiBFTVNBLVBLQ1MxLXYxLjUgcGFkZGluZyAoU2VlIFJGQzQ4ODAgMTMuMS4zKSBcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgSGFzaCBpbiBwa2NzMSBlbmNvZGluZ1xuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgaGFzaCBhcyBzdHJpbmdcblx0ICovXG5cdGRlY29kZTogZnVuY3Rpb24oYWxnbywgZGF0YSkgeyBcblx0XHR2YXIgaSA9IDA7XG5cdFx0aWYgKGRhdGEuY2hhckNvZGVBdCgwKSA9PSAwKSBpKys7XG5cdFx0ZWxzZSBpZiAoZGF0YS5jaGFyQ29kZUF0KDApICE9IDEpIHJldHVybiAtMTtcblx0XHRlbHNlIGkrKztcblxuXHRcdHdoaWxlIChkYXRhLmNoYXJDb2RlQXQoaSkgPT0gMHhGRikgaSsrO1xuXHRcdGlmIChkYXRhLmNoYXJDb2RlQXQoaSsrKSAhPSAwKSByZXR1cm4gLTE7XG5cdFx0dmFyIGogPSAwO1xuXHRcdGZvciAoaiA9IDA7IGogPCBoYXNoX2hlYWRlcnNbYWxnb10ubGVuZ3RoICYmIGoraSA8IGRhdGEubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmIChkYXRhLmNoYXJDb2RlQXQoaitpKSAhPSBoYXNoX2hlYWRlcnNbYWxnb11bal0pIHJldHVybiAtMTtcblx0XHR9XG5cdFx0aSs9IGo7XHRcblx0XHRpZiAoZGF0YS5zdWJzdHJpbmcoaSkubGVuZ3RoIDwgaGFzaC5nZXRIYXNoQnl0ZUxlbmd0aChhbGdvKSkgcmV0dXJuIC0xO1xuXHRcdHJldHVybiBkYXRhLnN1YnN0cmluZyhpKTtcblx0fVxuXHR9XG59XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuLy9cbi8vIEEgRGlnaXRhbCBzaWduYXR1cmUgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uXG5cbnZhciBCaWdJbnRlZ2VyID0gcmVxdWlyZSgnLi9qc2JuLmpzJyksXG4gIHJhbmRvbSA9IHJlcXVpcmUoJy4uL3JhbmRvbS5qcycpLFxuICBoYXNoTW9kdWxlID0gcmVxdWlyZSgnLi4vaGFzaCcpLFxuXHR1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbCcpO1xuXG5mdW5jdGlvbiBEU0EoKSB7XG5cdC8vIHMxID0gKChnKipzKSBtb2QgcCkgbW9kIHFcblx0Ly8gczEgPSAoKHMqKi0xKSooc2hhLTEobSkrKHMxKngpIG1vZCBxKVxuXHRmdW5jdGlvbiBzaWduKGhhc2hhbGdvLCBtLCBnLCBwLCBxLCB4KSB7XG5cdFx0Ly8gSWYgdGhlIG91dHB1dCBzaXplIG9mIHRoZSBjaG9zZW4gaGFzaCBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mXG5cdFx0Ly8gYml0cyBvZiBxLCB0aGUgaGFzaCByZXN1bHQgaXMgdHJ1bmNhdGVkIHRvIGZpdCBieSB0YWtpbmcgdGhlIG51bWJlclxuXHRcdC8vIG9mIGxlZnRtb3N0IGJpdHMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBiaXRzIG9mIHEuICBUaGlzIChwb3NzaWJseVxuXHRcdC8vIHRydW5jYXRlZCkgaGFzaCBmdW5jdGlvbiByZXN1bHQgaXMgdHJlYXRlZCBhcyBhIG51bWJlciBhbmQgdXNlZFxuXHRcdC8vIGRpcmVjdGx5IGluIHRoZSBEU0Egc2lnbmF0dXJlIGFsZ29yaXRobS5cblx0XHR2YXIgaGFzaGVkX2RhdGEgPSB1dGlsLmdldExlZnROQml0cyhoYXNoTW9kdWxlLmRpZ2VzdChoYXNoYWxnbyxtKSxxLmJpdExlbmd0aCgpKTtcblx0XHR2YXIgaGFzaCA9IG5ldyBCaWdJbnRlZ2VyKHV0aWwuaGV4c3RyZHVtcChoYXNoZWRfZGF0YSksIDE2KTtcblx0XHR2YXIgayA9IHJhbmRvbS5nZXRSYW5kb21CaWdJbnRlZ2VySW5SYW5nZShCaWdJbnRlZ2VyLk9ORS5hZGQoQmlnSW50ZWdlci5PTkUpLCBxLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7XG5cdFx0dmFyIHMxID0gKGcubW9kUG93KGsscCkpLm1vZChxKTsgXG5cdFx0dmFyIHMyID0gKGsubW9kSW52ZXJzZShxKS5tdWx0aXBseShoYXNoLmFkZCh4Lm11bHRpcGx5KHMxKSkpKS5tb2QocSk7XG5cdFx0dmFyIHJlc3VsdCA9IG5ldyBBcnJheSgpO1xuXHRcdHJlc3VsdFswXSA9IHMxLnRvTVBJKCk7XG5cdFx0cmVzdWx0WzFdID0gczIudG9NUEkoKTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cdGZ1bmN0aW9uIHNlbGVjdF9oYXNoX2FsZ29yaXRobShxKSB7XG5cdFx0dmFyIHVzZXJzZXR0aW5nID0gb3BlbnBncC5jb25maWcuY29uZmlnLnByZWZlcl9oYXNoX2FsZ29yaXRobTtcblx0XHQvKlxuXHRcdCAqIDEwMjQtYml0IGtleSwgMTYwLWJpdCBxLCBTSEEtMSwgU0hBLTIyNCwgU0hBLTI1NiwgU0hBLTM4NCwgb3IgU0hBLTUxMiBoYXNoXG5cdFx0ICogMjA0OC1iaXQga2V5LCAyMjQtYml0IHEsIFNIQS0yMjQsIFNIQS0yNTYsIFNIQS0zODQsIG9yIFNIQS01MTIgaGFzaFxuXHRcdCAqIDIwNDgtYml0IGtleSwgMjU2LWJpdCBxLCBTSEEtMjU2LCBTSEEtMzg0LCBvciBTSEEtNTEyIGhhc2hcblx0XHQgKiAzMDcyLWJpdCBrZXksIDI1Ni1iaXQgcSwgU0hBLTI1NiwgU0hBLTM4NCwgb3IgU0hBLTUxMiBoYXNoXG5cdFx0ICovXG5cdFx0c3dpdGNoIChNYXRoLnJvdW5kKHEuYml0TGVuZ3RoKCkgLyA4KSkge1xuXHRcdGNhc2UgMjA6IC8vIDEwMjQgYml0XG5cdFx0XHRpZiAodXNlcnNldHRpbmcgIT0gMiAmJlxuXHRcdFx0XHR1c2Vyc2V0dGluZyA+IDExICYmXG5cdFx0XHRcdHVzZXJzZXR0aW5nICE9IDEwICYmXG5cdFx0XHRcdHVzZXJzZXR0aW5nIDwgOClcblx0XHRcdFx0cmV0dXJuIDI7IC8vIHByZWZlciBzaGExXG5cdFx0XHRyZXR1cm4gdXNlcnNldHRpbmc7XG5cdFx0Y2FzZSAyODogLy8gMjA0OCBiaXRcblx0XHRcdGlmICh1c2Vyc2V0dGluZyA+IDExICYmXG5cdFx0XHRcdFx0dXNlcnNldHRpbmcgPCA4KVxuXHRcdFx0XHRcdHJldHVybiAxMTtcblx0XHRcdHJldHVybiB1c2Vyc2V0dGluZztcblx0XHRjYXNlIDMyOiAvLyA0MDk2IGJpdCAvLyBwcmVmZXIgc2hhMjI0XG5cdFx0XHRpZiAodXNlcnNldHRpbmcgPiAxMCAmJlxuXHRcdFx0XHRcdHVzZXJzZXR0aW5nIDwgOClcblx0XHRcdFx0XHRyZXR1cm4gODsgLy8gcHJlZmVyIHNoYTI1NlxuXHRcdFx0cmV0dXJuIHVzZXJzZXR0aW5nO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR1dGlsLnByaW50X2RlYnVnKFwiRFNBIHNlbGVjdCBoYXNoIGFsZ29yaXRobTogcmV0dXJuaW5nIG51bGwgZm9yIGFuIHVua25vd24gbGVuZ3RoIG9mIHFcIik7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFxuXHRcdH1cblx0fVxuXHR0aGlzLnNlbGVjdF9oYXNoX2FsZ29yaXRobSA9IHNlbGVjdF9oYXNoX2FsZ29yaXRobTtcblx0XG5cdGZ1bmN0aW9uIHZlcmlmeShoYXNoYWxnbywgczEsczIsbSxwLHEsZyx5KSB7XG5cdFx0dmFyIGhhc2hlZF9kYXRhID0gdXRpbC5nZXRMZWZ0TkJpdHMoaGFzaE1vZHVsZS5kaWdlc3QoaGFzaGFsZ28sbSkscS5iaXRMZW5ndGgoKSk7XG5cdFx0dmFyIGhhc2ggPSBuZXcgQmlnSW50ZWdlcih1dGlsLmhleHN0cmR1bXAoaGFzaGVkX2RhdGEpLCAxNik7IFxuXHRcdGlmIChCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKHMxKSA+IDAgfHxcblx0XHRcdFx0czEuY29tcGFyZVRvKHEpID4gMCB8fFxuXHRcdFx0XHRCaWdJbnRlZ2VyLlpFUk8uY29tcGFyZVRvKHMyKSA+IDAgfHxcblx0XHRcdFx0czIuY29tcGFyZVRvKHEpID4gMCkge1xuXHRcdFx0dXRpbC5wcmludF9lcnJvcihcImludmFsaWQgRFNBIFNpZ25hdHVyZVwiKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHR2YXIgdyA9IHMyLm1vZEludmVyc2UocSk7XG5cdFx0dmFyIHUxID0gaGFzaC5tdWx0aXBseSh3KS5tb2QocSk7XG5cdFx0dmFyIHUyID0gczEubXVsdGlwbHkodykubW9kKHEpO1xuXHRcdHJldHVybiBnLm1vZFBvdyh1MSxwKS5tdWx0aXBseSh5Lm1vZFBvdyh1MixwKSkubW9kKHApLm1vZChxKTtcblx0fVxuXHRcblx0Lypcblx0ICogdW51c2VkIGNvZGUuIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBzdGFydCB0byB3cml0ZSBhIGtleSBnZW5lcmF0b3Jcblx0ICogZnVuY3Rpb24uXG5cdFxuXHRmdW5jdGlvbiBnZW5lcmF0ZUtleShiaXRjb3VudCkge1xuXHQgICAgdmFyIHFpID0gbmV3IEJpZ0ludGVnZXIoYml0Y291bnQsIHByaW1lQ2VudGVyaWUpO1xuXHQgICAgdmFyIHBpID0gZ2VuZXJhdGVQKHEsIDUxMik7XG5cdCAgICB2YXIgZ2kgPSBnZW5lcmF0ZUcocCwgcSwgYml0Y291bnQpO1xuXHQgICAgdmFyIHhpO1xuXHQgICAgZG8ge1xuXHQgICAgICAgIHhpID0gbmV3IEJpZ0ludGVnZXIocS5iaXRDb3VudCgpLCByYW5kKTtcblx0ICAgIH0gd2hpbGUgKHguY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgIT0gMSAmJiB4LmNvbXBhcmVUbyhxKSAhPSAtMSk7XG5cdCAgICB2YXIgeWkgPSBnLm1vZFBvdyh4LCBwKTtcblx0ICAgIHJldHVybiB7eDogeGksIHE6IHFpLCBwOiBwaSwgZzogZ2ksIHk6IHlpfTtcblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlUChxLCBiaXRsZW5ndGgsIHJhbmRvbWZuKSB7XG5cdCAgICBpZiAoYml0bGVuZ3RoICUgNjQgIT0gMCkge1xuXHQgICAgXHRyZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICB2YXIgcFRlbXA7XG5cdCAgICB2YXIgcFRlbXAyO1xuXHQgICAgZG8ge1xuXHQgICAgICAgIHBUZW1wID0gcmFuZG9tZm4oYml0Y291bnQsIHRydWUpO1xuXHQgICAgICAgIHBUZW1wMiA9IHBUZW1wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcblx0ICAgICAgICBwVGVtcCA9IHBUZW1wLnN1YnRyYWN0KHBUZW1wMi5yZW1haW5kZXIocSkpO1xuXHQgICAgfSB3aGlsZSAoIXBUZW1wLmlzUHJvYmFibGVQcmltZShwcmltZUNlbnRlcmllKSB8fCBwVGVtcC5iaXRMZW5ndGgoKSAhPSBsKTtcblx0ICAgIHJldHVybiBwVGVtcDtcblx0fVxuXHRcblx0ZnVuY3Rpb24gZ2VuZXJhdGVHKHAsIHEsIGJpdGxlbmd0aCwgcmFuZG9tZm4pIHtcblx0ICAgIHZhciBhdXggPSBwLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcblx0ICAgIHZhciBwb3cgPSBhdXguZGl2aWRlKHEpO1xuXHQgICAgdmFyIGdUZW1wO1xuXHQgICAgZG8ge1xuXHQgICAgICAgIGdUZW1wID0gcmFuZG9tZm4oYml0bGVuZ3RoKTtcblx0ICAgIH0gd2hpbGUgKGdUZW1wLmNvbXBhcmVUbyhhdXgpICE9IC0xICYmIGdUZW1wLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgIT0gMSk7XG5cdCAgICByZXR1cm4gZ1RlbXAubW9kUG93KHBvdywgcCk7XG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUsocSwgYml0bGVuZ3RoLCByYW5kb21mbikge1xuXHQgICAgdmFyIHRlbXBLO1xuXHQgICAgZG8ge1xuXHQgICAgICAgIHRlbXBLID0gcmFuZG9tZm4oYml0bGVuZ3RoLCBmYWxzZSk7XG5cdCAgICB9IHdoaWxlICh0ZW1wSy5jb21wYXJlVG8ocSkgIT0gLTEgJiYgdGVtcEsuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgIT0gMSk7XG5cdCAgICByZXR1cm4gdGVtcEs7XG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVIocSxwKSB7XG5cdCAgICBrID0gZ2VuZXJhdGVLKHEpO1xuXHQgICAgdmFyIHIgPSBnLm1vZFBvdyhrLCBwKS5tb2QocSk7XG5cdCAgICByZXR1cm4gcjtcblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlUyhoYXNoZm4sayxyLG0scSx4KSB7XG4gICAgICAgIHZhciBoYXNoID0gaGFzaGZuKG0pO1xuICAgICAgICBzID0gKGsubW9kSW52ZXJzZShxKS5tdWx0aXBseShoYXNoLmFkZCh4Lm11bHRpcGx5KHIpKSkpLm1vZChxKTtcblx0ICAgIHJldHVybiBzO1xuXHR9ICovXG5cdHRoaXMuc2lnbiA9IHNpZ247XG5cdHRoaXMudmVyaWZ5ID0gdmVyaWZ5O1xuXHQvLyB0aGlzLmdlbmVyYXRlID0gZ2VuZXJhdGVLZXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRFNBO1xuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIE9uZS1QYXNzIFNpZ25hdHVyZSBQYWNrZXRzIChUYWcgNClcbiAqIFxuICogUkZDNDg4MCA1LjQ6XG4gKiBUaGUgT25lLVBhc3MgU2lnbmF0dXJlIHBhY2tldCBwcmVjZWRlcyB0aGUgc2lnbmVkIGRhdGEgYW5kIGNvbnRhaW5zXG4gKiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYWxsb3cgdGhlIHJlY2VpdmVyIHRvIGJlZ2luIGNhbGN1bGF0aW5nIGFueVxuICogaGFzaGVzIG5lZWRlZCB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZS4gIEl0IGFsbG93cyB0aGUgU2lnbmF0dXJlXG4gKiBwYWNrZXQgdG8gYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UsIHNvIHRoYXQgdGhlIHNpZ25lclxuICogY2FuIGNvbXB1dGUgdGhlIGVudGlyZSBzaWduZWQgbWVzc2FnZSBpbiBvbmUgcGFzcy5cbiAqL1xuXG52YXIgZW51bXMgPSByZXF1aXJlKCcuLi9lbnVtcy5qcycpLFxuXHR0eXBlX2tleWlkID0gcmVxdWlyZSgnLi4vdHlwZS9rZXlpZC5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldF9vbmVfcGFzc19zaWduYXR1cmUoKSB7XG5cdHRoaXMudmVyc2lvbiA9IG51bGw7IC8vIEEgb25lLW9jdGV0IHZlcnNpb24gbnVtYmVyLiAgVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyAzLlxuXHR0aGlzLnR5cGUgPSBudWxsOyBcdCAvLyBBIG9uZS1vY3RldCBzaWduYXR1cmUgdHlwZS4gIFNpZ25hdHVyZSB0eXBlcyBhcmUgZGVzY3JpYmVkIGluIFJGQzQ4ODAgU2VjdGlvbiA1LjIuMS5cblx0dGhpcy5oYXNoQWxnb3JpdGhtID0gbnVsbDsgXHQgICAvLyBBIG9uZS1vY3RldCBudW1iZXIgZGVzY3JpYmluZyB0aGUgaGFzaCBhbGdvcml0aG0gdXNlZC4gKFNlZSBSRkM0ODgwIDkuNClcblx0dGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBudWxsO1x0ICAgICAvLyBBIG9uZS1vY3RldCBudW1iZXIgZGVzY3JpYmluZyB0aGUgcHVibGljLWtleSBhbGdvcml0aG0gdXNlZC4gKFNlZSBSRkM0ODgwIDkuMSlcblx0dGhpcy5zaWduaW5nS2V5SWQgPSBudWxsOyAvLyBBbiBlaWdodC1vY3RldCBudW1iZXIgaG9sZGluZyB0aGUgS2V5IElEIG9mIHRoZSBzaWduaW5nIGtleS5cblx0dGhpcy5mbGFncyA9IG51bGw7IFx0Ly8gIEEgb25lLW9jdGV0IG51bWJlciBob2xkaW5nIGEgZmxhZyBzaG93aW5nIHdoZXRoZXIgdGhlIHNpZ25hdHVyZSBpcyBuZXN0ZWQuICBBIHplcm8gdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgcGFja2V0IGlzIGFub3RoZXIgT25lLVBhc3MgU2lnbmF0dXJlIHBhY2tldCB0aGF0IGRlc2NyaWJlcyBhbm90aGVyIHNpZ25hdHVyZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBzYW1lIG1lc3NhZ2UgZGF0YS5cblxuXHQvKipcblx0ICogcGFyc2luZyBmdW5jdGlvbiBmb3IgYSBvbmUtcGFzcyBzaWduYXR1cmUgcGFja2V0ICh0YWcgNCkuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBieXRlcyBwYXlsb2FkIG9mIGEgdGFnIDQgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gcG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBieXRlcyBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgYnl0ZXMgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gb2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdHZhciBteXBvcyA9IDA7XG5cdFx0Ly8gQSBvbmUtb2N0ZXQgdmVyc2lvbiBudW1iZXIuICBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIDMuXG5cdFx0dGhpcy52ZXJzaW9uID0gYnl0ZXMuY2hhckNvZGVBdChteXBvcysrKTtcblxuXHQgICAgIC8vIEEgb25lLW9jdGV0IHNpZ25hdHVyZSB0eXBlLiAgU2lnbmF0dXJlIHR5cGVzIGFyZSBkZXNjcmliZWQgaW5cblx0ICAgICAvLyAgIFNlY3Rpb24gNS4yLjEuXG5cdFx0dGhpcy50eXBlID0gZW51bXMucmVhZChlbnVtcy5zaWduYXR1cmUsIGJ5dGVzLmNoYXJDb2RlQXQobXlwb3MrKykpO1xuXG5cdCAgICAgLy8gQSBvbmUtb2N0ZXQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIGhhc2ggYWxnb3JpdGhtIHVzZWQuXG5cdFx0dGhpcy5oYXNoQWxnb3JpdGhtID0gZW51bXMucmVhZChlbnVtcy5oYXNoLCBieXRlcy5jaGFyQ29kZUF0KG15cG9zKyspKTtcblxuXHQgICAgIC8vIEEgb25lLW9jdGV0IG51bWJlciBkZXNjcmliaW5nIHRoZSBwdWJsaWMta2V5IGFsZ29yaXRobSB1c2VkLlxuXHRcdHRoaXMucHVibGljS2V5QWxnb3JpdGhtID0gZW51bXMucmVhZChlbnVtcy5wdWJsaWNLZXksIGJ5dGVzLmNoYXJDb2RlQXQobXlwb3MrKykpO1xuXG5cdCAgICAgLy8gQW4gZWlnaHQtb2N0ZXQgbnVtYmVyIGhvbGRpbmcgdGhlIEtleSBJRCBvZiB0aGUgc2lnbmluZyBrZXkuXG5cdFx0dGhpcy5zaWduaW5nS2V5SWQgPSBuZXcgdHlwZV9rZXlpZCgpO1xuXHRcdHRoaXMuc2lnbmluZ0tleUlkLnJlYWQoYnl0ZXMuc3Vic3RyKG15cG9zKSk7XG5cdFx0bXlwb3MgKz0gODtcblx0XHRcblx0ICAgICAvLyBBIG9uZS1vY3RldCBudW1iZXIgaG9sZGluZyBhIGZsYWcgc2hvd2luZyB3aGV0aGVyIHRoZSBzaWduYXR1cmVcblx0ICAgICAvLyAgIGlzIG5lc3RlZC4gIEEgemVybyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbmV4dCBwYWNrZXQgaXNcblx0ICAgICAvLyAgIGFub3RoZXIgT25lLVBhc3MgU2lnbmF0dXJlIHBhY2tldCB0aGF0IGRlc2NyaWJlcyBhbm90aGVyXG5cdCAgICAgLy8gICBzaWduYXR1cmUgdG8gYmUgYXBwbGllZCB0byB0aGUgc2FtZSBtZXNzYWdlIGRhdGEuXG5cdFx0dGhpcy5mbGFncyA9IGJ5dGVzLmNoYXJDb2RlQXQobXlwb3MrKyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogY3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG9uZS1wYXNzIHNpZ25hdHVyZSBwYWNrZXRcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSB0eXBlIFNpZ25hdHVyZSB0eXBlcyBhcyBkZXNjcmliZWQgaW4gUkZDNDg4MCBTZWN0aW9uIDUuMi4xLlxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGhhc2hhbGdvcml0aG0gdGhlIGhhc2ggYWxnb3JpdGhtIHVzZWQgd2l0aGluIHRoZSBzaWduYXR1cmVcblx0ICogQHBhcmFtIHtvcGVucGdwX21zZ19wcml2YXRla2V5fSBwcml2YXRla2V5IHRoZSBwcml2YXRlIGtleSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzaWduYXR1cmVcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5ndGggbGVuZ3RoIG9mIGRhdGEgdG8gYmUgc2lnbmVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVzdGVkIGJvb2xlYW4gc2hvd2luZyB3aGV0aGVyIHRoZSBzaWduYXR1cmUgaXMgbmVzdGVkLiBcblx0ICogIFwidHJ1ZVwiIGluZGljYXRlcyB0aGF0IHRoZSBuZXh0IHBhY2tldCBpcyBhbm90aGVyIE9uZS1QYXNzIFNpZ25hdHVyZSBwYWNrZXRcblx0ICogICB0aGF0IGRlc2NyaWJlcyBhbm90aGVyIHNpZ25hdHVyZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBzYW1lIG1lc3NhZ2UgZGF0YS4gXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBvbmUtcGFzcyBzaWduYXR1cmUgcGFja2V0XG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24odHlwZSwgaGFzaGFsZ29yaXRobSwgcHJpdmF0ZWtleSwgbGVuZ3RoLCBuZXN0ZWQpIHtcblx0XHR2YXIgcmVzdWx0ID1cIlwiOyBcblx0XHRcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgzKTtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShlbnVtcy53cml0ZShlbnVtcy5zaWduYXR1cmUsIHR5cGUpKTtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShlbnVtcy53cml0ZShlbnVtcy5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG0pKTtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShlbnVtcy53cml0ZShlbnVtcy5wdWJsaWNLZXksIHByaXZhdGVrZXkuYWxnb3JpdGhtKSk7XG5cdFx0cmVzdWx0ICs9IHByaXZhdGVrZXkuZ2V0S2V5SWQoKTtcblx0XHRpZiAobmVzdGVkKVxuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XG5cdFx0ZWxzZVxuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMSk7XG5cdFx0XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG4vL1xuLy8gRWxHYW1hbCBpbXBsZW1lbnRhdGlvblxuXG52YXIgQmlnSW50ZWdlciA9IHJlcXVpcmUoJy4vanNibi5qcycpLFxuICByYW5kb20gPSByZXF1aXJlKCcuLi9yYW5kb20uanMnKSxcbiAgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwnKTtcblxuZnVuY3Rpb24gRWxnYW1hbCgpIHtcblxuICBmdW5jdGlvbiBlbmNyeXB0KG0sZyxwLHkpIHtcbiAgICAvLyAgY2hvb3NlIGsgaW4gezIsLi4uLHAtMn1cbiAgICB2YXIgdHdvID0gQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKTtcbiAgICB2YXIgcE1pbnVzMiA9IHAuc3VidHJhY3QodHdvKTtcbiAgICB2YXIgayA9IHJhbmRvbS5nZXRSYW5kb21CaWdJbnRlZ2VySW5SYW5nZSh0d28sIHBNaW51czIpO1xuICAgIGsgPSBrLm1vZChwTWludXMyKS5hZGQoQmlnSW50ZWdlci5PTkUpO1xuICAgIHZhciBjID0gW107XG4gICAgY1swXSA9IGcubW9kUG93KGssIHApO1xuICAgIGNbMV0gPSB5Lm1vZFBvdyhrLCBwKS5tdWx0aXBseShtKS5tb2QocCk7XG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNyeXB0KGMxLGMyLHAseCkge1xuICAgIHV0aWwucHJpbnRfZGVidWcoXCJFbGdhbWFsIERlY3J5cHQ6XFxuYzE6XCIrdXRpbC5oZXhzdHJkdW1wKGMxLnRvTVBJKCkpK1wiXFxuXCIrXG4gICAgICAgIFwiYzI6XCIrdXRpbC5oZXhzdHJkdW1wKGMyLnRvTVBJKCkpK1wiXFxuXCIrXG4gICAgICAgIFwicDpcIit1dGlsLmhleHN0cmR1bXAocC50b01QSSgpKStcIlxcblwiK1xuICAgICAgICBcIng6XCIrdXRpbC5oZXhzdHJkdW1wKHgudG9NUEkoKSkpO1xuICAgIHJldHVybiAoYzEubW9kUG93KHgsIHApLm1vZEludmVyc2UocCkpLm11bHRpcGx5KGMyKS5tb2QocCk7XG4gICAgLy92YXIgYyA9IGMxLnBvdyh4KS5tb2RJbnZlcnNlKHApOyAvLyBjMF4tYSBtb2QgcFxuICAgICAgLy9yZXR1cm4gYy5tdWx0aXBseShjMikubW9kKHApO1xuICB9XG5cbiAgLy8gc2lnbmluZyBhbmQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiB1c2luZyBFbGdhbWFsIGlzIG5vdCByZXF1aXJlZCBieSBPcGVuUEdQLlxuICB0aGlzLmVuY3J5cHQgPSBlbmNyeXB0O1xuICB0aGlzLmRlY3J5cHQgPSBkZWNyeXB0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZ2FtYWw7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcblx0cnNhOiByZXF1aXJlKCcuL3JzYS5qcycpLFxuXHRlbGdhbWFsOiByZXF1aXJlKCcuL2VsZ2FtYWwuanMnKSxcblx0ZHNhOiByZXF1aXJlKCcuL2RzYS5qcycpXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgIFRvbSBXdSAodGp3QGNzLlN0YW5mb3JkLkVEVSkgXG4gKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSCBcbiAqIFxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbiAqIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvXG4gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cbiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMtSVNcIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgXG4gKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFxuICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgXG4gKlxuICogSU4gTk8gRVZFTlQgU0hBTEwgVE9NIFdVIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsXG4gKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVJcbiAqIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0ZcbiAqIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVRcbiAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4gKlxuICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGFwcGxpZXM6XG4gKlxuICogQWxsIHJlZGlzdHJpYnV0aW9ucyBtdXN0IHJldGFpbiBhbiBpbnRhY3QgY29weSBvZiB0aGlzIGNvcHlyaWdodCBub3RpY2VcbiAqIGFuZCBkaXNjbGFpbWVyLlxuICovXG5cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyk7XG5cbi8vIEJhc2ljIEphdmFTY3JpcHQgQk4gbGlicmFyeSAtIHN1YnNldCB1c2VmdWwgZm9yIFJTQSBlbmNyeXB0aW9uLlxuXG4vLyBCaXRzIHBlciBkaWdpdFxudmFyIGRiaXRzO1xuXG4vLyBKYXZhU2NyaXB0IGVuZ2luZSBhbmFseXNpc1xudmFyIGNhbmFyeSA9IDB4ZGVhZGJlZWZjYWZlO1xudmFyIGpfbG0gPSAoKGNhbmFyeSYweGZmZmZmZik9PTB4ZWZjYWZlKTtcblxuLy8gKHB1YmxpYykgQ29uc3RydWN0b3JcbmZ1bmN0aW9uIEJpZ0ludGVnZXIoYSxiLGMpIHtcbiAgaWYoYSAhPSBudWxsKVxuICAgIGlmKFwibnVtYmVyXCIgPT0gdHlwZW9mIGEpIHRoaXMuZnJvbU51bWJlcihhLGIsYyk7XG4gICAgZWxzZSBpZihiID09IG51bGwgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgYSkgdGhpcy5mcm9tU3RyaW5nKGEsMjU2KTtcbiAgICBlbHNlIHRoaXMuZnJvbVN0cmluZyhhLGIpO1xufVxuXG4vLyByZXR1cm4gbmV3LCB1bnNldCBCaWdJbnRlZ2VyXG5mdW5jdGlvbiBuYmkoKSB7IHJldHVybiBuZXcgQmlnSW50ZWdlcihudWxsKTsgfVxuXG4vLyBhbTogQ29tcHV0ZSB3X2ogKz0gKHgqdGhpc19pKSwgcHJvcGFnYXRlIGNhcnJpZXMsXG4vLyBjIGlzIGluaXRpYWwgY2FycnksIHJldHVybnMgZmluYWwgY2FycnkuXG4vLyBjIDwgMypkdmFsdWUsIHggPCAyKmR2YWx1ZSwgdGhpc19pIDwgZHZhbHVlXG4vLyBXZSBuZWVkIHRvIHNlbGVjdCB0aGUgZmFzdGVzdCBvbmUgdGhhdCB3b3JrcyBpbiB0aGlzIGVudmlyb25tZW50LlxuXG4vLyBhbTE6IHVzZSBhIHNpbmdsZSBtdWx0IGFuZCBkaXZpZGUgdG8gZ2V0IHRoZSBoaWdoIGJpdHMsXG4vLyBtYXggZGlnaXQgYml0cyBzaG91bGQgYmUgMjYgYmVjYXVzZVxuLy8gbWF4IGludGVybmFsIHZhbHVlID0gMipkdmFsdWVeMi0yKmR2YWx1ZSAoPCAyXjUzKVxuZnVuY3Rpb24gYW0xKGkseCx3LGosYyxuKSB7XG4gIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgdmFyIHYgPSB4KnRoaXNbaSsrXSt3W2pdK2M7XG4gICAgYyA9IE1hdGguZmxvb3Iodi8weDQwMDAwMDApO1xuICAgIHdbaisrXSA9IHYmMHgzZmZmZmZmO1xuICB9XG4gIHJldHVybiBjO1xufVxuLy8gYW0yIGF2b2lkcyBhIGJpZyBtdWx0LWFuZC1leHRyYWN0IGNvbXBsZXRlbHkuXG4vLyBNYXggZGlnaXQgYml0cyBzaG91bGQgYmUgPD0gMzAgYmVjYXVzZSB3ZSBkbyBiaXR3aXNlIG9wc1xuLy8gb24gdmFsdWVzIHVwIHRvIDIqaGR2YWx1ZV4yLWhkdmFsdWUtMSAoPCAyXjMxKVxuZnVuY3Rpb24gYW0yKGkseCx3LGosYyxuKSB7XG4gIHZhciB4bCA9IHgmMHg3ZmZmLCB4aCA9IHg+PjE1O1xuICB3aGlsZSgtLW4gPj0gMCkge1xuICAgIHZhciBsID0gdGhpc1tpXSYweDdmZmY7XG4gICAgdmFyIGggPSB0aGlzW2krK10+PjE1O1xuICAgIHZhciBtID0geGgqbCtoKnhsO1xuICAgIGwgPSB4bCpsKygobSYweDdmZmYpPDwxNSkrd1tqXSsoYyYweDNmZmZmZmZmKTtcbiAgICBjID0gKGw+Pj4zMCkrKG0+Pj4xNSkreGgqaCsoYz4+PjMwKTtcbiAgICB3W2orK10gPSBsJjB4M2ZmZmZmZmY7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG4vLyBBbHRlcm5hdGVseSwgc2V0IG1heCBkaWdpdCBiaXRzIHRvIDI4IHNpbmNlIHNvbWVcbi8vIGJyb3dzZXJzIHNsb3cgZG93biB3aGVuIGRlYWxpbmcgd2l0aCAzMi1iaXQgbnVtYmVycy5cbmZ1bmN0aW9uIGFtMyhpLHgsdyxqLGMsbikge1xuICB2YXIgeGwgPSB4JjB4M2ZmZiwgeGggPSB4Pj4xNDtcbiAgd2hpbGUoLS1uID49IDApIHtcbiAgICB2YXIgbCA9IHRoaXNbaV0mMHgzZmZmO1xuICAgIHZhciBoID0gdGhpc1tpKytdPj4xNDtcbiAgICB2YXIgbSA9IHhoKmwraCp4bDtcbiAgICBsID0geGwqbCsoKG0mMHgzZmZmKTw8MTQpK3dbal0rYztcbiAgICBjID0gKGw+PjI4KSsobT4+MTQpK3hoKmg7XG4gICAgd1tqKytdID0gbCYweGZmZmZmZmY7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG4vKmlmKGpfbG0gJiYgKG5hdmlnYXRvciAhPSB1bmRlZmluZWQgJiYgXG5cdG5hdmlnYXRvci5hcHBOYW1lID09IFwiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyXCIpKSB7XG4gIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0yO1xuICBkYml0cyA9IDMwO1xufVxuZWxzZSBpZihqX2xtICYmIChuYXZpZ2F0b3IgIT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci5hcHBOYW1lICE9IFwiTmV0c2NhcGVcIikpIHsqL1xuICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMTtcbiAgZGJpdHMgPSAyNjtcbi8qfVxuZWxzZSB7IC8vIE1vemlsbGEvTmV0c2NhcGUgc2VlbXMgdG8gcHJlZmVyIGFtM1xuICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMztcbiAgZGJpdHMgPSAyODtcbn0qL1xuXG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQiA9IGRiaXRzO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuRE0gPSAoKDE8PGRiaXRzKS0xKTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLkRWID0gKDE8PGRiaXRzKTtcblxudmFyIEJJX0ZQID0gNTI7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5GViA9IE1hdGgucG93KDIsQklfRlApO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuRjEgPSBCSV9GUC1kYml0cztcbkJpZ0ludGVnZXIucHJvdG90eXBlLkYyID0gMipkYml0cy1CSV9GUDtcblxuLy8gRGlnaXQgY29udmVyc2lvbnNcbnZhciBCSV9STSA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG52YXIgQklfUkMgPSBuZXcgQXJyYXkoKTtcbnZhciBycix2djtcbnJyID0gXCIwXCIuY2hhckNvZGVBdCgwKTtcbmZvcih2diA9IDA7IHZ2IDw9IDk7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG5yciA9IFwiYVwiLmNoYXJDb2RlQXQoMCk7XG5mb3IodnYgPSAxMDsgdnYgPCAzNjsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcbnJyID0gXCJBXCIuY2hhckNvZGVBdCgwKTtcbmZvcih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuXG5mdW5jdGlvbiBpbnQyY2hhcihuKSB7IHJldHVybiBCSV9STS5jaGFyQXQobik7IH1cbmZ1bmN0aW9uIGludEF0KHMsaSkge1xuICB2YXIgYyA9IEJJX1JDW3MuY2hhckNvZGVBdChpKV07XG4gIHJldHVybiAoYz09bnVsbCk/LTE6Yztcbn1cblxuLy8gKHByb3RlY3RlZCkgY29weSB0aGlzIHRvIHJcbmZ1bmN0aW9uIGJucENvcHlUbyhyKSB7XG4gIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgcltpXSA9IHRoaXNbaV07XG4gIHIudCA9IHRoaXMudDtcbiAgci5zID0gdGhpcy5zO1xufVxuXG4vLyAocHJvdGVjdGVkKSBzZXQgZnJvbSBpbnRlZ2VyIHZhbHVlIHgsIC1EViA8PSB4IDwgRFZcbmZ1bmN0aW9uIGJucEZyb21JbnQoeCkge1xuICB0aGlzLnQgPSAxO1xuICB0aGlzLnMgPSAoeDwwKT8tMTowO1xuICBpZih4ID4gMCkgdGhpc1swXSA9IHg7XG4gIGVsc2UgaWYoeCA8IC0xKSB0aGlzWzBdID0geCtEVjtcbiAgZWxzZSB0aGlzLnQgPSAwO1xufVxuXG4vLyByZXR1cm4gYmlnaW50IGluaXRpYWxpemVkIHRvIHZhbHVlXG5mdW5jdGlvbiBuYnYoaSkgeyB2YXIgciA9IG5iaSgpOyByLmZyb21JbnQoaSk7IHJldHVybiByOyB9XG5cbi8vIChwcm90ZWN0ZWQpIHNldCBmcm9tIHN0cmluZyBhbmQgcmFkaXhcbmZ1bmN0aW9uIGJucEZyb21TdHJpbmcocyxiKSB7XG4gIHZhciBrO1xuICBpZihiID09IDE2KSBrID0gNDtcbiAgZWxzZSBpZihiID09IDgpIGsgPSAzO1xuICBlbHNlIGlmKGIgPT0gMjU2KSBrID0gODsgLy8gYnl0ZSBhcnJheVxuICBlbHNlIGlmKGIgPT0gMikgayA9IDE7XG4gIGVsc2UgaWYoYiA9PSAzMikgayA9IDU7XG4gIGVsc2UgaWYoYiA9PSA0KSBrID0gMjtcbiAgZWxzZSB7IHRoaXMuZnJvbVJhZGl4KHMsYik7IHJldHVybjsgfVxuICB0aGlzLnQgPSAwO1xuICB0aGlzLnMgPSAwO1xuICB2YXIgaSA9IHMubGVuZ3RoLCBtaSA9IGZhbHNlLCBzaCA9IDA7XG4gIHdoaWxlKC0taSA+PSAwKSB7XG4gICAgdmFyIHggPSAoaz09OCk/c1tpXSYweGZmOmludEF0KHMsaSk7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIGlmKHMuY2hhckF0KGkpID09IFwiLVwiKSBtaSA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbWkgPSBmYWxzZTtcbiAgICBpZihzaCA9PSAwKVxuICAgICAgdGhpc1t0aGlzLnQrK10gPSB4O1xuICAgIGVsc2UgaWYoc2grayA+IHRoaXMuREIpIHtcbiAgICAgIHRoaXNbdGhpcy50LTFdIHw9ICh4JigoMTw8KHRoaXMuREItc2gpKS0xKSk8PHNoO1xuICAgICAgdGhpc1t0aGlzLnQrK10gPSAoeD4+KHRoaXMuREItc2gpKTtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgdGhpc1t0aGlzLnQtMV0gfD0geDw8c2g7XG4gICAgc2ggKz0gaztcbiAgICBpZihzaCA+PSB0aGlzLkRCKSBzaCAtPSB0aGlzLkRCO1xuICB9XG4gIGlmKGsgPT0gOCAmJiAoc1swXSYweDgwKSAhPSAwKSB7XG4gICAgdGhpcy5zID0gLTE7XG4gICAgaWYoc2ggPiAwKSB0aGlzW3RoaXMudC0xXSB8PSAoKDE8PCh0aGlzLkRCLXNoKSktMSk8PHNoO1xuICB9XG4gIHRoaXMuY2xhbXAoKTtcbiAgaWYobWkpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpO1xufVxuXG4vLyAocHJvdGVjdGVkKSBjbGFtcCBvZmYgZXhjZXNzIGhpZ2ggd29yZHNcbmZ1bmN0aW9uIGJucENsYW1wKCkge1xuICB2YXIgYyA9IHRoaXMucyZ0aGlzLkRNO1xuICB3aGlsZSh0aGlzLnQgPiAwICYmIHRoaXNbdGhpcy50LTFdID09IGMpIC0tdGhpcy50O1xufVxuXG4vLyAocHVibGljKSByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGdpdmVuIHJhZGl4XG5mdW5jdGlvbiBiblRvU3RyaW5nKGIpIHtcbiAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIFwiLVwiK3RoaXMubmVnYXRlKCkudG9TdHJpbmcoYik7XG4gIHZhciBrO1xuICBpZihiID09IDE2KSBrID0gNDtcbiAgZWxzZSBpZihiID09IDgpIGsgPSAzO1xuICBlbHNlIGlmKGIgPT0gMikgayA9IDE7XG4gIGVsc2UgaWYoYiA9PSAzMikgayA9IDU7XG4gIGVsc2UgaWYoYiA9PSA0KSBrID0gMjtcbiAgZWxzZSByZXR1cm4gdGhpcy50b1JhZGl4KGIpO1xuICB2YXIga20gPSAoMTw8ayktMSwgZCwgbSA9IGZhbHNlLCByID0gXCJcIiwgaSA9IHRoaXMudDtcbiAgdmFyIHAgPSB0aGlzLkRCLShpKnRoaXMuREIpJWs7XG4gIGlmKGktLSA+IDApIHtcbiAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApID4gMCkgeyBtID0gdHJ1ZTsgciA9IGludDJjaGFyKGQpOyB9XG4gICAgd2hpbGUoaSA+PSAwKSB7XG4gICAgICBpZihwIDwgaykge1xuICAgICAgICBkID0gKHRoaXNbaV0mKCgxPDxwKS0xKSk8PChrLXApO1xuICAgICAgICBkIHw9IHRoaXNbLS1pXT4+KHArPXRoaXMuREItayk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZCA9ICh0aGlzW2ldPj4ocC09aykpJmttO1xuICAgICAgICBpZihwIDw9IDApIHsgcCArPSB0aGlzLkRCOyAtLWk7IH1cbiAgICAgIH1cbiAgICAgIGlmKGQgPiAwKSBtID0gdHJ1ZTtcbiAgICAgIGlmKG0pIHIgKz0gaW50MmNoYXIoZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtP3I6XCIwXCI7XG59XG5cbi8vIChwdWJsaWMpIC10aGlzXG5mdW5jdGlvbiBibk5lZ2F0ZSgpIHsgdmFyIHIgPSBuYmkoKTsgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHx0aGlzfFxuZnVuY3Rpb24gYm5BYnMoKSB7IHJldHVybiAodGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpczsgfVxuXG4vLyAocHVibGljKSByZXR1cm4gKyBpZiB0aGlzID4gYSwgLSBpZiB0aGlzIDwgYSwgMCBpZiBlcXVhbFxuZnVuY3Rpb24gYm5Db21wYXJlVG8oYSkge1xuICB2YXIgciA9IHRoaXMucy1hLnM7XG4gIGlmKHIgIT0gMCkgcmV0dXJuIHI7XG4gIHZhciBpID0gdGhpcy50O1xuICByID0gaS1hLnQ7XG4gIGlmKHIgIT0gMCkgcmV0dXJuIHI7XG4gIHdoaWxlKC0taSA+PSAwKSBpZigocj10aGlzW2ldLWFbaV0pICE9IDApIHJldHVybiByO1xuICByZXR1cm4gMDtcbn1cblxuLy8gcmV0dXJucyBiaXQgbGVuZ3RoIG9mIHRoZSBpbnRlZ2VyIHhcbmZ1bmN0aW9uIG5iaXRzKHgpIHtcbiAgdmFyIHIgPSAxLCB0O1xuICBpZigodD14Pj4+MTYpICE9IDApIHsgeCA9IHQ7IHIgKz0gMTY7IH1cbiAgaWYoKHQ9eD4+OCkgIT0gMCkgeyB4ID0gdDsgciArPSA4OyB9XG4gIGlmKCh0PXg+PjQpICE9IDApIHsgeCA9IHQ7IHIgKz0gNDsgfVxuICBpZigodD14Pj4yKSAhPSAwKSB7IHggPSB0OyByICs9IDI7IH1cbiAgaWYoKHQ9eD4+MSkgIT0gMCkgeyB4ID0gdDsgciArPSAxOyB9XG4gIHJldHVybiByO1xufVxuXG4vLyAocHVibGljKSByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIFwidGhpc1wiXG5mdW5jdGlvbiBibkJpdExlbmd0aCgpIHtcbiAgaWYodGhpcy50IDw9IDApIHJldHVybiAwO1xuICByZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXih0aGlzLnMmdGhpcy5ETSkpO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyA8PCBuKkRCXG5mdW5jdGlvbiBibnBETFNoaWZ0VG8obixyKSB7XG4gIHZhciBpO1xuICBmb3IoaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgcltpK25dID0gdGhpc1tpXTtcbiAgZm9yKGkgPSBuLTE7IGkgPj0gMDsgLS1pKSByW2ldID0gMDtcbiAgci50ID0gdGhpcy50K247XG4gIHIucyA9IHRoaXMucztcbn1cblxuLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPj4gbipEQlxuZnVuY3Rpb24gYm5wRFJTaGlmdFRvKG4scikge1xuICBmb3IodmFyIGkgPSBuOyBpIDwgdGhpcy50OyArK2kpIHJbaS1uXSA9IHRoaXNbaV07XG4gIHIudCA9IE1hdGgubWF4KHRoaXMudC1uLDApO1xuICByLnMgPSB0aGlzLnM7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG5cbmZ1bmN0aW9uIGJucExTaGlmdFRvKG4scikge1xuICB2YXIgYnMgPSBuJXRoaXMuREI7XG4gIHZhciBjYnMgPSB0aGlzLkRCLWJzO1xuICB2YXIgYm0gPSAoMTw8Y2JzKS0xO1xuICB2YXIgZHMgPSBNYXRoLmZsb29yKG4vdGhpcy5EQiksIGMgPSAodGhpcy5zPDxicykmdGhpcy5ETSwgaTtcbiAgZm9yKGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHtcbiAgICByW2krZHMrMV0gPSAodGhpc1tpXT4+Y2JzKXxjO1xuICAgIGMgPSAodGhpc1tpXSZibSk8PGJzO1xuICB9XG4gIGZvcihpID0gZHMtMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSAwO1xuICByW2RzXSA9IGM7XG4gIHIudCA9IHRoaXMudCtkcysxO1xuICByLnMgPSB0aGlzLnM7XG4gIHIuY2xhbXAoKTtcbn1cblxuLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPj4gblxuZnVuY3Rpb24gYm5wUlNoaWZ0VG8obixyKSB7XG4gIHIucyA9IHRoaXMucztcbiAgdmFyIGRzID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICBpZihkcyA+PSB0aGlzLnQpIHsgci50ID0gMDsgcmV0dXJuOyB9XG4gIHZhciBicyA9IG4ldGhpcy5EQjtcbiAgdmFyIGNicyA9IHRoaXMuREItYnM7XG4gIHZhciBibSA9ICgxPDxicyktMTtcbiAgclswXSA9IHRoaXNbZHNdPj5icztcbiAgZm9yKHZhciBpID0gZHMrMTsgaSA8IHRoaXMudDsgKytpKSB7XG4gICAgcltpLWRzLTFdIHw9ICh0aGlzW2ldJmJtKTw8Y2JzO1xuICAgIHJbaS1kc10gPSB0aGlzW2ldPj5icztcbiAgfVxuICBpZihicyA+IDApIHJbdGhpcy50LWRzLTFdIHw9ICh0aGlzLnMmYm0pPDxjYnM7XG4gIHIudCA9IHRoaXMudC1kcztcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyAtIGFcbmZ1bmN0aW9uIGJucFN1YlRvKGEscikge1xuICB2YXIgaSA9IDAsIGMgPSAwLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gIHdoaWxlKGkgPCBtKSB7XG4gICAgYyArPSB0aGlzW2ldLWFbaV07XG4gICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgIGMgPj49IHRoaXMuREI7XG4gIH1cbiAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgYyAtPSBhLnM7XG4gICAgd2hpbGUoaSA8IHRoaXMudCkge1xuICAgICAgYyArPSB0aGlzW2ldO1xuICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICB9XG4gICAgYyArPSB0aGlzLnM7XG4gIH1cbiAgZWxzZSB7XG4gICAgYyArPSB0aGlzLnM7XG4gICAgd2hpbGUoaSA8IGEudCkge1xuICAgICAgYyAtPSBhW2ldO1xuICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICB9XG4gICAgYyAtPSBhLnM7XG4gIH1cbiAgci5zID0gKGM8MCk/LTE6MDtcbiAgaWYoYyA8IC0xKSByW2krK10gPSB0aGlzLkRWK2M7XG4gIGVsc2UgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gIHIudCA9IGk7XG4gIHIuY2xhbXAoKTtcbn1cblxuLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKiBhLCByICE9IHRoaXMsYSAoSEFDIDE0LjEyKVxuLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuZnVuY3Rpb24gYm5wTXVsdGlwbHlUbyhhLHIpIHtcbiAgdmFyIHggPSB0aGlzLmFicygpLCB5ID0gYS5hYnMoKTtcbiAgdmFyIGkgPSB4LnQ7XG4gIHIudCA9IGkreS50O1xuICB3aGlsZSgtLWkgPj0gMCkgcltpXSA9IDA7XG4gIGZvcihpID0gMDsgaSA8IHkudDsgKytpKSByW2kreC50XSA9IHguYW0oMCx5W2ldLHIsaSwwLHgudCk7XG4gIHIucyA9IDA7XG4gIHIuY2xhbXAoKTtcbiAgaWYodGhpcy5zICE9IGEucykgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzXjIsIHIgIT0gdGhpcyAoSEFDIDE0LjE2KVxuZnVuY3Rpb24gYm5wU3F1YXJlVG8ocikge1xuICB2YXIgeCA9IHRoaXMuYWJzKCk7XG4gIHZhciBpID0gci50ID0gMip4LnQ7XG4gIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgZm9yKGkgPSAwOyBpIDwgeC50LTE7ICsraSkge1xuICAgIHZhciBjID0geC5hbShpLHhbaV0sciwyKmksMCwxKTtcbiAgICBpZigocltpK3gudF0rPXguYW0oaSsxLDIqeFtpXSxyLDIqaSsxLGMseC50LWktMSkpID49IHguRFYpIHtcbiAgICAgIHJbaSt4LnRdIC09IHguRFY7XG4gICAgICByW2kreC50KzFdID0gMTtcbiAgICB9XG4gIH1cbiAgaWYoci50ID4gMCkgcltyLnQtMV0gKz0geC5hbShpLHhbaV0sciwyKmksMCwxKTtcbiAgci5zID0gMDtcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHJvdGVjdGVkKSBkaXZpZGUgdGhpcyBieSBtLCBxdW90aWVudCBhbmQgcmVtYWluZGVyIHRvIHEsIHIgKEhBQyAxNC4yMClcbi8vIHIgIT0gcSwgdGhpcyAhPSBtLiAgcSBvciByIG1heSBiZSBudWxsLlxuZnVuY3Rpb24gYm5wRGl2UmVtVG8obSxxLHIpIHtcbiAgdmFyIHBtID0gbS5hYnMoKTtcbiAgaWYocG0udCA8PSAwKSByZXR1cm47XG4gIHZhciBwdCA9IHRoaXMuYWJzKCk7XG4gIGlmKHB0LnQgPCBwbS50KSB7XG4gICAgaWYocSAhPSBudWxsKSBxLmZyb21JbnQoMCk7XG4gICAgaWYociAhPSBudWxsKSB0aGlzLmNvcHlUbyhyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYociA9PSBudWxsKSByID0gbmJpKCk7XG4gIHZhciB5ID0gbmJpKCksIHRzID0gdGhpcy5zLCBtcyA9IG0ucztcbiAgdmFyIG5zaCA9IHRoaXMuREItbmJpdHMocG1bcG0udC0xXSk7XHQvLyBub3JtYWxpemUgbW9kdWx1c1xuICBpZihuc2ggPiAwKSB7IHBtLmxTaGlmdFRvKG5zaCx5KTsgcHQubFNoaWZ0VG8obnNoLHIpOyB9XG4gIGVsc2UgeyBwbS5jb3B5VG8oeSk7IHB0LmNvcHlUbyhyKTsgfVxuICB2YXIgeXMgPSB5LnQ7XG4gIHZhciB5MCA9IHlbeXMtMV07XG4gIGlmKHkwID09IDApIHJldHVybjtcbiAgdmFyIHl0ID0geTAqKDE8PHRoaXMuRjEpKygoeXM+MSk/eVt5cy0yXT4+dGhpcy5GMjowKTtcbiAgdmFyIGQxID0gdGhpcy5GVi95dCwgZDIgPSAoMTw8dGhpcy5GMSkveXQsIGUgPSAxPDx0aGlzLkYyO1xuICB2YXIgaSA9IHIudCwgaiA9IGkteXMsIHQgPSAocT09bnVsbCk/bmJpKCk6cTtcbiAgeS5kbFNoaWZ0VG8oaix0KTtcbiAgaWYoci5jb21wYXJlVG8odCkgPj0gMCkge1xuICAgIHJbci50KytdID0gMTtcbiAgICByLnN1YlRvKHQscik7XG4gIH1cbiAgQmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLHQpO1xuICB0LnN1YlRvKHkseSk7XHQvLyBcIm5lZ2F0aXZlXCIgeSBzbyB3ZSBjYW4gcmVwbGFjZSBzdWIgd2l0aCBhbSBsYXRlclxuICB3aGlsZSh5LnQgPCB5cykgeVt5LnQrK10gPSAwO1xuICB3aGlsZSgtLWogPj0gMCkge1xuICAgIC8vIEVzdGltYXRlIHF1b3RpZW50IGRpZ2l0XG4gICAgdmFyIHFkID0gKHJbLS1pXT09eTApP3RoaXMuRE06TWF0aC5mbG9vcihyW2ldKmQxKyhyW2ktMV0rZSkqZDIpO1xuICAgIGlmKChyW2ldKz15LmFtKDAscWQscixqLDAseXMpKSA8IHFkKSB7XHQvLyBUcnkgaXQgb3V0XG4gICAgICB5LmRsU2hpZnRUbyhqLHQpO1xuICAgICAgci5zdWJUbyh0LHIpO1xuICAgICAgd2hpbGUocltpXSA8IC0tcWQpIHIuc3ViVG8odCxyKTtcbiAgICB9XG4gIH1cbiAgaWYocSAhPSBudWxsKSB7XG4gICAgci5kclNoaWZ0VG8oeXMscSk7XG4gICAgaWYodHMgIT0gbXMpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLHEpO1xuICB9XG4gIHIudCA9IHlzO1xuICByLmNsYW1wKCk7XG4gIGlmKG5zaCA+IDApIHIuclNoaWZ0VG8obnNoLHIpO1x0Ly8gRGVub3JtYWxpemUgcmVtYWluZGVyXG4gIGlmKHRzIDwgMCkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG59XG5cbi8vIChwdWJsaWMpIHRoaXMgbW9kIGFcbmZ1bmN0aW9uIGJuTW9kKGEpIHtcbiAgdmFyIHIgPSBuYmkoKTtcbiAgdGhpcy5hYnMoKS5kaXZSZW1UbyhhLG51bGwscik7XG4gIGlmKHRoaXMucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIGEuc3ViVG8ocixyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIE1vZHVsYXIgcmVkdWN0aW9uIHVzaW5nIFwiY2xhc3NpY1wiIGFsZ29yaXRobVxuZnVuY3Rpb24gQ2xhc3NpYyhtKSB7IHRoaXMubSA9IG07IH1cbmZ1bmN0aW9uIGNDb252ZXJ0KHgpIHtcbiAgaWYoeC5zIDwgMCB8fCB4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHJldHVybiB4Lm1vZCh0aGlzLm0pO1xuICBlbHNlIHJldHVybiB4O1xufVxuZnVuY3Rpb24gY1JldmVydCh4KSB7IHJldHVybiB4OyB9XG5mdW5jdGlvbiBjUmVkdWNlKHgpIHsgeC5kaXZSZW1Ubyh0aGlzLm0sbnVsbCx4KTsgfVxuZnVuY3Rpb24gY011bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuZnVuY3Rpb24gY1NxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG5DbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0ID0gY0NvbnZlcnQ7XG5DbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQgPSBjUmV2ZXJ0O1xuQ2xhc3NpYy5wcm90b3R5cGUucmVkdWNlID0gY1JlZHVjZTtcbkNsYXNzaWMucHJvdG90eXBlLm11bFRvID0gY011bFRvO1xuQ2xhc3NpYy5wcm90b3R5cGUuc3FyVG8gPSBjU3FyVG87XG5cbi8vIChwcm90ZWN0ZWQpIHJldHVybiBcIi0xL3RoaXMgJSAyXkRCXCI7IHVzZWZ1bCBmb3IgTW9udC4gcmVkdWN0aW9uXG4vLyBqdXN0aWZpY2F0aW9uOlxuLy8gICAgICAgICB4eSA9PSAxIChtb2QgbSlcbi8vICAgICAgICAgeHkgPSAgMStrbVxuLy8gICB4eSgyLXh5KSA9ICgxK2ttKSgxLWttKVxuLy8geFt5KDIteHkpXSA9IDEta14ybV4yXG4vLyB4W3koMi14eSldID09IDEgKG1vZCBtXjIpXG4vLyBpZiB5IGlzIDEveCBtb2QgbSwgdGhlbiB5KDIteHkpIGlzIDEveCBtb2QgbV4yXG4vLyBzaG91bGQgcmVkdWNlIHggYW5kIHkoMi14eSkgYnkgbV4yIGF0IGVhY2ggc3RlcCB0byBrZWVwIHNpemUgYm91bmRlZC5cbi8vIEpTIG11bHRpcGx5IFwib3ZlcmZsb3dzXCIgZGlmZmVyZW50bHkgZnJvbSBDL0MrKywgc28gY2FyZSBpcyBuZWVkZWQgaGVyZS5cbmZ1bmN0aW9uIGJucEludkRpZ2l0KCkge1xuICBpZih0aGlzLnQgPCAxKSByZXR1cm4gMDtcbiAgdmFyIHggPSB0aGlzWzBdO1xuICBpZigoeCYxKSA9PSAwKSByZXR1cm4gMDtcbiAgdmFyIHkgPSB4JjM7XHRcdC8vIHkgPT0gMS94IG1vZCAyXjJcbiAgeSA9ICh5KigyLSh4JjB4ZikqeSkpJjB4ZjtcdC8vIHkgPT0gMS94IG1vZCAyXjRcbiAgeSA9ICh5KigyLSh4JjB4ZmYpKnkpKSYweGZmO1x0Ly8geSA9PSAxL3ggbW9kIDJeOFxuICB5ID0gKHkqKDItKCgoeCYweGZmZmYpKnkpJjB4ZmZmZikpKSYweGZmZmY7XHQvLyB5ID09IDEveCBtb2QgMl4xNlxuICAvLyBsYXN0IHN0ZXAgLSBjYWxjdWxhdGUgaW52ZXJzZSBtb2QgRFYgZGlyZWN0bHk7XG4gIC8vIGFzc3VtZXMgMTYgPCBEQiA8PSAzMiBhbmQgYXNzdW1lcyBhYmlsaXR5IHRvIGhhbmRsZSA0OC1iaXQgaW50c1xuICB5ID0gKHkqKDIteCp5JXRoaXMuRFYpKSV0aGlzLkRWO1x0XHQvLyB5ID09IDEveCBtb2QgMl5kYml0c1xuICAvLyB3ZSByZWFsbHkgd2FudCB0aGUgbmVnYXRpdmUgaW52ZXJzZSwgYW5kIC1EViA8IHkgPCBEVlxuICByZXR1cm4gKHk+MCk/dGhpcy5EVi15Oi15O1xufVxuXG4vLyBNb250Z29tZXJ5IHJlZHVjdGlvblxuZnVuY3Rpb24gTW9udGdvbWVyeShtKSB7XG4gIHRoaXMubSA9IG07XG4gIHRoaXMubXAgPSBtLmludkRpZ2l0KCk7XG4gIHRoaXMubXBsID0gdGhpcy5tcCYweDdmZmY7XG4gIHRoaXMubXBoID0gdGhpcy5tcD4+MTU7XG4gIHRoaXMudW0gPSAoMTw8KG0uREItMTUpKS0xO1xuICB0aGlzLm10MiA9IDIqbS50O1xufVxuXG4vLyB4UiBtb2QgbVxuZnVuY3Rpb24gbW9udENvbnZlcnQoeCkge1xuICB2YXIgciA9IG5iaSgpO1xuICB4LmFicygpLmRsU2hpZnRUbyh0aGlzLm0udCxyKTtcbiAgci5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxyKTtcbiAgaWYoeC5zIDwgMCAmJiByLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID4gMCkgdGhpcy5tLnN1YlRvKHIscik7XG4gIHJldHVybiByO1xufVxuXG4vLyB4L1IgbW9kIG1cbmZ1bmN0aW9uIG1vbnRSZXZlcnQoeCkge1xuICB2YXIgciA9IG5iaSgpO1xuICB4LmNvcHlUbyhyKTtcbiAgdGhpcy5yZWR1Y2Uocik7XG4gIHJldHVybiByO1xufVxuXG4vLyB4ID0geC9SIG1vZCBtIChIQUMgMTQuMzIpXG5mdW5jdGlvbiBtb250UmVkdWNlKHgpIHtcbiAgd2hpbGUoeC50IDw9IHRoaXMubXQyKVx0Ly8gcGFkIHggc28gYW0gaGFzIGVub3VnaCByb29tIGxhdGVyXG4gICAgeFt4LnQrK10gPSAwO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5tLnQ7ICsraSkge1xuICAgIC8vIGZhc3RlciB3YXkgb2YgY2FsY3VsYXRpbmcgdTAgPSB4W2ldKm1wIG1vZCBEVlxuICAgIHZhciBqID0geFtpXSYweDdmZmY7XG4gICAgdmFyIHUwID0gKGoqdGhpcy5tcGwrKCgoaip0aGlzLm1waCsoeFtpXT4+MTUpKnRoaXMubXBsKSZ0aGlzLnVtKTw8MTUpKSZ4LkRNO1xuICAgIC8vIHVzZSBhbSB0byBjb21iaW5lIHRoZSBtdWx0aXBseS1zaGlmdC1hZGQgaW50byBvbmUgY2FsbFxuICAgIGogPSBpK3RoaXMubS50O1xuICAgIHhbal0gKz0gdGhpcy5tLmFtKDAsdTAseCxpLDAsdGhpcy5tLnQpO1xuICAgIC8vIHByb3BhZ2F0ZSBjYXJyeVxuICAgIHdoaWxlKHhbal0gPj0geC5EVikgeyB4W2pdIC09IHguRFY7IHhbKytqXSsrOyB9XG4gIH1cbiAgeC5jbGFtcCgpO1xuICB4LmRyU2hpZnRUbyh0aGlzLm0udCx4KTtcbiAgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA+PSAwKSB4LnN1YlRvKHRoaXMubSx4KTtcbn1cblxuLy8gciA9IFwieF4yL1IgbW9kIG1cIjsgeCAhPSByXG5mdW5jdGlvbiBtb250U3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbi8vIHIgPSBcInh5L1IgbW9kIG1cIjsgeCx5ICE9IHJcbmZ1bmN0aW9uIG1vbnRNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuTW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydCA9IG1vbnRDb252ZXJ0O1xuTW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0ID0gbW9udFJldmVydDtcbk1vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZSA9IG1vbnRSZWR1Y2U7XG5Nb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbyA9IG1vbnRNdWxUbztcbk1vbnRnb21lcnkucHJvdG90eXBlLnNxclRvID0gbW9udFNxclRvO1xuXG4vLyAocHJvdGVjdGVkKSB0cnVlIGlmZiB0aGlzIGlzIGV2ZW5cbmZ1bmN0aW9uIGJucElzRXZlbigpIHsgcmV0dXJuICgodGhpcy50PjApPyh0aGlzWzBdJjEpOnRoaXMucykgPT0gMDsgfVxuXG4vLyAocHJvdGVjdGVkKSB0aGlzXmUsIGUgPCAyXjMyLCBkb2luZyBzcXIgYW5kIG11bCB3aXRoIFwiclwiIChIQUMgMTQuNzkpXG5mdW5jdGlvbiBibnBFeHAoZSx6KSB7XG4gIGlmKGUgPiAweGZmZmZmZmZmIHx8IGUgPCAxKSByZXR1cm4gQmlnSW50ZWdlci5PTkU7XG4gIHZhciByID0gbmJpKCksIHIyID0gbmJpKCksIGcgPSB6LmNvbnZlcnQodGhpcyksIGkgPSBuYml0cyhlKS0xO1xuICBnLmNvcHlUbyhyKTtcbiAgd2hpbGUoLS1pID49IDApIHtcbiAgICB6LnNxclRvKHIscjIpO1xuICAgIGlmKChlJigxPDxpKSkgPiAwKSB6Lm11bFRvKHIyLGcscik7XG4gICAgZWxzZSB7IHZhciB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgfVxuICByZXR1cm4gei5yZXZlcnQocik7XG59XG5cbi8vIChwdWJsaWMpIHRoaXNeZSAlIG0sIDAgPD0gZSA8IDJeMzJcbmZ1bmN0aW9uIGJuTW9kUG93SW50KGUsbSkge1xuICB2YXIgejtcbiAgaWYoZSA8IDI1NiB8fCBtLmlzRXZlbigpKSB6ID0gbmV3IENsYXNzaWMobSk7IGVsc2UgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuICByZXR1cm4gdGhpcy5leHAoZSx6KTtcbn1cblxuLy8gcHJvdGVjdGVkXG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG8gPSBibnBDb3B5VG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tSW50ID0gYm5wRnJvbUludDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21TdHJpbmcgPSBibnBGcm9tU3RyaW5nO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuY2xhbXAgPSBibnBDbGFtcDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbyA9IGJucERMU2hpZnRUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmRyU2hpZnRUbyA9IGJucERSU2hpZnRUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmxTaGlmdFRvID0gYm5wTFNoaWZ0VG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hpZnRUbyA9IGJucFJTaGlmdFRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc3ViVG8gPSBibnBTdWJUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VG8gPSBibnBNdWx0aXBseVRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlVG8gPSBibnBTcXVhcmVUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmRpdlJlbVRvID0gYm5wRGl2UmVtVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnZEaWdpdCA9IGJucEludkRpZ2l0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuID0gYm5wSXNFdmVuO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZXhwID0gYm5wRXhwO1xuXG4vLyBwdWJsaWNcbkJpZ0ludGVnZXIucHJvdG90eXBlLnRvU3RyaW5nID0gYm5Ub1N0cmluZztcbkJpZ0ludGVnZXIucHJvdG90eXBlLm5lZ2F0ZSA9IGJuTmVnYXRlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYWJzID0gYm5BYnM7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5jb21wYXJlVG8gPSBibkNvbXBhcmVUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmJpdExlbmd0aCA9IGJuQml0TGVuZ3RoO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubW9kID0gYm5Nb2Q7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3dJbnQgPSBibk1vZFBvd0ludDtcblxuLy8gXCJjb25zdGFudHNcIlxuQmlnSW50ZWdlci5aRVJPID0gbmJ2KDApO1xuQmlnSW50ZWdlci5PTkUgPSBuYnYoMSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmlnSW50ZWdlcjtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcbiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1ICBUb20gV3UgKHRqd0Bjcy5TdGFuZm9yZC5FRFUpIFxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBNb2RpZmllZCBieSBSZWN1cml0eSBMYWJzIEdtYkhcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuICogXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xuICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4gKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUy1JU1wiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBcbiAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgXG4gKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBcbiAqXG4gKiBJTiBOTyBFVkVOVCBTSEFMTCBUT00gV1UgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCxcbiAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUlxuICogUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRlxuICogVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVFxuICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gYXBwbGllczpcbiAqXG4gKiBBbGwgcmVkaXN0cmlidXRpb25zIG11c3QgcmV0YWluIGFuIGludGFjdCBjb3B5IG9mIHRoaXMgY29weXJpZ2h0IG5vdGljZVxuICogYW5kIGRpc2NsYWltZXIuXG4gKi9cblxuXG4vLyBFeHRlbmRlZCBKYXZhU2NyaXB0IEJOIGZ1bmN0aW9ucywgcmVxdWlyZWQgZm9yIFJTQSBwcml2YXRlIG9wcy5cblxuLy8gVmVyc2lvbiAxLjE6IG5ldyBCaWdJbnRlZ2VyKFwiMFwiLCAxMCkgcmV0dXJucyBcInByb3BlclwiIHplcm9cbi8vIFZlcnNpb24gMS4yOiBzcXVhcmUoKSBBUEksIGlzUHJvYmFibGVQcmltZSBmaXhcblxuLy8gKHB1YmxpYylcbmZ1bmN0aW9uIGJuQ2xvbmUoKSB7IHZhciByID0gbmJpKCk7IHRoaXMuY29weVRvKHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgaW50ZWdlclxuZnVuY3Rpb24gYm5JbnRWYWx1ZSgpIHtcbiAgaWYodGhpcy5zIDwgMCkge1xuICAgIGlmKHRoaXMudCA9PSAxKSByZXR1cm4gdGhpc1swXS10aGlzLkRWO1xuICAgIGVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAtMTtcbiAgfVxuICBlbHNlIGlmKHRoaXMudCA9PSAxKSByZXR1cm4gdGhpc1swXTtcbiAgZWxzZSBpZih0aGlzLnQgPT0gMCkgcmV0dXJuIDA7XG4gIC8vIGFzc3VtZXMgMTYgPCBEQiA8IDMyXG4gIHJldHVybiAoKHRoaXNbMV0mKCgxPDwoMzItdGhpcy5EQikpLTEpKTw8dGhpcy5EQil8dGhpc1swXTtcbn1cblxuLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIGJ5dGVcbmZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCkgeyByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwyNCk+PjI0OyB9XG5cbi8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBzaG9ydCAoYXNzdW1lcyBEQj49MTYpXG5mdW5jdGlvbiBiblNob3J0VmFsdWUoKSB7IHJldHVybiAodGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDE2KT4+MTY7IH1cblxuLy8gKHByb3RlY3RlZCkgcmV0dXJuIHggcy50LiByXnggPCBEVlxuZnVuY3Rpb24gYm5wQ2h1bmtTaXplKHIpIHsgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIqdGhpcy5EQi9NYXRoLmxvZyhyKSk7IH1cblxuLy8gKHB1YmxpYykgMCBpZiB0aGlzID09IDAsIDEgaWYgdGhpcyA+IDBcbmZ1bmN0aW9uIGJuU2lnTnVtKCkge1xuICBpZih0aGlzLnMgPCAwKSByZXR1cm4gLTE7XG4gIGVsc2UgaWYodGhpcy50IDw9IDAgfHwgKHRoaXMudCA9PSAxICYmIHRoaXNbMF0gPD0gMCkpIHJldHVybiAwO1xuICBlbHNlIHJldHVybiAxO1xufVxuXG4vLyAocHJvdGVjdGVkKSBjb252ZXJ0IHRvIHJhZGl4IHN0cmluZ1xuZnVuY3Rpb24gYm5wVG9SYWRpeChiKSB7XG4gIGlmKGIgPT0gbnVsbCkgYiA9IDEwO1xuICBpZih0aGlzLnNpZ251bSgpID09IDAgfHwgYiA8IDIgfHwgYiA+IDM2KSByZXR1cm4gXCIwXCI7XG4gIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpO1xuICB2YXIgYSA9IE1hdGgucG93KGIsY3MpO1xuICB2YXIgZCA9IG5idihhKSwgeSA9IG5iaSgpLCB6ID0gbmJpKCksIHIgPSBcIlwiO1xuICB0aGlzLmRpdlJlbVRvKGQseSx6KTtcbiAgd2hpbGUoeS5zaWdudW0oKSA+IDApIHtcbiAgICByID0gKGErei5pbnRWYWx1ZSgpKS50b1N0cmluZyhiKS5zdWJzdHIoMSkgKyByO1xuICAgIHkuZGl2UmVtVG8oZCx5LHopO1xuICB9XG4gIHJldHVybiB6LmludFZhbHVlKCkudG9TdHJpbmcoYikgKyByO1xufVxuXG4vLyAocHJvdGVjdGVkKSBjb252ZXJ0IGZyb20gcmFkaXggc3RyaW5nXG5mdW5jdGlvbiBibnBGcm9tUmFkaXgocyxiKSB7XG4gIHRoaXMuZnJvbUludCgwKTtcbiAgaWYoYiA9PSBudWxsKSBiID0gMTA7XG4gIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpO1xuICB2YXIgZCA9IE1hdGgucG93KGIsY3MpLCBtaSA9IGZhbHNlLCBqID0gMCwgdyA9IDA7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHggPSBpbnRBdChzLGkpO1xuICAgIGlmKHggPCAwKSB7XG4gICAgICBpZihzLmNoYXJBdChpKSA9PSBcIi1cIiAmJiB0aGlzLnNpZ251bSgpID09IDApIG1pID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB3ID0gYip3K3g7XG4gICAgaWYoKytqID49IGNzKSB7XG4gICAgICB0aGlzLmRNdWx0aXBseShkKTtcbiAgICAgIHRoaXMuZEFkZE9mZnNldCh3LDApO1xuICAgICAgaiA9IDA7XG4gICAgICB3ID0gMDtcbiAgICB9XG4gIH1cbiAgaWYoaiA+IDApIHtcbiAgICB0aGlzLmRNdWx0aXBseShNYXRoLnBvdyhiLGopKTtcbiAgICB0aGlzLmRBZGRPZmZzZXQodywwKTtcbiAgfVxuICBpZihtaSkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIGFsdGVybmF0ZSBjb25zdHJ1Y3RvclxuZnVuY3Rpb24gYm5wRnJvbU51bWJlcihhLGIsYykge1xuICBpZihcIm51bWJlclwiID09IHR5cGVvZiBiKSB7XG4gICAgLy8gbmV3IEJpZ0ludGVnZXIoaW50LGludCxSTkcpXG4gICAgaWYoYSA8IDIpIHRoaXMuZnJvbUludCgxKTtcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZnJvbU51bWJlcihhLGMpO1xuICAgICAgaWYoIXRoaXMudGVzdEJpdChhLTEpKVx0Ly8gZm9yY2UgTVNCIHNldFxuICAgICAgICB0aGlzLmJpdHdpc2VUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYS0xKSxvcF9vcix0aGlzKTtcbiAgICAgIGlmKHRoaXMuaXNFdmVuKCkpIHRoaXMuZEFkZE9mZnNldCgxLDApOyAvLyBmb3JjZSBvZGRcbiAgICAgIHdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShiKSkge1xuICAgICAgICB0aGlzLmRBZGRPZmZzZXQoMiwwKTtcbiAgICAgICAgaWYodGhpcy5iaXRMZW5ndGgoKSA+IGEpIHRoaXMuc3ViVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIG5ldyBCaWdJbnRlZ2VyKGludCxSTkcpXG4gICAgdmFyIHggPSBuZXcgQXJyYXkoKSwgdCA9IGEmNztcbiAgICB4Lmxlbmd0aCA9IChhPj4zKSsxO1xuICAgIGIubmV4dEJ5dGVzKHgpO1xuICAgIGlmKHQgPiAwKSB4WzBdICY9ICgoMTw8dCktMSk7IGVsc2UgeFswXSA9IDA7XG4gICAgdGhpcy5mcm9tU3RyaW5nKHgsMjU2KTtcbiAgfVxufVxuXG4vLyAocHVibGljKSBjb252ZXJ0IHRvIGJpZ2VuZGlhbiBieXRlIGFycmF5XG5mdW5jdGlvbiBiblRvQnl0ZUFycmF5KCkge1xuICB2YXIgaSA9IHRoaXMudCwgciA9IG5ldyBBcnJheSgpO1xuICByWzBdID0gdGhpcy5zO1xuICB2YXIgcCA9IHRoaXMuREItKGkqdGhpcy5EQiklOCwgZCwgayA9IDA7XG4gIGlmKGktLSA+IDApIHtcbiAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApICE9ICh0aGlzLnMmdGhpcy5ETSk+PnApXG4gICAgICByW2srK10gPSBkfCh0aGlzLnM8PCh0aGlzLkRCLXApKTtcbiAgICB3aGlsZShpID49IDApIHtcbiAgICAgIGlmKHAgPCA4KSB7XG4gICAgICAgIGQgPSAodGhpc1tpXSYoKDE8PHApLTEpKTw8KDgtcCk7XG4gICAgICAgIGQgfD0gdGhpc1stLWldPj4ocCs9dGhpcy5EQi04KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkID0gKHRoaXNbaV0+PihwLT04KSkmMHhmZjtcbiAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gdGhpcy5EQjsgLS1pOyB9XG4gICAgICB9XG4gICAgICAvL2lmKChkJjB4ODApICE9IDApIGQgfD0gLTI1NjtcbiAgICAgIC8vaWYoayA9PSAwICYmICh0aGlzLnMmMHg4MCkgIT0gKGQmMHg4MCkpICsraztcbiAgICAgIGlmKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSByW2srK10gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gYm5FcXVhbHMoYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk9PTApOyB9XG5mdW5jdGlvbiBibk1pbihhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKTwwKT90aGlzOmE7IH1cbmZ1bmN0aW9uIGJuTWF4KGEpIHsgcmV0dXJuKHRoaXMuY29tcGFyZVRvKGEpPjApP3RoaXM6YTsgfVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyBvcCBhIChiaXR3aXNlKVxuZnVuY3Rpb24gYm5wQml0d2lzZVRvKGEsb3Ascikge1xuICB2YXIgaSwgZiwgbSA9IE1hdGgubWluKGEudCx0aGlzLnQpO1xuICBmb3IoaSA9IDA7IGkgPCBtOyArK2kpIHJbaV0gPSBvcCh0aGlzW2ldLGFbaV0pO1xuICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICBmID0gYS5zJnRoaXMuRE07XG4gICAgZm9yKGkgPSBtOyBpIDwgdGhpcy50OyArK2kpIHJbaV0gPSBvcCh0aGlzW2ldLGYpO1xuICAgIHIudCA9IHRoaXMudDtcbiAgfVxuICBlbHNlIHtcbiAgICBmID0gdGhpcy5zJnRoaXMuRE07XG4gICAgZm9yKGkgPSBtOyBpIDwgYS50OyArK2kpIHJbaV0gPSBvcChmLGFbaV0pO1xuICAgIHIudCA9IGEudDtcbiAgfVxuICByLnMgPSBvcCh0aGlzLnMsYS5zKTtcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHVibGljKSB0aGlzICYgYVxuZnVuY3Rpb24gb3BfYW5kKHgseSkgeyByZXR1cm4geCZ5OyB9XG5mdW5jdGlvbiBibkFuZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kLHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSB0aGlzIHwgYVxuZnVuY3Rpb24gb3Bfb3IoeCx5KSB7IHJldHVybiB4fHk7IH1cbmZ1bmN0aW9uIGJuT3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX29yLHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSB0aGlzIF4gYVxuZnVuY3Rpb24gb3BfeG9yKHgseSkgeyByZXR1cm4geF55OyB9XG5mdW5jdGlvbiBiblhvcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfeG9yLHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSB0aGlzICYgfmFcbmZ1bmN0aW9uIG9wX2FuZG5vdCh4LHkpIHsgcmV0dXJuIHgmfnk7IH1cbmZ1bmN0aW9uIGJuQW5kTm90KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmRub3Qscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIH50aGlzXG5mdW5jdGlvbiBibk5vdCgpIHtcbiAgdmFyIHIgPSBuYmkoKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByW2ldID0gdGhpcy5ETSZ+dGhpc1tpXTtcbiAgci50ID0gdGhpcy50O1xuICByLnMgPSB+dGhpcy5zO1xuICByZXR1cm4gcjtcbn1cblxuLy8gKHB1YmxpYykgdGhpcyA8PCBuXG5mdW5jdGlvbiBiblNoaWZ0TGVmdChuKSB7XG4gIHZhciByID0gbmJpKCk7XG4gIGlmKG4gPCAwKSB0aGlzLnJTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMubFNoaWZ0VG8obixyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIChwdWJsaWMpIHRoaXMgPj4gblxuZnVuY3Rpb24gYm5TaGlmdFJpZ2h0KG4pIHtcbiAgdmFyIHIgPSBuYmkoKTtcbiAgaWYobiA8IDApIHRoaXMubFNoaWZ0VG8oLW4scik7IGVsc2UgdGhpcy5yU2hpZnRUbyhuLHIpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gcmV0dXJuIGluZGV4IG9mIGxvd2VzdCAxLWJpdCBpbiB4LCB4IDwgMl4zMVxuZnVuY3Rpb24gbGJpdCh4KSB7XG4gIGlmKHggPT0gMCkgcmV0dXJuIC0xO1xuICB2YXIgciA9IDA7XG4gIGlmKCh4JjB4ZmZmZikgPT0gMCkgeyB4ID4+PSAxNjsgciArPSAxNjsgfVxuICBpZigoeCYweGZmKSA9PSAwKSB7IHggPj49IDg7IHIgKz0gODsgfVxuICBpZigoeCYweGYpID09IDApIHsgeCA+Pj0gNDsgciArPSA0OyB9XG4gIGlmKCh4JjMpID09IDApIHsgeCA+Pj0gMjsgciArPSAyOyB9XG4gIGlmKCh4JjEpID09IDApICsrcjtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIChwdWJsaWMpIHJldHVybnMgaW5kZXggb2YgbG93ZXN0IDEtYml0IChvciAtMSBpZiBub25lKVxuZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSlcbiAgICBpZih0aGlzW2ldICE9IDApIHJldHVybiBpKnRoaXMuREIrbGJpdCh0aGlzW2ldKTtcbiAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIHRoaXMudCp0aGlzLkRCO1xuICByZXR1cm4gLTE7XG59XG5cbi8vIHJldHVybiBudW1iZXIgb2YgMSBiaXRzIGluIHhcbmZ1bmN0aW9uIGNiaXQoeCkge1xuICB2YXIgciA9IDA7XG4gIHdoaWxlKHggIT0gMCkgeyB4ICY9IHgtMTsgKytyOyB9XG4gIHJldHVybiByO1xufVxuXG4vLyAocHVibGljKSByZXR1cm4gbnVtYmVyIG9mIHNldCBiaXRzXG5mdW5jdGlvbiBibkJpdENvdW50KCkge1xuICB2YXIgciA9IDAsIHggPSB0aGlzLnMmdGhpcy5ETTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByICs9IGNiaXQodGhpc1tpXV54KTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIChwdWJsaWMpIHRydWUgaWZmIG50aCBiaXQgaXMgc2V0XG5mdW5jdGlvbiBiblRlc3RCaXQobikge1xuICB2YXIgaiA9IE1hdGguZmxvb3Iobi90aGlzLkRCKTtcbiAgaWYoaiA+PSB0aGlzLnQpIHJldHVybih0aGlzLnMhPTApO1xuICByZXR1cm4oKHRoaXNbal0mKDE8PChuJXRoaXMuREIpKSkhPTApO1xufVxuXG4vLyAocHJvdGVjdGVkKSB0aGlzIG9wICgxPDxuKVxuZnVuY3Rpb24gYm5wQ2hhbmdlQml0KG4sb3ApIHtcbiAgdmFyIHIgPSBCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQobik7XG4gIHRoaXMuYml0d2lzZVRvKHIsb3Ascik7XG4gIHJldHVybiByO1xufVxuXG4vLyAocHVibGljKSB0aGlzIHwgKDE8PG4pXG5mdW5jdGlvbiBiblNldEJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX29yKTsgfVxuXG4vLyAocHVibGljKSB0aGlzICYgfigxPDxuKVxuZnVuY3Rpb24gYm5DbGVhckJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX2FuZG5vdCk7IH1cblxuLy8gKHB1YmxpYykgdGhpcyBeICgxPDxuKVxuZnVuY3Rpb24gYm5GbGlwQml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3BfeG9yKTsgfVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyArIGFcbmZ1bmN0aW9uIGJucEFkZFRvKGEscikge1xuICB2YXIgaSA9IDAsIGMgPSAwLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gIHdoaWxlKGkgPCBtKSB7XG4gICAgYyArPSB0aGlzW2ldK2FbaV07XG4gICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgIGMgPj49IHRoaXMuREI7XG4gIH1cbiAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgYyArPSBhLnM7XG4gICAgd2hpbGUoaSA8IHRoaXMudCkge1xuICAgICAgYyArPSB0aGlzW2ldO1xuICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICB9XG4gICAgYyArPSB0aGlzLnM7XG4gIH1cbiAgZWxzZSB7XG4gICAgYyArPSB0aGlzLnM7XG4gICAgd2hpbGUoaSA8IGEudCkge1xuICAgICAgYyArPSBhW2ldO1xuICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgYyA+Pj0gdGhpcy5EQjtcbiAgICB9XG4gICAgYyArPSBhLnM7XG4gIH1cbiAgci5zID0gKGM8MCk/LTE6MDtcbiAgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gIGVsc2UgaWYoYyA8IC0xKSByW2krK10gPSB0aGlzLkRWK2M7XG4gIHIudCA9IGk7XG4gIHIuY2xhbXAoKTtcbn1cblxuLy8gKHB1YmxpYykgdGhpcyArIGFcbmZ1bmN0aW9uIGJuQWRkKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5hZGRUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSB0aGlzIC0gYVxuZnVuY3Rpb24gYm5TdWJ0cmFjdChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuc3ViVG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuLy8gKHB1YmxpYykgdGhpcyAqIGFcbmZ1bmN0aW9uIGJuTXVsdGlwbHkoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLm11bHRpcGx5VG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuLy8gKHB1YmxpYykgdGhpc14yXG5mdW5jdGlvbiBiblNxdWFyZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zcXVhcmVUbyhyKTsgcmV0dXJuIHI7IH1cblxuLy8gKHB1YmxpYykgdGhpcyAvIGFcbmZ1bmN0aW9uIGJuRGl2aWRlKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5kaXZSZW1UbyhhLHIsbnVsbCk7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHRoaXMgJSBhXG5mdW5jdGlvbiBiblJlbWFpbmRlcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuZGl2UmVtVG8oYSxudWxsLHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSBbdGhpcy9hLHRoaXMlYV1cbmZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGEpIHtcbiAgdmFyIHEgPSBuYmkoKSwgciA9IG5iaSgpO1xuICB0aGlzLmRpdlJlbVRvKGEscSxyKTtcbiAgcmV0dXJuIG5ldyBBcnJheShxLHIpO1xufVxuXG4vLyAocHJvdGVjdGVkKSB0aGlzICo9IG4sIHRoaXMgPj0gMCwgMSA8IG4gPCBEVlxuZnVuY3Rpb24gYm5wRE11bHRpcGx5KG4pIHtcbiAgdGhpc1t0aGlzLnRdID0gdGhpcy5hbSgwLG4tMSx0aGlzLDAsMCx0aGlzLnQpO1xuICArK3RoaXMudDtcbiAgdGhpcy5jbGFtcCgpO1xufVxuXG4vLyAocHJvdGVjdGVkKSB0aGlzICs9IG4gPDwgdyB3b3JkcywgdGhpcyA+PSAwXG5mdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdykge1xuICBpZihuID09IDApIHJldHVybjtcbiAgd2hpbGUodGhpcy50IDw9IHcpIHRoaXNbdGhpcy50KytdID0gMDtcbiAgdGhpc1t3XSArPSBuO1xuICB3aGlsZSh0aGlzW3ddID49IHRoaXMuRFYpIHtcbiAgICB0aGlzW3ddIC09IHRoaXMuRFY7XG4gICAgaWYoKyt3ID49IHRoaXMudCkgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICsrdGhpc1t3XTtcbiAgfVxufVxuXG4vLyBBIFwibnVsbFwiIHJlZHVjZXJcbmZ1bmN0aW9uIE51bGxFeHAoKSB7fVxuZnVuY3Rpb24gbk5vcCh4KSB7IHJldHVybiB4OyB9XG5mdW5jdGlvbiBuTXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IH1cbmZ1bmN0aW9uIG5TcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgfVxuXG5OdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gbk5vcDtcbk51bGxFeHAucHJvdG90eXBlLnJldmVydCA9IG5Ob3A7XG5OdWxsRXhwLnByb3RvdHlwZS5tdWxUbyA9IG5NdWxUbztcbk51bGxFeHAucHJvdG90eXBlLnNxclRvID0gblNxclRvO1xuXG4vLyAocHVibGljKSB0aGlzXmVcbmZ1bmN0aW9uIGJuUG93KGUpIHsgcmV0dXJuIHRoaXMuZXhwKGUsbmV3IE51bGxFeHAoKSk7IH1cblxuLy8gKHByb3RlY3RlZCkgciA9IGxvd2VyIG4gd29yZHMgb2YgXCJ0aGlzICogYVwiLCBhLnQgPD0gblxuLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuZnVuY3Rpb24gYm5wTXVsdGlwbHlMb3dlclRvKGEsbixyKSB7XG4gIHZhciBpID0gTWF0aC5taW4odGhpcy50K2EudCxuKTtcbiAgci5zID0gMDsgLy8gYXNzdW1lcyBhLHRoaXMgPj0gMFxuICByLnQgPSBpO1xuICB3aGlsZShpID4gMCkgclstLWldID0gMDtcbiAgdmFyIGo7XG4gIGZvcihqID0gci50LXRoaXMudDsgaSA8IGo7ICsraSkgcltpK3RoaXMudF0gPSB0aGlzLmFtKDAsYVtpXSxyLGksMCx0aGlzLnQpO1xuICBmb3IoaiA9IE1hdGgubWluKGEudCxuKTsgaSA8IGo7ICsraSkgdGhpcy5hbSgwLGFbaV0scixpLDAsbi1pKTtcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gXCJ0aGlzICogYVwiIHdpdGhvdXQgbG93ZXIgbiB3b3JkcywgbiA+IDBcbi8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbmZ1bmN0aW9uIGJucE11bHRpcGx5VXBwZXJUbyhhLG4scikge1xuICAtLW47XG4gIHZhciBpID0gci50ID0gdGhpcy50K2EudC1uO1xuICByLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhpcyA+PSAwXG4gIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgZm9yKGkgPSBNYXRoLm1heChuLXRoaXMudCwwKTsgaSA8IGEudDsgKytpKVxuICAgIHJbdGhpcy50K2ktbl0gPSB0aGlzLmFtKG4taSxhW2ldLHIsMCwwLHRoaXMudCtpLW4pO1xuICByLmNsYW1wKCk7XG4gIHIuZHJTaGlmdFRvKDEscik7XG59XG5cbi8vIEJhcnJldHQgbW9kdWxhciByZWR1Y3Rpb25cbmZ1bmN0aW9uIEJhcnJldHQobSkge1xuICAvLyBzZXR1cCBCYXJyZXR0XG4gIHRoaXMucjIgPSBuYmkoKTtcbiAgdGhpcy5xMyA9IG5iaSgpO1xuICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oMiptLnQsdGhpcy5yMik7XG4gIHRoaXMubXUgPSB0aGlzLnIyLmRpdmlkZShtKTtcbiAgdGhpcy5tID0gbTtcbn1cblxuZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoeCkge1xuICBpZih4LnMgPCAwIHx8IHgudCA+IDIqdGhpcy5tLnQpIHJldHVybiB4Lm1vZCh0aGlzLm0pO1xuICBlbHNlIGlmKHguY29tcGFyZVRvKHRoaXMubSkgPCAwKSByZXR1cm4geDtcbiAgZWxzZSB7IHZhciByID0gbmJpKCk7IHguY29weVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgcmV0dXJuIHI7IH1cbn1cblxuZnVuY3Rpb24gYmFycmV0dFJldmVydCh4KSB7IHJldHVybiB4OyB9XG5cbi8vIHggPSB4IG1vZCBtIChIQUMgMTQuNDIpXG5mdW5jdGlvbiBiYXJyZXR0UmVkdWNlKHgpIHtcbiAgeC5kclNoaWZ0VG8odGhpcy5tLnQtMSx0aGlzLnIyKTtcbiAgaWYoeC50ID4gdGhpcy5tLnQrMSkgeyB4LnQgPSB0aGlzLm0udCsxOyB4LmNsYW1wKCk7IH1cbiAgdGhpcy5tdS5tdWx0aXBseVVwcGVyVG8odGhpcy5yMix0aGlzLm0udCsxLHRoaXMucTMpO1xuICB0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsdGhpcy5tLnQrMSx0aGlzLnIyKTtcbiAgd2hpbGUoeC5jb21wYXJlVG8odGhpcy5yMikgPCAwKSB4LmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKTtcbiAgeC5zdWJUbyh0aGlzLnIyLHgpO1xuICB3aGlsZSh4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHguc3ViVG8odGhpcy5tLHgpO1xufVxuXG4vLyByID0geF4yIG1vZCBtOyB4ICE9IHJcbmZ1bmN0aW9uIGJhcnJldHRTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuLy8gciA9IHgqeSBtb2QgbTsgeCx5ICE9IHJcbmZ1bmN0aW9uIGJhcnJldHRNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuQmFycmV0dC5wcm90b3R5cGUuY29udmVydCA9IGJhcnJldHRDb252ZXJ0O1xuQmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0ID0gYmFycmV0dFJldmVydDtcbkJhcnJldHQucHJvdG90eXBlLnJlZHVjZSA9IGJhcnJldHRSZWR1Y2U7XG5CYXJyZXR0LnByb3RvdHlwZS5tdWxUbyA9IGJhcnJldHRNdWxUbztcbkJhcnJldHQucHJvdG90eXBlLnNxclRvID0gYmFycmV0dFNxclRvO1xuXG4vLyAocHVibGljKSB0aGlzXmUgJSBtIChIQUMgMTQuODUpXG5mdW5jdGlvbiBibk1vZFBvdyhlLG0pIHtcbiAgdmFyIGkgPSBlLmJpdExlbmd0aCgpLCBrLCByID0gbmJ2KDEpLCB6O1xuICBpZihpIDw9IDApIHJldHVybiByO1xuICBlbHNlIGlmKGkgPCAxOCkgayA9IDE7XG4gIGVsc2UgaWYoaSA8IDQ4KSBrID0gMztcbiAgZWxzZSBpZihpIDwgMTQ0KSBrID0gNDtcbiAgZWxzZSBpZihpIDwgNzY4KSBrID0gNTtcbiAgZWxzZSBrID0gNjtcbiAgaWYoaSA8IDgpXG4gICAgeiA9IG5ldyBDbGFzc2ljKG0pO1xuICBlbHNlIGlmKG0uaXNFdmVuKCkpXG4gICAgeiA9IG5ldyBCYXJyZXR0KG0pO1xuICBlbHNlXG4gICAgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuXG4gIC8vIHByZWNvbXB1dGF0aW9uXG4gIHZhciBnID0gbmV3IEFycmF5KCksIG4gPSAzLCBrMSA9IGstMSwga20gPSAoMTw8ayktMTtcbiAgZ1sxXSA9IHouY29udmVydCh0aGlzKTtcbiAgaWYoayA+IDEpIHtcbiAgICB2YXIgZzIgPSBuYmkoKTtcbiAgICB6LnNxclRvKGdbMV0sZzIpO1xuICAgIHdoaWxlKG4gPD0ga20pIHtcbiAgICAgIGdbbl0gPSBuYmkoKTtcbiAgICAgIHoubXVsVG8oZzIsZ1tuLTJdLGdbbl0pO1xuICAgICAgbiArPSAyO1xuICAgIH1cbiAgfVxuXG4gIHZhciBqID0gZS50LTEsIHcsIGlzMSA9IHRydWUsIHIyID0gbmJpKCksIHQ7XG4gIGkgPSBuYml0cyhlW2pdKS0xO1xuICB3aGlsZShqID49IDApIHtcbiAgICBpZihpID49IGsxKSB3ID0gKGVbal0+PihpLWsxKSkma207XG4gICAgZWxzZSB7XG4gICAgICB3ID0gKGVbal0mKCgxPDwoaSsxKSktMSkpPDwoazEtaSk7XG4gICAgICBpZihqID4gMCkgdyB8PSBlW2otMV0+Pih0aGlzLkRCK2ktazEpO1xuICAgIH1cblxuICAgIG4gPSBrO1xuICAgIHdoaWxlKCh3JjEpID09IDApIHsgdyA+Pj0gMTsgLS1uOyB9XG4gICAgaWYoKGkgLT0gbikgPCAwKSB7IGkgKz0gdGhpcy5EQjsgLS1qOyB9XG4gICAgaWYoaXMxKSB7XHQvLyByZXQgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0XG4gICAgICBnW3ddLmNvcHlUbyhyKTtcbiAgICAgIGlzMSA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlKG4gPiAxKSB7IHouc3FyVG8ocixyMik7IHouc3FyVG8ocjIscik7IG4gLT0gMjsgfVxuICAgICAgaWYobiA+IDApIHouc3FyVG8ocixyMik7IGVsc2UgeyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgICAgIHoubXVsVG8ocjIsZ1t3XSxyKTtcbiAgICB9XG5cbiAgICB3aGlsZShqID49IDAgJiYgKGVbal0mKDE8PGkpKSA9PSAwKSB7XG4gICAgICB6LnNxclRvKHIscjIpOyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7XG4gICAgICBpZigtLWkgPCAwKSB7IGkgPSB0aGlzLkRCLTE7IC0tajsgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gei5yZXZlcnQocik7XG59XG5cbi8vIChwdWJsaWMpIGdjZCh0aGlzLGEpIChIQUMgMTQuNTQpXG5mdW5jdGlvbiBibkdDRChhKSB7XG4gIHZhciB4ID0gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTtcbiAgdmFyIHkgPSAoYS5zPDApP2EubmVnYXRlKCk6YS5jbG9uZSgpO1xuICBpZih4LmNvbXBhcmVUbyh5KSA8IDApIHsgdmFyIHQgPSB4OyB4ID0geTsgeSA9IHQ7IH1cbiAgdmFyIGkgPSB4LmdldExvd2VzdFNldEJpdCgpLCBnID0geS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgaWYoZyA8IDApIHJldHVybiB4O1xuICBpZihpIDwgZykgZyA9IGk7XG4gIGlmKGcgPiAwKSB7XG4gICAgeC5yU2hpZnRUbyhnLHgpO1xuICAgIHkuclNoaWZ0VG8oZyx5KTtcbiAgfVxuICB3aGlsZSh4LnNpZ251bSgpID4gMCkge1xuICAgIGlmKChpID0geC5nZXRMb3dlc3RTZXRCaXQoKSkgPiAwKSB4LnJTaGlmdFRvKGkseCk7XG4gICAgaWYoKGkgPSB5LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHkuclNoaWZ0VG8oaSx5KTtcbiAgICBpZih4LmNvbXBhcmVUbyh5KSA+PSAwKSB7XG4gICAgICB4LnN1YlRvKHkseCk7XG4gICAgICB4LnJTaGlmdFRvKDEseCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgeS5zdWJUbyh4LHkpO1xuICAgICAgeS5yU2hpZnRUbygxLHkpO1xuICAgIH1cbiAgfVxuICBpZihnID4gMCkgeS5sU2hpZnRUbyhnLHkpO1xuICByZXR1cm4geTtcbn1cblxuLy8gKHByb3RlY3RlZCkgdGhpcyAlIG4sIG4gPCAyXjI2XG5mdW5jdGlvbiBibnBNb2RJbnQobikge1xuICBpZihuIDw9IDApIHJldHVybiAwO1xuICB2YXIgZCA9IHRoaXMuRFYlbiwgciA9ICh0aGlzLnM8MCk/bi0xOjA7XG4gIGlmKHRoaXMudCA+IDApXG4gICAgaWYoZCA9PSAwKSByID0gdGhpc1swXSVuO1xuICAgIGVsc2UgZm9yKHZhciBpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByID0gKGQqcit0aGlzW2ldKSVuO1xuICByZXR1cm4gcjtcbn1cblxuLy8gKHB1YmxpYykgMS90aGlzICUgbSAoSEFDIDE0LjYxKVxuZnVuY3Rpb24gYm5Nb2RJbnZlcnNlKG0pIHtcbiAgdmFyIGFjID0gbS5pc0V2ZW4oKTtcbiAgaWYoKHRoaXMuaXNFdmVuKCkgJiYgYWMpIHx8IG0uc2lnbnVtKCkgPT0gMCkgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTztcbiAgdmFyIHUgPSBtLmNsb25lKCksIHYgPSB0aGlzLmNsb25lKCk7XG4gIHZhciBhID0gbmJ2KDEpLCBiID0gbmJ2KDApLCBjID0gbmJ2KDApLCBkID0gbmJ2KDEpO1xuICB3aGlsZSh1LnNpZ251bSgpICE9IDApIHtcbiAgICB3aGlsZSh1LmlzRXZlbigpKSB7XG4gICAgICB1LnJTaGlmdFRvKDEsdSk7XG4gICAgICBpZihhYykge1xuICAgICAgICBpZighYS5pc0V2ZW4oKSB8fCAhYi5pc0V2ZW4oKSkgeyBhLmFkZFRvKHRoaXMsYSk7IGIuc3ViVG8obSxiKTsgfVxuICAgICAgICBhLnJTaGlmdFRvKDEsYSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmKCFiLmlzRXZlbigpKSBiLnN1YlRvKG0sYik7XG4gICAgICBiLnJTaGlmdFRvKDEsYik7XG4gICAgfVxuICAgIHdoaWxlKHYuaXNFdmVuKCkpIHtcbiAgICAgIHYuclNoaWZ0VG8oMSx2KTtcbiAgICAgIGlmKGFjKSB7XG4gICAgICAgIGlmKCFjLmlzRXZlbigpIHx8ICFkLmlzRXZlbigpKSB7IGMuYWRkVG8odGhpcyxjKTsgZC5zdWJUbyhtLGQpOyB9XG4gICAgICAgIGMuclNoaWZ0VG8oMSxjKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYoIWQuaXNFdmVuKCkpIGQuc3ViVG8obSxkKTtcbiAgICAgIGQuclNoaWZ0VG8oMSxkKTtcbiAgICB9XG4gICAgaWYodS5jb21wYXJlVG8odikgPj0gMCkge1xuICAgICAgdS5zdWJUbyh2LHUpO1xuICAgICAgaWYoYWMpIGEuc3ViVG8oYyxhKTtcbiAgICAgIGIuc3ViVG8oZCxiKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2LnN1YlRvKHUsdik7XG4gICAgICBpZihhYykgYy5zdWJUbyhhLGMpO1xuICAgICAgZC5zdWJUbyhiLGQpO1xuICAgIH1cbiAgfVxuICBpZih2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgIT0gMCkgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTztcbiAgaWYoZC5jb21wYXJlVG8obSkgPj0gMCkgcmV0dXJuIGQuc3VidHJhY3QobSk7XG4gIGlmKGQuc2lnbnVtKCkgPCAwKSBkLmFkZFRvKG0sZCk7IGVsc2UgcmV0dXJuIGQ7XG4gIGlmKGQuc2lnbnVtKCkgPCAwKSByZXR1cm4gZC5hZGQobSk7IGVsc2UgcmV0dXJuIGQ7XG59XG5cbnZhciBsb3dwcmltZXMgPSBbMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTtcbnZhciBscGxpbSA9ICgxPDwyNikvbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV07XG5cbi8vIChwdWJsaWMpIHRlc3QgcHJpbWFsaXR5IHdpdGggY2VydGFpbnR5ID49IDEtLjVedFxuZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUodCkge1xuICB2YXIgaSwgeCA9IHRoaXMuYWJzKCk7XG4gIGlmKHgudCA9PSAxICYmIHhbMF0gPD0gbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV0pIHtcbiAgICBmb3IoaSA9IDA7IGkgPCBsb3dwcmltZXMubGVuZ3RoOyArK2kpXG4gICAgICBpZih4WzBdID09IGxvd3ByaW1lc1tpXSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmKHguaXNFdmVuKCkpIHJldHVybiBmYWxzZTtcbiAgaSA9IDE7XG4gIHdoaWxlKGkgPCBsb3dwcmltZXMubGVuZ3RoKSB7XG4gICAgdmFyIG0gPSBsb3dwcmltZXNbaV0sIGogPSBpKzE7XG4gICAgd2hpbGUoaiA8IGxvd3ByaW1lcy5sZW5ndGggJiYgbSA8IGxwbGltKSBtICo9IGxvd3ByaW1lc1tqKytdO1xuICAgIG0gPSB4Lm1vZEludChtKTtcbiAgICB3aGlsZShpIDwgaikgaWYobSVsb3dwcmltZXNbaSsrXSA9PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHgubWlsbGVyUmFiaW4odCk7XG59XG5cbi8qIGFkZGVkIGJ5IFJlY3VyaXR5IExhYnMgKi9cblxuZnVuY3Rpb24gbmJpdHMoeCkge1xuXHR2YXIgbiA9IDEsIHQ7XG5cdGlmICgodCA9IHggPj4+IDE2KSAhPSAwKSB7XG5cdFx0eCA9IHQ7XG5cdFx0biArPSAxNjtcblx0fVxuXHRpZiAoKHQgPSB4ID4+IDgpICE9IDApIHtcblx0XHR4ID0gdDtcblx0XHRuICs9IDg7XG5cdH1cblx0aWYgKCh0ID0geCA+PiA0KSAhPSAwKSB7XG5cdFx0eCA9IHQ7XG5cdFx0biArPSA0O1xuXHR9XG5cdGlmICgodCA9IHggPj4gMikgIT0gMCkge1xuXHRcdHggPSB0O1xuXHRcdG4gKz0gMjtcblx0fVxuXHRpZiAoKHQgPSB4ID4+IDEpICE9IDApIHtcblx0XHR4ID0gdDtcblx0XHRuICs9IDE7XG5cdH1cblx0cmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGJuVG9NUEkgKCkge1xuXHR2YXIgYmEgPSB0aGlzLnRvQnl0ZUFycmF5KCk7XG5cdHZhciBzaXplID0gKGJhLmxlbmd0aC0xKSo4K25iaXRzKGJhWzBdKTtcblx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChzaXplICYgMHhGRjAwKSA+PiA4KTtcblx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoc2l6ZSAmIDB4RkYpO1xuXHRyZXN1bHQgKz0gdXRpbC5iaW4yc3RyKGJhKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qIEVORCBvZiBhZGRpdGlvbiAqL1xuXG4vLyAocHJvdGVjdGVkKSB0cnVlIGlmIHByb2JhYmx5IHByaW1lIChIQUMgNC4yNCwgTWlsbGVyLVJhYmluKVxuZnVuY3Rpb24gYm5wTWlsbGVyUmFiaW4odCkge1xuICB2YXIgbjEgPSB0aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgdmFyIGsgPSBuMS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgaWYoayA8PSAwKSByZXR1cm4gZmFsc2U7XG4gIHZhciByID0gbjEuc2hpZnRSaWdodChrKTtcbiAgdCA9ICh0KzEpPj4xO1xuICBpZih0ID4gbG93cHJpbWVzLmxlbmd0aCkgdCA9IGxvd3ByaW1lcy5sZW5ndGg7XG4gIHZhciBhID0gbmJpKCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0OyArK2kpIHtcbiAgICAvL1BpY2sgYmFzZXMgYXQgcmFuZG9tLCBpbnN0ZWFkIG9mIHN0YXJ0aW5nIGF0IDJcbiAgICBhLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO1xuICAgIHZhciB5ID0gYS5tb2RQb3cocix0aGlzKTtcbiAgICBpZih5LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgIT0gMCAmJiB5LmNvbXBhcmVUbyhuMSkgIT0gMCkge1xuICAgICAgdmFyIGogPSAxO1xuICAgICAgd2hpbGUoaisrIDwgayAmJiB5LmNvbXBhcmVUbyhuMSkgIT0gMCkge1xuICAgICAgICB5ID0geS5tb2RQb3dJbnQoMix0aGlzKTtcbiAgICAgICAgaWYoeS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmKHkuY29tcGFyZVRvKG4xKSAhPSAwKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgQmlnSW50ZWdlciA9IHJlcXVpcmUoJy4vanNibi5qcycpO1xuXG4vLyBwcm90ZWN0ZWRcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNodW5rU2l6ZSA9IGJucENodW5rU2l6ZTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXggPSBibnBUb1JhZGl4O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVJhZGl4ID0gYm5wRnJvbVJhZGl4O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbU51bWJlciA9IGJucEZyb21OdW1iZXI7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG8gPSBibnBCaXR3aXNlVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5jaGFuZ2VCaXQgPSBibnBDaGFuZ2VCaXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGRUbyA9IGJucEFkZFRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5ID0gYm5wRE11bHRpcGx5O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldCA9IGJucERBZGRPZmZzZXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseUxvd2VyVG8gPSBibnBNdWx0aXBseUxvd2VyVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG8gPSBibnBNdWx0aXBseVVwcGVyVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnQgPSBibnBNb2RJbnQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5taWxsZXJSYWJpbiA9IGJucE1pbGxlclJhYmluO1xuXG4vLyBwdWJsaWNcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNsb25lID0gYm5DbG9uZTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlID0gYm5JbnRWYWx1ZTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZSA9IGJuQnl0ZVZhbHVlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc2hvcnRWYWx1ZSA9IGJuU2hvcnRWYWx1ZTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnNpZ251bSA9IGJuU2lnTnVtO1xuQmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBiblRvQnl0ZUFycmF5O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzID0gYm5FcXVhbHM7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5taW4gPSBibk1pbjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1heCA9IGJuTWF4O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYW5kID0gYm5BbmQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5vciA9IGJuT3I7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS54b3IgPSBiblhvcjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdCA9IGJuQW5kTm90O1xuQmlnSW50ZWdlci5wcm90b3R5cGUubm90ID0gYm5Ob3Q7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQgPSBiblNoaWZ0TGVmdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBiblNoaWZ0UmlnaHQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXRMb3dlc3RTZXRCaXQgPSBibkdldExvd2VzdFNldEJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50ID0gYm5CaXRDb3VudDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnRlc3RCaXQgPSBiblRlc3RCaXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zZXRCaXQgPSBiblNldEJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0ID0gYm5DbGVhckJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmZsaXBCaXQgPSBibkZsaXBCaXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGQgPSBibkFkZDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0ID0gYm5TdWJ0cmFjdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5ID0gYm5NdWx0aXBseTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZSA9IGJuRGl2aWRlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyID0gYm5SZW1haW5kZXI7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGVBbmRSZW1haW5kZXIgPSBibkRpdmlkZUFuZFJlbWFpbmRlcjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvdyA9IGJuTW9kUG93O1xuQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZSA9IGJuTW9kSW52ZXJzZTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnBvdyA9IGJuUG93O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZ2NkID0gYm5HQ0Q7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWUgPSBibklzUHJvYmFibGVQcmltZTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnRvTVBJID0gYm5Ub01QSTtcblxuLy8gSlNCTi1zcGVjaWZpYyBleHRlbnNpb25cbkJpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZSA9IGJuU3F1YXJlO1xuXG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG4vL1xuLy8gUlNBIGltcGxlbWVudGF0aW9uXG5cbnZhciBCaWdJbnRlZ2VyID0gcmVxdWlyZSgnLi9qc2JuLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyksXG5cdHJhbmRvbSA9IHJlcXVpcmUoJy4uL3JhbmRvbS5qcycpO1xuXG5mdW5jdGlvbiBTZWN1cmVSYW5kb20oKXtcbiAgICBmdW5jdGlvbiBuZXh0Qnl0ZXMoYnl0ZUFycmF5KXtcbiAgICAgICAgZm9yKHZhciBuID0gMDsgbiA8IGJ5dGVBcnJheS5sZW5ndGg7bisrKXtcbiAgICAgICAgICAgIGJ5dGVBcnJheVtuXSA9IHJhbmRvbS5nZXRTZWN1cmVSYW5kb21PY3RldCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMubmV4dEJ5dGVzID0gbmV4dEJ5dGVzO1xufVxuXG5mdW5jdGlvbiBSU0EoKSB7XG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHVzZXMganNibiBCaWcgTnVtIGxpYnJhcnkgdG8gZGVjcnlwdCBSU0Fcblx0ICogQHBhcmFtIG1cblx0ICogICAgICAgICAgICBtZXNzYWdlXG5cdCAqIEBwYXJhbSBkXG5cdCAqICAgICAgICAgICAgUlNBIGQgYXMgQmlnSW50ZWdlclxuXHQgKiBAcGFyYW0gcFxuXHQgKiAgICAgICAgICAgIFJTQSBwIGFzIEJpZ0ludGVnZXJcblx0ICogQHBhcmFtIHFcblx0ICogICAgICAgICAgICBSU0EgcSBhcyBCaWdJbnRlZ2VyXG5cdCAqIEBwYXJhbSB1XG5cdCAqICAgICAgICAgICAgUlNBIHUgYXMgQmlnSW50ZWdlclxuXHQgKiBAcmV0dXJuIHtCaWdJbnRlZ2VyfSBUaGUgZGVjcnlwdGVkIHZhbHVlIG9mIHRoZSBtZXNzYWdlXG5cdCAqL1xuXHRmdW5jdGlvbiBkZWNyeXB0KG0sIGQsIHAsIHEsIHUpIHtcblx0XHR2YXIgeHAgPSBtLm1vZChwKS5tb2RQb3coZC5tb2QocC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpLCBwKTtcblx0XHR2YXIgeHEgPSBtLm1vZChxKS5tb2RQb3coZC5tb2QocS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpLCBxKTtcblx0XHR1dGlsLnByaW50X2RlYnVnKFwicnNhLmpzIGRlY3J5cHRcXG54cG46XCIrdXRpbC5oZXhzdHJkdW1wKHhwLnRvTVBJKCkpK1wiXFxueHFuOlwiK3V0aWwuaGV4c3RyZHVtcCh4cS50b01QSSgpKSk7XG5cblx0XHR2YXIgdCA9IHhxLnN1YnRyYWN0KHhwKTtcblx0XHRpZiAodFswXSA9PSAwKSB7XG5cdFx0XHR0ID0geHAuc3VidHJhY3QoeHEpO1xuXHRcdFx0dCA9IHQubXVsdGlwbHkodSkubW9kKHEpO1xuXHRcdFx0dCA9IHEuc3VidHJhY3QodCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHQgPSB0Lm11bHRpcGx5KHUpLm1vZChxKTtcblx0XHR9XG5cdFx0cmV0dXJuIHQubXVsdGlwbHkocCkuYWRkKHhwKTtcblx0fVxuXHRcblx0LyoqXG5cdCAqIGVuY3J5cHQgbWVzc2FnZVxuXHQgKiBAcGFyYW0gbSBtZXNzYWdlIGFzIEJpZ0ludGVnZXJcblx0ICogQHBhcmFtIGUgcHVibGljIE1QSSBwYXJ0IGFzIEJpZ0ludGVnZXJcblx0ICogQHBhcmFtIG4gcHVibGljIE1QSSBwYXJ0IGFzIEJpZ0ludGVnZXJcblx0ICogQHJldHVybiBCaWdJbnRlZ2VyXG5cdCAqL1xuXHRmdW5jdGlvbiBlbmNyeXB0KG0sZSxuKSB7XG5cdFx0cmV0dXJuIG0ubW9kUG93SW50KGUsIG4pO1xuXHR9XG5cdFxuXHQvKiBTaWduIGFuZCBWZXJpZnkgKi9cblx0ZnVuY3Rpb24gc2lnbihtLGQsbikge1xuXHRcdHJldHVybiBtLm1vZFBvdyhkLCBuKTtcblx0fVxuXHRcdFxuXHRmdW5jdGlvbiB2ZXJpZnkoeCxlLG4pIHtcblx0XHRyZXR1cm4geC5tb2RQb3dJbnQoZSwgbik7XG5cdH1cblx0XG5cdC8vIFwiZW1wdHlcIiBSU0Ega2V5IGNvbnN0cnVjdG9yXG4gICAgZnVuY3Rpb24ga2V5T2JqZWN0KCkge1xuICAgICAgICB0aGlzLm4gPSBudWxsO1xuICAgICAgICB0aGlzLmUgPSAwO1xuICAgICAgICB0aGlzLmVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5kID0gbnVsbDtcbiAgICAgICAgdGhpcy5wID0gbnVsbDtcbiAgICAgICAgdGhpcy5xID0gbnVsbDtcbiAgICAgICAgdGhpcy5kbXAxID0gbnVsbDtcbiAgICAgICAgdGhpcy5kbXExID0gbnVsbDtcbiAgICAgICAgdGhpcy51ID0gbnVsbDtcbiAgICB9XG5cdFxuXHQvLyBHZW5lcmF0ZSBhIG5ldyByYW5kb20gcHJpdmF0ZSBrZXkgQiBiaXRzIGxvbmcsIHVzaW5nIHB1YmxpYyBleHB0IEVcbiAgICBmdW5jdGlvbiBnZW5lcmF0ZShCLEUpIHtcbiAgICAgICAgdmFyIGtleSA9IG5ldyBrZXlPYmplY3QoKTtcbiAgICAgICAgdmFyIHJuZyA9IG5ldyBTZWN1cmVSYW5kb20oKTtcbiAgICAgICAgdmFyIHFzID0gQj4+MTtcbiAgICAgICAga2V5LmUgPSBwYXJzZUludChFLDE2KTtcbiAgICAgICAga2V5LmVlID0gbmV3IEJpZ0ludGVnZXIoRSwxNik7XG4gICAgICAgIGZvcig7Oykge1xuICAgICAgICAgICAgZm9yKDs7KSB7XG4gICAgICAgICAgICAgICAga2V5LnAgPSBuZXcgQmlnSW50ZWdlcihCLXFzLDEscm5nKTtcbiAgICAgICAgICAgICAgICBpZihrZXkucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGtleS5lZSkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwICYmIGtleS5wLmlzUHJvYmFibGVQcmltZSgxMCkpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yKDs7KSB7XG4gICAgICAgICAgICAgICAga2V5LnEgPSBuZXcgQmlnSW50ZWdlcihxcywxLHJuZyk7XG4gICAgICAgICAgICAgICAgaWYoa2V5LnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChrZXkuZWUpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCAmJiBrZXkucS5pc1Byb2JhYmxlUHJpbWUoMTApKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGtleS5wLmNvbXBhcmVUbyhrZXkucSkgPD0gMCkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0ga2V5LnA7XG4gICAgICAgICAgICAgICAga2V5LnAgPSBrZXkucTtcbiAgICAgICAgICAgICAgICBrZXkucSA9IHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcDEgPSBrZXkucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgICAgICAgICB2YXIgcTEgPSBrZXkucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgICAgICAgICB2YXIgcGhpID0gcDEubXVsdGlwbHkocTEpO1xuICAgICAgICAgICAgaWYocGhpLmdjZChrZXkuZWUpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCkge1xuICAgICAgICAgICAgICAgIGtleS5uID0ga2V5LnAubXVsdGlwbHkoa2V5LnEpO1xuICAgICAgICAgICAgICAgIGtleS5kID0ga2V5LmVlLm1vZEludmVyc2UocGhpKTtcbiAgICAgICAgICAgICAgICBrZXkuZG1wMSA9IGtleS5kLm1vZChwMSk7XG4gICAgICAgICAgICAgICAga2V5LmRtcTEgPSBrZXkuZC5tb2QocTEpO1xuICAgICAgICAgICAgICAgIGtleS51ID0ga2V5LnAubW9kSW52ZXJzZShrZXkucSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cdFx0XG5cdHRoaXMuZW5jcnlwdCA9IGVuY3J5cHQ7XG5cdHRoaXMuZGVjcnlwdCA9IGRlY3J5cHQ7XG5cdHRoaXMudmVyaWZ5ID0gdmVyaWZ5O1xuXHR0aGlzLnNpZ24gPSBzaWduO1xuXHR0aGlzLmdlbmVyYXRlID0gZ2VuZXJhdGU7XG5cdHRoaXMua2V5T2JqZWN0ID0ga2V5T2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJTQTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBIFxuXG4vLyBUaGUgR1BHNEJyb3dzZXJzIGNyeXB0byBpbnRlcmZhY2VcblxudmFyIHR5cGVfbXBpID0gcmVxdWlyZSgnLi4vdHlwZS9tcGkuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSBzZWN1cmUgcmFuZG9tIGJ5dGUgc3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIExlbmd0aCBpbiBieXRlcyB0byBnZW5lcmF0ZVxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFJhbmRvbSBieXRlIHN0cmluZ1xuXHQgKi9cblx0Z2V0UmFuZG9tQnl0ZXM6IGZ1bmN0aW9uKGxlbmd0aCkge1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmdldFNlY3VyZVJhbmRvbU9jdGV0KCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBwc2V1ZG8tcmFuZG9tIG51bWJlciBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gZnJvbSBNaW4gb2YgdGhlIHJhbmRvbSBudW1iZXJcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSB0byBNYXggb2YgdGhlIHJhbmRvbSBudW1iZXIgKG1heCAzMmJpdClcblx0ICogQHJldHVybiB7SW50ZWdlcn0gQSBwc2V1ZG8gcmFuZG9tIG51bWJlclxuXHQgKi9cblx0Z2V0UHNldWRvUmFuZG9tOiBmdW5jdGlvbihmcm9tLCB0bykge1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqKHRvLWZyb20pKStmcm9tO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm4gYSBzZWN1cmUgcmFuZG9tIG51bWJlciBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gZnJvbSBNaW4gb2YgdGhlIHJhbmRvbSBudW1iZXJcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSB0byBNYXggb2YgdGhlIHJhbmRvbSBudW1iZXIgKG1heCAzMmJpdClcblx0ICogQHJldHVybiB7SW50ZWdlcn0gQSBzZWN1cmUgcmFuZG9tIG51bWJlclxuXHQgKi9cblx0Z2V0U2VjdXJlUmFuZG9tOiBmdW5jdGlvbihmcm9tLCB0bykge1xuXHRcdHZhciBidWYgPSBuZXcgVWludDMyQXJyYXkoMSk7XG5cdFx0d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnVmKTtcblx0XHR2YXIgYml0cyA9ICgodG8tZnJvbSkpLnRvU3RyaW5nKDIpLmxlbmd0aDtcblx0XHR3aGlsZSAoKGJ1ZlswXSAmIChNYXRoLnBvdygyLCBiaXRzKSAtMSkpID4gKHRvLWZyb20pKVxuXHRcdFx0d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnVmKTtcblx0XHRyZXR1cm4gZnJvbSsoTWF0aC5hYnMoYnVmWzBdICYgKE1hdGgucG93KDIsIGJpdHMpIC0xKSkpO1xuXHR9LFxuXG5cdGdldFNlY3VyZVJhbmRvbU9jdGV0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgYnVmID0gbmV3IFVpbnQzMkFycmF5KDEpO1xuXHRcdHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7XG5cdFx0cmV0dXJuIGJ1ZlswXSAmIDB4RkY7XG5cdH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNlY3VyZSByYW5kb20gYmlnIGludGVnZXIgb2YgYml0cyBsZW5ndGhcbiAgICogQHBhcmFtIHtJbnRlZ2VyfSBiaXRzIEJpdCBsZW5ndGggb2YgdGhlIE1QSSB0byBjcmVhdGVcbiAgICogQHJldHVybiB7QmlnSW50ZWdlcn0gUmVzdWx0aW5nIGJpZyBpbnRlZ2VyXG4gICAqL1xuICBnZXRSYW5kb21CaWdJbnRlZ2VyOiBmdW5jdGlvbihiaXRzKSB7XG4gICAgaWYgKGJpdHMgPCAwKSB7XG4gICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBudW1CeXRlcyA9IE1hdGguZmxvb3IoKGJpdHMrNykvOCk7XG5cbiAgICB2YXIgcmFuZG9tQml0cyA9IHRoaXMuZ2V0UmFuZG9tQnl0ZXMobnVtQnl0ZXMpO1xuICAgIGlmIChiaXRzICUgOCA+IDApIHtcbiAgICAgIFxuICAgICAgcmFuZG9tQml0cyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAgIChNYXRoLnBvdygyLGJpdHMgJSA4KS0xKSAmXG4gICAgICAgICAgICAgIHJhbmRvbUJpdHMuY2hhckNvZGVBdCgwKSkgK1xuICAgICAgICByYW5kb21CaXRzLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgdmFyIG1waSA9IG5ldyB0eXBlX21waSgpO1xuICAgIG1waS5mcm9tQnl0ZXMocmFuZG9tQml0cyk7XG4gICAgcmV0dXJuIG1waS50b0JpZ0ludGVnZXIoKTtcbiAgfSxcblxuICBnZXRSYW5kb21CaWdJbnRlZ2VySW5SYW5nZTogZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICBpZiAobWF4LmNvbXBhcmVUbyhtaW4pIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSBtYXguc3VidHJhY3QobWluKTtcbiAgICB2YXIgciA9IHRoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlcihyYW5nZS5iaXRMZW5ndGgoKSk7XG4gICAgd2hpbGUgKHIgPiByYW5nZSkge1xuICAgICAgciA9IHRoaXMuZ2V0UmFuZG9tQmlnSW50ZWdlcihyYW5nZS5iaXRMZW5ndGgoKSk7XG4gICAgfVxuICAgIHJldHVybiBtaW4uYWRkKHIpO1xuICB9XG5cbn07XG4iLCJcbnZhciBwdWJsaWNLZXkgPSByZXF1aXJlKCcuL3B1YmxpY19rZXknKSxcblx0cGtjczEgPSByZXF1aXJlKCcuL3BrY3MxLmpzJyksXG5cdGhhc2hNb2R1bGUgPSByZXF1aXJlKCcuL2hhc2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdC8qKlxuXHQgKiBcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBhbGdvIHB1YmxpYyBLZXkgYWxnb3JpdGhtXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gaGFzaF9hbGdvIEhhc2ggYWxnb3JpdGhtXG5cdCAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waVtdfSBtc2dfTVBJcyBTaWduYXR1cmUgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnNcblx0ICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpW119IHB1YmxpY2tleV9NUElzIFB1YmxpYyBrZXkgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIERhdGEgb24gd2hlcmUgdGhlIHNpZ25hdHVyZSB3YXMgY29tcHV0ZWQgb24uXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgc2lnbmF0dXJlIChzaWdfZGF0YSB3YXMgZXF1YWwgdG8gZGF0YSBvdmVyIGhhc2gpXG5cdCAqL1xuXHR2ZXJpZnk6IGZ1bmN0aW9uKGFsZ28sIGhhc2hfYWxnbywgbXNnX01QSXMsIHB1YmxpY2tleV9NUElzLCBkYXRhKSB7XG5cdFx0dmFyIGNhbGNfaGFzaCA9IGhhc2hNb2R1bGUuZGlnZXN0KGhhc2hfYWxnbywgZGF0YSk7XG5cblx0XHRzd2l0Y2goYWxnbykge1xuXHRcdGNhc2UgMTogLy8gUlNBIChFbmNyeXB0IG9yIFNpZ24pIFtIQUNdICBcblx0XHRjYXNlIDI6IC8vIFJTQSBFbmNyeXB0LU9ubHkgW0hBQ11cblx0XHRjYXNlIDM6IC8vIFJTQSBTaWduLU9ubHkgW0hBQ11cblx0XHRcdHZhciByc2EgPSBuZXcgcHVibGljS2V5LnJzYSgpO1xuXHRcdFx0dmFyIG4gPSBwdWJsaWNrZXlfTVBJc1swXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBlID0gcHVibGlja2V5X01QSXNbMV0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgeCA9IG1zZ19NUElzWzBdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIGRvcHVibGljID0gcnNhLnZlcmlmeSh4LGUsbik7XG5cdFx0XHR2YXIgaGFzaCAgPSBwa2NzMS5lbXNhLmRlY29kZShoYXNoX2FsZ28sZG9wdWJsaWMudG9NUEkoKS5zdWJzdHJpbmcoMikpO1xuXHRcdFx0aWYgKGhhc2ggPT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQS0NTMSBwYWRkaW5nIGluIG1lc3NhZ2Ugb3Iga2V5IGluY29ycmVjdC4gQWJvcnRpbmcuLi4nKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBoYXNoID09IGNhbGNfaGFzaDtcblx0XHRcdFxuXHRcdGNhc2UgMTY6IC8vIEVsZ2FtYWwgKEVuY3J5cHQtT25seSkgW0VMR0FNQUxdIFtIQUNdXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzaWduaW5nIHdpdGggRWxnYW1hbCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgT3BlblBHUCBzdGFuZGFyZC5cIik7XG5cdFx0Y2FzZSAxNzogLy8gRFNBIChEaWdpdGFsIFNpZ25hdHVyZSBBbGdvcml0aG0pIFtGSVBTMTg2XSBbSEFDXVxuXHRcdFx0dmFyIGRzYSA9IG5ldyBwdWJsaWNLZXkuZHNhKCk7XG5cdFx0XHR2YXIgczEgPSBtc2dfTVBJc1swXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBzMiA9IG1zZ19NUElzWzFdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIHAgPSBwdWJsaWNrZXlfTVBJc1swXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBxID0gcHVibGlja2V5X01QSXNbMV0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgZyA9IHB1YmxpY2tleV9NUElzWzJdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIHkgPSBwdWJsaWNrZXlfTVBJc1szXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBtID0gZGF0YTtcblx0XHRcdHZhciBkb3B1YmxpYyA9IGRzYS52ZXJpZnkoaGFzaF9hbGdvLHMxLHMyLG0scCxxLGcseSk7XG5cdFx0XHRyZXR1cm4gZG9wdWJsaWMuY29tcGFyZVRvKHMxKSA9PSAwO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlIGFsZ29yaXRobS4nKTtcblx0XHR9XG5cdFx0XG5cdH0sXG5cdCAgIFxuXHQvKipcblx0ICogQ3JlYXRlIGEgc2lnbmF0dXJlIG9uIGRhdGEgdXNpbmcgdGhlIHNwZWNpZmllZCBhbGdvcml0aG1cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBoYXNoX2FsZ28gaGFzaCBBbGdvcml0aG0gdG8gdXNlIChTZWUgUkZDNDg4MCA5LjQpXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gYWxnbyBBc3ltbWV0cmljIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlIChTZWUgUkZDNDg4MCA5LjEpXG5cdCAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waVtdfSBwdWJsaWNNUElzIFB1YmxpYyBrZXkgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgXG5cdCAqIG9mIHRoZSBwcml2YXRlIGtleSBcblx0ICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpW119IHNlY3JldE1QSXMgUHJpdmF0ZSBrZXkgbXVsdGlwcmVjaXNpb24gXG5cdCAqIGludGVnZXJzIHdoaWNoIGlzIHVzZWQgdG8gc2lnbiB0aGUgZGF0YVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGJlIHNpZ25lZFxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX3R5cGVfbXBpW119XG5cdCAqL1xuXHRzaWduOiBmdW5jdGlvbihoYXNoX2FsZ28sIGFsZ28sIGtleUludGVnZXJzLCBkYXRhKSB7XG5cdFx0XG5cdFx0c3dpdGNoKGFsZ28pIHtcblx0XHRjYXNlIDE6IC8vIFJTQSAoRW5jcnlwdCBvciBTaWduKSBbSEFDXSAgXG5cdFx0Y2FzZSAyOiAvLyBSU0EgRW5jcnlwdC1Pbmx5IFtIQUNdXG5cdFx0Y2FzZSAzOiAvLyBSU0EgU2lnbi1Pbmx5IFtIQUNdXG5cdFx0XHR2YXIgcnNhID0gbmV3IHB1YmxpY0tleS5yc2EoKTtcblx0XHRcdHZhciBkID0ga2V5SW50ZWdlcnNbMl0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgbiA9IGtleUludGVnZXJzWzBdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIG0gPSBwa2NzMS5lbXNhLmVuY29kZShoYXNoX2FsZ28sIFxuXHRcdFx0XHRkYXRhLCBrZXlJbnRlZ2Vyc1swXS5ieXRlTGVuZ3RoKCkpO1xuXG5cdFx0XHRyZXR1cm4gcnNhLnNpZ24obSwgZCwgbikudG9NUEkoKTtcblxuXHRcdGNhc2UgMTc6IC8vIERTQSAoRGlnaXRhbCBTaWduYXR1cmUgQWxnb3JpdGhtKSBbRklQUzE4Nl0gW0hBQ11cblx0XHRcdHZhciBkc2EgPSBuZXcgcHVibGljS2V5LmRzYSgpO1xuXG5cdFx0XHR2YXIgcCA9IGtleUludGVnZXJzWzBdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIHEgPSBrZXlJbnRlZ2Vyc1sxXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBnID0ga2V5SW50ZWdlcnNbMl0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgeSA9IGtleUludGVnZXJzWzNdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIHggPSBrZXlJbnRlZ2Vyc1s0XS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBtID0gZGF0YTtcblx0XHRcdHZhciByZXN1bHQgPSBkc2Euc2lnbihoYXNoX2FsZ28sbSwgZywgcCwgcSwgeCk7XG5cblx0XHRcdHJldHVybiByZXN1bHRbMF0udG9TdHJpbmcoKSArIHJlc3VsdFsxXS50b1N0cmluZygpO1xuXHRcdGNhc2UgMTY6IC8vIEVsZ2FtYWwgKEVuY3J5cHQtT25seSkgW0VMR0FNQUxdIFtIQUNdXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1NpZ25pbmcgd2l0aCBFbGdhbWFsIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBPcGVuUEdQIHN0YW5kYXJkLicpO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlIGFsZ29yaXRobS4nKTtcblx0XHR9XHRcblx0fVxufVxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vL1xuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0LmpzJyk7XG5cblxuXG4vKipcbiAqIEZpbmRzIG91dCB3aGljaCBBc2NpaSBBcm1vcmluZyB0eXBlIGlzIHVzZWQuIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFtTdHJpbmddIGFzY2lpIGFybW9yZWQgdGV4dFxuICogQHJldHVybnMge0ludGVnZXJ9IDAgPSBNRVNTQUdFIFBBUlQgbiBvZiBtXG4gKiAgICAgICAgIDEgPSBNRVNTQUdFIFBBUlQgblxuICogICAgICAgICAyID0gU0lHTkVEIE1FU1NBR0VcbiAqICAgICAgICAgMyA9IFBHUCBNRVNTQUdFXG4gKiAgICAgICAgIDQgPSBQVUJMSUMgS0VZIEJMT0NLXG4gKiAgICAgICAgIDUgPSBQUklWQVRFIEtFWSBCTE9DS1xuICogICAgICAgICBudWxsID0gdW5rbm93blxuICovXG5mdW5jdGlvbiBnZXRfdHlwZSh0ZXh0KSB7XG5cdHZhciBzcGxpdHRlZHRleHQgPSB0ZXh0LnNwbGl0KCctLS0tLScpO1xuXHQvLyBCRUdJTiBQR1AgTUVTU0FHRSwgUEFSVCBYL1lcblx0Ly8gVXNlZCBmb3IgbXVsdGktcGFydCBtZXNzYWdlcywgd2hlcmUgdGhlIGFybW9yIGlzIHNwbGl0IGFtb25nc3QgWVxuXHQvLyBwYXJ0cywgYW5kIHRoaXMgaXMgdGhlIFh0aCBwYXJ0IG91dCBvZiBZLlxuXHRpZiAoc3BsaXR0ZWR0ZXh0WzFdLm1hdGNoKC9CRUdJTiBQR1AgTUVTU0FHRSwgUEFSVCBcXGQrXFwvXFxkKy8pKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH0gZWxzZVxuXHRcdC8vIEJFR0lOIFBHUCBNRVNTQUdFLCBQQVJUIFhcblx0XHQvLyBVc2VkIGZvciBtdWx0aS1wYXJ0IG1lc3NhZ2VzLCB3aGVyZSB0aGlzIGlzIHRoZSBYdGggcGFydCBvZiBhblxuXHRcdC8vIHVuc3BlY2lmaWVkIG51bWJlciBvZiBwYXJ0cy4gUmVxdWlyZXMgdGhlIE1FU1NBR0UtSUQgQXJtb3Jcblx0XHQvLyBIZWFkZXIgdG8gYmUgdXNlZC5cblx0aWYgKHNwbGl0dGVkdGV4dFsxXS5tYXRjaCgvQkVHSU4gUEdQIE1FU1NBR0UsIFBBUlQgXFxkKy8pKSB7XG5cdFx0cmV0dXJuIDE7XG5cblx0fSBlbHNlXG5cdFx0Ly8gQkVHSU4gUEdQIFNJR05BVFVSRVxuXHRcdC8vIFVzZWQgZm9yIGRldGFjaGVkIHNpZ25hdHVyZXMsIE9wZW5QR1AvTUlNRSBzaWduYXR1cmVzLCBhbmRcblx0XHQvLyBjbGVhcnRleHQgc2lnbmF0dXJlcy4gTm90ZSB0aGF0IFBHUCAyLnggdXNlcyBCRUdJTiBQR1AgTUVTU0FHRVxuXHRcdC8vIGZvciBkZXRhY2hlZCBzaWduYXR1cmVzLlxuXHRpZiAoc3BsaXR0ZWR0ZXh0WzFdLm1hdGNoKC9CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UvKSkge1xuXHRcdHJldHVybiAyO1xuXG5cdH0gZWxzZVxuICBcdCAgICAvLyBCRUdJTiBQR1AgTUVTU0FHRVxuXHQgICAgLy8gVXNlZCBmb3Igc2lnbmVkLCBlbmNyeXB0ZWQsIG9yIGNvbXByZXNzZWQgZmlsZXMuXG5cdGlmIChzcGxpdHRlZHRleHRbMV0ubWF0Y2goL0JFR0lOIFBHUCBNRVNTQUdFLykpIHtcblx0XHRyZXR1cm4gMztcblxuXHR9IGVsc2Vcblx0XHQvLyBCRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DS1xuXHRcdC8vIFVzZWQgZm9yIGFybW9yaW5nIHB1YmxpYyBrZXlzLlxuXHRpZiAoc3BsaXR0ZWR0ZXh0WzFdLm1hdGNoKC9CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy8pKSB7XG5cdFx0cmV0dXJuIDQ7XG5cblx0fSBlbHNlXG5cdFx0Ly8gQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLXG5cdFx0Ly8gVXNlZCBmb3IgYXJtb3JpbmcgcHJpdmF0ZSBrZXlzLlxuXHRpZiAoc3BsaXR0ZWR0ZXh0WzFdLm1hdGNoKC9CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0svKSkge1xuXHRcdHJldHVybiA1O1xuXHR9XG59XG5cbi8qKlxuICogQWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIGFybW9yIHZlcnNpb24gb2YgYW4gT3BlblBHUCBiaW5hcnlcbiAqIHBhY2tldCBibG9jay5cbiAqIEBhdXRob3IgIEFsZXhcbiAqIEB2ZXJzaW9uIDIwMTEtMTItMTZcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBoZWFkZXIgaW5mb3JtYXRpb25cbiAqL1xuZnVuY3Rpb24gYXJtb3JfYWRkaGVhZGVyKCkge1xuICAgIHZhciByZXN1bHQgPSBcIlwiO1xuXHRpZiAob3BlbnBncC5jb25maWcuY29uZmlnLnNob3dfdmVyc2lvbikge1xuICAgICAgICByZXN1bHQgKz0gXCJWZXJzaW9uOiBcIitvcGVucGdwLmNvbmZpZy52ZXJzaW9uc3RyaW5nKydcXHJcXG4nO1xuICAgIH1cblx0aWYgKG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5zaG93X2NvbW1lbnQpIHtcbiAgICAgICAgcmVzdWx0ICs9IFwiQ29tbWVudDogXCIrb3BlbnBncC5jb25maWcuY29tbWVudHN0cmluZysnXFxyXFxuJztcbiAgICB9XG4gICAgcmVzdWx0ICs9ICdcXHJcXG4nO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cblxuXG4vKipcbiAqIENhbGN1bGF0ZXMgYSBjaGVja3N1bSBvdmVyIHRoZSBnaXZlbiBkYXRhIGFuZCByZXR1cm5zIGl0IGJhc2U2NCBlbmNvZGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGNyZWF0ZSBhIENSQy0yNCBjaGVja3N1bSBmb3JcbiAqIEByZXR1cm4ge1N0cmluZ30gQmFzZTY0IGVuY29kZWQgY2hlY2tzdW1cbiAqL1xuZnVuY3Rpb24gZ2V0Q2hlY2tTdW0oZGF0YSkge1xuXHR2YXIgYyA9IGNyZWF0ZWNyYzI0KGRhdGEpO1xuXHR2YXIgc3RyID0gXCJcIiArIFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+PiAxNikrXG5cdFx0XHRcdCAgIFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gOCkgJiAweEZGKStcblx0XHRcdFx0ICAgU3RyaW5nLmZyb21DaGFyQ29kZShjICYgMHhGRik7XG5cdHJldHVybiBiYXNlNjQuZW5jb2RlKHN0cik7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY2hlY2tzdW0gb3ZlciB0aGUgZ2l2ZW4gZGF0YSBhbmQgY29tcGFyZXMgaXQgd2l0aCB0aGUgXG4gKiBnaXZlbiBiYXNlNjQgZW5jb2RlZCBjaGVja3N1bVxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgRGF0YSB0byBjcmVhdGUgYSBDUkMtMjQgY2hlY2tzdW0gZm9yXG4gKiBAcGFyYW0ge1N0cmluZ30gY2hlY2tzdW0gQmFzZTY0IGVuY29kZWQgY2hlY2tzdW1cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIGNoZWNrc3VtIGlzIGNvcnJlY3Q7IG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiB2ZXJpZnlDaGVja1N1bShkYXRhLCBjaGVja3N1bSkge1xuXHR2YXIgYyA9IGdldENoZWNrU3VtKGRhdGEpO1xuXHR2YXIgZCA9IGNoZWNrc3VtO1xuXHRyZXR1cm4gY1swXSA9PSBkWzBdICYmIGNbMV0gPT0gZFsxXSAmJiBjWzJdID09IGRbMl07XG59XG4vKipcbiAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhIENSQy0yNCBjaGVja3N1bSBvdmVyIGEgZ2l2ZW4gc3RyaW5nIChkYXRhKVxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgRGF0YSB0byBjcmVhdGUgYSBDUkMtMjQgY2hlY2tzdW0gZm9yXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgQ1JDLTI0IGNoZWNrc3VtIGFzIG51bWJlclxuICovXG52YXIgY3JjX3RhYmxlID0gW1xuMHgwMDAwMDAwMCwgMHgwMDg2NGNmYiwgMHgwMThhZDUwZCwgMHgwMTBjOTlmNiwgMHgwMzkzZTZlMSwgMHgwMzE1YWExYSwgMHgwMjE5MzNlYywgMHgwMjlmN2YxNywgMHgwN2ExODEzOSwgMHgwNzI3Y2RjMiwgMHgwNjJiNTQzNCwgMHgwNmFkMThjZiwgMHgwNDMyNjdkOCwgMHgwNGI0MmIyMywgMHgwNWI4YjJkNSwgMHgwNTNlZmUyZSwgMHgwZmM1NGU4OSwgMHgwZjQzMDI3MiwgMHgwZTRmOWI4NCwgMHgwZWM5ZDc3ZiwgMHgwYzU2YTg2OCwgMHgwY2QwZTQ5MywgMHgwZGRjN2Q2NSwgMHgwZDVhMzE5ZSwgMHgwODY0Y2ZiMCwgMHgwOGUyODM0YiwgMHgwOWVlMWFiZCwgMHgwOTY4NTY0NiwgMHgwYmY3Mjk1MSwgMHgwYjcxNjVhYSwgMHgwYTdkZmM1YywgMHgwYWZiYjBhNywgMHgxZjBjZDFlOSwgMHgxZjhhOWQxMiwgMHgxZTg2MDRlNCwgMHgxZTAwNDgxZiwgMHgxYzlmMzcwOCwgMHgxYzE5N2JmMywgMHgxZDE1ZTIwNSwgMHgxZDkzYWVmZSwgMHgxOGFkNTBkMCwgMHgxODJiMWMyYiwgMHgxOTI3ODVkZCwgMHgxOWExYzkyNiwgMHgxYjNlYjYzMSwgMHgxYmI4ZmFjYSwgMHgxYWI0NjMzYywgMHgxYTMyMmZjNywgMHgxMGM5OWY2MCwgMHgxMDRmZDM5YiwgMHgxMTQzNGE2ZCwgMHgxMWM1MDY5NiwgMHgxMzVhNzk4MSwgMHgxM2RjMzU3YSwgMHgxMmQwYWM4YywgMHgxMjU2ZTA3NywgMHgxNzY4MWU1OSwgMHgxN2VlNTJhMiwgMHgxNmUyY2I1NCwgMHgxNjY0ODdhZiwgMHgxNGZiZjhiOCwgMHgxNDdkYjQ0MywgMHgxNTcxMmRiNSwgMHgxNWY3NjE0ZSwgMHgzZTE5YTNkMiwgMHgzZTlmZWYyOSwgMHgzZjkzNzZkZiwgMHgzZjE1M2EyNCwgMHgzZDhhNDUzMywgMHgzZDBjMDljOCwgMHgzYzAwOTAzZSwgMHgzYzg2ZGNjNSwgMHgzOWI4MjJlYiwgMHgzOTNlNmUxMCwgMHgzODMyZjdlNiwgMHgzOGI0YmIxZCwgMHgzYTJiYzQwYSwgMHgzYWFkODhmMSwgMHgzYmExMTEwNywgMHgzYjI3NWRmYywgMHgzMWRjZWQ1YiwgMHgzMTVhYTFhMCxcbjB4MzA1NjM4NTYsIDB4MzBkMDc0YWQsIDB4MzI0ZjBiYmEsIDB4MzJjOTQ3NDEsIDB4MzNjNWRlYjcsIDB4MzM0MzkyNGMsIDB4MzY3ZDZjNjIsIDB4MzZmYjIwOTksIDB4MzdmN2I5NmYsIDB4Mzc3MWY1OTQsIDB4MzVlZThhODMsIDB4MzU2OGM2NzgsIDB4MzQ2NDVmOGUsIDB4MzRlMjEzNzUsIDB4MjExNTcyM2IsIDB4MjE5MzNlYzAsIDB4MjA5ZmE3MzYsIDB4MjAxOWViY2QsIDB4MjI4Njk0ZGEsIDB4MjIwMGQ4MjEsIDB4MjMwYzQxZDcsIDB4MjM4YTBkMmMsIDB4MjZiNGYzMDIsIDB4MjYzMmJmZjksIDB4MjczZTI2MGYsIDB4MjdiODZhZjQsIDB4MjUyNzE1ZTMsIDB4MjVhMTU5MTgsIDB4MjRhZGMwZWUsIDB4MjQyYjhjMTUsIDB4MmVkMDNjYjIsIDB4MmU1NjcwNDksIDB4MmY1YWU5YmYsIDB4MmZkY2E1NDQsIDB4MmQ0M2RhNTMsIDB4MmRjNTk2YTgsIDB4MmNjOTBmNWUsIDB4MmM0ZjQzYTUsIDB4Mjk3MWJkOGIsIDB4MjlmN2YxNzAsIDB4MjhmYjY4ODYsIDB4Mjg3ZDI0N2QsIDB4MmFlMjViNmEsIDB4MmE2NDE3OTEsIDB4MmI2ODhlNjcsIDB4MmJlZWMyOWMsIDB4N2MzMzQ3YTQsIDB4N2NiNTBiNWYsIDB4N2RiOTkyYTksIDB4N2QzZmRlNTIsIDB4N2ZhMGExNDUsIDB4N2YyNmVkYmUsIDB4N2UyYTc0NDgsIDB4N2VhYzM4YjMsIDB4N2I5MmM2OWQsIDB4N2IxNDhhNjYsIDB4N2ExODEzOTAsIDB4N2E5ZTVmNmIsIDB4NzgwMTIwN2MsIDB4Nzg4NzZjODcsIDB4Nzk4YmY1NzEsIDB4NzkwZGI5OGEsIDB4NzNmNjA5MmQsIDB4NzM3MDQ1ZDYsIDB4NzI3Y2RjMjAsIDB4NzJmYTkwZGIsIDB4NzA2NWVmY2MsIDB4NzBlM2EzMzcsIDB4NzFlZjNhYzEsIDB4NzE2OTc2M2EsIDB4NzQ1Nzg4MTQsIDB4NzRkMWM0ZWYsIDB4NzVkZDVkMTksIDB4NzU1YjExZTIsIDB4NzdjNDZlZjUsIDB4Nzc0MjIyMGUsIDB4NzY0ZWJiZjgsIDB4NzZjOGY3MDMsIDB4NjMzZjk2NGQsIDB4NjNiOWRhYjYsIDB4NjJiNTQzNDAsIDB4NjIzMzBmYmIsXG4weDYwYWM3MGFjLCAweDYwMmEzYzU3LCAweDYxMjZhNWExLCAweDYxYTBlOTVhLCAweDY0OWUxNzc0LCAweDY0MTg1YjhmLCAweDY1MTRjMjc5LCAweDY1OTI4ZTgyLCAweDY3MGRmMTk1LCAweDY3OGJiZDZlLCAweDY2ODcyNDk4LCAweDY2MDE2ODYzLCAweDZjZmFkOGM0LCAweDZjN2M5NDNmLCAweDZkNzAwZGM5LCAweDZkZjY0MTMyLCAweDZmNjkzZTI1LCAweDZmZWY3MmRlLCAweDZlZTNlYjI4LCAweDZlNjVhN2QzLCAweDZiNWI1OWZkLCAweDZiZGQxNTA2LCAweDZhZDE4Y2YwLCAweDZhNTdjMDBiLCAweDY4YzhiZjFjLCAweDY4NGVmM2U3LCAweDY5NDI2YTExLCAweDY5YzQyNmVhLCAweDQyMmFlNDc2LCAweDQyYWNhODhkLCAweDQzYTAzMTdiLCAweDQzMjY3ZDgwLCAweDQxYjkwMjk3LCAweDQxM2Y0ZTZjLCAweDQwMzNkNzlhLCAweDQwYjU5YjYxLCAweDQ1OGI2NTRmLCAweDQ1MGQyOWI0LCAweDQ0MDFiMDQyLCAweDQ0ODdmY2I5LCAweDQ2MTg4M2FlLCAweDQ2OWVjZjU1LCAweDQ3OTI1NmEzLCAweDQ3MTQxYTU4LCAweDRkZWZhYWZmLCAweDRkNjllNjA0LCAweDRjNjU3ZmYyLCAweDRjZTMzMzA5LCAweDRlN2M0YzFlLCAweDRlZmEwMGU1LCAweDRmZjY5OTEzLCAweDRmNzBkNWU4LCAweDRhNGUyYmM2LCAweDRhYzg2NzNkLCAweDRiYzRmZWNiLCAweDRiNDJiMjMwLCAweDQ5ZGRjZDI3LCAweDQ5NWI4MWRjLCAweDQ4NTcxODJhLCAweDQ4ZDE1NGQxLCAweDVkMjYzNTlmLCAweDVkYTA3OTY0LCAweDVjYWNlMDkyLCAweDVjMmFhYzY5LCAweDVlYjVkMzdlLCAweDVlMzM5Zjg1LCAweDVmM2YwNjczLCAweDVmYjk0YTg4LCAweDVhODdiNGE2LCAweDVhMDFmODVkLCAweDViMGQ2MWFiLCAweDViOGIyZDUwLCAweDU5MTQ1MjQ3LCAweDU5OTIxZWJjLCAweDU4OWU4NzRhLCAweDU4MThjYmIxLCAweDUyZTM3YjE2LCAweDUyNjUzN2VkLCAweDUzNjlhZTFiLCAweDUzZWZlMmUwLCAweDUxNzA5ZGY3LCAweDUxZjZkMTBjLFxuMHg1MGZhNDhmYSwgMHg1MDdjMDQwMSwgMHg1NTQyZmEyZiwgMHg1NWM0YjZkNCwgMHg1NGM4MmYyMiwgMHg1NDRlNjNkOSwgMHg1NmQxMWNjZSwgMHg1NjU3NTAzNSwgMHg1NzViYzljMywgMHg1N2RkODUzOF07XG5cbmZ1bmN0aW9uIGNyZWF0ZWNyYzI0KGlucHV0KSB7XG4gIHZhciBjcmMgPSAweEI3MDRDRTtcbiAgdmFyIGluZGV4ID0gMDtcblxuICB3aGlsZSgoaW5wdXQubGVuZ3RoIC0gaW5kZXgpID4gMTYpICB7XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzEpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzIpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzMpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzQpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzUpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzYpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzcpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzgpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzkpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzEwKSkgJiAweGZmXTtcbiAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmNfdGFibGVbKChjcmMgPj4gMTYpIF4gaW5wdXQuY2hhckNvZGVBdChpbmRleCsxMSkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrMTIpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzEzKSkgJiAweGZmXTtcbiAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmNfdGFibGVbKChjcmMgPj4gMTYpIF4gaW5wdXQuY2hhckNvZGVBdChpbmRleCsxNCkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrMTUpKSAmIDB4ZmZdO1xuICAgaW5kZXggKz0gMTY7XG4gIH1cblxuICBmb3IodmFyIGogPSBpbmRleDsgaiA8IGlucHV0Lmxlbmd0aDsgaisrKSB7XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpICYgMHhmZl1cbiAgfVxuICByZXR1cm4gY3JjICYgMHhmZmZmZmY7XG59XG5cbi8qKlxuICogRGVBcm1vciBhbiBPcGVuUEdQIGFybW9yZWQgbWVzc2FnZTsgdmVyaWZ5IHRoZSBjaGVja3N1bSBhbmQgcmV0dXJuIFxuICogdGhlIGVuY29kZWQgYnl0ZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IE9wZW5QR1AgYXJtb3JlZCBtZXNzYWdlXG4gKiBAcmV0dXJucyB7KEJvb2xlYW58T2JqZWN0KX0gRWl0aGVyIGZhbHNlIGluIGNhc2Ugb2YgYW4gZXJyb3IgXG4gKiBvciBhbiBvYmplY3Qgd2l0aCBhdHRyaWJ1dGUgXCJ0ZXh0XCIgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0ZXh0XG4gKiBhbmQgYW4gYXR0cmlidXRlIFwib3BlbnBncFwiIGNvbnRhaW5pbmcgdGhlIGJ5dGVzLlxuICovXG5mdW5jdGlvbiBkZWFybW9yKHRleHQpIHtcblx0dGV4dCA9IHRleHQucmVwbGFjZSgvXFxyL2csICcnKVxuXG5cdHZhciB0eXBlID0gZ2V0X3R5cGUodGV4dCk7XG5cblx0aWYgKHR5cGUgIT0gMikge1xuXHRcdHZhciBzcGxpdHRlZHRleHQgPSB0ZXh0LnNwbGl0KCctLS0tLScpO1xuXG5cdFx0dmFyIGRhdGEgPSB7IFxuXHRcdFx0b3BlbnBncDogYmFzZTY0LmRlY29kZShcblx0XHRcdFx0c3BsaXR0ZWR0ZXh0WzJdXG5cdFx0XHRcdFx0LnNwbGl0KCdcXG5cXG4nKVsxXVxuXHRcdFx0XHRcdC5zcGxpdChcIlxcbj1cIilbMF1cblx0XHRcdFx0XHQucmVwbGFjZSgvXFxuLSAvZyxcIlxcblwiKSksXG5cdFx0XHR0eXBlOiB0eXBlXG5cdFx0fTtcblxuXHRcdGlmICh2ZXJpZnlDaGVja1N1bShkYXRhLm9wZW5wZ3AsIFxuXHRcdFx0c3BsaXR0ZWR0ZXh0WzJdXG5cdFx0XHRcdC5zcGxpdCgnXFxuXFxuJylbMV1cblx0XHRcdFx0LnNwbGl0KFwiXFxuPVwiKVsxXVxuXHRcdFx0XHQuc3BsaXQoJ1xcbicpWzBdKSlcblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0ZWxzZSB7XG5cdFx0XHR1dGlsLnByaW50X2Vycm9yKFwiQXNjaWkgYXJtb3IgaW50ZWdyaXR5IGNoZWNrIG9uIG1lc3NhZ2UgZmFpbGVkOiAnXCJcblx0XHRcdFx0KyBzcGxpdHRlZHRleHRbMl1cblx0XHRcdFx0XHQuc3BsaXQoJ1xcblxcbicpWzFdXG5cdFx0XHRcdFx0LnNwbGl0KFwiXFxuPVwiKVsxXVxuXHRcdFx0XHRcdC5zcGxpdCgnXFxuJylbMF0gXG5cdFx0XHRcdCsgXCInIHNob3VsZCBiZSAnXCJcblx0XHRcdFx0KyBnZXRDaGVja1N1bShkYXRhKSkgKyBcIidcIjtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dmFyIHNwbGl0dGVkdGV4dCA9IHRleHQuc3BsaXQoJy0tLS0tJyk7XG5cblx0XHR2YXIgcmVzdWx0ID0ge1xuXHRcdFx0dGV4dDogc3BsaXR0ZWR0ZXh0WzJdXG5cdFx0XHRcdC5yZXBsYWNlKC9cXG4tIC9nLFwiXFxuXCIpXG5cdFx0XHRcdC5zcGxpdChcIlxcblxcblwiKVsxXSxcblx0XHRcdG9wZW5wZ3A6IGJhc2U2NF9kZWNvZGUoc3BsaXR0ZWR0ZXh0WzRdXG5cdFx0XHRcdC5zcGxpdChcIlxcblxcblwiKVsxXVxuXHRcdFx0XHQuc3BsaXQoXCJcXG49XCIpWzBdKSxcblx0XHRcdHR5cGU6IHR5cGVcblx0XHR9O1xuXG5cdFx0aWYgKHZlcmlmeUNoZWNrU3VtKHJlc3VsdC5vcGVucGdwLCBzcGxpdHRlZHRleHRbNF1cblx0XHRcdC5zcGxpdChcIlxcblxcblwiKVsxXVxuXHRcdFx0LnNwbGl0KFwiXFxuPVwiKVsxXSkpXG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRlbHNlIHtcblx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJBc2NpaSBhcm1vciBpbnRlZ3JpdHkgY2hlY2sgb24gbWVzc2FnZSBmYWlsZWRcIik7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG59XG5cblxuLyoqXG4gKiBBcm1vciBhbiBPcGVuUEdQIGJpbmFyeSBwYWNrZXQgYmxvY2tcbiAqIEBwYXJhbSB7SW50ZWdlcn0gbWVzc2FnZXR5cGUgdHlwZSBvZiB0aGUgbWVzc2FnZVxuICogQHBhcmFtIGRhdGFcbiAqIEBwYXJhbSB7SW50ZWdlcn0gcGFydGluZGV4XG4gKiBAcGFyYW0ge0ludGVnZXJ9IHBhcnR0b3RhbFxuICogQHJldHVybnMge1N0cmluZ30gQXJtb3JlZCB0ZXh0XG4gKi9cbmZ1bmN0aW9uIGFybW9yKG1lc3NhZ2V0eXBlLCBkYXRhLCBwYXJ0aW5kZXgsIHBhcnR0b3RhbCkge1xuXHR2YXIgcmVzdWx0ID0gXCJcIjtcblx0c3dpdGNoKG1lc3NhZ2V0eXBlKSB7XG5cdGNhc2UgMDpcblx0XHRyZXN1bHQgKz0gXCItLS0tLUJFR0lOIFBHUCBNRVNTQUdFLCBQQVJUIFwiK3BhcnRpbmRleCtcIi9cIitwYXJ0dG90YWwrXCItLS0tLVxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBhcm1vcl9hZGRoZWFkZXIoKTtcblx0XHRyZXN1bHQgKz0gYmFzZTY0LmVuY29kZShkYXRhKTtcblx0XHRyZXN1bHQgKz0gXCJcXHJcXG49XCIrZ2V0Q2hlY2tTdW0oZGF0YSkrXCJcXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gXCItLS0tLUVORCBQR1AgTUVTU0FHRSwgUEFSVCBcIitwYXJ0aW5kZXgrXCIvXCIrcGFydHRvdGFsK1wiLS0tLS1cXHJcXG5cIjtcblx0XHRicmVhaztcblx0Y2FzZSAxOlxuXHRcdHJlc3VsdCArPSBcIi0tLS0tQkVHSU4gUEdQIE1FU1NBR0UsIFBBUlQgXCIrcGFydGluZGV4K1wiLS0tLS1cXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gYXJtb3JfYWRkaGVhZGVyKCk7XG5cdFx0cmVzdWx0ICs9IGJhc2U2NC5lbmNvZGUoZGF0YSk7XG5cdFx0cmVzdWx0ICs9IFwiXFxyXFxuPVwiK2dldENoZWNrU3VtKGRhdGEpK1wiXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1FTkQgUEdQIE1FU1NBR0UsIFBBUlQgXCIrcGFydGluZGV4K1wiLS0tLS1cXHJcXG5cIjtcblx0XHRicmVhaztcblx0Y2FzZSAyOlxuXHRcdHJlc3VsdCArPSBcIlxcclxcbi0tLS0tQkVHSU4gUEdQIFNJR05FRCBNRVNTQUdFLS0tLS1cXHJcXG5IYXNoOiBcIitkYXRhLmhhc2grXCJcXHJcXG5cXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gZGF0YS50ZXh0LnJlcGxhY2UoL1xcbi0vZyxcIlxcbi0gLVwiKTtcblx0XHRyZXN1bHQgKz0gXCJcXHJcXG4tLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLVxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBhcm1vcl9hZGRoZWFkZXIoKTtcblx0XHRyZXN1bHQgKz0gYmFzZTY0LmVuY29kZShkYXRhLm9wZW5wZ3ApO1xuXHRcdHJlc3VsdCArPSBcIlxcclxcbj1cIitnZXRDaGVja1N1bShkYXRhLm9wZW5wZ3ApK1wiXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1FTkQgUEdQIFNJR05BVFVSRS0tLS0tXFxyXFxuXCI7XG5cdFx0YnJlYWs7XG5cdGNhc2UgMzpcblx0XHRyZXN1bHQgKz0gXCItLS0tLUJFR0lOIFBHUCBNRVNTQUdFLS0tLS1cXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gYXJtb3JfYWRkaGVhZGVyKCk7XG5cdFx0cmVzdWx0ICs9IGJhc2U2NC5lbmNvZGUoZGF0YSk7XG5cdFx0cmVzdWx0ICs9IFwiXFxyXFxuPVwiK2dldENoZWNrU3VtKGRhdGEpK1wiXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLVxcclxcblwiO1xuXHRcdGJyZWFrO1xuXHRjYXNlIDQ6XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IGFybW9yX2FkZGhlYWRlcigpO1xuXHRcdHJlc3VsdCArPSBiYXNlNjQuZW5jb2RlKGRhdGEpO1xuXHRcdHJlc3VsdCArPSBcIlxcclxcbj1cIitnZXRDaGVja1N1bShkYXRhKStcIlxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBcIi0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXHJcXG5cXHJcXG5cIjtcblx0XHRicmVhaztcblx0Y2FzZSA1OlxuXHRcdHJlc3VsdCArPSBcIi0tLS0tQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLLS0tLS1cXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gYXJtb3JfYWRkaGVhZGVyKCk7XG5cdFx0cmVzdWx0ICs9IGJhc2U2NC5lbmNvZGUoZGF0YSk7XG5cdFx0cmVzdWx0ICs9IFwiXFxyXFxuPVwiK2dldENoZWNrU3VtKGRhdGEpK1wiXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1FTkQgUEdQIFBSSVZBVEUgS0VZIEJMT0NLLS0tLS1cXHJcXG5cIjtcblx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRlbmNvZGU6IGFybW9yLFxuXHRkZWNvZGU6IGRlYXJtb3Jcbn1cbiIsIi8qIE9wZW5QR1AgcmFkaXgtNjQvYmFzZTY0IHN0cmluZyBlbmNvZGluZy9kZWNvZGluZ1xyXG4gKiBDb3B5cmlnaHQgMjAwNSBIZXJiZXJ0IEhhbmV3aW5rZWwsIHd3dy5oYW5lV0lOLmRlXHJcbiAqIHZlcnNpb24gMS4wLCBjaGVjayB3d3cuaGFuZVdJTi5kZSBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uXHJcbiAqXHJcbiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMsIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgXHJcbiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgb3Igc2VsbCB0aGlzIHNvZnR3YXJlLCB3aXRoIG9yXHJcbiAqIHdpdGhvdXQgZmVlLCBmb3IgYW55IHB1cnBvc2UgYW5kIGJ5IGFueSBpbmRpdmlkdWFsIG9yIG9yZ2FuaXphdGlvbiwgaXMgaGVyZWJ5XHJcbiAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFwcGVhciBcclxuICogaW4gYWxsIGNvcGllcy4gRGlzdHJpYnV0aW9uIGFzIGEgcGFydCBvZiBhbiBhcHBsaWNhdGlvbiBvciBiaW5hcnkgbXVzdFxyXG4gKiBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHNcclxuICogcHJvdmlkZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gb3IgZGlzdHJpYnV0aW9uLlxyXG4gKi9cclxuXHJcbnZhciBiNjRzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xyXG5cclxuZnVuY3Rpb24gczJyKHQpIHtcclxuXHR2YXIgYSwgYywgbjtcclxuXHR2YXIgciA9ICcnLCBsID0gMCwgcyA9IDA7XHJcblx0dmFyIHRsID0gdC5sZW5ndGg7XHJcblxyXG5cdGZvciAobiA9IDA7IG4gPCB0bDsgbisrKSB7XHJcblx0XHRjID0gdC5jaGFyQ29kZUF0KG4pO1xyXG5cdFx0aWYgKHMgPT0gMCkge1xyXG5cdFx0XHRyICs9IGI2NHMuY2hhckF0KChjID4+IDIpICYgNjMpO1xyXG5cdFx0XHRhID0gKGMgJiAzKSA8PCA0O1xyXG5cdFx0fSBlbHNlIGlmIChzID09IDEpIHtcclxuXHRcdFx0ciArPSBiNjRzLmNoYXJBdCgoYSB8IChjID4+IDQpICYgMTUpKTtcclxuXHRcdFx0YSA9IChjICYgMTUpIDw8IDI7XHJcblx0XHR9IGVsc2UgaWYgKHMgPT0gMikge1xyXG5cdFx0XHRyICs9IGI2NHMuY2hhckF0KGEgfCAoKGMgPj4gNikgJiAzKSk7XHJcblx0XHRcdGwgKz0gMTtcclxuXHRcdFx0aWYgKChsICUgNjApID09IDApXHJcblx0XHRcdFx0ciArPSBcIlxcblwiO1xyXG5cdFx0XHRyICs9IGI2NHMuY2hhckF0KGMgJiA2Myk7XHJcblx0XHR9XHJcblx0XHRsICs9IDE7XHJcblx0XHRpZiAoKGwgJSA2MCkgPT0gMClcclxuXHRcdFx0ciArPSBcIlxcblwiO1xyXG5cclxuXHRcdHMgKz0gMTtcclxuXHRcdGlmIChzID09IDMpXHJcblx0XHRcdHMgPSAwO1xyXG5cdH1cclxuXHRpZiAocyA+IDApIHtcclxuXHRcdHIgKz0gYjY0cy5jaGFyQXQoYSk7XHJcblx0XHRsICs9IDE7XHJcblx0XHRpZiAoKGwgJSA2MCkgPT0gMClcclxuXHRcdFx0ciArPSBcIlxcblwiO1xyXG5cdFx0ciArPSAnPSc7XHJcblx0XHRsICs9IDE7XHJcblx0fVxyXG5cdGlmIChzID09IDEpIHtcclxuXHRcdGlmICgobCAlIDYwKSA9PSAwKVxyXG5cdFx0XHRyICs9IFwiXFxuXCI7XHJcblx0XHRyICs9ICc9JztcclxuXHR9XHJcblxyXG5cdHJldHVybiByO1xyXG59XHJcblxyXG5mdW5jdGlvbiByMnModCkge1xyXG5cdHZhciBjLCBuO1xyXG5cdHZhciByID0gJycsIHMgPSAwLCBhID0gMDtcclxuXHR2YXIgdGwgPSB0Lmxlbmd0aDtcclxuXHJcblx0Zm9yIChuID0gMDsgbiA8IHRsOyBuKyspIHtcclxuXHRcdGMgPSBiNjRzLmluZGV4T2YodC5jaGFyQXQobikpO1xyXG5cdFx0aWYgKGMgPj0gMCkge1xyXG5cdFx0XHRpZiAocylcclxuXHRcdFx0XHRyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYSB8IChjID4+ICg2IC0gcykpICYgMjU1KTtcclxuXHRcdFx0cyA9IChzICsgMikgJiA3O1xyXG5cdFx0XHRhID0gKGMgPDwgcykgJiAyNTU7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiByO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRlbmNvZGU6IHMycixcclxuXHRkZWNvZGU6IHIyc1xyXG59XHJcbiIsInZhciBlbnVtcyA9IHtcblxuXHQvKiogQSBzdHJpbmcgdG8ga2V5IHNwZWNpZmllciB0eXBlXG5cdCAqIEBlbnVtIHtJbnRlZ2VyfVxuXHQgKi9cblx0czJrOiB7XG5cdFx0c2ltcGxlOiAwLFxuXHRcdHNhbHRlZDogMSxcblx0XHRpdGVyYXRlZDogMyxcblx0XHRnbnU6IDEwMVxuXHR9LFxuXG5cdC8qKiBSRkM0ODgwLCBzZWN0aW9uIDkuMSBcblx0ICogQGVudW0ge1N0cmluZ31cblx0ICovXG5cdHB1YmxpY0tleToge1xuXHRcdHJzYV9lbmNyeXB0X3NpZ246IDEsXG5cdFx0cnNhX2VuY3J5cHQ6IDIsXG5cdFx0cnNhX3NpZ246IDMsXG5cdFx0ZWxnYW1hbDogMTYsXG5cdFx0ZHNhOiAxN1xuXHR9LFxuXG5cdC8qKiBSRkM0ODgwLCBzZWN0aW9uIDkuMiBcblx0ICogQGVudW0ge1N0cmluZ31cblx0ICovXG5cdHN5bW1ldHJpYzoge1xuXHRcdHBsYWludGV4dDogMCxcblx0XHQvKiogTm90IGltcGxlbWVudGVkISAqL1xuXHRcdGlkZWE6IDEsXG5cdFx0dHJpcGxlZGVzOiAyLFxuXHRcdGNhc3Q1OiAzLFxuXHRcdGJsb3dmaXNoOiA0LFxuXHRcdGFlczEyODogNyxcblx0XHRhZXMxOTI6IDgsXG5cdFx0YWVzMjU2OiA5LFxuXHRcdHR3b2Zpc2g6IDEwXG5cdH0sXG5cblx0LyoqIFJGQzQ4ODAsIHNlY3Rpb24gOS4zXG5cdCAqIEBlbnVtIHtTdHJpbmd9XG5cdCAqL1xuXHRjb21wcmVzc2lvbjoge1xuXHRcdHVuY29tcHJlc3NlZDogMCxcblx0XHQvKiogUkZDMTk1MSAqL1xuXHRcdHppcDogMSxcblx0XHQvKiogUkZDMTk1MCAqL1xuXHRcdHpsaWI6IDIsXG5cdFx0YnppcDI6IDNcblx0fSxcblxuXHQvKiogUkZDNDg4MCwgc2VjdGlvbiA5LjRcblx0ICogQGVudW0ge1N0cmluZ31cblx0ICovXG5cdGhhc2g6IHtcblx0XHRtZDU6IDEsXG5cdFx0c2hhMTogMixcblx0XHRyaXBlbWQ6IDMsXG5cdFx0c2hhMjU2OiA4LFxuXHRcdHNoYTM4NDogOSxcblx0XHRzaGE1MTI6IDEwLFxuXHRcdHNoYTIyNDogMTFcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBAZW51bSB7U3RyaW5nfVxuXHQgKiBBIGxpc3Qgb2YgcGFja2V0IHR5cGVzIGFuZCBudW1lcmljIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZW0uXG5cdCAqL1xuXHRwYWNrZXQ6IHtcblx0XHRwdWJsaWNfa2V5X2VuY3J5cHRlZF9zZXNzaW9uX2tleTogMSxcblx0XHRzaWduYXR1cmU6IDIsXG5cdFx0c3ltX2VuY3J5cHRlZF9zZXNzaW9uX2tleTogMyxcblx0XHRvbmVfcGFzc19zaWduYXR1cmU6IDQsXG5cdFx0c2VjcmV0X2tleTogNSxcblx0XHRwdWJsaWNfa2V5OiA2LFxuXHRcdHNlY3JldF9zdWJrZXk6IDcsXG5cdFx0Y29tcHJlc3NlZDogOCxcblx0XHRzeW1tZXRyaWNhbGx5X2VuY3J5cHRlZDogOSxcblx0XHRtYXJrZXI6IDEwLFxuXHRcdGxpdGVyYWw6IDExLFxuXHRcdHRydXN0OiAxMixcblx0XHR1c2VyaWQ6IDEzLFxuXHRcdHB1YmxpY19zdWJrZXk6IDE0LFxuXHRcdHVzZXJfYXR0cmlidXRlOiAxNyxcblx0XHRzeW1fZW5jcnlwdGVkX2ludGVncml0eV9wcm90ZWN0ZWQ6IDE4LFxuXHRcdG1vZGlmaWNhdGlvbl9kZXRlY3Rpb25fY29kZTogMTlcblx0fSxcblxuXG5cdC8qKlxuXHQgKiBEYXRhIHR5cGVzIGluIHRoZSBsaXRlcmFsIHBhY2tldFxuXHQgKiBAcmVhZG9ubHlcblx0ICogQGVudW0ge1N0cmluZ31cblx0ICovXG5cdGxpdGVyYWw6IHtcblx0XHQvKiogQmluYXJ5IGRhdGEgKi9cblx0XHRiaW5hcnk6ICdiJy5jaGFyQ29kZUF0KCksXG5cdFx0LyoqIFRleHQgZGF0YSAqL1xuXHRcdHRleHQ6ICd0Jy5jaGFyQ29kZUF0KCksXG5cdFx0LyoqIFV0ZjggZGF0YSAqL1xuXHRcdHV0Zjg6ICd1Jy5jaGFyQ29kZUF0KClcblx0fSxcblxuXG5cdC8qKiBPbmUgcGFzcyBzaWduYXR1cmUgcGFja2V0IHR5cGVcblx0ICogQGVudW0ge1N0cmluZ30gKi9cblx0c2lnbmF0dXJlOiB7XG5cdFx0LyoqIDB4MDA6IFNpZ25hdHVyZSBvZiBhIGJpbmFyeSBkb2N1bWVudC4gKi9cblx0XHRiaW5hcnk6IDAsXG5cdFx0LyoqIDB4MDE6IFNpZ25hdHVyZSBvZiBhIGNhbm9uaWNhbCB0ZXh0IGRvY3VtZW50LlxuXHRcdCAqIENhbm9uaWNhbHl6aW5nIHRoZSBkb2N1bWVudCBieSBjb252ZXJ0aW5nIGxpbmUgZW5kaW5ncy4gKi9cblx0XHR0ZXh0OiAxLFxuXHRcdC8qKiAweDAyOiBTdGFuZGFsb25lIHNpZ25hdHVyZS5cblx0XHQqIFRoaXMgc2lnbmF0dXJlIGlzIGEgc2lnbmF0dXJlIG9mIG9ubHkgaXRzIG93biBzdWJwYWNrZXQgY29udGVudHMuXG5cdFx0KiBJdCBpcyBjYWxjdWxhdGVkIGlkZW50aWNhbGx5IHRvIGEgc2lnbmF0dXJlIG92ZXIgYSB6ZXJvLWxlbmdoXG5cdFx0KiBiaW5hcnkgZG9jdW1lbnQuICBOb3RlIHRoYXQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBWM1xuXHRcdCogc3RhbmRhbG9uZSBzaWduYXR1cmUuICovXG5cdFx0c3RhbmRhbG9uZTogMixcblx0XHQvKiogMHgxMDogR2VuZXJpYyBjZXJ0aWZpY2F0aW9uIG9mIGEgVXNlciBJRCBhbmQgUHVibGljLUtleSBwYWNrZXQuXG5cdFx0KiBUaGUgaXNzdWVyIG9mIHRoaXMgY2VydGlmaWNhdGlvbiBkb2VzIG5vdCBtYWtlIGFueSBwYXJ0aWN1bGFyXG5cdFx0KiBhc3NlcnRpb24gYXMgdG8gaG93IHdlbGwgdGhlIGNlcnRpZmllciBoYXMgY2hlY2tlZCB0aGF0IHRoZSBvd25lclxuXHRcdCogb2YgdGhlIGtleSBpcyBpbiBmYWN0IHRoZSBwZXJzb24gZGVzY3JpYmVkIGJ5IHRoZSBVc2VyIElELiAqL1xuXHRcdGNlcnRfZ2VuZXJpYzogMTYsXG5cdFx0LyoqIDB4MTE6IFBlcnNvbmEgY2VydGlmaWNhdGlvbiBvZiBhIFVzZXIgSUQgYW5kIFB1YmxpYy1LZXkgcGFja2V0LlxuXHRcdCogVGhlIGlzc3VlciBvZiB0aGlzIGNlcnRpZmljYXRpb24gaGFzIG5vdCBkb25lIGFueSB2ZXJpZmljYXRpb24gb2Zcblx0XHQqIHRoZSBjbGFpbSB0aGF0IHRoZSBvd25lciBvZiB0aGlzIGtleSBpcyB0aGUgVXNlciBJRCBzcGVjaWZpZWQuICovXG5cdFx0Y2VydF9wZXJzb25hOiAxNyxcblx0XHQvKiogMHgxMjogQ2FzdWFsIGNlcnRpZmljYXRpb24gb2YgYSBVc2VyIElEIGFuZCBQdWJsaWMtS2V5IHBhY2tldC5cblx0XHQqIFRoZSBpc3N1ZXIgb2YgdGhpcyBjZXJ0aWZpY2F0aW9uIGhhcyBkb25lIHNvbWUgY2FzdWFsXG5cdFx0KiB2ZXJpZmljYXRpb24gb2YgdGhlIGNsYWltIG9mIGlkZW50aXR5LiAqL1xuXHRcdGNlcnRfY2FzdWFsOiAxOCxcblx0XHQvKiogMHgxMzogUG9zaXRpdmUgY2VydGlmaWNhdGlvbiBvZiBhIFVzZXIgSUQgYW5kIFB1YmxpYy1LZXkgcGFja2V0LlxuXHRcdCogVGhlIGlzc3VlciBvZiB0aGlzIGNlcnRpZmljYXRpb24gaGFzIGRvbmUgc3Vic3RhbnRpYWxcblx0XHQqIHZlcmlmaWNhdGlvbiBvZiB0aGUgY2xhaW0gb2YgaWRlbnRpdHkuXG5cdFx0KiBcblx0XHQqIE1vc3QgT3BlblBHUCBpbXBsZW1lbnRhdGlvbnMgbWFrZSB0aGVpciBcImtleSBzaWduYXR1cmVzXCIgYXMgMHgxMFxuXHRcdCogY2VydGlmaWNhdGlvbnMuICBTb21lIGltcGxlbWVudGF0aW9ucyBjYW4gaXNzdWUgMHgxMS0weDEzXG5cdFx0KiBjZXJ0aWZpY2F0aW9ucywgYnV0IGZldyBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHR5cGVzLiAqL1xuXHRcdGNlcnRfcG9zaXRpdmU6IDE5LFxuXHRcdC8qKiAweDMwOiBDZXJ0aWZpY2F0aW9uIHJldm9jYXRpb24gc2lnbmF0dXJlXG5cdFx0KiBUaGlzIHNpZ25hdHVyZSByZXZva2VzIGFuIGVhcmxpZXIgVXNlciBJRCBjZXJ0aWZpY2F0aW9uIHNpZ25hdHVyZVxuXHRcdCogKHNpZ25hdHVyZSBjbGFzcyAweDEwIHRocm91Z2ggMHgxMykgb3IgZGlyZWN0LWtleSBzaWduYXR1cmVcblx0XHQqICgweDFGKS4gIEl0IHNob3VsZCBiZSBpc3N1ZWQgYnkgdGhlIHNhbWUga2V5IHRoYXQgaXNzdWVkIHRoZVxuXHRcdCogcmV2b2tlZCBzaWduYXR1cmUgb3IgYW4gYXV0aG9yaXplZCByZXZvY2F0aW9uIGtleS4gIFRoZSBzaWduYXR1cmVcblx0XHQqIGlzIGNvbXB1dGVkIG92ZXIgdGhlIHNhbWUgZGF0YSBhcyB0aGUgY2VydGlmaWNhdGUgdGhhdCBpdFxuXHRcdCogcmV2b2tlcywgYW5kIHNob3VsZCBoYXZlIGEgbGF0ZXIgY3JlYXRpb24gZGF0ZSB0aGFuIHRoYXRcblx0XHQqIGNlcnRpZmljYXRlLiAqL1xuXHRcdGNlcnRfcmV2b2NhdGlvbjogNDgsXG5cdFx0LyoqIDB4MTg6IFN1YmtleSBCaW5kaW5nIFNpZ25hdHVyZVxuXHRcdCogVGhpcyBzaWduYXR1cmUgaXMgYSBzdGF0ZW1lbnQgYnkgdGhlIHRvcC1sZXZlbCBzaWduaW5nIGtleSB0aGF0XG5cdFx0KiBpbmRpY2F0ZXMgdGhhdCBpdCBvd25zIHRoZSBzdWJrZXkuICBUaGlzIHNpZ25hdHVyZSBpcyBjYWxjdWxhdGVkXG5cdFx0KiBkaXJlY3RseSBvbiB0aGUgcHJpbWFyeSBrZXkgYW5kIHN1YmtleSwgYW5kIG5vdCBvbiBhbnkgVXNlciBJRCBvclxuXHRcdCogb3RoZXIgcGFja2V0cy4gIEEgc2lnbmF0dXJlIHRoYXQgYmluZHMgYSBzaWduaW5nIHN1YmtleSBNVVNUIGhhdmVcblx0XHQqIGFuIEVtYmVkZGVkIFNpZ25hdHVyZSBzdWJwYWNrZXQgaW4gdGhpcyBiaW5kaW5nIHNpZ25hdHVyZSB0aGF0XG5cdFx0KiBjb250YWlucyBhIDB4MTkgc2lnbmF0dXJlIG1hZGUgYnkgdGhlIHNpZ25pbmcgc3Via2V5IG9uIHRoZVxuXHRcdCogcHJpbWFyeSBrZXkgYW5kIHN1YmtleS4gKi9cblx0XHRzdWJrZXlfYmluZGluZzogMjQsXG5cdFx0LyoqIDB4MTk6IFByaW1hcnkgS2V5IEJpbmRpbmcgU2lnbmF0dXJlXG5cdFx0KiBUaGlzIHNpZ25hdHVyZSBpcyBhIHN0YXRlbWVudCBieSBhIHNpZ25pbmcgc3Via2V5LCBpbmRpY2F0aW5nXG5cdFx0KiB0aGF0IGl0IGlzIG93bmVkIGJ5IHRoZSBwcmltYXJ5IGtleSBhbmQgc3Via2V5LiAgVGhpcyBzaWduYXR1cmVcblx0XHQqIGlzIGNhbGN1bGF0ZWQgdGhlIHNhbWUgd2F5IGFzIGEgMHgxOCBzaWduYXR1cmU6IGRpcmVjdGx5IG9uIHRoZVxuXHRcdCogcHJpbWFyeSBrZXkgYW5kIHN1YmtleSwgYW5kIG5vdCBvbiBhbnkgVXNlciBJRCBvciBvdGhlciBwYWNrZXRzLlxuXHRcdFxuXHRcdCogV2hlbiBhIHNpZ25hdHVyZSBpcyBtYWRlIG92ZXIgYSBrZXksIHRoZSBoYXNoIGRhdGEgc3RhcnRzIHdpdGggdGhlXG5cdFx0KiBvY3RldCAweDk5LCBmb2xsb3dlZCBieSBhIHR3by1vY3RldCBsZW5ndGggb2YgdGhlIGtleSwgYW5kIHRoZW4gYm9keVxuXHRcdCogb2YgdGhlIGtleSBwYWNrZXQuICAoTm90ZSB0aGF0IHRoaXMgaXMgYW4gb2xkLXN0eWxlIHBhY2tldCBoZWFkZXIgZm9yXG5cdFx0KiBhIGtleSBwYWNrZXQgd2l0aCB0d28tb2N0ZXQgbGVuZ3RoLikgIEEgc3Via2V5IGJpbmRpbmcgc2lnbmF0dXJlXG5cdFx0KiAodHlwZSAweDE4KSBvciBwcmltYXJ5IGtleSBiaW5kaW5nIHNpZ25hdHVyZSAodHlwZSAweDE5KSB0aGVuIGhhc2hlc1xuXHRcdCogdGhlIHN1YmtleSB1c2luZyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG1haW4ga2V5IChhbHNvIHVzaW5nIDB4OTkgYXNcblx0XHQqIHRoZSBmaXJzdCBvY3RldCkuICovXG5cdFx0a2V5X2JpbmRpbmc6IDI1LFxuXHRcdC8qKiAweDFGOiBTaWduYXR1cmUgZGlyZWN0bHkgb24gYSBrZXlcblx0XHQqIFRoaXMgc2lnbmF0dXJlIGlzIGNhbGN1bGF0ZWQgZGlyZWN0bHkgb24gYSBrZXkuICBJdCBiaW5kcyB0aGVcblx0XHQqIGluZm9ybWF0aW9uIGluIHRoZSBTaWduYXR1cmUgc3VicGFja2V0cyB0byB0aGUga2V5LCBhbmQgaXNcblx0XHQqIGFwcHJvcHJpYXRlIHRvIGJlIHVzZWQgZm9yIHN1YnBhY2tldHMgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uXG5cdFx0KiBhYm91dCB0aGUga2V5LCBzdWNoIGFzIHRoZSBSZXZvY2F0aW9uIEtleSBzdWJwYWNrZXQuICBJdCBpcyBhbHNvXG5cdFx0KiBhcHByb3ByaWF0ZSBmb3Igc3RhdGVtZW50cyB0aGF0IG5vbi1zZWxmIGNlcnRpZmllcnMgd2FudCB0byBtYWtlXG5cdFx0KiBhYm91dCB0aGUga2V5IGl0c2VsZiwgcmF0aGVyIHRoYW4gdGhlIGJpbmRpbmcgYmV0d2VlbiBhIGtleSBhbmQgYVxuXHRcdCogbmFtZS4gKi9cblx0XHRrZXk6IDMxLFxuXHRcdC8qKiAweDIwOiBLZXkgcmV2b2NhdGlvbiBzaWduYXR1cmVcblx0XHQqIFRoZSBzaWduYXR1cmUgaXMgY2FsY3VsYXRlZCBkaXJlY3RseSBvbiB0aGUga2V5IGJlaW5nIHJldm9rZWQuICBBXG5cdFx0KiByZXZva2VkIGtleSBpcyBub3QgdG8gYmUgdXNlZC4gIE9ubHkgcmV2b2NhdGlvbiBzaWduYXR1cmVzIGJ5IHRoZVxuXHRcdCoga2V5IGJlaW5nIHJldm9rZWQsIG9yIGJ5IGFuIGF1dGhvcml6ZWQgcmV2b2NhdGlvbiBrZXksIHNob3VsZCBiZVxuXHRcdCogY29uc2lkZXJlZCB2YWxpZCByZXZvY2F0aW9uIHNpZ25hdHVyZXMuYSAqL1xuXHRcdGtleV9yZXZvY2F0aW9uOiAzMixcblx0XHQvKiogMHgyODogU3Via2V5IHJldm9jYXRpb24gc2lnbmF0dXJlXG5cdFx0KiBUaGUgc2lnbmF0dXJlIGlzIGNhbGN1bGF0ZWQgZGlyZWN0bHkgb24gdGhlIHN1YmtleSBiZWluZyByZXZva2VkLlxuXHRcdCogQSByZXZva2VkIHN1YmtleSBpcyBub3QgdG8gYmUgdXNlZC4gIE9ubHkgcmV2b2NhdGlvbiBzaWduYXR1cmVzXG5cdFx0KiBieSB0aGUgdG9wLWxldmVsIHNpZ25hdHVyZSBrZXkgdGhhdCBpcyBib3VuZCB0byB0aGlzIHN1YmtleSwgb3Jcblx0XHQqIGJ5IGFuIGF1dGhvcml6ZWQgcmV2b2NhdGlvbiBrZXksIHNob3VsZCBiZSBjb25zaWRlcmVkIHZhbGlkXG5cdFx0KiByZXZvY2F0aW9uIHNpZ25hdHVyZXMuXG5cdFx0KiBLZXkgcmV2b2NhdGlvbiBzaWduYXR1cmVzICh0eXBlcyAweDIwIGFuZCAweDI4KVxuXHRcdCogaGFzaCBvbmx5IHRoZSBrZXkgYmVpbmcgcmV2b2tlZC4gKi9cblx0XHRzdWJrZXlfcmV2b2NhdGlvbjogNDAsXG5cdFx0LyoqIDB4NDA6IFRpbWVzdGFtcCBzaWduYXR1cmUuXG5cdFx0KiBUaGlzIHNpZ25hdHVyZSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHRoZSB0aW1lc3RhbXAgY29udGFpbmVkIGluXG5cdFx0KiBpdC4gKi9cblx0XHR0aW1lc3RhbXA6IDY0LFxuXHRcdC8qKiAgICAweDUwOiBUaGlyZC1QYXJ0eSBDb25maXJtYXRpb24gc2lnbmF0dXJlLlxuXHRcdCogVGhpcyBzaWduYXR1cmUgaXMgYSBzaWduYXR1cmUgb3ZlciBzb21lIG90aGVyIE9wZW5QR1AgU2lnbmF0dXJlXG5cdFx0KiBwYWNrZXQocykuICBJdCBpcyBhbmFsb2dvdXMgdG8gYSBub3Rhcnkgc2VhbCBvbiB0aGUgc2lnbmVkIGRhdGEuXG5cdFx0KiBBIHRoaXJkLXBhcnR5IHNpZ25hdHVyZSBTSE9VTEQgaW5jbHVkZSBTaWduYXR1cmUgVGFyZ2V0XG5cdFx0KiBzdWJwYWNrZXQocykgdG8gZ2l2ZSBlYXN5IGlkZW50aWZpY2F0aW9uLiAgTm90ZSB0aGF0IHdlIHJlYWxseSBkb1xuXHRcdCogbWVhbiBTSE9VTEQuICBUaGVyZSBhcmUgcGxhdXNpYmxlIHVzZXMgZm9yIHRoaXMgKHN1Y2ggYXMgYSBibGluZFxuXHRcdCogcGFydHkgdGhhdCBvbmx5IHNlZXMgdGhlIHNpZ25hdHVyZSwgbm90IHRoZSBrZXkgb3Igc291cmNlXG5cdFx0KiBkb2N1bWVudCkgdGhhdCBjYW5ub3QgaW5jbHVkZSBhIHRhcmdldCBzdWJwYWNrZXQuICovXG5cdFx0dGhpcmRfcGFydHk6IDgwXG5cdH0sXG5cblx0Ly8gQXNzZXJ0cyB2YWxpZGl0eSBhbmQgY29udmVydHMgZnJvbSBzdHJpbmcvaW50ZWdlciB0byBpbnRlZ2VyLlxuXHR3cml0ZTogZnVuY3Rpb24odHlwZSwgZSkge1xuXHRcdGlmKHR5cGVvZiBlID09ICdudW1iZXInKSB7XG5cdFx0XHRlID0gdGhpcy5yZWFkKHR5cGUsIGUpO1xuXHRcdH1cblx0XHRcblx0XHRpZih0eXBlW2VdICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHR5cGVbZV07XG5cdFx0fSBlbHNlIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbnVtIHZhbHVlLicpO1xuXHR9LFxuXHQvLyBDb252ZXJ0cyBmcm9tIGFuIGludGVnZXIgdG8gc3RyaW5nLlxuXHRyZWFkOiBmdW5jdGlvbih0eXBlLCBlKSB7XG5cdFx0Zm9yKHZhciBpIGluIHR5cGUpXG5cdFx0XHRpZih0eXBlW2ldID09IGUpIHJldHVybiBpO1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVudW0gdmFsdWUuJyk7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlbnVtcztcbiIsInZhciBjcnlwdG8gPSByZXF1aXJlKCcuL2NyeXB0bycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vb3BlbnBncC5qcycpO1xubW9kdWxlLmV4cG9ydHMudXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xubW9kdWxlLmV4cG9ydHMucGFja2V0ID0gcmVxdWlyZSgnLi9wYWNrZXQnKTtcbm1vZHVsZS5leHBvcnRzLm1waSA9IHJlcXVpcmUoJy4vdHlwZS9tcGkuanMnKTtcbm1vZHVsZS5leHBvcnRzLnMyayA9IHJlcXVpcmUoJy4vdHlwZS9zMmsuanMnKTtcbm1vZHVsZS5leHBvcnRzLmtleWlkID0gcmVxdWlyZSgnLi90eXBlL2tleWlkLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5hcm1vciA9IHJlcXVpcmUoJy4vZW5jb2RpbmcvYXJtb3IuanMnKTtcbm1vZHVsZS5leHBvcnRzLmVudW1zID0gcmVxdWlyZSgnLi9lbnVtcy5qcycpO1xuXG5mb3IodmFyIGkgaW4gY3J5cHRvKVxuXHRtb2R1bGUuZXhwb3J0c1tpXSA9IGNyeXB0b1tpXTtcblxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRoZSBvcGVucGdwIGJhc2UgY2xhc3Mgc2hvdWxkIHByb3ZpZGUgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IFxuICogdG8gY29uc3VtZSB0aGUgb3BlbnBncC5qcyBsaWJyYXJ5LiBBbGwgYWRkaXRpb25hbCBjbGFzc2VzIGFyZSBkb2N1bWVudGVkIFxuICogZm9yIGV4dGVuZGluZyBhbmQgZGV2ZWxvcGluZyBvbiB0b3Agb2YgdGhlIGJhc2UgbGlicmFyeS5cbiAqL1xuXG4vKipcbiAqIEdQRzRCcm93c2VycyBDb3JlIGludGVyZmFjZS4gQSBzaW5nbGUgaW5zdGFuY2UgaXMgaG9sZFxuICogZnJvbSB0aGUgYmVnaW5uaW5nLiBUbyB1c2UgdGhpcyBsaWJyYXJ5IGNhbGwgXCJvcGVucGdwLmluaXQoKVwiXG4gKiBAYWxpYXMgb3BlbnBncFxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIE1haW4gT3BlbnBncC5qcyBjbGFzcy4gVXNlIHRoaXMgdG8gaW5pdGlhdGUgYW5kIG1ha2UgYWxsIGNhbGxzIHRvIHRoaXMgbGlicmFyeS5cbiAqL1xuZnVuY3Rpb24gX29wZW5wZ3AgKCkge1xuXHR0aGlzLnRvc3RyaW5nID0gXCJcIjtcblx0XG5cdC8qKlxuXHQgKiBpbml0aWFsaXplcyB0aGUgbGlicmFyeTpcblx0ICogLSByZWFkaW5nIHRoZSBrZXlyaW5nIGZyb20gbG9jYWwgc3RvcmFnZVxuXHQgKiAtIHJlYWRpbmcgdGhlIGNvbmZpZyBmcm9tIGxvY2FsIHN0b3JhZ2Vcblx0ICovXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cdFx0dGhpcy5jb25maWcgPSBuZXcgb3BlbnBncF9jb25maWcoKTtcblx0XHR0aGlzLmNvbmZpZy5yZWFkKCk7XG5cdFx0dGhpcy5rZXlyaW5nID0gbmV3IG9wZW5wZ3Bfa2V5cmluZygpO1xuXHRcdHRoaXMua2V5cmluZy5pbml0KCk7XG5cdH1cblx0XG5cdC8qKlxuXHQgKiByZWFkcyBzZXZlcmFsIHB1YmxpY0tleSBvYmplY3RzIGZyb20gYSBhc2NpaSBhcm1vcmVkXG5cdCAqIHJlcHJlc2VudGF0aW9uIGFuIHJldHVybnMgb3BlbnBncF9tc2dfcHVibGlja2V5IHBhY2tldHNcblx0ICogQHBhcmFtIHtTdHJpbmd9IGFybW9yZWRUZXh0IE9wZW5QR1AgYXJtb3JlZCB0ZXh0IGNvbnRhaW5pbmdcblx0ICogdGhlIHB1YmxpYyBrZXkocylcblx0ICogQHJldHVybiB7b3BlbnBncF9tc2dfcHVibGlja2V5W119IG9uIGVycm9yIHRoZSBmdW5jdGlvblxuXHQgKiByZXR1cm5zIG51bGxcblx0ICovXG5cdGZ1bmN0aW9uIHJlYWRfcHVibGljS2V5KGFybW9yZWRUZXh0KSB7XG5cdFx0dmFyIG15cG9zID0gMDtcblx0XHR2YXIgcHVibGljS2V5cyA9IG5ldyBBcnJheSgpO1xuXHRcdHZhciBwdWJsaWNLZXlDb3VudCA9IDA7XG5cdFx0dmFyIGlucHV0ID0gb3BlbnBncF9lbmNvZGluZ19kZUFybW9yKGFybW9yZWRUZXh0LnJlcGxhY2UoL1xcci9nLCcnKSkub3BlbnBncDtcblx0XHR2YXIgbCA9IGlucHV0Lmxlbmd0aDtcblx0XHR3aGlsZSAobXlwb3MgIT0gaW5wdXQubGVuZ3RoKSB7XG5cdFx0XHR2YXIgZmlyc3RfcGFja2V0ID0gb3BlbnBncF9wYWNrZXQucmVhZF9wYWNrZXQoaW5wdXQsIG15cG9zLCBsKTtcblx0XHRcdC8vIHB1YmxpYyBrZXkgcGFyc2VyXG5cdFx0XHRpZiAoaW5wdXRbbXlwb3NdLmNoYXJDb2RlQXQoKSA9PSAweDk5IHx8IGZpcnN0X3BhY2tldC50YWdUeXBlID09IDYpIHtcblx0XHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0gPSBuZXcgb3BlbnBncF9tc2dfcHVibGlja2V5KCk7XHRcdFx0XHRcblx0XHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0uaGVhZGVyID0gaW5wdXQuc3Vic3RyaW5nKG15cG9zLG15cG9zKzMpO1xuXHRcdFx0XHRpZiAoaW5wdXRbbXlwb3NdLmNoYXJDb2RlQXQoKSA9PSAweDk5KSB7XG5cdFx0XHRcdFx0Ly8gcGFyc2UgdGhlIGxlbmd0aCBhbmQgcmVhZCBhIHRhZzYgcGFja2V0XG5cdFx0XHRcdFx0bXlwb3MrKztcblx0XHRcdFx0XHR2YXIgbCA9IChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgPDwgOClcblx0XHRcdFx0XHRcdFx0fCBpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0ucHVibGljS2V5UGFja2V0ID0gbmV3IG9wZW5wZ3BfcGFja2V0X2tleW1hdGVyaWFsKCk7XG5cdFx0XHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0ucHVibGljS2V5UGFja2V0LmhlYWRlciA9IHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLmhlYWRlcjtcblx0XHRcdFx0XHRwdWJsaWNLZXlzW3B1YmxpY0tleUNvdW50XS5wdWJsaWNLZXlQYWNrZXQucmVhZF90YWc2KGlucHV0LCBteXBvcywgbCk7XG5cdFx0XHRcdFx0bXlwb3MgKz0gcHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0ucHVibGljS2V5UGFja2V0LnBhY2tldExlbmd0aDtcblx0XHRcdFx0XHRteXBvcyArPSBwdWJsaWNLZXlzW3B1YmxpY0tleUNvdW50XS5yZWFkX25vZGVzKHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLnB1YmxpY0tleVBhY2tldCwgaW5wdXQsIG15cG9zLCAoaW5wdXQubGVuZ3RoIC0gbXlwb3MpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwdWJsaWNLZXlzW3B1YmxpY0tleUNvdW50XSA9IG5ldyBvcGVucGdwX21zZ19wdWJsaWNrZXkoKTtcblx0XHRcdFx0XHRwdWJsaWNLZXlzW3B1YmxpY0tleUNvdW50XS5wdWJsaWNLZXlQYWNrZXQgPSBmaXJzdF9wYWNrZXQ7XG5cdFx0XHRcdFx0bXlwb3MgKz0gZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aCtmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoO1xuXHRcdFx0XHRcdG15cG9zICs9IHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLnJlYWRfbm9kZXMoZmlyc3RfcGFja2V0LCBpbnB1dCwgbXlwb3MsIGlucHV0Lmxlbmd0aCAtbXlwb3MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR1dGlsLnByaW50X2Vycm9yKFwibm8gcHVibGljIGtleSBmb3VuZCFcIik7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0uZGF0YSA9IGlucHV0LnN1YnN0cmluZygwLG15cG9zKTtcblx0XHRcdHB1YmxpY0tleUNvdW50Kys7XG5cdFx0fVxuXHRcdHJldHVybiBwdWJsaWNLZXlzO1xuXHR9XG5cdFxuXHQvKipcblx0ICogcmVhZHMgc2V2ZXJhbCBwcml2YXRlS2V5IG9iamVjdHMgZnJvbSBhIGFzY2lpIGFybW9yZWRcblx0ICogcmVwcmVzZW50YXRpb24gYW4gcmV0dXJucyBvcGVucGdwX21zZ19wcml2YXRla2V5IG9iamVjdHNcblx0ICogQHBhcmFtIHtTdHJpbmd9IGFybW9yZWRUZXh0IE9wZW5QR1AgYXJtb3JlZCB0ZXh0IGNvbnRhaW5pbmdcblx0ICogdGhlIHByaXZhdGUga2V5KHMpXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXlbXX0gb24gZXJyb3IgdGhlIGZ1bmN0aW9uXG5cdCAqIHJldHVybnMgbnVsbFxuXHQgKi9cblx0ZnVuY3Rpb24gcmVhZF9wcml2YXRlS2V5KGFybW9yZWRUZXh0KSB7XG5cdFx0dmFyIHByaXZhdGVLZXlzID0gbmV3IEFycmF5KCk7XG5cdFx0dmFyIHByaXZhdGVLZXlDb3VudCA9IDA7XG5cdFx0dmFyIG15cG9zID0gMDtcblx0XHR2YXIgaW5wdXQgPSBvcGVucGdwX2VuY29kaW5nX2RlQXJtb3IoYXJtb3JlZFRleHQucmVwbGFjZSgvXFxyL2csJycpKS5vcGVucGdwO1xuXHRcdHZhciBsID0gaW5wdXQubGVuZ3RoO1xuXHRcdHdoaWxlIChteXBvcyAhPSBpbnB1dC5sZW5ndGgpIHtcblx0XHRcdHZhciBmaXJzdF9wYWNrZXQgPSBvcGVucGdwX3BhY2tldC5yZWFkX3BhY2tldChpbnB1dCwgbXlwb3MsIGwpO1xuXHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDUpIHtcblx0XHRcdFx0cHJpdmF0ZUtleXNbcHJpdmF0ZUtleXMubGVuZ3RoXSA9IG5ldyBvcGVucGdwX21zZ19wcml2YXRla2V5KCk7XG5cdFx0XHRcdG15cG9zICs9IGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGgrZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aDtcblx0XHRcdFx0bXlwb3MgKz0gcHJpdmF0ZUtleXNbcHJpdmF0ZUtleUNvdW50XS5yZWFkX25vZGVzKGZpcnN0X3BhY2tldCwgaW5wdXQsIG15cG9zLCBsKTtcblx0XHRcdC8vIG90aGVyIGJsb2Nrc1x0ICAgICAgICAgICAgXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR1dGlsLnByaW50X2Vycm9yKCdubyBibG9jayBwYWNrZXQgZm91bmQhJyk7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cHJpdmF0ZUtleXNbcHJpdmF0ZUtleUNvdW50XS5kYXRhID0gaW5wdXQuc3Vic3RyaW5nKDAsbXlwb3MpO1xuXHRcdFx0cHJpdmF0ZUtleUNvdW50Kys7XG5cdFx0fVxuXHRcdHJldHVybiBwcml2YXRlS2V5cztcdFx0XG5cdH1cblxuXHQvKipcblx0ICogcmVhZHMgbWVzc2FnZSBwYWNrZXRzIG91dCBvZiBhbiBPcGVuUEdQIGFybW9yZWQgdGV4dCBhbmRcblx0ICogcmV0dXJucyBhbiBhcnJheSBvZiBtZXNzYWdlIG9iamVjdHNcblx0ICogQHBhcmFtIHtTdHJpbmd9IGFybW9yZWRUZXh0IHRleHQgdG8gYmUgcGFyc2VkXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfbXNnX21lc3NhZ2VbXX0gb24gZXJyb3IgdGhlIGZ1bmN0aW9uXG5cdCAqIHJldHVybnMgbnVsbFxuXHQgKi9cblx0ZnVuY3Rpb24gcmVhZF9tZXNzYWdlKGFybW9yZWRUZXh0KSB7XG5cdFx0dmFyIGRlYXJtb3JlZDtcblx0XHR0cnl7XG4gICAgXHRcdGRlYXJtb3JlZCA9IG9wZW5wZ3BfZW5jb2RpbmdfZGVBcm1vcihhcm1vcmVkVGV4dC5yZXBsYWNlKC9cXHIvZywnJykpO1xuXHRcdH1cblx0XHRjYXRjaChlKXtcbiAgICBcdFx0dXRpbC5wcmludF9lcnJvcignbm8gbWVzc2FnZSBmb3VuZCEnKTtcbiAgICBcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdHJldHVybiByZWFkX21lc3NhZ2VzX2RlYXJtb3JlZChkZWFybW9yZWQpO1xuXHRcdH1cblx0XHRcblx0LyoqXG5cdCAqIHJlYWRzIG1lc3NhZ2UgcGFja2V0cyBvdXQgb2YgYW4gT3BlblBHUCBhcm1vcmVkIHRleHQgYW5kXG5cdCAqIHJldHVybnMgYW4gYXJyYXkgb2YgbWVzc2FnZSBvYmplY3RzLiBDYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkgb3IgaW50ZXJuYWxseS5cblx0ICogRXh0ZXJuYWwgY2FsbCB3aWxsIHBhcnNlIGEgZGUtYXJtb3JlZCBtZXNzYWdlZCBhbmQgcmV0dXJuIG1lc3NhZ2VzIGZvdW5kLlxuXHQgKiBJbnRlcm5hbCB3aWxsIGJlIGNhbGxlZCB0byByZWFkIHBhY2tldHMgd3JhcHBlZCBpbiBvdGhlciBwYWNrZXRzIChpLmUuIGNvbXByZXNzZWQpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBkZWFybW9yZWQgdGV4dCBvZiBPcGVuUEdQIHBhY2tldHMsIHRvIGJlIHBhcnNlZFxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX21zZ19tZXNzYWdlW119IG9uIGVycm9yIHRoZSBmdW5jdGlvblxuXHQgKiByZXR1cm5zIG51bGxcblx0ICovXG5cdGZ1bmN0aW9uIHJlYWRfbWVzc2FnZXNfZGVhcm1vcmVkKGlucHV0KXtcblx0XHR2YXIgbWVzc2FnZVN0cmluZyA9IGlucHV0Lm9wZW5wZ3A7XG5cdFx0dmFyIHNpZ25hdHVyZVRleHQgPSBpbnB1dC50ZXh0OyAvL3RleHQgdG8gdmVyaWZ5IHNpZ25hdHVyZXMgYWdhaW5zdC4gTW9kaWZpZWQgYnkgVGFnMTEuXG5cdFx0dmFyIG1lc3NhZ2VzID0gbmV3IEFycmF5KCk7XG5cdFx0dmFyIG1lc3NhZ2VDb3VudCA9IDA7XG5cdFx0dmFyIG15cG9zID0gMDtcblx0XHR2YXIgbCA9IG1lc3NhZ2VTdHJpbmcubGVuZ3RoO1xuXHRcdHdoaWxlIChteXBvcyA8IG1lc3NhZ2VTdHJpbmcubGVuZ3RoKSB7XG5cdFx0XHR2YXIgZmlyc3RfcGFja2V0ID0gb3BlbnBncF9wYWNrZXQucmVhZF9wYWNrZXQobWVzc2FnZVN0cmluZywgbXlwb3MsIGwpO1xuXHRcdFx0aWYgKCFmaXJzdF9wYWNrZXQpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHQvLyBwdWJsaWMga2V5IHBhcnNlciAoZGVmaW5pdGlvbiBmcm9tIHRoZSBzdGFuZGFyZDopXG5cdFx0XHQvLyBPcGVuUEdQIE1lc3NhZ2UgICAgICA6LSBFbmNyeXB0ZWQgTWVzc2FnZSB8IFNpZ25lZCBNZXNzYWdlIHxcblx0XHRcdC8vICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzZWQgTWVzc2FnZSB8IExpdGVyYWwgTWVzc2FnZS5cblx0XHRcdC8vIENvbXByZXNzZWQgTWVzc2FnZSAgIDotIENvbXByZXNzZWQgRGF0YSBQYWNrZXQuXG5cdFx0XHQvLyBcblx0XHRcdC8vIExpdGVyYWwgTWVzc2FnZSAgICAgIDotIExpdGVyYWwgRGF0YSBQYWNrZXQuXG5cdFx0XHQvLyBcblx0XHRcdC8vIEVTSyAgICAgICAgICAgICAgICAgIDotIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5IFBhY2tldCB8XG5cdFx0XHQvLyAgICAgICAgICAgICAgICAgICAgICAgICBTeW1tZXRyaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleSBQYWNrZXQuXG5cdFx0XHQvLyBcblx0XHRcdC8vIEVTSyBTZXF1ZW5jZSAgICAgICAgIDotIEVTSyB8IEVTSyBTZXF1ZW5jZSwgRVNLLlxuXHRcdFx0Ly8gXG5cdFx0XHQvLyBFbmNyeXB0ZWQgRGF0YSAgICAgICA6LSBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCB8XG5cdFx0XHQvLyAgICAgICAgICAgICAgICAgICAgICAgICBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBJbnRlZ3JpdHkgUHJvdGVjdGVkIERhdGEgUGFja2V0XG5cdFx0XHQvLyBcblx0XHRcdC8vIEVuY3J5cHRlZCBNZXNzYWdlICAgIDotIEVuY3J5cHRlZCBEYXRhIHwgRVNLIFNlcXVlbmNlLCBFbmNyeXB0ZWQgRGF0YS5cblx0XHRcdC8vIFxuXHRcdFx0Ly8gT25lLVBhc3MgU2lnbmVkIE1lc3NhZ2UgOi0gT25lLVBhc3MgU2lnbmF0dXJlIFBhY2tldCxcblx0XHRcdC8vICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5QR1AgTWVzc2FnZSwgQ29ycmVzcG9uZGluZyBTaWduYXR1cmUgUGFja2V0LlxuXG5cdFx0XHQvLyBTaWduZWQgTWVzc2FnZSAgICAgICA6LSBTaWduYXR1cmUgUGFja2V0LCBPcGVuUEdQIE1lc3NhZ2UgfFxuXHRcdFx0Ly8gICAgICAgICAgICAgICAgICAgICAgICAgT25lLVBhc3MgU2lnbmVkIE1lc3NhZ2UuXG5cdFx0XHRpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gIDEgfHxcblx0XHRcdCAgICAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMiAmJiBmaXJzdF9wYWNrZXQuc2lnbmF0dXJlVHlwZSA8IDE2KSB8fFxuXHRcdFx0ICAgICBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAgMyB8fFxuXHRcdFx0ICAgICBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAgNCB8fFxuXHRcdFx0XHQgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gIDggfHxcblx0XHRcdFx0IGZpcnN0X3BhY2tldC50YWdUeXBlID09ICA5IHx8XG5cdFx0XHRcdCBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxMCB8fFxuXHRcdFx0XHQgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMTEgfHxcblx0XHRcdFx0IGZpcnN0X3BhY2tldC50YWdUeXBlID09IDE4IHx8XG5cdFx0XHRcdCBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxOSkge1xuXHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGhdID0gbmV3IG9wZW5wZ3BfbXNnX21lc3NhZ2UoKTtcblx0XHRcdFx0bWVzc2FnZXNbbWVzc2FnZUNvdW50XS5tZXNzYWdlUGFja2V0ID0gZmlyc3RfcGFja2V0O1xuXHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlQ291bnRdLnR5cGUgPSBpbnB1dC50eXBlO1xuXHRcdFx0XHQvLyBFbmNyeXB0ZWQgTWVzc2FnZVxuXHRcdFx0XHRpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gOSB8fFxuXHRcdFx0XHQgICAgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMSB8fFxuXHRcdFx0XHQgICAgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMyB8fFxuXHRcdFx0XHQgICAgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMTgpIHtcblx0XHRcdFx0XHRpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gOSkge1xuXHRcdFx0XHRcdFx0dXRpbC5wcmludF9lcnJvcihcInVuZXhwZWN0ZWQgb3BlbnBncCBwYWNrZXRcIik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDEpIHtcblx0XHRcdFx0XHRcdHV0aWwucHJpbnRfZGVidWcoXCJzZXNzaW9uIGtleSBmb3VuZDpcXG4gXCIrZmlyc3RfcGFja2V0LnRvU3RyaW5nKCkpO1xuXHRcdFx0XHRcdFx0dmFyIGlzc2Vzc2lvbmtleSA9IHRydWU7XG5cdFx0XHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlQ291bnRdLnNlc3Npb25LZXlzID0gbmV3IEFycmF5KCk7XG5cdFx0XHRcdFx0XHR2YXIgc2Vzc2lvbktleUNvdW50ID0gMDtcblx0XHRcdFx0XHRcdHdoaWxlIChpc3Nlc3Npb25rZXkpIHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZXNbbWVzc2FnZUNvdW50XS5zZXNzaW9uS2V5c1tzZXNzaW9uS2V5Q291bnRdID0gZmlyc3RfcGFja2V0O1xuXHRcdFx0XHRcdFx0XHRteXBvcyArPSBmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aDtcblx0XHRcdFx0XHRcdFx0bCAtPSAoZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRmaXJzdF9wYWNrZXQgPSBvcGVucGdwX3BhY2tldC5yZWFkX3BhY2tldChtZXNzYWdlU3RyaW5nLCBteXBvcywgbCk7XG5cdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgIT0gMSAmJiBmaXJzdF9wYWNrZXQudGFnVHlwZSAhPSAzKVxuXHRcdFx0XHRcdFx0XHRcdGlzc2Vzc2lvbmtleSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRzZXNzaW9uS2V5Q291bnQrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxOCB8fCBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSA5KSB7XG5cdFx0XHRcdFx0XHRcdHV0aWwucHJpbnRfZGVidWcoXCJlbmNyeXB0ZWQgZGF0YSBmb3VuZDpcXG4gXCIrZmlyc3RfcGFja2V0LnRvU3RyaW5nKCkpO1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlQ291bnRdLmVuY3J5cHRlZERhdGEgPSBmaXJzdF9wYWNrZXQ7XG5cdFx0XHRcdFx0XHRcdG15cG9zICs9IGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGgrZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aDtcblx0XHRcdFx0XHRcdFx0bCAtPSAoZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCtmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUNvdW50Kys7XG5cdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dXRpbC5wcmludF9kZWJ1ZyhcInNvbWV0aGluZyBpcyB3cm9uZzogXCIrZmlyc3RfcGFja2V0LnRhZ1R5cGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxOCkge1xuXHRcdFx0XHRcdFx0dXRpbC5wcmludF9kZWJ1ZyhcInN5bW1ldHJpYyBlbmNyeXB0ZWQgZGF0YVwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIFxuXHRcdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAyICYmIGZpcnN0X3BhY2tldC5zaWduYXR1cmVUeXBlIDwgMykge1xuXHRcdFx0XHRcdC8vIFNpZ25lZCBNZXNzYWdlXG5cdFx0XHRcdFx0XHRteXBvcyArPSBmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aDtcblx0XHRcdFx0XHRcdGwgLT0gKGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGggKyBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoKTtcblx0XHRcdFx0XHRcdG1lc3NhZ2VzW21lc3NhZ2VDb3VudF0udGV4dCA9IHNpZ25hdHVyZVRleHQ7XG5cdFx0XHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlQ291bnRdLnNpZ25hdHVyZSA9IGZpcnN0X3BhY2tldDtcblx0XHRcdFx0ICAgICAgICBtZXNzYWdlQ291bnQrKztcblx0XHRcdFx0fSBlbHNlIFxuXHRcdFx0XHRcdC8vIFNpZ25lZCBNZXNzYWdlXG5cdFx0XHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDQpIHtcblx0XHRcdFx0XHRcdC8vVE9ETzogSW1wbGVtZW50IGNoZWNrXG5cdFx0XHRcdFx0XHRteXBvcyArPSBmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aDtcblx0XHRcdFx0XHRcdGwgLT0gKGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGggKyBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoKTtcblx0XHRcdFx0fSBlbHNlIFxuXHRcdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSA4KSB7XG5cdFx0XHRcdFx0Ly8gQ29tcHJlc3NlZCBNZXNzYWdlXG5cdFx0XHRcdFx0XHRteXBvcyArPSBmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aDtcblx0XHRcdFx0XHRcdGwgLT0gKGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGggKyBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoKTtcblx0XHRcdFx0ICAgICAgICB2YXIgZGVjb21wcmVzc2VkVGV4dCA9IGZpcnN0X3BhY2tldC5kZWNvbXByZXNzKCk7XG5cdFx0XHRcdCAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5jb25jYXQob3BlbnBncC5yZWFkX21lc3NhZ2VzX2RlYXJtb3JlZCh7dGV4dDogZGVjb21wcmVzc2VkVGV4dCwgb3BlbnBncDogZGVjb21wcmVzc2VkVGV4dH0pKTtcblx0XHRcdFx0fSBlbHNlXG5cdFx0XHRcdFx0Ly8gTWFya2VyIFBhY2tldCAoT2Jzb2xldGUgTGl0ZXJhbCBQYWNrZXQpIChUYWcgMTApXG5cdFx0XHRcdFx0Ly8gXCJTdWNoIGEgcGFja2V0IE1VU1QgYmUgaWdub3JlZCB3aGVuIHJlY2VpdmVkLlwiIHNlZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0ODgwI3NlY3Rpb24tNS44XG5cdFx0XHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDEwKSB7XG5cdFx0XHRcdFx0XHQvLyByZXNldCBtZXNzYWdlc1xuXHRcdFx0XHRcdFx0bWVzc2FnZXMubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRcdC8vIGNvbnRpbnVlIHdpdGggbmV4dCBwYWNrZXRcblx0XHRcdFx0XHRcdG15cG9zICs9IGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGggKyBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoO1xuXHRcdFx0XHRcdFx0bCAtPSAoZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGgpO1xuXHRcdFx0XHR9IGVsc2UgXG5cdFx0XHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDExKSB7XG5cdFx0XHRcdFx0Ly8gTGl0ZXJhbCBNZXNzYWdlIC0tIHdvcmsgaXMgYWxyZWFkeSBkb25lIGluIHJlYWRfcGFja2V0XG5cdFx0XHRcdFx0bXlwb3MgKz0gZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGg7XG5cdFx0XHRcdFx0bCAtPSAoZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGgpO1xuXHRcdFx0XHRcdHNpZ25hdHVyZVRleHQgPSBmaXJzdF9wYWNrZXQuZGF0YTtcblx0XHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlQ291bnRdLmRhdGEgPSBmaXJzdF9wYWNrZXQuZGF0YTtcblx0XHRcdFx0XHRtZXNzYWdlQ291bnQrKztcblx0XHRcdFx0fSBlbHNlIFxuXHRcdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxOSkge1xuXHRcdFx0XHRcdC8vIE1vZGlmaWNhdGlvbiBEZXRlY3QgQ29kZVxuXHRcdFx0XHRcdFx0bXlwb3MgKz0gZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGg7XG5cdFx0XHRcdFx0XHRsIC09IChmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHV0aWwucHJpbnRfZXJyb3IoJ25vIG1lc3NhZ2UgZm91bmQhJyk7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gbWVzc2FnZXM7XG5cdH1cblx0XG5cdC8qKlxuXHQgKiBjcmVhdGVzIGEgYmluYXJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBlbmNyeXB0ZWQgYW5kIHNpZ25lZCBtZXNzYWdlLlxuXHQgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIGVuY3J5cHRlZCB3aXRoIHRoZSBwdWJsaWMga2V5cyBzcGVjaWZpZWQgYW5kIHNpZ25lZFxuXHQgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcHJpdmF0ZSBrZXkuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwcml2YXRla2V5IHtvYmo6IFtvcGVucGdwX21zZ19wcml2YXRla2V5XX0gUHJpdmF0ZSBrZXkgXG5cdCAqIHRvIGJlIHVzZWQgdG8gc2lnbiB0aGUgbWVzc2FnZVxuXHQgKiBAcGFyYW0ge09iamVjdFtdfSBwdWJsaWNrZXlzIEFuIGFycmFmIG9mIHtvYmo6IFtvcGVucGdwX21zZ19wdWJsaWNrZXldfVxuXHQgKiAtIHB1YmxpYyBrZXlzIHRvIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgbWVzc2FnZSBcblx0ICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2V0ZXh0IG1lc3NhZ2UgdGV4dCB0byBlbmNyeXB0IGFuZCBzaWduXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gYSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIHdoaWNoIFxuXHQgKiBjYW4gYmUgT3BlblBHUCBhcm1vcmVkXG5cdCAqL1xuXHRmdW5jdGlvbiB3cml0ZV9zaWduZWRfYW5kX2VuY3J5cHRlZF9tZXNzYWdlKHByaXZhdGVrZXksIHB1YmxpY2tleXMsIG1lc3NhZ2V0ZXh0KSB7XG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0dmFyIGxpdGVyYWwgPSBuZXcgb3BlbnBncF9wYWNrZXRfbGl0ZXJhbGRhdGEoKS53cml0ZV9wYWNrZXQobWVzc2FnZXRleHQucmVwbGFjZSgvXFxyXFxuL2csXCJcXG5cIikucmVwbGFjZSgvXFxuL2csXCJcXHJcXG5cIikpO1xuXHRcdHV0aWwucHJpbnRfZGVidWdfaGV4c3RyX2R1bXAoXCJsaXRlcmFsX3BhY2tldDogfFwiK2xpdGVyYWwrXCJ8XFxuXCIsbGl0ZXJhbCk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwdWJsaWNrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgb25lcGFzc3NpZ25hdHVyZSA9IG5ldyBvcGVucGdwX3BhY2tldF9vbmVwYXNzc2lnbmF0dXJlKCk7XG5cdFx0XHR2YXIgb25lcGFzc3NpZ3N0ciA9IFwiXCI7XG5cdFx0XHRpZiAoaSA9PSAwKVxuXHRcdFx0XHRvbmVwYXNzc2lnc3RyID0gb25lcGFzc3NpZ25hdHVyZS53cml0ZV9wYWNrZXQoMSwgb3BlbnBncC5jb25maWcuY29uZmlnLnByZWZlcl9oYXNoX2FsZ29yaXRobSwgIHByaXZhdGVrZXksIGZhbHNlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0b25lcGFzc3NpZ3N0ciA9IG9uZXBhc3NzaWduYXR1cmUud3JpdGVfcGFja2V0KDEsIG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5wcmVmZXJfaGFzaF9hbGdvcml0aG0sICBwcml2YXRla2V5LCBmYWxzZSk7XG5cdFx0XHR1dGlsLnByaW50X2RlYnVnX2hleHN0cl9kdW1wKFwib25lcGFzc3NpZ3N0cjogfFwiK29uZXBhc3NzaWdzdHIrXCJ8XFxuXCIsb25lcGFzc3NpZ3N0cik7XG5cdFx0XHR2YXIgZGF0YXNpZ25hdHVyZSA9IG5ldyBvcGVucGdwX3BhY2tldF9zaWduYXR1cmUoKS53cml0ZV9tZXNzYWdlX3NpZ25hdHVyZSgxLCBtZXNzYWdldGV4dC5yZXBsYWNlKC9cXHJcXG4vZyxcIlxcblwiKS5yZXBsYWNlKC9cXG4vZyxcIlxcclxcblwiKSwgcHJpdmF0ZWtleSk7XG5cdFx0XHR1dGlsLnByaW50X2RlYnVnX2hleHN0cl9kdW1wKFwiZGF0YXNpZ25hdHVyZTogfFwiK2RhdGFzaWduYXR1cmUub3BlbnBncCtcInxcXG5cIixkYXRhc2lnbmF0dXJlLm9wZW5wZ3ApO1xuXHRcdFx0aWYgKGkgPT0gMCkge1xuXHRcdFx0XHRyZXN1bHQgPSBvbmVwYXNzc2lnc3RyK2xpdGVyYWwrZGF0YXNpZ25hdHVyZS5vcGVucGdwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0ID0gb25lcGFzc3NpZ3N0cityZXN1bHQrZGF0YXNpZ25hdHVyZS5vcGVucGdwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHR1dGlsLnByaW50X2RlYnVnX2hleHN0cl9kdW1wKFwic2lnbmVkIHBhY2tldDogfFwiK3Jlc3VsdCtcInxcXG5cIixyZXN1bHQpO1xuXHRcdC8vIHNpZ25hdHVyZXMgZG9uZS4uIG5vdyBlbmNyeXB0aW9uXG5cdFx0dmFyIHNlc3Npb25rZXkgPSBvcGVucGdwX2NyeXB0b19nZW5lcmF0ZVNlc3Npb25LZXkob3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyKTsgXG5cdFx0dmFyIHJlc3VsdDIgPSBcIlwiO1xuXHRcdFxuXHRcdC8vIGNyZWF0aW5nIHNlc3Npb24ga2V5cyBmb3IgZWFjaCByZWNpcGllbnRcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHB1YmxpY2tleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBwa2V5ID0gcHVibGlja2V5c1tpXS5nZXRFbmNyeXB0aW9uS2V5KCk7XG5cdFx0XHRpZiAocGtleSA9PSBudWxsKSB7XG5cdFx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJubyBlbmNyeXB0aW9uIGtleSBmb3VuZCEgS2V5IGlzIGZvciBzaWduaW5nIG9ubHkuXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHJlc3VsdDIgKz0gbmV3IG9wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZHNlc3Npb25rZXkoKS5cblx0XHRcdFx0XHR3cml0ZV9wdWJfa2V5X3BhY2tldChcblx0XHRcdFx0XHRcdHBrZXkuZ2V0S2V5SWQoKSxcblx0XHRcdFx0XHRcdHBrZXkuTVBJcyxcblx0XHRcdFx0XHRcdHBrZXkucHVibGljS2V5QWxnb3JpdGhtLFxuXHRcdFx0XHRcdFx0b3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyLFxuXHRcdFx0XHRcdFx0c2Vzc2lvbmtleSk7XG5cdFx0fVxuXHRcdGlmIChvcGVucGdwLmNvbmZpZy5jb25maWcuaW50ZWdyaXR5X3Byb3RlY3QpIHtcblx0XHRcdHJlc3VsdDIgKz0gbmV3IG9wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZGludGVncml0eXByb3RlY3RlZGRhdGEoKS53cml0ZV9wYWNrZXQob3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyLCBzZXNzaW9ua2V5LCByZXN1bHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQyICs9IG5ldyBvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhKCkud3JpdGVfcGFja2V0KG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5lbmNyeXB0aW9uX2NpcGhlciwgc2Vzc2lvbmtleSwgcmVzdWx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9wZW5wZ3BfZW5jb2RpbmdfYXJtb3IoMyxyZXN1bHQyLG51bGwsbnVsbCk7XG5cdH1cblx0LyoqXG5cdCAqIGNyZWF0ZXMgYSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVuY3J5cHRlZCBtZXNzYWdlLlxuXHQgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIGVuY3J5cHRlZCB3aXRoIHRoZSBwdWJsaWMga2V5cyBzcGVjaWZpZWQgXG5cdCAqIEBwYXJhbSB7T2JqZWN0W119IHB1YmxpY2tleXMgQW4gYXJyYXkgb2Yge29iajogW29wZW5wZ3BfbXNnX3B1YmxpY2tleV19XG5cdCAqIC1wdWJsaWMga2V5cyB0byBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIG1lc3NhZ2UgXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdldGV4dCBtZXNzYWdlIHRleHQgdG8gZW5jcnlwdFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IGEgYmluYXJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZVxuXHQgKiB3aGljaCBjYW4gYmUgT3BlblBHUCBhcm1vcmVkXG5cdCAqL1xuXHRmdW5jdGlvbiB3cml0ZV9lbmNyeXB0ZWRfbWVzc2FnZShwdWJsaWNrZXlzLCBtZXNzYWdldGV4dCkge1xuXHRcdHZhciByZXN1bHQgPSBcIlwiO1xuXHRcdHZhciBsaXRlcmFsID0gbmV3IG9wZW5wZ3BfcGFja2V0X2xpdGVyYWxkYXRhKCkud3JpdGVfcGFja2V0KG1lc3NhZ2V0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLFwiXFxuXCIpLnJlcGxhY2UoL1xcbi9nLFwiXFxyXFxuXCIpKTtcblx0XHR1dGlsLnByaW50X2RlYnVnX2hleHN0cl9kdW1wKFwibGl0ZXJhbF9wYWNrZXQ6IHxcIitsaXRlcmFsK1wifFxcblwiLGxpdGVyYWwpO1xuXHRcdHJlc3VsdCA9IGxpdGVyYWw7XG5cdFx0XG5cdFx0Ly8gc2lnbmF0dXJlcyBkb25lLi4gbm93IGVuY3J5cHRpb25cblx0XHR2YXIgc2Vzc2lvbmtleSA9IG9wZW5wZ3BfY3J5cHRvX2dlbmVyYXRlU2Vzc2lvbktleShvcGVucGdwLmNvbmZpZy5jb25maWcuZW5jcnlwdGlvbl9jaXBoZXIpOyBcblx0XHR2YXIgcmVzdWx0MiA9IFwiXCI7XG5cdFx0XG5cdFx0Ly8gY3JlYXRpbmcgc2Vzc2lvbiBrZXlzIGZvciBlYWNoIHJlY2lwaWVudFxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcHVibGlja2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHBrZXkgPSBwdWJsaWNrZXlzW2ldLmdldEVuY3J5cHRpb25LZXkoKTtcblx0XHRcdGlmIChwa2V5ID09IG51bGwpIHtcblx0XHRcdFx0dXRpbC5wcmludF9lcnJvcihcIm5vIGVuY3J5cHRpb24ga2V5IGZvdW5kISBLZXkgaXMgZm9yIHNpZ25pbmcgb25seS5cIik7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmVzdWx0MiArPSBuZXcgb3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkc2Vzc2lvbmtleSgpLlxuXHRcdFx0XHRcdHdyaXRlX3B1Yl9rZXlfcGFja2V0KFxuXHRcdFx0XHRcdFx0cGtleS5nZXRLZXlJZCgpLFxuXHRcdFx0XHRcdFx0cGtleS5NUElzLFxuXHRcdFx0XHRcdFx0cGtleS5wdWJsaWNLZXlBbGdvcml0aG0sXG5cdFx0XHRcdFx0XHRvcGVucGdwLmNvbmZpZy5jb25maWcuZW5jcnlwdGlvbl9jaXBoZXIsXG5cdFx0XHRcdFx0XHRzZXNzaW9ua2V5KTtcblx0XHR9XG5cdFx0aWYgKG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5pbnRlZ3JpdHlfcHJvdGVjdCkge1xuXHRcdFx0cmVzdWx0MiArPSBuZXcgb3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkaW50ZWdyaXR5cHJvdGVjdGVkZGF0YSgpLndyaXRlX3BhY2tldChvcGVucGdwLmNvbmZpZy5jb25maWcuZW5jcnlwdGlvbl9jaXBoZXIsIHNlc3Npb25rZXksIHJlc3VsdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdDIgKz0gbmV3IG9wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZGRhdGEoKS53cml0ZV9wYWNrZXQob3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyLCBzZXNzaW9ua2V5LCByZXN1bHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3BlbnBncF9lbmNvZGluZ19hcm1vcigzLHJlc3VsdDIsbnVsbCxudWxsKTtcblx0fVxuXHRcblx0LyoqXG5cdCAqIGNyZWF0ZXMgYSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGEgc2lnbmVkIG1lc3NhZ2UuXG5cdCAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2lnbmVkIHdpdGggdGhlIHNwZWNpZmllZCBwcml2YXRlIGtleS5cblx0ICogQHBhcmFtIHtPYmplY3R9IHByaXZhdGVrZXkge29iajogW29wZW5wZ3BfbXNnX3ByaXZhdGVrZXldfVxuXHQgKiAtIHRoZSBwcml2YXRlIGtleSB0byBiZSB1c2VkIHRvIHNpZ24gdGhlIG1lc3NhZ2UgXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdldGV4dCBtZXNzYWdlIHRleHQgdG8gc2lnblxuXHQgKiBAcmV0dXJuIHtPYmplY3R9IHtPYmplY3Q6IHRleHQgW1N0cmluZ119LCBvcGVucGdwOiB7U3RyaW5nfSBhIGJpbmFyeVxuXHQgKiAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIHdoaWNoIGNhbiBiZSBPcGVuUEdQXG5cdCAqICAgYXJtb3JlZChvcGVucGdwKSBhbmQgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlICh0ZXh0KS4gXG5cdCAqIFRoaXMgY2FuIGJlIGRpcmVjdGx5IHVzZWQgdG8gT3BlblBHUCBhcm1vciB0aGUgbWVzc2FnZVxuXHQgKi9cblx0ZnVuY3Rpb24gd3JpdGVfc2lnbmVkX21lc3NhZ2UocHJpdmF0ZWtleSwgbWVzc2FnZXRleHQpIHtcblx0XHR2YXIgc2lnID0gbmV3IG9wZW5wZ3BfcGFja2V0X3NpZ25hdHVyZSgpLndyaXRlX21lc3NhZ2Vfc2lnbmF0dXJlKDEsIG1lc3NhZ2V0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLFwiXFxuXCIpLnJlcGxhY2UoL1xcbi8sXCJcXHJcXG5cIiksIHByaXZhdGVrZXkpO1xuXHRcdHZhciByZXN1bHQgPSB7dGV4dDogbWVzc2FnZXRleHQucmVwbGFjZSgvXFxyXFxuL2csXCJcXG5cIikucmVwbGFjZSgvXFxuLyxcIlxcclxcblwiKSwgb3BlbnBncDogc2lnLm9wZW5wZ3AsIGhhc2g6IHNpZy5oYXNofTtcblx0XHRyZXR1cm4gb3BlbnBncF9lbmNvZGluZ19hcm1vcigyLHJlc3VsdCwgbnVsbCwgbnVsbClcblx0fVxuXHRcblx0LyoqXG5cdCAqIGdlbmVyYXRlcyBhIG5ldyBrZXkgcGFpciBmb3Igb3BlbnBncC4gQmV0YSBzdGFnZS4gQ3VycmVudGx5IG9ubHkgXG5cdCAqIHN1cHBvcnRzIFJTQSBrZXlzLCBhbmQgbm8gc3Via2V5cy5cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBrZXlUeXBlIHRvIGluZGljYXRlIHdoYXQgdHlwZSBvZiBrZXkgdG8gbWFrZS4gXG5cdCAqIFJTQSBpcyAxLiBGb2xsb3dzIGFsZ29yaXRobXMgb3V0bGluZWQgaW4gT3BlblBHUC5cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBudW1CaXRzIG51bWJlciBvZiBiaXRzIGZvciB0aGUga2V5IGNyZWF0aW9uLiAoc2hvdWxkIFxuXHQgKiBiZSAxMDI0KywgZ2VuZXJhbGx5KVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXNlcklkIGFzc3VtZXMgYWxyZWFkeSBpbiBmb3JtIG9mIFwiVXNlciBOYW1lIFxuXHQgKiA8dXNlcm5hbWVAZW1haWwuY29tPlwiXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzcGhyYXNlIFRoZSBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCB0aGUgcmVzdWx0aW5nIHByaXZhdGUga2V5XG5cdCAqIEByZXR1cm4ge09iamVjdH0ge3ByaXZhdGVLZXk6IFtvcGVucGdwX21zZ19wcml2YXRla2V5XSwgXG5cdCAqIHByaXZhdGVLZXlBcm1vcmVkOiBbc3RyaW5nXSwgcHVibGljS2V5QXJtb3JlZDogW3N0cmluZ119XG5cdCAqL1xuXHRmdW5jdGlvbiBnZW5lcmF0ZV9rZXlfcGFpcihrZXlUeXBlLCBudW1CaXRzLCB1c2VySWQsIHBhc3NwaHJhc2Upe1xuXHRcdHZhciB1c2VySWRQYWNrZXQgPSBuZXcgb3BlbnBncF9wYWNrZXRfdXNlcmlkKCk7XG5cdFx0dmFyIHVzZXJJZFN0cmluZyA9IHVzZXJJZFBhY2tldC53cml0ZV9wYWNrZXQodXNlcklkKTtcblx0XHRcblx0XHR2YXIga2V5UGFpciA9IG9wZW5wZ3BfY3J5cHRvX2dlbmVyYXRlS2V5UGFpcihrZXlUeXBlLG51bUJpdHMsIHBhc3NwaHJhc2UsIG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5wcmVmZXJfaGFzaF9hbGdvcml0aG0sIDMpO1xuXHRcdHZhciBwcml2S2V5U3RyaW5nID0ga2V5UGFpci5wcml2YXRlS2V5O1xuXHRcdHZhciBwcml2S2V5UGFja2V0ID0gbmV3IG9wZW5wZ3BfcGFja2V0X2tleW1hdGVyaWFsKCkucmVhZF9wcml2X2tleShwcml2S2V5U3RyaW5nLnN0cmluZywzLHByaXZLZXlTdHJpbmcuc3RyaW5nLmxlbmd0aCk7XG5cdFx0aWYoIXByaXZLZXlQYWNrZXQuZGVjcnlwdFNlY3JldE1QSXMocGFzc3BocmFzZSkpXG5cdFx0ICAgIHV0aWwucHJpbnRfZXJyb3IoJ0lzc3VlIGNyZWF0aW5nIGtleS4gVW5hYmxlIHRvIHJlYWQgcmVzdWx0aW5nIHByaXZhdGUga2V5Jyk7XG5cdFx0dmFyIHByaXZLZXkgPSBuZXcgb3BlbnBncF9tc2dfcHJpdmF0ZWtleSgpO1xuXHRcdHByaXZLZXkucHJpdmF0ZUtleVBhY2tldCA9IHByaXZLZXlQYWNrZXQ7XG5cdFx0cHJpdktleS5nZXRQcmVmZXJyZWRTaWduYXR1cmVIYXNoQWxnb3JpdGhtID0gZnVuY3Rpb24oKXtyZXR1cm4gb3BlbnBncC5jb25maWcuY29uZmlnLnByZWZlcl9oYXNoX2FsZ29yaXRobX07Ly9uZWVkIHRvIG92ZXJyaWRlIHRoaXMgdG8gc29sdmUgY2F0Y2ggMjIgdG8gZ2VuZXJhdGUgc2lnbmF0dXJlLiA4IGlzIHZhbHVlIGZvciBTSEEyNTZcblx0XHRcblx0XHR2YXIgcHVibGljS2V5U3RyaW5nID0gcHJpdktleS5wcml2YXRlS2V5UGFja2V0LnB1YmxpY0tleS5kYXRhO1xuXHRcdHZhciBoYXNoRGF0YSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHg5OSkrIFN0cmluZy5mcm9tQ2hhckNvZGUoKChwdWJsaWNLZXlTdHJpbmcubGVuZ3RoKSA+PiA4KSAmIDB4RkYpIFxuXHRcdFx0KyBTdHJpbmcuZnJvbUNoYXJDb2RlKChwdWJsaWNLZXlTdHJpbmcubGVuZ3RoKSAmIDB4RkYpICtwdWJsaWNLZXlTdHJpbmcrU3RyaW5nLmZyb21DaGFyQ29kZSgweEI0KSArXG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCh1c2VySWQubGVuZ3RoKSA+PiAyNCkgK1N0cmluZy5mcm9tQ2hhckNvZGUoKCh1c2VySWQubGVuZ3RoKSA+PiAxNikgJiAweEZGKSBcblx0XHRcdCsgU3RyaW5nLmZyb21DaGFyQ29kZSgoKHVzZXJJZC5sZW5ndGgpID4+IDgpICYgMHhGRikgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKCh1c2VySWQubGVuZ3RoKSAmIDB4RkYpICsgdXNlcklkXG5cdFx0dmFyIHNpZ25hdHVyZSA9IG5ldyBvcGVucGdwX3BhY2tldF9zaWduYXR1cmUoKTtcblx0XHRzaWduYXR1cmUgPSBzaWduYXR1cmUud3JpdGVfbWVzc2FnZV9zaWduYXR1cmUoMTYsaGFzaERhdGEsIHByaXZLZXkpO1xuXHRcdHZhciBwdWJsaWNBcm1vcmVkID0gb3BlbnBncF9lbmNvZGluZ19hcm1vcig0LCBrZXlQYWlyLnB1YmxpY0tleS5zdHJpbmcgKyB1c2VySWRTdHJpbmcgKyBzaWduYXR1cmUub3BlbnBncCApO1xuXG5cdFx0dmFyIHByaXZBcm1vcmVkID0gb3BlbnBncF9lbmNvZGluZ19hcm1vcig1LHByaXZLZXlTdHJpbmcuc3RyaW5nK3VzZXJJZFN0cmluZytzaWduYXR1cmUub3BlbnBncCk7XG5cdFx0XG5cdFx0cmV0dXJuIHtwcml2YXRlS2V5IDogcHJpdktleSwgcHJpdmF0ZUtleUFybW9yZWQ6IHByaXZBcm1vcmVkLCBwdWJsaWNLZXlBcm1vcmVkOiBwdWJsaWNBcm1vcmVkfVxuXHR9XG5cdFxuXHR0aGlzLmdlbmVyYXRlX2tleV9wYWlyID0gZ2VuZXJhdGVfa2V5X3BhaXI7XG5cdHRoaXMud3JpdGVfc2lnbmVkX21lc3NhZ2UgPSB3cml0ZV9zaWduZWRfbWVzc2FnZTsgXG5cdHRoaXMud3JpdGVfc2lnbmVkX2FuZF9lbmNyeXB0ZWRfbWVzc2FnZSA9IHdyaXRlX3NpZ25lZF9hbmRfZW5jcnlwdGVkX21lc3NhZ2U7XG5cdHRoaXMud3JpdGVfZW5jcnlwdGVkX21lc3NhZ2UgPSB3cml0ZV9lbmNyeXB0ZWRfbWVzc2FnZTtcblx0dGhpcy5yZWFkX21lc3NhZ2UgPSByZWFkX21lc3NhZ2U7XG5cdHRoaXMucmVhZF9tZXNzYWdlc19kZWFybW9yZWQgPSByZWFkX21lc3NhZ2VzX2RlYXJtb3JlZDtcblx0dGhpcy5yZWFkX3B1YmxpY0tleSA9IHJlYWRfcHVibGljS2V5O1xuXHR0aGlzLnJlYWRfcHJpdmF0ZUtleSA9IHJlYWRfcHJpdmF0ZUtleTtcblx0dGhpcy5pbml0ID0gaW5pdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgX29wZW5wZ3AoKTtcblxuIiwiXG52YXIgZW51bXMgPSByZXF1aXJlKCcuLi9lbnVtcy5qcycpO1xuXG4vLyBUaGlzIGlzIHByZXR0eSB1Z2x5LCBidXQgYnJvd3NlcmlmeSBuZWVkcyB0byBoYXZlIHRoZSByZXF1aXJlcyBleHBsaWNpdGx5IHdyaXR0ZW4uXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Y29tcHJlc3NlZDogcmVxdWlyZSgnLi9jb21wcmVzc2VkLmpzJyksXG5cdHN5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZDogcmVxdWlyZSgnLi9zeW1fZW5jcnlwdGVkX2ludGVncml0eV9wcm90ZWN0ZWQuanMnKSxcblx0cHVibGljX2tleV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXk6IHJlcXVpcmUoJy4vcHVibGljX2tleV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkuanMnKSxcblx0c3ltX2VuY3J5cHRlZF9zZXNzaW9uX2tleTogcmVxdWlyZSgnLi9zeW1fZW5jcnlwdGVkX3Nlc3Npb25fa2V5LmpzJyksXG5cdGxpdGVyYWw6IHJlcXVpcmUoJy4vbGl0ZXJhbC5qcycpLFxuXHRwdWJsaWNfa2V5OiByZXF1aXJlKCcuL3B1YmxpY19rZXkuanMnKSxcblx0c3ltbWV0cmljYWxseV9lbmNyeXB0ZWQ6IHJlcXVpcmUoJy4vc3ltbWV0cmljYWxseV9lbmNyeXB0ZWQuanMnKSxcblx0bWFya2VyOiByZXF1aXJlKCcuL21hcmtlci5qcycpLFxuXHRwdWJsaWNfc3Via2V5OiByZXF1aXJlKCcuL3B1YmxpY19zdWJrZXkuanMnKSxcblx0dXNlcl9hdHRyaWJ1dGU6IHJlcXVpcmUoJy4vdXNlcl9hdHRyaWJ1dGUuanMnKSxcblx0b25lX3Bhc3Nfc2lnbmF0dXJlOiByZXF1aXJlKCcuL29uZV9wYXNzX3NpZ25hdHVyZS5qcycpLFxuXHRzZWNyZXRfa2V5OiByZXF1aXJlKCcuL3NlY3JldF9rZXkuanMnKSxcblx0dXNlcmlkOiByZXF1aXJlKCcuL3VzZXJpZC5qcycpLFxuXHRzZWNyZXRfc3Via2V5OiByZXF1aXJlKCcuL3NlY3JldF9zdWJrZXkuanMnKSxcblx0c2lnbmF0dXJlOiByZXF1aXJlKCcuL3NpZ25hdHVyZS5qcycpLFxuXHR0cnVzdDogcmVxdWlyZSgnLi90cnVzdC5qcycpXG59XG5cbmZvcih2YXIgaSBpbiBlbnVtcy5wYWNrZXQpIHtcblx0dmFyIHBhY2tldENsYXNzID0gbW9kdWxlLmV4cG9ydHNbaV07XG5cblx0aWYocGFja2V0Q2xhc3MgIT0gdW5kZWZpbmVkKVxuXHRcdHBhY2tldENsYXNzLnByb3RvdHlwZS50YWcgPSBlbnVtcy5wYWNrZXRbaV07XG59XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgZW51bXMgPSByZXF1aXJlKCcuLi9lbnVtcy5qcycpLFxuXHRKWEcgPSByZXF1aXJlKCcuLi9jb21wcmVzc2lvbi9qeGcuanMnKSxcblx0YmFzZTY0ID0gcmVxdWlyZSgnLi4vZW5jb2RpbmcvYmFzZTY0LmpzJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wcmVzc2VkIERhdGEgUGFja2V0IChUYWcgOClcbiAqIFxuICogUkZDNDg4MCA1LjY6XG4gKiBUaGUgQ29tcHJlc3NlZCBEYXRhIHBhY2tldCBjb250YWlucyBjb21wcmVzc2VkIGRhdGEuICBUeXBpY2FsbHksIHRoaXNcbiAqIHBhY2tldCBpcyBmb3VuZCBhcyB0aGUgY29udGVudHMgb2YgYW4gZW5jcnlwdGVkIHBhY2tldCwgb3IgZm9sbG93aW5nXG4gKiBhIFNpZ25hdHVyZSBvciBPbmUtUGFzcyBTaWduYXR1cmUgcGFja2V0LCBhbmQgY29udGFpbnMgYSBsaXRlcmFsIGRhdGFcbiAqIHBhY2tldC5cbiAqLyAgIFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrZXRfY29tcHJlc3NlZCgpIHtcblx0LyoqIEB0eXBlIHtwYWNrZXRsaXN0fSAqL1xuXHR0aGlzLnBhY2tldHM7XG5cdC8qKiBAdHlwZSB7Y29tcHJlc3Npb259ICovXG5cdHRoaXMuYWxnb3JpdGhtID0gJ3VuY29tcHJlc3NlZCc7XG5cblx0dGhpcy5jb21wcmVzc2VkID0gbnVsbDtcblxuXHRcblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIHRoZSBwYWNrZXQuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBQYXlsb2FkIG9mIGEgdGFnIDggcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcblx0ICogQHBhckFNIHtpTlRFR0VSfSBMRU4gbEVOR1RIIE9GIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgXG5cdCAqIGlucHV0IGF0IHBvc2l0aW9uXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfcGFja2V0X2NvbXByZXNzZWR9IE9iamVjdCByZXByZXNlbnRhdGlvblxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHQvLyBPbmUgb2N0ZXQgdGhhdCBnaXZlcyB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gY29tcHJlc3MgdGhlIHBhY2tldC5cblx0XHR0aGlzLmFsZ29yaXRobSA9IGVudW1zLnJlYWQoZW51bXMuY29tcHJlc3Npb24sIGJ5dGVzLmNoYXJDb2RlQXQoMCkpO1xuXG5cdFx0Ly8gQ29tcHJlc3NlZCBkYXRhLCB3aGljaCBtYWtlcyB1cCB0aGUgcmVtYWluZGVyIG9mIHRoZSBwYWNrZXQuXG5cdFx0dGhpcy5jb21wcmVzc2VkID0gYnl0ZXMuc3Vic3RyKDEpO1xuXG5cdFx0dGhpcy5kZWNvbXByZXNzKCk7XG5cdH1cblxuXHRcblx0XG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZih0aGlzLmNvbXByZXNzZWQgPT0gbnVsbClcblx0XHRcdHRoaXMuY29tcHJlc3MoKTtcblxuXHRcdHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLmNvbXByZXNzaW9uLCB0aGlzLmFsZ29yaXRobSkpIFxuXHRcdFx0KyB0aGlzLmNvbXByZXNzZWQ7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBEZWNvbXByZXNzaW9uIG1ldGhvZCBmb3IgZGVjb21wcmVzc2luZyB0aGUgY29tcHJlc3NlZCBkYXRhXG5cdCAqIHJlYWQgYnkgcmVhZF9wYWNrZXRcblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgZGVjb21wcmVzc2VkIGRhdGFcblx0ICovXG5cdHRoaXMuZGVjb21wcmVzcyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBkZWNvbXByZXNzZWQ7XG5cblx0XHRzd2l0Y2ggKHRoaXMuYWxnb3JpdGhtKSB7XG5cdFx0Y2FzZSAndW5jb21wcmVzc2VkJzpcblx0XHRcdGRlY29tcHJlc3NlZCA9IHRoaXMuY29tcHJlc3NlZDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnemlwJzpcblx0XHRcdHZhciBjb21wRGF0YSA9IHRoaXMuY29tcHJlc3NlZDtcblxuXHRcdFx0dmFyIHJhZGl4ID0gYmFzZTY0LmVuY29kZShjb21wRGF0YSkucmVwbGFjZSgvXFxuL2csXCJcIik7XG5cdFx0XHQvLyBubyBoZWFkZXIgaW4gdGhpcyBjYXNlLCBkaXJlY3RseSBjYWxsIGRlZmxhdGVcblx0XHRcdHZhciBqeGdfb2JqID0gbmV3IEpYRy5VdGlsLlVuemlwKEpYRy5VdGlsLkJhc2U2NC5kZWNvZGVBc0FycmF5KHJhZGl4KSk7XG5cblx0XHRcdGRlY29tcHJlc3NlZCA9IHVuZXNjYXBlKGp4Z19vYmouZGVmbGF0ZSgpWzBdWzBdKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnemxpYic6XG5cdFx0XHQvL1JGQyAxOTUwLiBCaXRzIDAtMyBDb21wcmVzc2lvbiBNZXRob2Rcblx0XHRcdHZhciBjb21wcmVzc2lvbk1ldGhvZCA9IHRoaXMuY29tcHJlc3NlZC5jaGFyQ29kZUF0KDApICUgMHgxMDtcblxuXHRcdFx0Ly9CaXRzIDQtNyBSRkMgMTk1MCBhcmUgTFo3NyBXaW5kb3cuIEdlbmVyYWxseSB0aGlzIHZhbHVlIGlzIDcgPT0gMzJrIHdpbmRvdyBzaXplLlxuXHRcdFx0Ly8gMm5kIEJ5dGUgaW4gUkZDIDE5NTAgaXMgZm9yIFwiRkxBR3NcIiBBbGxvd3MgZm9yIGEgRGljdGlvbmFyeSBcblx0XHRcdC8vIChob3cgaXMgdGhpcyBkZWZpbmVkKS4gQmFzaWMgY2hlY2tzdW0sIGFuZCBjb21wcmVzc2lvbiBsZXZlbC5cblxuXHRcdFx0aWYgKGNvbXByZXNzaW9uTWV0aG9kID09IDgpIHsgLy9DTSA4IGlzIGZvciBERUZMQVRFLCBSRkMgMTk1MVxuXHRcdFx0XHQvLyByZW1vdmUgNCBieXRlcyBBRExFUjMyIGNoZWNrc3VtIGZyb20gdGhlIGVuZFxuXHRcdFx0XHR2YXIgY29tcERhdGEgPSB0aGlzLmNvbXByZXNzZWQuc3Vic3RyaW5nKDAsIHRoaXMuY29tcHJlc3NlZC5sZW5ndGggLSA0KTtcblx0XHRcdFx0dmFyIHJhZGl4ID0gYmFzZTY0LmVuY29kZShjb21wRGF0YSkucmVwbGFjZSgvXFxuL2csXCJcIik7XG5cdFx0XHRcdC8vVE9ETyBjaGVjayBBRExFUjMyIGNoZWNrc3VtXG5cdFx0XHRcdGRlY29tcHJlc3NlZCA9IEpYRy5kZWNvbXByZXNzKHJhZGl4KTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJDb21wcmVzc2lvbiBhbGdvcml0aG0gWkxJQiBvbmx5IHN1cHBvcnRzIFwiICtcblx0XHRcdFx0XHRcIkRFRkxBVEUgY29tcHJlc3Npb24gbWV0aG9kLlwiKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnYnppcDInOlxuXHRcdFx0Ly8gVE9ETzogbmVlZCB0byBpbXBsZW1lbnQgdGhpc1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDb21wcmVzc2lvbiBhbGdvcml0aG0gQlppcDIgW0JaMl0gaXMgbm90IGltcGxlbWVudGVkLicpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29tcHJlc3Npb24gYWxnb3JpdGhtIHVua25vd24gOlwiICsgdGhpcy5hbG9ncml0aG0pO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0dGhpcy5wYWNrZXRzLnJlYWQoZGVjb21wcmVzc2VkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wcmVzcyB0aGUgcGFja2V0IGRhdGEgKG1lbWJlciBkZWNvbXByZXNzZWREYXRhKVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHR5cGUgQWxnb3JpdGhtIHRvIGJlIHVzZWQgLy8gU2VlIFJGQyA0ODgwIDkuM1xuXHQgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGJlIGNvbXByZXNzZWRcblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgY29tcHJlc3NlZCBkYXRhIHN0b3JlZCBpbiBhdHRyaWJ1dGUgY29tcHJlc3NlZERhdGFcblx0ICovXG5cdHRoaXMuY29tcHJlc3MgPSBmdW5jdGlvbigpIHtcblx0XHRzd2l0Y2ggKHRoaXMuYWxnb3JpdGhtKSB7XG5cblx0XHRjYXNlICd1bmNvbXByZXNzZWQnOiAvLyAtIFVuY29tcHJlc3NlZFxuXHRcdFx0dGhpcy5jb21wcmVzc2VkID0gdGhpcy5wYWNrZXRzLndyaXRlKCk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3ppcCc6IC8vIC0gWklQIFtSRkMxOTUxXVxuXHRcdFx0dXRpbC5wcmludF9lcnJvcihcIkNvbXByZXNzaW9uIGFsZ29yaXRobSBaSVAgW1JGQzE5NTFdIGlzIG5vdCBpbXBsZW1lbnRlZC5cIik7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3psaWInOiAvLyAtIFpMSUIgW1JGQzE5NTBdXG5cdFx0XHQvLyBUT0RPOiBuZWVkIHRvIGltcGxlbWVudCB0aGlzXG5cdFx0XHR1dGlsLnByaW50X2Vycm9yKFwiQ29tcHJlc3Npb24gYWxnb3JpdGhtIFpMSUIgW1JGQzE5NTBdIGlzIG5vdCBpbXBsZW1lbnRlZC5cIik7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ2J6aXAyJzogLy8gIC0gQlppcDIgW0JaMl1cblx0XHRcdC8vIFRPRE86IG5lZWQgdG8gaW1wbGVtZW50IHRoaXNcblx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJDb21wcmVzc2lvbiBhbGdvcml0aG0gQlppcDIgW0JaMl0gaXMgbm90IGltcGxlbWVudGVkLlwiKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJDb21wcmVzc2lvbiBhbGdvcml0aG0gdW5rbm93biA6XCIrdGhpcy50eXBlKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxufTtcbiIsIlxudmFyIGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGxpc3Q6IHJlcXVpcmUoJy4vcGFja2V0bGlzdC5qcycpLFxufVxuXG52YXIgcGFja2V0cyA9IHJlcXVpcmUoJy4vYWxsX3BhY2tldHMuanMnKTtcblxuZm9yKHZhciBpIGluIHBhY2tldHMpXG5cdG1vZHVsZS5leHBvcnRzW2ldID0gcGFja2V0c1tpXTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBMaXRlcmFsIERhdGEgUGFja2V0IChUYWcgMTEpXG4gKiBcbiAqIFJGQzQ4ODAgNS45OiBBIExpdGVyYWwgRGF0YSBwYWNrZXQgY29udGFpbnMgdGhlIGJvZHkgb2YgYSBtZXNzYWdlOyBkYXRhIHRoYXRcbiAqIGlzIG5vdCB0byBiZSBmdXJ0aGVyIGludGVycHJldGVkLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldF9saXRlcmFsKCkge1xuXHR0aGlzLmZvcm1hdCA9ICd1dGY4Jztcblx0dGhpcy5kYXRhID0gJyc7XG5cdHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XG5cblx0XG5cdC8qKlxuXHQgKiBTZXQgdGhlIHBhY2tldCBkYXRhIHRvIGEgamF2YXNjcmlwdCBuYXRpdmUgc3RyaW5nIG9yIGEgc3F1ZW5jZSBvZiBcblx0ICogYnl0ZXMuIENvbnZlcnNpb24gdG8gYSBwcm9wZXIgdXRmOCBlbmNvZGluZyB0YWtlcyBwbGFjZSB3aGVuIHRoZSBcblx0ICogcGFja2V0IGlzIHdyaXR0ZW4uXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgQW55IG5hdGl2ZSBqYXZhc2NyaXB0IHN0cmluZ1xuXHQgKiBAcGFyYW0ge29wZW5wZ3BfcGFja2V0X2xpdGVyYWxkYXRhLmZvcm1hdH0gZm9ybWF0IFxuXHQgKi9cblx0dGhpcy5zZXQgPSBmdW5jdGlvbihzdHIsIGZvcm1hdCkge1xuXHRcdHRoaXMuZm9ybWF0ID0gZm9ybWF0O1xuXHRcdHRoaXMuZGF0YSA9IHN0cjtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIHBhY2tldCBkYXRhIHRvIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBwcm92aWRlZCBzdHJpbmdcblx0ICogb2YgYnl0ZXMgdG9nZXRoZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29udmVyc2lvbiBmb3JtYXQuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBieXRlcyBUaGUgc3RyaW5nIG9mIGJ5dGVzXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9wYWNrZXRfbGl0ZXJhbGRhdGEuZm9ybWF0fSBmb3JtYXRcblx0ICovXG5cdHRoaXMuc2V0Qnl0ZXMgPSBmdW5jdGlvbihieXRlcywgZm9ybWF0KSB7XG5cdFx0dGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG5cblx0XHRpZihmb3JtYXQgPT0gJ3V0ZjgnKVxuXHRcdFx0Ynl0ZXMgPSB1dGlsLmRlY29kZV91dGY4KGJ5dGVzKTtcblxuXHRcdHRoaXMuZGF0YSA9IGJ5dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgYnl0ZSBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIGxpdGVyYWwgcGFja2V0IGRhdGFcblx0ICogQHJldHVybnMge1N0cmluZ30gQSBzZXF1ZW5jZSBvZiBieXRlc1xuXHQgKi9cblx0dGhpcy5nZXRCeXRlcyA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmKHRoaXMuZm9ybWF0ID09ICd1dGY4Jylcblx0XHRcdHJldHVybiB1dGlsLmVuY29kZV91dGY4KHRoaXMuZGF0YSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YTtcblx0fVxuXHRcblx0XG5cblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgbGl0ZXJhbCBkYXRhIHBhY2tldCAodGFnIDExKS5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBQYXlsb2FkIG9mIGEgdGFnIDExIHBhY2tldFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHBvc2l0aW9uXG5cdCAqICAgICAgICAgICAgUG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5cblx0ICogICAgICAgICAgICBMZW5ndGggb2YgdGhlIHBhY2tldCBvciB0aGUgcmVtYWluaW5nIGxlbmd0aCBvZlxuXHQgKiAgICAgICAgICAgIGlucHV0IGF0IHBvc2l0aW9uXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZGRhdGF9IG9iamVjdCByZXByZXNlbnRhdGlvblxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHQvLyAtIEEgb25lLW9jdGV0IGZpZWxkIHRoYXQgZGVzY3JpYmVzIGhvdyB0aGUgZGF0YSBpcyBmb3JtYXR0ZWQuXG5cblx0XHR2YXIgZm9ybWF0ID0gZW51bXMucmVhZChlbnVtcy5saXRlcmFsLCBieXRlc1swXS5jaGFyQ29kZUF0KCkpO1xuXG5cdFx0dmFyIGZpbGVuYW1lX2xlbiA9IGJ5dGVzLmNoYXJDb2RlQXQoMSk7XG5cdFx0dGhpcy5maWxlbmFtZSA9IHV0aWwuZGVjb2RlX3V0ZjgoYnl0ZXMuc3Vic3RyKDIsIGZpbGVuYW1lX2xlbikpO1xuXG5cdFx0dGhpcy5kYXRlID0gdXRpbC5yZWFkRGF0ZShieXRlcy5zdWJzdHIoMlxuXHRcdFx0XHQrIGZpbGVuYW1lX2xlbiwgNCkpO1xuXG5cdFx0dmFyIGRhdGEgPSBieXRlcy5zdWJzdHJpbmcoNiArIGZpbGVuYW1lX2xlbik7XG5cdFxuXHRcdHRoaXMuc2V0Qnl0ZXMoZGF0YSwgZm9ybWF0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYWNrZXRcblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIGluc2VydGVkIGFzIGJvZHlcblx0ICogQHJldHVybiB7U3RyaW5nfSBzdHJpbmctcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhY2tldFxuXHQgKi9cblx0dGhpcy53cml0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBmaWxlbmFtZSA9IHV0aWwuZW5jb2RlX3V0ZjgoXCJtc2cudHh0XCIpO1xuXG5cdFx0dmFyIGRhdGEgPSB0aGlzLmdldEJ5dGVzKCk7XG5cblx0XHR2YXIgcmVzdWx0ID0gJyc7XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZW51bXMud3JpdGUoZW51bXMubGl0ZXJhbCwgdGhpcy5mb3JtYXQpKTtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmaWxlbmFtZS5sZW5ndGgpO1xuXHRcdHJlc3VsdCArPSBmaWxlbmFtZTtcblx0XHRyZXN1bHQgKz0gdXRpbC53cml0ZURhdGUodGhpcy5kYXRlKTtcblx0XHRyZXN1bHQgKz0gZGF0YTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RyYW5nZSBcIk1hcmtlciBwYWNrZXRcIiAoVGFnIDEwKVxuICogXG4gKiBSRkM0ODgwIDUuODogQW4gZXhwZXJpbWVudGFsIHZlcnNpb24gb2YgUEdQIHVzZWQgdGhpcyBwYWNrZXQgYXMgdGhlIExpdGVyYWxcbiAqIHBhY2tldCwgYnV0IG5vIHJlbGVhc2VkIHZlcnNpb24gb2YgUEdQIGdlbmVyYXRlZCBMaXRlcmFsIHBhY2tldHMgd2l0aCB0aGlzXG4gKiB0YWcuIFdpdGggUEdQIDUueCwgdGhpcyBwYWNrZXQgaGFzIGJlZW4gcmVhc3NpZ25lZCBhbmQgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBhc1xuICogdGhlIE1hcmtlciBwYWNrZXQuXG4gKiBcbiAqIFN1Y2ggYSBwYWNrZXQgTVVTVCBiZSBpZ25vcmVkIHdoZW4gcmVjZWl2ZWQuXG4gKi9cbmZ1bmN0aW9uIHBhY2tldF9tYXJrZXIoKSB7XG5cdC8qKlxuXHQgKiBQYXJzaW5nIGZ1bmN0aW9uIGZvciBhIGxpdGVyYWwgZGF0YSBwYWNrZXQgKHRhZyAxMCkuXG5cdCAqIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgUGF5bG9hZCBvZiBhIHRhZyAxMCBwYWNrZXRcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvblxuXHQgKiAgICAgICAgICAgIFBvc2l0aW9uIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyaW5nXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuXG5cdCAqICAgICAgICAgICAgTGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2Zcblx0ICogICAgICAgICAgICBpbnB1dCBhdCBwb3NpdGlvblxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhfSBPYmplY3QgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0aWYgKGJ5dGVzWzBdLmNoYXJDb2RlQXQoKSA9PSAweDUwICYmIC8vIFBcblx0XHRcdFx0Ynl0ZXNbMV0uY2hhckNvZGVBdCgpID09IDB4NDcgJiYgLy8gR1xuXHRcdFx0XHRieXRlc1syXS5jaGFyQ29kZUF0KCkgPT0gMHg1MCkgLy8gUFxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Ly8gbWFya2VyIHBhY2tldCBkb2VzIG5vdCBjb250YWluIFwiUEdQXCJcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYWNrZXRfbWFya2VyO1xuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKSxcblx0dXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZFNpbXBsZUxlbmd0aDogZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgbGVuID0gMCxcblx0XHRcdG9mZnNldCxcblx0XHRcdHR5cGUgPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cblxuXHRcdGlmICh0eXBlIDwgMTkyKSB7XG5cdFx0XHRsZW4gPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHRvZmZzZXQgPSAxO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA8IDI1NSkge1xuXHRcdFx0bGVuID0gKChieXRlc1swXS5jaGFyQ29kZUF0KCkgLSAxOTIpIDw8IDgpICsgKGJ5dGVzWzFdLmNoYXJDb2RlQXQoKSkgKyAxOTI7XG5cdFx0XHRvZmZzZXQgPSAyO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PSAyNTUpIHtcblx0XHRcdGxlbiA9IHV0aWwucmVhZE51bWJlcihieXRlcy5zdWJzdHIoMSwgNCkpO1xuXHRcdFx0b2Zmc2V0ID0gNTtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBsZW46IGxlbiwgb2Zmc2V0OiBvZmZzZXQgfTtcblx0fSxcblxuXHQvKipcblx0ICogRW5jb2RlcyBhIGdpdmVuIGludGVnZXIgb2YgbGVuZ3RoIHRvIHRoZSBvcGVucGdwIGxlbmd0aCBzcGVjaWZpZXIgdG8gYVxuXHQgKiBzdHJpbmdcblx0ICogXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIFRoZSBsZW5ndGggdG8gZW5jb2RlXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIHdpdGggb3BlbnBncCBsZW5ndGggcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHdyaXRlU2ltcGxlTGVuZ3RoOiBmdW5jdGlvbihsZW5ndGgpIHtcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcblx0XHRpZiAobGVuZ3RoIDwgMTkyKSB7XG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW5ndGgpO1xuXHRcdH0gZWxzZSBpZiAobGVuZ3RoID4gMTkxICYmIGxlbmd0aCA8IDgzODQpIHtcblx0XHRcdC8qXG5cdFx0XHQgKiBsZXQgYSA9ICh0b3RhbCBkYXRhIHBhY2tldCBsZW5ndGgpIC0gMTkyIGxldCBiYyA9IHR3byBvY3RldFxuXHRcdFx0ICogcmVwcmVzZW50YXRpb24gb2YgYSBsZXQgZCA9IGIgKyAxOTJcblx0XHRcdCAqL1xuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChsZW5ndGggLSAxOTIpID4+IDgpICsgMTkyKTtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChsZW5ndGggLSAxOTIpICYgMHhGRik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSk7XG5cdFx0XHRyZXN1bHQgKz0gdXRpbC53cml0ZU51bWJlcihsZW5ndGgsIDQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBXcml0ZXMgYSBwYWNrZXQgaGVhZGVyIHZlcnNpb24gNCB3aXRoIHRoZSBnaXZlbiB0YWdfdHlwZSBhbmQgbGVuZ3RoIHRvIGFcblx0ICogc3RyaW5nXG5cdCAqIFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHRhZ190eXBlIFRhZyB0eXBlXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFN0cmluZyBvZiB0aGUgaGVhZGVyXG5cdCAqL1xuXHR3cml0ZUhlYWRlcjogZnVuY3Rpb24odGFnX3R5cGUsIGxlbmd0aCkge1xuXHRcdC8qIHdlJ3JlIG9ubHkgZ2VuZXJhdGluZyB2NCBwYWNrZXQgaGVhZGVycyBoZXJlICovXG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhDMCB8IHRhZ190eXBlKTtcblx0XHRyZXN1bHQgKz0gdGhpcy53cml0ZVNpbXBsZUxlbmd0aChsZW5ndGgpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFdyaXRlcyBhIHBhY2tldCBoZWFkZXIgVmVyc2lvbiAzIHdpdGggdGhlIGdpdmVuIHRhZ190eXBlIGFuZCBsZW5ndGggdG8gYVxuXHQgKiBzdHJpbmdcblx0ICogXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gdGFnX3R5cGUgVGFnIHR5cGVcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBwYXlsb2FkXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIG9mIHRoZSBoZWFkZXJcblx0ICovXG5cdHdyaXRlT2xkSGVhZGVyOiBmdW5jdGlvbih0YWdfdHlwZSwgbGVuZ3RoKSB7XG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0aWYgKGxlbmd0aCA8IDI1Nikge1xuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHg4MCB8ICh0YWdfdHlwZSA8PCAyKSk7XG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW5ndGgpO1xuXHRcdH0gZWxzZSBpZiAobGVuZ3RoIDwgNjU1MzYpIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAodGFnX3R5cGUgPDwgMikgfCAxKTtcblx0XHRcdHJlc3VsdCArPSB1dGlsLndyaXRlTnVtYmVyKGxlbmd0aCwgMik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAodGFnX3R5cGUgPDwgMikgfCAyKTtcblx0XHRcdHJlc3VsdCArPSB1dGlsLndyaXRlTnVtYmVyKGxlbmd0aCwgNCk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdlbmVyaWMgc3RhdGljIFBhY2tldCBQYXJzZXIgZnVuY3Rpb25cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBJbnB1dCBzdHJlYW0gYXMgc3RyaW5nXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gdG8gc3RhcnQgcGFyc2luZ1xuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGxlbiBMZW5ndGggb2YgdGhlIGlucHV0IGZyb20gcG9zaXRpb24gb25cblx0ICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGEgcGFyc2VkIG9wZW5wZ3BfcGFja2V0XG5cdCAqL1xuXHRyZWFkOiBmdW5jdGlvbihpbnB1dCwgcG9zaXRpb24sIGxlbikge1xuXHRcdC8vIHNvbWUgc2FuaXR5IGNoZWNrc1xuXHRcdGlmIChpbnB1dCA9PSBudWxsIHx8IGlucHV0Lmxlbmd0aCA8PSBwb3NpdGlvblxuXHRcdFx0XHR8fCBpbnB1dC5zdWJzdHJpbmcocG9zaXRpb24pLmxlbmd0aCA8IDJcblx0XHRcdFx0fHwgKGlucHV0W3Bvc2l0aW9uXS5jaGFyQ29kZUF0KCkgJiAweDgwKSA9PSAwKSB7XG5cdFx0XHR1dGlsXG5cdFx0XHRcdFx0LnByaW50X2Vycm9yKFwiRXJyb3IgZHVyaW5nIHBhcnNpbmcuIFRoaXMgbWVzc2FnZSAvIGtleSBpcyBwcm9iYWJseSBub3QgY29udGFpbmluZyBhIHZhbGlkIE9wZW5QR1AgZm9ybWF0LlwiKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHR2YXIgbXlwb3MgPSBwb3NpdGlvbjtcblx0XHR2YXIgdGFnID0gLTE7XG5cdFx0dmFyIGZvcm1hdCA9IC0xO1xuXHRcdHZhciBwYWNrZXRfbGVuZ3RoO1xuXG5cdFx0Zm9ybWF0ID0gMDsgLy8gMCA9IG9sZCBmb3JtYXQ7IDEgPSBuZXcgZm9ybWF0XG5cdFx0aWYgKChpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpICYgMHg0MCkgIT0gMCkge1xuXHRcdFx0Zm9ybWF0ID0gMTtcblx0XHR9XG5cblx0XHR2YXIgcGFja2V0X2xlbmd0aF90eXBlO1xuXHRcdGlmIChmb3JtYXQpIHtcblx0XHRcdC8vIG5ldyBmb3JtYXQgaGVhZGVyXG5cdFx0XHR0YWcgPSBpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpICYgMHgzRjsgLy8gYml0IDUtMFxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBvbGQgZm9ybWF0IGhlYWRlclxuXHRcdFx0dGFnID0gKGlucHV0W215cG9zXS5jaGFyQ29kZUF0KCkgJiAweDNGKSA+PiAyOyAvLyBiaXQgNS0yXG5cdFx0XHRwYWNrZXRfbGVuZ3RoX3R5cGUgPSBpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpICYgMHgwMzsgLy8gYml0IDEtMFxuXHRcdH1cblxuXHRcdC8vIGhlYWRlciBvY3RldCBwYXJzaW5nIGRvbmVcblx0XHRteXBvcysrO1xuXG5cdFx0Ly8gcGFyc2VkIGxlbmd0aCBmcm9tIGxlbmd0aCBmaWVsZFxuXHRcdHZhciBib2R5ZGF0YSA9IG51bGw7XG5cblx0XHQvLyB1c2VkIGZvciBwYXJ0aWFsIGJvZHkgbGVuZ3Roc1xuXHRcdHZhciByZWFsX3BhY2tldF9sZW5ndGggPSAtMTtcblx0XHRpZiAoIWZvcm1hdCkge1xuXHRcdFx0Ly8gNC4yLjEuIE9sZCBGb3JtYXQgUGFja2V0IExlbmd0aHNcblx0XHRcdHN3aXRjaCAocGFja2V0X2xlbmd0aF90eXBlKSB7XG5cdFx0XHRjYXNlIDA6IC8vIFRoZSBwYWNrZXQgaGFzIGEgb25lLW9jdGV0IGxlbmd0aC4gVGhlIGhlYWRlciBpcyAyIG9jdGV0c1xuXHRcdFx0XHQvLyBsb25nLlxuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTogLy8gVGhlIHBhY2tldCBoYXMgYSB0d28tb2N0ZXQgbGVuZ3RoLiBUaGUgaGVhZGVyIGlzIDMgb2N0ZXRzXG5cdFx0XHRcdC8vIGxvbmcuXG5cdFx0XHRcdHBhY2tldF9sZW5ndGggPSAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDgpXG5cdFx0XHRcdFx0XHR8IGlucHV0W215cG9zKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDI6IC8vIFRoZSBwYWNrZXQgaGFzIGEgZm91ci1vY3RldCBsZW5ndGguIFRoZSBoZWFkZXIgaXMgNVxuXHRcdFx0XHQvLyBvY3RldHMgbG9uZy5cblx0XHRcdFx0cGFja2V0X2xlbmd0aCA9IChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgPDwgMjQpXG5cdFx0XHRcdFx0XHR8IChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgPDwgMTYpXG5cdFx0XHRcdFx0XHR8IChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgPDwgOClcblx0XHRcdFx0XHRcdHwgaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIDMgLSBUaGUgcGFja2V0IGlzIG9mIGluZGV0ZXJtaW5hdGUgbGVuZ3RoLiBUaGUgaGVhZGVyIGlzIDFcblx0XHRcdFx0Ly8gb2N0ZXQgbG9uZywgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGRldGVybWluZSBob3cgbG9uZ1xuXHRcdFx0XHQvLyB0aGUgcGFja2V0IGlzLiBJZiB0aGUgcGFja2V0IGlzIGluIGEgZmlsZSwgdGhpcyBtZWFucyB0aGF0XG5cdFx0XHRcdC8vIHRoZSBwYWNrZXQgZXh0ZW5kcyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJbiBnZW5lcmFsLCBcblx0XHRcdFx0Ly8gYW4gaW1wbGVtZW50YXRpb24gU0hPVUxEIE5PVCB1c2UgaW5kZXRlcm1pbmF0ZS1sZW5ndGggXG5cdFx0XHRcdC8vIHBhY2tldHMgZXhjZXB0IHdoZXJlIHRoZSBlbmQgb2YgdGhlIGRhdGEgd2lsbCBiZSBjbGVhciBcblx0XHRcdFx0Ly8gZnJvbSB0aGUgY29udGV4dCwgYW5kIGV2ZW4gdGhlbiBpdCBpcyBiZXR0ZXIgdG8gdXNlIGEgXG5cdFx0XHRcdC8vIGRlZmluaXRlIGxlbmd0aCwgb3IgYSBuZXcgZm9ybWF0IGhlYWRlci4gVGhlIG5ldyBmb3JtYXQgXG5cdFx0XHRcdC8vIGhlYWRlcnMgZGVzY3JpYmVkIGJlbG93IGhhdmUgYSBtZWNoYW5pc20gZm9yIHByZWNpc2VseVxuXHRcdFx0XHQvLyBlbmNvZGluZyBkYXRhIG9mIGluZGV0ZXJtaW5hdGUgbGVuZ3RoLlxuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gbGVuO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdH0gZWxzZSAvLyA0LjIuMi4gTmV3IEZvcm1hdCBQYWNrZXQgTGVuZ3Roc1xuXHRcdHtcblxuXHRcdFx0Ly8gNC4yLjIuMS4gT25lLU9jdGV0IExlbmd0aHNcblx0XHRcdGlmIChpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpIDwgMTkyKSB7XG5cdFx0XHRcdHBhY2tldF9sZW5ndGggPSBpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHRcdHV0aWwucHJpbnRfZGVidWcoXCIxIGJ5dGUgbGVuZ3RoOlwiICsgcGFja2V0X2xlbmd0aCk7XG5cdFx0XHRcdC8vIDQuMi4yLjIuIFR3by1PY3RldCBMZW5ndGhzXG5cdFx0XHR9IGVsc2UgaWYgKGlucHV0W215cG9zXS5jaGFyQ29kZUF0KCkgPj0gMTkyXG5cdFx0XHRcdFx0JiYgaW5wdXRbbXlwb3NdLmNoYXJDb2RlQXQoKSA8IDIyNCkge1xuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gKChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgLSAxOTIpIDw8IDgpXG5cdFx0XHRcdFx0XHQrIChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkpICsgMTkyO1xuXHRcdFx0XHR1dGlsLnByaW50X2RlYnVnKFwiMiBieXRlIGxlbmd0aDpcIiArIHBhY2tldF9sZW5ndGgpO1xuXHRcdFx0XHQvLyA0LjIuMi40LiBQYXJ0aWFsIEJvZHkgTGVuZ3Roc1xuXHRcdFx0fSBlbHNlIGlmIChpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpID4gMjIzXG5cdFx0XHRcdFx0JiYgaW5wdXRbbXlwb3NdLmNoYXJDb2RlQXQoKSA8IDI1NSkge1xuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gMSA8PCAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpICYgMHgxRik7XG5cdFx0XHRcdHV0aWwucHJpbnRfZGVidWcoXCI0IGJ5dGUgbGVuZ3RoOlwiICsgcGFja2V0X2xlbmd0aCk7XG5cdFx0XHRcdC8vIEVFRUssIHdlJ3JlIHJlYWRpbmcgdGhlIGZ1bGwgZGF0YSBoZXJlLi4uXG5cdFx0XHRcdHZhciBteXBvczIgPSBteXBvcyArIHBhY2tldF9sZW5ndGg7XG5cdFx0XHRcdGJvZHlkYXRhID0gaW5wdXQuc3Vic3RyaW5nKG15cG9zLCBteXBvcyArIHBhY2tldF9sZW5ndGgpO1xuXHRcdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRcdGlmIChpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA8IDE5Mikge1xuXHRcdFx0XHRcdFx0dmFyIHRtcGxlbiA9IGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHRcdFx0XHRwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcblx0XHRcdFx0XHRcdGJvZHlkYXRhICs9IGlucHV0LnN1YnN0cmluZyhteXBvczIsIG15cG9zMiArIHRtcGxlbik7XG5cdFx0XHRcdFx0XHRteXBvczIgKz0gdG1wbGVuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA+PSAxOTJcblx0XHRcdFx0XHRcdFx0JiYgaW5wdXRbbXlwb3MyXS5jaGFyQ29kZUF0KCkgPCAyMjQpIHtcblx0XHRcdFx0XHRcdHZhciB0bXBsZW4gPSAoKGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCkgLSAxOTIpIDw8IDgpXG5cdFx0XHRcdFx0XHRcdFx0KyAoaW5wdXRbbXlwb3MyKytdLmNoYXJDb2RlQXQoKSkgKyAxOTI7XG5cdFx0XHRcdFx0XHRwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcblx0XHRcdFx0XHRcdGJvZHlkYXRhICs9IGlucHV0LnN1YnN0cmluZyhteXBvczIsIG15cG9zMiArIHRtcGxlbik7XG5cdFx0XHRcdFx0XHRteXBvczIgKz0gdG1wbGVuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA+IDIyM1xuXHRcdFx0XHRcdFx0XHQmJiBpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA8IDI1NSkge1xuXHRcdFx0XHRcdFx0dmFyIHRtcGxlbiA9IDEgPDwgKGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCkgJiAweDFGKTtcblx0XHRcdFx0XHRcdHBhY2tldF9sZW5ndGggKz0gdG1wbGVuO1xuXHRcdFx0XHRcdFx0Ym9keWRhdGEgKz0gaW5wdXQuc3Vic3RyaW5nKG15cG9zMiwgbXlwb3MyICsgdG1wbGVuKTtcblx0XHRcdFx0XHRcdG15cG9zMiArPSB0bXBsZW47XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG15cG9zMisrO1xuXHRcdFx0XHRcdFx0dmFyIHRtcGxlbiA9IChpbnB1dFtteXBvczIrK10uY2hhckNvZGVBdCgpIDw8IDI0KVxuXHRcdFx0XHRcdFx0XHRcdHwgKGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCkgPDwgMTYpXG5cdFx0XHRcdFx0XHRcdFx0fCAoaW5wdXRbbXlwb3MyKytdLmNoYXJDb2RlQXQoKSA8PCA4KVxuXHRcdFx0XHRcdFx0XHRcdHwgaW5wdXRbbXlwb3MyKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdFx0XHRcdGJvZHlkYXRhICs9IGlucHV0LnN1YnN0cmluZyhteXBvczIsIG15cG9zMiArIHRtcGxlbik7XG5cdFx0XHRcdFx0XHRwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcblx0XHRcdFx0XHRcdG15cG9zMiArPSB0bXBsZW47XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVhbF9wYWNrZXRfbGVuZ3RoID0gbXlwb3MyO1xuXHRcdFx0XHQvLyA0LjIuMi4zLiBGaXZlLU9jdGV0IExlbmd0aHNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG15cG9zKys7XG5cdFx0XHRcdHBhY2tldF9sZW5ndGggPSAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDI0KVxuXHRcdFx0XHRcdFx0fCAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDE2KVxuXHRcdFx0XHRcdFx0fCAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDgpXG5cdFx0XHRcdFx0XHR8IGlucHV0W215cG9zKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBpZiB0aGVyZSB3YXMnbnQgYSBwYXJ0aWFsIGJvZHkgbGVuZ3RoOiB1c2UgdGhlIHNwZWNpZmllZFxuXHRcdC8vIHBhY2tldF9sZW5ndGhcblx0XHRpZiAocmVhbF9wYWNrZXRfbGVuZ3RoID09IC0xKSB7XG5cdFx0XHRyZWFsX3BhY2tldF9sZW5ndGggPSBwYWNrZXRfbGVuZ3RoO1xuXHRcdH1cblxuXHRcdGlmIChib2R5ZGF0YSA9PSBudWxsKSB7XG5cdFx0XHRib2R5ZGF0YSA9IGlucHV0LnN1YnN0cmluZyhteXBvcywgbXlwb3MgKyByZWFsX3BhY2tldF9sZW5ndGgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IFxuXHRcdFx0dGFnOiB0YWcsXG5cdFx0XHRwYWNrZXQ6IGJvZHlkYXRhLFxuXHRcdFx0b2Zmc2V0OiBteXBvcyArIHJlYWxfcGFja2V0X2xlbmd0aFxuXHRcdH07XG5cdH1cbn1cblxuIiwiXG5cbnZhciBwYWNrZXRQYXJzZXIgPSByZXF1aXJlKCcuL3BhY2tldC5qcycpLFxuXHRwYWNrZXRzID0gcmVxdWlyZSgnLi9hbGxfcGFja2V0cy5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGxpc3Qgb2Ygb3BlbnBncCBwYWNrZXRzLlxuICogVGFrZSBjYXJlIHdoZW4gaXRlcmF0aW5nIG92ZXIgaXQgLSB0aGUgcGFja2V0cyB0aGVtc2VsdmVzXG4gKiBhcmUgc3RvcmVkIGFzIG51bWVyaWNhbCBpbmRpY2VzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldGxpc3QoKSB7XG5cdC8qKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgY29udGFpbmVkIHdpdGhpbiB0aGUgbGlzdC5cblx0ICogQHJlYWRvbmx5XG5cdCAqIEB0eXBlIHtJbnRlZ2VyfSAqL1xuXHR0aGlzLmxlbmd0aCA9IDA7XG5cblxuXG5cdC8qKlxuXHQgKiBSZWFkcyBhIHN0cmVhbSBvZiBiaW5hcnkgZGF0YSBhbmQgaW50ZXJwcmVudHMgaXQgYXMgYSBsaXN0IG9mIHBhY2tldHMuXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9ieXRlYXJyYXl9IEFuIGFycmF5IG9mIGJ5dGVzLlxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgaSA9IDA7XG5cblx0XHR3aGlsZShpIDwgYnl0ZXMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgcGFyc2VkID0gcGFja2V0UGFyc2VyLnJlYWQoYnl0ZXMsIGksIGJ5dGVzLmxlbmd0aCAtIGkpO1xuXHRcdFx0aSA9IHBhcnNlZC5vZmZzZXQ7XG5cblx0XHRcdHZhciB0YWcgPSBlbnVtcy5yZWFkKGVudW1zLnBhY2tldCwgcGFyc2VkLnRhZyk7XG5cdFx0XHR2YXIgcGFja2V0ID0gbmV3IHBhY2tldHNbdGFnXSgpO1xuXG5cdFx0XHR0aGlzLnB1c2gocGFja2V0KTtcblxuXHRcdFx0cGFja2V0LnJlYWQocGFyc2VkLnBhY2tldCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Ygb3BlbnBncCBvYmplY3RzIGNvbnRhaW5lZCB3aXRoaW4gdGhlXG5cdCAqIGNsYXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyB7b3BlbnBncF9ieXRlYXJyYXl9IEFuIGFycmF5IG9mIGJ5dGVzIGNvbnRhaW5pbmcgdmFsaWQgb3BlbnBncCBwYWNrZXRzLlxuXHQgKi9cblx0dGhpcy53cml0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBieXRlcyA9ICcnO1xuXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBwYWNrZXRieXRlcyA9IHRoaXNbaV0ud3JpdGUoKTtcblx0XHRcdGJ5dGVzICs9IHBhY2tldFBhcnNlci53cml0ZUhlYWRlcih0aGlzW2ldLnRhZywgcGFja2V0Ynl0ZXMubGVuZ3RoKTtcblx0XHRcdGJ5dGVzICs9IHBhY2tldGJ5dGVzO1xuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gYnl0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIHBhY2tldCB0byB0aGUgbGlzdC4gVGhpcyBpcyB0aGUgb25seSBzdXBwb3J0ZWQgbWV0aG9kIG9mIGRvaW5nIHNvO1xuXHQgKiB3cml0aW5nIHRvIHBhY2tldGxpc3RbaV0gZGlyZWN0bHkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG5cdCAqL1xuXHR0aGlzLnB1c2ggPSBmdW5jdGlvbihwYWNrZXQpIHtcblx0XHRwYWNrZXQucGFja2V0cyA9IG5ldyBwYWNrZXRsaXN0KCk7XG5cblx0XHR0aGlzW3RoaXMubGVuZ3RoXSA9IHBhY2tldDtcblx0XHR0aGlzLmxlbmd0aCsrO1xuXHR9XG5cbn1cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpLFxuXHR0eXBlX21waSA9IHJlcXVpcmUoJy4uL3R5cGUvbXBpLmpzJyksXG5cdGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKSxcblx0Y3J5cHRvID0gcmVxdWlyZSgnLi4vY3J5cHRvJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBLZXkgTWF0ZXJpYWwgUGFja2V0IChUYWcgNSw2LDcsMTQpXG4gKiAgIFxuICogUkZDNDQ4MCA1LjU6XG4gKiBBIGtleSBtYXRlcmlhbCBwYWNrZXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHB1YmxpYyBvclxuICogcHJpdmF0ZSBrZXkuICBUaGVyZSBhcmUgZm91ciB2YXJpYW50cyBvZiB0aGlzIHBhY2tldCB0eXBlLCBhbmQgdHdvXG4gKiBtYWpvciB2ZXJzaW9ucy4gIENvbnNlcXVlbnRseSwgdGhpcyBzZWN0aW9uIGlzIGNvbXBsZXguXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3B1YmxpY19rZXkoKSB7XG5cdC8qKiBLZXkgY3JlYXRpb24gZGF0ZS5cblx0ICogQHR5cGUge0RhdGV9ICovXG5cdHRoaXMuY3JlYXRlZCA9IG5ldyBEYXRlKCk7XG5cdC8qKiBBIGxpc3Qgb2YgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnNcblx0ICogQHR5cGUge29wZW5wZ3BfdHlwZV9tcGl9ICovXG5cdHRoaXMubXBpID0gW107XG5cdC8qKiBQdWJsaWMga2V5IGFsZ29yaXRobVxuXHQgKiBAdHlwZSB7b3BlbnBncC5wdWJsaWNrZXl9ICovXG5cdHRoaXMuYWxnb3JpdGhtID0gJ3JzYV9zaWduJztcblxuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBQYXJzZXIgZm9yIHB1YmxpYyBrZXlzIGFzIHNwZWNpZmllZCBpbiBSRkMgNDg4MCBzZWN0aW9uIFxuXHQgKiA1LjUuMiBQdWJsaWMtS2V5IFBhY2tldCBGb3JtYXRzXG5cdCAqIGNhbGxlZCBieSByZWFkX3RhZyZsdDtudW0mZ3Q7XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBJbnB1dCBzdHJpbmcgdG8gcmVhZCB0aGUgcGFja2V0IGZyb21cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBTdGFydCBwb3NpdGlvbiBmb3IgdGhlIHBhcnNlclxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlbiBMZW5ndGggb2YgdGhlIHBhY2tldCBvciByZW1haW5pbmcgbGVuZ3RoIG9mIGlucHV0XG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhpcyBvYmplY3Qgd2l0aCBhdHRyaWJ1dGVzIHNldCBieSB0aGUgcGFyc2VyXG5cdCAqLyAgXG5cdHRoaXMucmVhZFB1YmxpY0tleSA9IHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0Ly8gQSBvbmUtb2N0ZXQgdmVyc2lvbiBudW1iZXIgKDMgb3IgNCkuXG5cdFx0dmFyIHZlcnNpb24gPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cblx0XHRpZiAodmVyc2lvbiA9PSA0KSB7XG5cdFx0XHQvLyAtIEEgZm91ci1vY3RldCBudW1iZXIgZGVub3RpbmcgdGhlIHRpbWUgdGhhdCB0aGUga2V5IHdhcyBjcmVhdGVkLlxuXHRcdFx0dGhpcy5jcmVhdGVkID0gdXRpbC5yZWFkRGF0ZShieXRlcy5zdWJzdHIoMSwgNCkpO1xuXHRcdFx0XG5cdFx0XHQvLyAtIEEgb25lLW9jdGV0IG51bWJlciBkZW5vdGluZyB0aGUgcHVibGljLWtleSBhbGdvcml0aG0gb2YgdGhpcyBrZXkuXG5cdFx0XHR0aGlzLmFsZ29yaXRobSA9IGVudW1zLnJlYWQoZW51bXMucHVibGljS2V5LCBieXRlc1s1XS5jaGFyQ29kZUF0KCkpO1xuXG5cdFx0XHR2YXIgbXBpY291bnQgPSBjcnlwdG8uZ2V0UHVibGljTXBpQ291bnQodGhpcy5hbGdvcml0aG0pO1xuXHRcdFx0dGhpcy5tcGkgPSBbXTtcblxuXHRcdFx0dmFyIGJtcGkgPSBieXRlcy5zdWJzdHIoNik7XG5cdFx0XHR2YXIgcCA9IDA7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBcblx0XHRcdFx0aSA8IG1waWNvdW50ICYmIHAgPCBibXBpLmxlbmd0aDsgXG5cdFx0XHRcdGkrKykge1xuXG5cdFx0XHRcdHRoaXMubXBpW2ldID0gbmV3IHR5cGVfbXBpKCk7XG5cblx0XHRcdFx0cCArPSB0aGlzLm1waVtpXS5yZWFkKGJtcGkuc3Vic3RyKHApKVxuXG5cdFx0XHRcdGlmKHAgPiBibXBpLmxlbmd0aClcblx0XHRcdFx0XHR1dGlsLnByaW50X2Vycm9yKFwib3BlbnBncC5wYWNrZXQua2V5bWF0ZXJpYWwuanNcXG5cIlxuXHRcdFx0XHRcdFx0KydlcnJvciByZWFkaW5nIE1QSSBAOicrcCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBwICsgNjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdWZXJzaW9uICcgKyB2ZXJzaW9uICsgJyBvZiB0aGUga2V5IHBhY2tldCBpcyB1bnN1cHBvcnRlZC4nKTtcblx0XHR9XG5cdH1cblxuXHQvKlxuICAgICAqIFNhbWUgYXMgd3JpdGVfcHJpdmF0ZV9rZXksIGJ1dCBoYXMgbGVzcyBpbmZvcm1hdGlvbiBiZWNhdXNlIG9mIFxuXHQgKiBwdWJsaWMga2V5LlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0ga2V5VHlwZSBGb2xsb3dzIHRoZSBPcGVuUEdQIGFsZ29yaXRobSBzdGFuZGFyZCwgXG5cdCAqIElFIDEgY29ycmVzcG9uZHMgdG8gUlNBLlxuICAgICAqIEBwYXJhbSB7UlNBLmtleU9iamVjdH0ga2V5XG4gICAgICogQHBhcmFtIHRpbWVQYWNrZXRcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHtib2R5OiBbc3RyaW5nXU9wZW5QR1AgcGFja2V0IGJvZHkgY29udGVudHMsIFxuXHQgKiBoZWFkZXI6IFtzdHJpbmddIE9wZW5QR1AgcGFja2V0IGhlYWRlciwgc3RyaW5nOiBbc3RyaW5nXSBoZWFkZXIrYm9keX1cbiAgICAgKi9cbiAgICB0aGlzLndyaXRlUHVibGljS2V5ID0gdGhpcy53cml0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFZlcnNpb25cblx0XHR2YXIgcmVzdWx0ID0gU3RyaW5nLmZyb21DaGFyQ29kZSg0KTtcbiAgICAgICAgcmVzdWx0ICs9IHV0aWwud3JpdGVEYXRlKHRoaXMuY3JlYXRlZCk7XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZW51bXMud3JpdGUoZW51bXMucHVibGljS2V5LCB0aGlzLmFsZ29yaXRobSkpO1xuXG5cdFx0dmFyIG1waWNvdW50ID0gY3J5cHRvLmdldFB1YmxpY01waUNvdW50KHRoaXMuYWxnb3JpdGhtKTtcblxuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtcGljb3VudDsgaSsrKSB7XG5cdFx0XHRyZXN1bHQgKz0gdGhpcy5tcGlbaV0ud3JpdGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Ly8gV3JpdGUgYW4gb2xkIHZlcnNpb24gcGFja2V0IC0gaXQncyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGludGVybmFsIHJvdXRpbmVzLlxuXHR0aGlzLndyaXRlT2xkID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGJ5dGVzID0gdGhpcy53cml0ZVB1YmxpY0tleSgpO1xuXG5cdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMHg5OSkgK1xuXHRcdFx0dXRpbC53cml0ZU51bWJlcihieXRlcy5sZW5ndGgsIDIpICtcblx0XHRcdGJ5dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGtleSBpZCBvZiB0aGUga2V5IFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEEgOCBieXRlIGtleSBpZFxuXHQgKi9cblx0dGhpcy5nZXRLZXlJZCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEZpbmdlcnByaW50KCkuc3Vic3RyKDEyLCA4KTtcblx0fVxuXHRcblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBrZXlcblx0ICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaW5nZXJwcmludFxuXHQgKi9cblx0dGhpcy5nZXRGaW5nZXJwcmludCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0b0hhc2ggPSB0aGlzLndyaXRlT2xkKCk7XG5cdFx0cmV0dXJuIGNyeXB0by5oYXNoLnNoYTEodG9IYXNoLCB0b0hhc2gubGVuZ3RoKTtcblx0fVxuXG59XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgdHlwZV9rZXlpZCA9IHJlcXVpcmUoJy4uL3R5cGUva2V5aWQuanMnKSxcblx0dXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKSxcblx0dHlwZV9tcGkgPSByZXF1aXJlKCcuLi90eXBlL21waS5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpO1xuXHRcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgUHVibGljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgUGFja2V0cyAoVGFnIDEpXG4gKiBcbiAqIFJGQzQ4ODAgNS4xOiBBIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5IHBhY2tldCBob2xkcyB0aGUgc2Vzc2lvbiBrZXlcbiAqIHVzZWQgdG8gZW5jcnlwdCBhIG1lc3NhZ2UuIFplcm8gb3IgbW9yZSBQdWJsaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleVxuICogcGFja2V0cyBhbmQvb3IgU3ltbWV0cmljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0cyBtYXkgcHJlY2VkZSBhXG4gKiBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCwgd2hpY2ggaG9sZHMgYW4gZW5jcnlwdGVkIG1lc3NhZ2UuIFRoZVxuICogbWVzc2FnZSBpcyBlbmNyeXB0ZWQgd2l0aCB0aGUgc2Vzc2lvbiBrZXksIGFuZCB0aGUgc2Vzc2lvbiBrZXkgaXMgaXRzZWxmXG4gKiBlbmNyeXB0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgRW5jcnlwdGVkIFNlc3Npb24gS2V5IHBhY2tldChzKS4gVGhlXG4gKiBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCBpcyBwcmVjZWRlZCBieSBvbmUgUHVibGljLUtleSBFbmNyeXB0ZWRcbiAqIFNlc3Npb24gS2V5IHBhY2tldCBmb3IgZWFjaCBPcGVuUEdQIGtleSB0byB3aGljaCB0aGUgbWVzc2FnZSBpcyBlbmNyeXB0ZWQuXG4gKiBUaGUgcmVjaXBpZW50IG9mIHRoZSBtZXNzYWdlIGZpbmRzIGEgc2Vzc2lvbiBrZXkgdGhhdCBpcyBlbmNyeXB0ZWQgdG8gdGhlaXJcbiAqIHB1YmxpYyBrZXksIGRlY3J5cHRzIHRoZSBzZXNzaW9uIGtleSwgYW5kIHRoZW4gdXNlcyB0aGUgc2Vzc2lvbiBrZXkgdG9cbiAqIGRlY3J5cHQgdGhlIG1lc3NhZ2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3B1YmxpY19rZXlfZW5jcnlwdGVkX3Nlc3Npb25fa2V5KCkge1xuXHR0aGlzLnZlcnNpb24gPSAzO1xuXG5cdHRoaXMucHVibGljS2V5SWQgPSBuZXcgdHlwZV9rZXlpZCgpO1xuXHR0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9ICdyc2FfZW5jcnlwdCc7XG5cblx0dGhpcy5zZXNzaW9uS2V5ID0gbnVsbDtcblx0dGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtID0gJ2FlczI1Nic7XG5cblx0LyoqIEB0eXBlIHtvcGVucGdwX3R5cGVfbXBpW119ICovXG5cdHRoaXMuZW5jcnlwdGVkID0gW107XG5cblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgcHVibGlja2V5IGVuY3J5cHRlZCBzZXNzaW9uIGtleSBwYWNrZXQgKHRhZyAxKS5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBQYXlsb2FkIG9mIGEgdGFnIDEgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gTGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2Zcblx0ICogICAgICAgICAgICBpbnB1dCBhdCBwb3NpdGlvblxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhfSBPYmplY3QgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cblx0XHR0aGlzLnZlcnNpb24gPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cdFx0dGhpcy5wdWJsaWNLZXlJZC5yZWFkKGJ5dGVzLnN1YnN0cigxKSk7XG5cdFx0dGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBlbnVtcy5yZWFkKGVudW1zLnB1YmxpY0tleSwgYnl0ZXNbOV0uY2hhckNvZGVBdCgpKTtcblxuXHRcdHZhciBpID0gMTA7XG5cblx0XHR2YXIgaW50ZWdlckNvdW50ID0gKGZ1bmN0aW9uKGFsZ28pIHtcblx0XHRcdHN3aXRjaCAoYWxnbykge1xuXHRcdFx0Y2FzZSAncnNhX2VuY3J5cHQnOlxuXHRcdFx0Y2FzZSAncnNhX2VuY3J5cHRfc2lnbic6XG5cdFx0XHRcdHJldHVybiAxO1xuXG5cdFx0XHRjYXNlICdlbGdhbWFsJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYWxnb3JpdGhtLlwiKTtcblx0XHRcdH1cblx0XHR9KSh0aGlzLnB1YmxpY0tleUFsZ29yaXRobSk7XG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IFtdO1xuXG5cdFx0Zm9yKHZhciBqID0gMDsgaiA8IGludGVnZXJDb3VudDsgaisrKSB7XG5cdFx0XHR2YXIgbXBpID0gbmV3IHR5cGVfbXBpKCk7XG5cdFx0XHRpICs9IG1waS5yZWFkKGJ5dGVzLnN1YnN0cihpKSk7XG5cdFx0XHR0aGlzLmVuY3J5cHRlZC5wdXNoKG1waSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRhZyAxIHBhY2tldFxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IHB1YmxpY0tleUlkXG5cdCAqICAgICAgICAgICAgIFRoZSBwdWJsaWMga2V5IGlkIGNvcnJlc3BvbmRpbmcgdG8gcHVibGljTVBJcyBrZXkgYXMgc3RyaW5nXG5cdCAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waVtdfSBwdWJsaWNNUElzXG5cdCAqICAgICAgICAgICAgTXVsdGlwcmVjaXNpb24gaW50ZWdlciBvYmplY3RzIGRlc2NyaWJpbmcgdGhlIHB1YmxpYyBrZXlcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwdWJhbGdvXG5cdCAqICAgICAgICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBhbGdvcml0aG0gLy8gU2VlIFJGQzQ4ODAgOS4xXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gc3ltbWFsZ29cblx0ICogICAgICAgICAgICBUaGUgc3ltbWV0cmljIGNpcGhlciBhbGdvcml0aG0gdXNlZCB0byBlbmNyeXB0IHRoZSBkYXRhIFxuXHQgKiAgICAgICAgICAgIHdpdGhpbiBhbiBlbmNyeXB0ZWRkYXRhcGFja2V0IG9yIGVuY3J5cHRlZGludGVncml0eS1cblx0ICogICAgICAgICAgICBwcm90ZWN0ZWRkYXRhcGFja2V0IFxuXHQgKiAgICAgICAgICAgIGZvbGxvd2luZyB0aGlzIHBhY2tldCAvL1NlZSBSRkM0ODgwIDkuMlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc2Vzc2lvbmtleVxuXHQgKiAgICAgICAgICAgIEEgc3RyaW5nIG9mIHJhbmRvbWJ5dGVzIHJlcHJlc2VudGluZyB0aGUgc2Vzc2lvbiBrZXlcblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnZlcnNpb24pO1xuXHRcdHJlc3VsdCArPSB0aGlzLnB1YmxpY0tleUlkLndyaXRlKCk7XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG5cdFx0XHRlbnVtcy53cml0ZShlbnVtcy5wdWJsaWNLZXksIHRoaXMucHVibGljS2V5QWxnb3JpdGhtKSk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmVuY3J5cHRlZC5sZW5ndGg7IGkrKykge1xuXHRcdFx0cmVzdWx0ICs9IHRoaXMuZW5jcnlwdGVkW2ldLndyaXRlKClcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oa2V5KSB7XG5cdFx0dmFyIGRhdGEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuXHRcdFx0ZW51bXMud3JpdGUoZW51bXMuc3ltbWV0cmljLCB0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0pKTtcblxuXHRcdGRhdGEgKz0gdGhpcy5zZXNzaW9uS2V5O1xuXHRcdHZhciBjaGVja3N1bSA9IHV0aWwuY2FsY19jaGVja3N1bSh0aGlzLnNlc3Npb25LZXkpO1xuXHRcdGRhdGEgKz0gdXRpbC53cml0ZU51bWJlcihjaGVja3N1bSwgMik7XG5cblx0XHR2YXIgbXBpID0gbmV3IHR5cGVfbXBpKCk7XG5cdFx0bXBpLmZyb21CeXRlcyhjcnlwdG8ucGtjczEuZW1lLmVuY29kZShcblx0XHRcdGRhdGEsXG5cdFx0XHRrZXkubXBpWzBdLmJ5dGVMZW5ndGgoKSkpO1xuXG5cdFx0dGhpcy5lbmNyeXB0ZWQgPSBjcnlwdG8ucHVibGljS2V5RW5jcnlwdChcblx0XHRcdHRoaXMucHVibGljS2V5QWxnb3JpdGhtLCBcblx0XHRcdGtleS5tcGksXG5cdFx0XHRtcGkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY3J5cHRzIHRoZSBzZXNzaW9uIGtleSAob25seSBmb3IgcHVibGljIGtleSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXlcblx0ICogcGFja2V0cyAodGFnIDEpXG5cdCAqIFxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX21lc3NhZ2V9IG1zZ1xuXHQgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIG9iamVjdCAod2l0aCBtZW1iZXIgZW5jcnlwdGVkRGF0YVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXl9IGtleVxuXHQgKiAgICAgICAgICAgIFByaXZhdGUga2V5IHdpdGggc2VjTVBJcyB1bmxvY2tlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1bmVuY3J5cHRlZCBzZXNzaW9uIGtleVxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24oa2V5KSB7XG5cdFx0dmFyIHJlc3VsdCA9IGNyeXB0by5wdWJsaWNLZXlEZWNyeXB0KFxuXHRcdFx0XHR0aGlzLnB1YmxpY0tleUFsZ29yaXRobSxcblx0XHRcdFx0a2V5Lm1waSxcblx0XHRcdFx0dGhpcy5lbmNyeXB0ZWQpLnRvQnl0ZXMoKTtcblxuXHRcdHZhciBjaGVja3N1bSA9IHV0aWwucmVhZE51bWJlcihyZXN1bHQuc3Vic3RyKHJlc3VsdC5sZW5ndGggLSAyKSk7XG5cblx0XHR2YXIgZGVjb2RlZCA9IGNyeXB0by5wa2NzMS5lbWUuZGVjb2RlKFxuXHRcdFx0cmVzdWx0LFxuXHRcdFx0a2V5Lm1waVswXS5ieXRlTGVuZ3RoKCkpO1xuXG5cdFx0dmFyIGtleSA9IGRlY29kZWQuc3Vic3RyaW5nKDEsIGRlY29kZWQubGVuZ3RoIC0gMik7XG5cblx0XHRpZihjaGVja3N1bSAhPSB1dGlsLmNhbGNfY2hlY2tzdW0oa2V5KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDaGVja3N1bSBtaXNtYXRjaCcpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc2Vzc2lvbktleSA9IGtleTtcblx0XHRcdHRoaXMuc2Vzc2lvbktleUFsZ29yaXRobSA9IFxuXHRcdFx0XHRlbnVtcy5yZWFkKGVudW1zLnN5bW1ldHJpYywgZGVjb2RlZC5jaGFyQ29kZUF0KDApKTtcblx0XHR9XG5cdH1cbn07XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBwdWJsaWNfa2V5ID0gcmVxdWlyZSgnLi9wdWJsaWNfa2V5LmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHVibGljX3N1YmtleSgpIHtcblx0cHVibGljX2tleS5jYWxsKHRoaXMpO1xufVxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIHB1YmxpY0tleSA9IHJlcXVpcmUoJy4vcHVibGljX2tleS5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpLFxuXHR0eXBlX21waSA9IHJlcXVpcmUoJy4uL3R5cGUvbXBpLmpzJyksXG5cdHR5cGVfczJrID0gcmVxdWlyZSgnLi4vdHlwZS9zMmsuanMnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIEtleSBNYXRlcmlhbCBQYWNrZXQgKFRhZyA1LDYsNywxNClcbiAqICAgXG4gKiBSRkM0NDgwIDUuNTpcbiAqIEEga2V5IG1hdGVyaWFsIHBhY2tldCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHVibGljIG9yXG4gKiBwcml2YXRlIGtleS4gIFRoZXJlIGFyZSBmb3VyIHZhcmlhbnRzIG9mIHRoaXMgcGFja2V0IHR5cGUsIGFuZCB0d29cbiAqIG1ham9yIHZlcnNpb25zLiAgQ29uc2VxdWVudGx5LCB0aGlzIHNlY3Rpb24gaXMgY29tcGxleC5cbiAqL1xuZnVuY3Rpb24gcGFja2V0X3NlY3JldF9rZXkoKSB7XG5cdHB1YmxpY0tleS5jYWxsKHRoaXMpO1xuXG5cdHRoaXMuZW5jcnlwdGVkID0gbnVsbDtcblxuXG5cdGZ1bmN0aW9uIGdldF9oYXNoX2xlbihoYXNoKSB7XG5cdFx0aWYoaGFzaCA9PSAnc2hhMScpXG5cdFx0XHRyZXR1cm4gMjA7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRfaGFzaF9mbihoYXNoKSB7XG5cdFx0aWYoaGFzaCA9PSAnc2hhMScpXG5cdFx0XHRyZXR1cm4gY3J5cHRvLmhhc2guc2hhMTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oYykge1xuXHRcdFx0XHRcdHJldHVybiB1dGlsLndyaXRlTnVtYmVyKHV0aWwuY2FsY19jaGVja3N1bShjKSwgMik7XG5cdFx0XHRcdH1cblx0fVxuXG5cdC8vIEhlbHBlciBmdW5jdGlvblxuXHRmdW5jdGlvbiBwYXJzZV9jbGVhcnRleHRfbXBpKGhhc2hfYWxnb3JpdGhtLCBjbGVhcnRleHQsIGFsZ29yaXRobSkge1xuXHRcdHZhciBoYXNobGVuID0gZ2V0X2hhc2hfbGVuKGhhc2hfYWxnb3JpdGhtKSxcblx0XHRcdGhhc2hmbiA9IGdldF9oYXNoX2ZuKGhhc2hfYWxnb3JpdGhtKTtcblxuXHRcdHZhciBoYXNodGV4dCA9IGNsZWFydGV4dC5zdWJzdHIoY2xlYXJ0ZXh0Lmxlbmd0aCAtIGhhc2hsZW4pO1xuXHRcdGNsZWFydGV4dCA9IGNsZWFydGV4dC5zdWJzdHIoMCwgY2xlYXJ0ZXh0Lmxlbmd0aCAtIGhhc2hsZW4pO1xuXG5cdFx0dmFyIGhhc2ggPSBoYXNoZm4oY2xlYXJ0ZXh0KTtcblxuXHRcdGlmKGhhc2ggIT0gaGFzaHRleHQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJIYXNoIG1pc21hdGNoLlwiKTtcblxuXHRcdHZhciBtcGlzID0gY3J5cHRvLmdldFByaXZhdGVNcGlDb3VudChhbGdvcml0aG0pO1xuXG5cdFx0dmFyIGogPSAwO1xuXHRcdHZhciBtcGkgPSBbXTtcblxuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtcGlzICYmIGogPCBjbGVhcnRleHQubGVuZ3RoOyBpKyspIHtcblx0XHRcdG1waVtpXSA9IG5ldyB0eXBlX21waSgpO1xuXHRcdFx0aiArPSBtcGlbaV0ucmVhZChjbGVhcnRleHQuc3Vic3RyKGopKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbXBpO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVfY2xlYXJ0ZXh0X21waShoYXNoX2FsZ29yaXRobSwgYWxnb3JpdGhtLCBtcGkpIHtcblx0XHR2YXIgYnl0ZXM9ICcnO1xuXHRcdHZhciBkaXNjYXJkID0gY3J5cHRvLmdldFB1YmxpY01waUNvdW50KGFsZ29yaXRobSk7XG5cblx0XHRmb3IodmFyIGkgPSBkaXNjYXJkOyBpIDwgbXBpLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRieXRlcyArPSBtcGlbaV0ud3JpdGUoKTtcblx0XHR9XG5cblxuXHRcdGJ5dGVzICs9IGdldF9oYXNoX2ZuKGhhc2hfYWxnb3JpdGhtKShieXRlcyk7XG5cdFx0XG5cdFx0cmV0dXJuIGJ5dGVzO1xuXHR9XG5cdFx0XG5cblx0Ly8gNS41LjMuICBTZWNyZXQtS2V5IFBhY2tldCBGb3JtYXRzXG5cdFxuXHQvKipcblx0ICogSW50ZXJuYWwgcGFyc2VyIGZvciBwcml2YXRlIGtleXMgYXMgc3BlY2lmaWVkIGluIFJGQyA0ODgwIHNlY3Rpb24gNS41LjNcblx0ICogQHBhcmFtIHtTdHJpbmd9IGJ5dGVzIElucHV0IHN0cmluZyB0byByZWFkIHRoZSBwYWNrZXQgZnJvbVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHBvc2l0aW9uIFN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgcGFyc2VyXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuIExlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHJlbWFpbmluZyBsZW5ndGggb2YgYnl0ZXNcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGlzIG9iamVjdCB3aXRoIGF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBwYXJzZXJcblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdCAgICAvLyAtIEEgUHVibGljLUtleSBvciBQdWJsaWMtU3Via2V5IHBhY2tldCwgYXMgZGVzY3JpYmVkIGFib3ZlLlxuXHRcdHZhciBsZW4gPSB0aGlzLnJlYWRQdWJsaWNLZXkoYnl0ZXMpO1xuXG5cdCAgICBieXRlcyA9IGJ5dGVzLnN1YnN0cihsZW4pO1xuXG5cdFx0XG5cdCAgICAvLyAtIE9uZSBvY3RldCBpbmRpY2F0aW5nIHN0cmluZy10by1rZXkgdXNhZ2UgY29udmVudGlvbnMuICBaZXJvXG5cdCAgICAvLyAgIGluZGljYXRlcyB0aGF0IHRoZSBzZWNyZXQta2V5IGRhdGEgaXMgbm90IGVuY3J5cHRlZC4gIDI1NSBvciAyNTRcblx0ICAgIC8vICAgaW5kaWNhdGVzIHRoYXQgYSBzdHJpbmctdG8ta2V5IHNwZWNpZmllciBpcyBiZWluZyBnaXZlbi4gIEFueVxuXHQgICAgLy8gICBvdGhlciB2YWx1ZSBpcyBhIHN5bW1ldHJpYy1rZXkgZW5jcnlwdGlvbiBhbGdvcml0aG0gaWRlbnRpZmllci5cblx0ICAgIHZhciBpc0VuY3J5cHRlZCA9IGJ5dGVzWzBdLmNoYXJDb2RlQXQoKTtcblxuXHRcdGlmKGlzRW5jcnlwdGVkKSB7XG5cdFx0XHR0aGlzLmVuY3J5cHRlZCA9IGJ5dGVzO1xuXHRcdH0gZWxzZSB7XG5cdFxuXHRcdFx0Ly8gLSBQbGFpbiBvciBlbmNyeXB0ZWQgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgY29tcHJpc2luZyB0aGUgc2VjcmV0XG5cdFx0XHQvLyAgIGtleSBkYXRhLiAgVGhlc2UgYWxnb3JpdGhtLXNwZWNpZmljIGZpZWxkcyBhcmUgYXMgZGVzY3JpYmVkXG5cdFx0XHQvLyAgIGJlbG93LlxuXG5cdFx0XHR0aGlzLm1waSA9IHRoaXMubXBpLmNvbmNhdChwYXJzZV9jbGVhcnRleHRfbXBpKCdtb2QnLCBieXRlcy5zdWJzdHIoMSksXG5cdFx0XHRcdHRoaXMuYWxnb3JpdGhtKSk7XG5cdFx0fSAgICBcblxuXHR9XG5cdFxuXHQvKlxuICAgICAqIENyZWF0ZXMgYW4gT3BlblBHUCBrZXkgcGFja2V0IGZvciB0aGUgZ2l2ZW4ga2V5LiBtdWNoIFxuXHQgKiBUT0RPIGluIHJlZ2FyZHMgdG8gczJrLCBzdWJrZXlzLlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0ga2V5VHlwZSBGb2xsb3dzIHRoZSBPcGVuUEdQIGFsZ29yaXRobSBzdGFuZGFyZCwgXG5cdCAqIElFIDEgY29ycmVzcG9uZHMgdG8gUlNBLlxuICAgICAqIEBwYXJhbSB7UlNBLmtleU9iamVjdH0ga2V5XG4gICAgICogQHBhcmFtIHBhc3NwaHJhc2VcbiAgICAgKiBAcGFyYW0gczJrSGFzaFxuICAgICAqIEBwYXJhbSBzeW1tZXRyaWNFbmNyeXB0aW9uQWxnb3JpdGhtXG4gICAgICogQHBhcmFtIHRpbWVQYWNrZXRcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHtib2R5OiBbc3RyaW5nXU9wZW5QR1AgcGFja2V0IGJvZHkgY29udGVudHMsIFxuXHRcdGhlYWRlcjogW3N0cmluZ10gT3BlblBHUCBwYWNrZXQgaGVhZGVyLCBzdHJpbmc6IFtzdHJpbmddIGhlYWRlcitib2R5fVxuICAgICAqL1xuICAgIHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgYnl0ZXMgPSB0aGlzLndyaXRlUHVibGljS2V5KCk7XG5cblx0XHRpZighdGhpcy5lbmNyeXB0ZWQpIHtcblx0XHRcdGJ5dGVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XG5cdFx0XHRcblx0XHRcdGJ5dGVzICs9IHdyaXRlX2NsZWFydGV4dF9tcGkoJ21vZCcsIHRoaXMuYWxnb3JpdGhtLCB0aGlzLm1waSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJ5dGVzICs9IHRoaXMuZW5jcnlwdGVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBieXRlcztcblx0fVxuXHRcdFx0XG5cblxuXG5cdC8qKiBFbmNyeXB0IHRoZSBwYXlsb2FkLiBCeSBkZWZhdWx0LCB3ZSB1c2UgYWVzMjU2IGFuZCBpdGVyYXRlZCwgc2FsdGVkIHN0cmluZ1xuXHQgKiB0byBrZXkgc3BlY2lmaWVyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzcGhyYXNlXG5cdCAqL1xuICAgIHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uKHBhc3NwaHJhc2UpIHtcblxuXHRcdHZhciBzMmsgPSBuZXcgdHlwZV9zMmsoKSxcblx0XHRcdHN5bW1ldHJpYyA9ICdhZXMyNTYnLFxuXHRcdFx0Y2xlYXJ0ZXh0ID0gd3JpdGVfY2xlYXJ0ZXh0X21waSgnc2hhMScsIHRoaXMuYWxnb3JpdGhtLCB0aGlzLm1waSksXG5cdFx0XHRrZXkgPSBwcm9kdWNlRW5jcnlwdGlvbktleShzMmssIHBhc3NwaHJhc2UsIHN5bW1ldHJpYyksXG5cdFx0XHRibG9ja0xlbiA9IGNyeXB0by5jaXBoZXJbc3ltbWV0cmljXS5ibG9ja1NpemUsXG5cdFx0XHRpdiA9IGNyeXB0by5yYW5kb20uZ2V0UmFuZG9tQnl0ZXMoYmxvY2tMZW4pO1xuXG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9ICcnO1xuXHRcdHRoaXMuZW5jcnlwdGVkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjU0KTtcblx0XHR0aGlzLmVuY3J5cHRlZCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLnN5bW1ldHJpYywgc3ltbWV0cmljKSk7XG5cdFx0dGhpcy5lbmNyeXB0ZWQgKz0gczJrLndyaXRlKCk7XG5cdFx0dGhpcy5lbmNyeXB0ZWQgKz0gaXY7XG5cblxuXG5cdFx0dGhpcy5lbmNyeXB0ZWQgKz0gY3J5cHRvLmNmYi5ub3JtYWxFbmNyeXB0KHN5bW1ldHJpYywga2V5LCBjbGVhcnRleHQsIGl2KTtcbiAgICB9XG5cblx0ZnVuY3Rpb24gcHJvZHVjZUVuY3J5cHRpb25LZXkoczJrLCBwYXNzcGhyYXNlLCBhbGdvcml0aG0pIHtcblx0XHRyZXR1cm4gczJrLnByb2R1Y2Vfa2V5KHBhc3NwaHJhc2UsXG5cdFx0XHRjcnlwdG8uY2lwaGVyW2FsZ29yaXRobV0ua2V5U2l6ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVjcnlwdHMgdGhlIHByaXZhdGUga2V5IE1QSXMgd2hpY2ggYXJlIG5lZWRlZCB0byB1c2UgdGhlIGtleS5cblx0ICogb3BlbnBncF9wYWNrZXRfa2V5bWF0ZXJpYWwuaGFzVW5lbmNyeXB0ZWRTZWNyZXRLZXlEYXRhIHNob3VsZCBiZSBcblx0ICogZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWRcblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJfcGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSBmb3IgdGhpcyBwcml2YXRlIGtleSBcblx0ICogYXMgc3RyaW5nXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHBhc3NwaHJhc2Ugd2FzIGNvcnJlY3Q7IGZhbHNlIGlmIG5vdFxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24ocGFzc3BocmFzZSkge1xuXHRcdGlmICghdGhpcy5lbmNyeXB0ZWQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRzeW1tZXRyaWMsXG5cdFx0XHRrZXk7XG5cblx0XHR2YXIgczJrX3VzYWdlID0gdGhpcy5lbmNyeXB0ZWRbaSsrXS5jaGFyQ29kZUF0KCk7XG5cblx0ICAgIC8vIC0gW09wdGlvbmFsXSBJZiBzdHJpbmctdG8ta2V5IHVzYWdlIG9jdGV0IHdhcyAyNTUgb3IgMjU0LCBhIG9uZS1cblx0ICAgIC8vICAgb2N0ZXQgc3ltbWV0cmljIGVuY3J5cHRpb24gYWxnb3JpdGhtLlxuXHQgICAgaWYgKHMya191c2FnZSA9PSAyNTUgfHwgczJrX3VzYWdlID09IDI1NCkge1xuXHQgICAgXHRzeW1tZXRyaWMgPSB0aGlzLmVuY3J5cHRlZFtpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdHN5bW1ldHJpYyA9IGVudW1zLnJlYWQoZW51bXMuc3ltbWV0cmljLCBzeW1tZXRyaWMpO1xuXHQgICAgIFxuXHRcdFx0Ly8gLSBbT3B0aW9uYWxdIElmIHN0cmluZy10by1rZXkgdXNhZ2Ugb2N0ZXQgd2FzIDI1NSBvciAyNTQsIGFcblx0XHRcdC8vICAgc3RyaW5nLXRvLWtleSBzcGVjaWZpZXIuICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmctdG8ta2V5XG5cdFx0XHQvLyAgIHNwZWNpZmllciBpcyBpbXBsaWVkIGJ5IGl0cyB0eXBlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cdCAgICBcdHZhciBzMmsgPSBuZXcgdHlwZV9zMmsoKTtcblx0ICAgIFx0aSArPSBzMmsucmVhZCh0aGlzLmVuY3J5cHRlZC5zdWJzdHIoaSkpO1xuXG5cdFx0XHRrZXkgPSBwcm9kdWNlRW5jcnlwdGlvbktleShzMmssIHBhc3NwaHJhc2UsIHN5bW1ldHJpYyk7XG5cdCAgICB9IGVsc2Uge1xuXHRcdFx0c3ltbWV0cmljID0gczJrX3VzYWdlO1xuXHRcdFx0c3ltbWV0cmljID0gZW51bXMucmVhZChlbnVtcy5zeW1tZXRyaWMsIHN5bW1ldHJpYyk7XG5cdFx0XHRrZXkgPSBjcnlwdG8uaGFzaC5tZDUocGFzc3BocmFzZSk7XG5cdFx0fVxuXG5cdCAgICBcblx0ICAgIC8vIC0gW09wdGlvbmFsXSBJZiBzZWNyZXQgZGF0YSBpcyBlbmNyeXB0ZWQgKHN0cmluZy10by1rZXkgdXNhZ2Ugb2N0ZXRcblx0ICAgIC8vICAgbm90IHplcm8pLCBhbiBJbml0aWFsIFZlY3RvciAoSVYpIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGVcblx0ICAgIC8vICAgY2lwaGVyJ3MgYmxvY2sgc2l6ZS5cblx0XHR2YXIgaXYgPSB0aGlzLmVuY3J5cHRlZC5zdWJzdHIoaSwgXG5cdFx0XHRjcnlwdG8uY2lwaGVyW3N5bW1ldHJpY10uYmxvY2tTaXplKTtcblxuXHRcdGkgKz0gaXYubGVuZ3RoO1xuXG5cdFx0dmFyIGNsZWFydGV4dCxcblx0XHRcdGNpcGhlcnRleHQgPSB0aGlzLmVuY3J5cHRlZC5zdWJzdHIoaSk7XG5cbiBcdFx0Y2xlYXJ0ZXh0ID0gY3J5cHRvLmNmYi5ub3JtYWxEZWNyeXB0KHN5bW1ldHJpYywga2V5LCBjaXBoZXJ0ZXh0LCBpdik7XG5cblx0XHR2YXIgaGFzaCA9IHMya191c2FnZSA9PSAyNTQgP1xuXHRcdFx0J3NoYTEnIDpcblx0XHRcdCdtb2QnO1xuXG4gICBcdFxuXHRcdHRoaXMubXBpID0gdGhpcy5tcGkuY29uY2F0KHBhcnNlX2NsZWFydGV4dF9tcGkoaGFzaCwgY2xlYXJ0ZXh0LFxuXHRcdFx0dGhpcy5hbGdvcml0aG0pKTtcblx0fVxuXG5cdHRoaXMuZ2VuZXJhdGUgPSBmdW5jdGlvbihiaXRzKSB7XG5cblx0fVxuXHRcbn1cblxucGFja2V0X3NlY3JldF9rZXkucHJvdG90eXBlID0gbmV3IHB1YmxpY0tleTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYWNrZXRfc2VjcmV0X2tleTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBzZWNyZXRfa2V5ID0gcmVxdWlyZSgnLi9zZWNyZXRfa2V5LmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2VjcmV0X3N1YmtleSgpIHtcblx0c2VjcmV0X2tleS5jYWxsKHRoaXMpO1xufVxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdHBhY2tldCA9IHJlcXVpcmUoJy4vcGFja2V0LmpzJyksXG5cdGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKSxcblx0Y3J5cHRvID0gcmVxdWlyZSgnLi4vY3J5cHRvJyksXG5cdHR5cGVfbXBpID0gcmVxdWlyZSgnLi4vdHlwZS9tcGkuanMnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFNpZ25hdHVyZSBQYWNrZXQgKFRhZyAyKVxuICogXG4gKiBSRkM0NDgwIDUuMjpcbiAqIEEgU2lnbmF0dXJlIHBhY2tldCBkZXNjcmliZXMgYSBiaW5kaW5nIGJldHdlZW4gc29tZSBwdWJsaWMga2V5IGFuZFxuICogc29tZSBkYXRhLiAgVGhlIG1vc3QgY29tbW9uIHNpZ25hdHVyZXMgYXJlIGEgc2lnbmF0dXJlIG9mIGEgZmlsZSBvciBhXG4gKiBibG9jayBvZiB0ZXh0LCBhbmQgYSBzaWduYXR1cmUgdGhhdCBpcyBhIGNlcnRpZmljYXRpb24gb2YgYSBVc2VyIElELlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldF9zaWduYXR1cmUoKSB7XG5cblx0dGhpcy5zaWduYXR1cmVUeXBlID0gbnVsbDtcblx0dGhpcy5oYXNoQWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBudWxsOyBcblxuXHR0aGlzLnNpZ25hdHVyZURhdGEgPSBudWxsO1xuXHR0aGlzLnNpZ25lZEhhc2hWYWx1ZSA9IG51bGw7XG5cdHRoaXMubXBpID0gbnVsbDtcblxuXHR0aGlzLmNyZWF0ZWQgPSBudWxsO1xuXHR0aGlzLnNpZ25hdHVyZUV4cGlyYXRpb25UaW1lID0gbnVsbDtcblx0dGhpcy5zaWduYXR1cmVOZXZlckV4cGlyZXMgPSBudWxsO1xuXHR0aGlzLmV4cG9ydGFibGUgPSBudWxsO1xuXHR0aGlzLnRydXN0TGV2ZWwgPSBudWxsO1xuXHR0aGlzLnRydXN0QW1vdW50ID0gbnVsbDtcblx0dGhpcy5yZWd1bGFyRXhwcmVzc2lvbiA9IG51bGw7XG5cdHRoaXMucmV2b2NhYmxlID0gbnVsbDtcblx0dGhpcy5rZXlFeHBpcmF0aW9uVGltZSA9IG51bGw7XG5cdHRoaXMua2V5TmV2ZXJFeHBpcmVzID0gbnVsbDtcblx0dGhpcy5wcmVmZXJyZWRTeW1tZXRyaWNBbGdvcml0aG1zID0gbnVsbDtcblx0dGhpcy5yZXZvY2F0aW9uS2V5Q2xhc3MgPSBudWxsO1xuXHR0aGlzLnJldm9jYXRpb25LZXlBbGdvcml0aG0gPSBudWxsO1xuXHR0aGlzLnJldm9jYXRpb25LZXlGaW5nZXJwcmludCA9IG51bGw7XG5cdHRoaXMuaXNzdWVyS2V5SWQgPSBudWxsO1xuXHR0aGlzLm5vdGF0aW9uID0ge307XG5cdHRoaXMucHJlZmVycmVkSGFzaEFsZ29yaXRobXMgPSBudWxsO1xuXHR0aGlzLnByZWZlcnJlZENvbXByZXNzaW9uQWxnb3JpdGhtcyA9IG51bGw7XG5cdHRoaXMua2V5U2VydmVyUHJlZmVyZW5jZXMgPSBudWxsO1xuXHR0aGlzLnByZWZlcnJlZEtleVNlcnZlciA9IG51bGw7XG5cdHRoaXMuaXNQcmltYXJ5VXNlcklEID0gbnVsbDtcblx0dGhpcy5wb2xpY3lVUkkgPSBudWxsO1xuXHR0aGlzLmtleUZsYWdzID0gbnVsbDtcblx0dGhpcy5zaWduZXJzVXNlcklkID0gbnVsbDtcblx0dGhpcy5yZWFzb25Gb3JSZXZvY2F0aW9uRmxhZyA9IG51bGw7XG5cdHRoaXMucmVhc29uRm9yUmV2b2NhdGlvblN0cmluZyA9IG51bGw7XG5cdHRoaXMuc2lnbmF0dXJlVGFyZ2V0UHVibGljS2V5QWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoQWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoID0gbnVsbDtcblx0dGhpcy5lbWJlZGRlZFNpZ25hdHVyZSA9IG51bGw7XG5cblx0dGhpcy52ZXJpZmllZCA9IGZhbHNlO1xuXHRcblxuXHQvKipcblx0ICogcGFyc2luZyBmdW5jdGlvbiBmb3IgYSBzaWduYXR1cmUgcGFja2V0ICh0YWcgMikuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBieXRlcyBwYXlsb2FkIG9mIGEgdGFnIDIgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gcG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBieXRlcyBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgYnl0ZXMgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gb2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdHZhciBpID0gMDtcblxuXHRcdHZhciB2ZXJzaW9uID0gYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCk7XG5cdFx0Ly8gc3dpdGNoIG9uIHZlcnNpb24gKDMgYW5kIDQpXG5cdFx0c3dpdGNoICh2ZXJzaW9uKSB7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0Ly8gT25lLW9jdGV0IGxlbmd0aCBvZiBmb2xsb3dpbmcgaGFzaGVkIG1hdGVyaWFsLiBNVVNUIGJlIDUuXG5cdFx0XHRpZiAoYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCkgIT0gNSlcblx0XHRcdFx0dXRpbC5wcmludF9kZWJ1ZyhcIm9wZW5wZ3AucGFja2V0LnNpZ25hdHVyZS5qc1xcblwiK1xuXHRcdFx0XHRcdCdpbnZhbGlkIE9uZS1vY3RldCBsZW5ndGggb2YgZm9sbG93aW5nIGhhc2hlZCBtYXRlcmlhbC4nICtcblx0XHRcdFx0XHQnTVVTVCBiZSA1LiBAOicrKGktMSkpO1xuXG5cdFx0XHR2YXIgc2lncG9zID0gaTtcblx0XHRcdC8vIE9uZS1vY3RldCBzaWduYXR1cmUgdHlwZS5cblx0XHRcdHRoaXMuc2lnbmF0dXJlVHlwZSA9IGJ5dGVzW2krK10uY2hhckNvZGVBdCgpO1xuXG5cdFx0XHQvLyBGb3VyLW9jdGV0IGNyZWF0aW9uIHRpbWUuXG5cdFx0XHR0aGlzLmNyZWF0ZWQgPSB1dGlsLnJlYWREYXRlKGJ5dGVzLnN1YnN0cihpLCA0KSk7XG5cdFx0XHRpICs9IDQ7XG5cdFx0XHRcblx0XHRcdC8vIHN0b3JpbmcgZGF0YSBhcHBlbmRlZCB0byBkYXRhIHdoaWNoIGdldHMgdmVyaWZpZWRcblx0XHRcdHRoaXMuc2lnbmF0dXJlRGF0YSA9IGJ5dGVzLnN1YnN0cmluZyhwb3NpdGlvbiwgaSk7XG5cdFx0XHRcblx0XHRcdC8vIEVpZ2h0LW9jdGV0IEtleSBJRCBvZiBzaWduZXIuXG5cdFx0XHR0aGlzLmlzc3VlcktleUlkID0gYnl0ZXMuc3Vic3RyaW5nKGksIGkgKzgpO1xuXHRcdFx0aSArPSA4O1xuXG5cdFx0XHQvLyBPbmUtb2N0ZXQgcHVibGljLWtleSBhbGdvcml0aG0uXG5cdFx0XHR0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9IGJ5dGVzW2krK10uY2hhckNvZGVBdCgpO1xuXG5cdFx0XHQvLyBPbmUtb2N0ZXQgaGFzaCBhbGdvcml0aG0uXG5cdFx0XHR0aGlzLmhhc2hBbGdvcml0aG0gPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRicmVhaztcblx0XHRjYXNlIDQ6XG5cdFx0XHR0aGlzLnNpZ25hdHVyZVR5cGUgPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdHRoaXMucHVibGljS2V5QWxnb3JpdGhtID0gYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHR0aGlzLmhhc2hBbGdvcml0aG0gPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblxuXG5cdFx0XHRmdW5jdGlvbiBzdWJwYWNrZXRzKGJ5dGVzLCBzaWduZWQpIHtcblx0XHRcdFx0Ly8gVHdvLW9jdGV0IHNjYWxhciBvY3RldCBjb3VudCBmb3IgZm9sbG93aW5nIGhhc2hlZCBzdWJwYWNrZXRcblx0XHRcdFx0Ly8gZGF0YS5cblx0XHRcdFx0dmFyIHN1YnBhY2tldF9sZW5ndGggPSB1dGlsLnJlYWROdW1iZXIoXG5cdFx0XHRcdFx0Ynl0ZXMuc3Vic3RyKDAsIDIpKTtcblxuXHRcdFx0XHR2YXIgaSA9IDI7XG5cblx0XHRcdFx0Ly8gSGFzaGVkIHN1YnBhY2tldCBkYXRhIHNldCAoemVybyBvciBtb3JlIHN1YnBhY2tldHMpXG5cdFx0XHRcdHZhciBzdWJwYWNrZWRfcmVhZCA9IDA7XG5cdFx0XHRcdHdoaWxlIChpIDwgMiArIHN1YnBhY2tldF9sZW5ndGgpIHtcblxuXHRcdFx0XHRcdHZhciBsZW4gPSBwYWNrZXQucmVhZFNpbXBsZUxlbmd0aChieXRlcy5zdWJzdHIoaSkpO1xuXHRcdFx0XHRcdGkgKz0gbGVuLm9mZnNldDtcblxuXHRcdFx0XHRcdC8vIFNpbmNlIGl0IGlzIHRyaXZpYWwgdG8gYWRkIGRhdGEgdG8gdGhlIHVuaGFzaGVkIHBvcnRpb24gb2YgXG5cdFx0XHRcdFx0Ly8gdGhlIHBhY2tldCB3ZSBzaW1wbHkgaWdub3JlIGFsbCB1bmF1dGhlbnRpY2F0ZWQgZGF0YS5cblx0XHRcdFx0XHRpZihzaWduZWQpXG5cdFx0XHRcdFx0XHR0aGlzLnJlYWRfc3ViX3BhY2tldChieXRlcy5zdWJzdHIoaSwgbGVuLmxlbikpO1xuXG5cdFx0XHRcdFx0aSArPSBsZW4ubGVuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0aSArPSBzdWJwYWNrZXRzLmNhbGwodGhpcywgYnl0ZXMuc3Vic3RyKGkpLCB0cnVlKTtcblxuXHRcdFx0Ly8gQSBWNCBzaWduYXR1cmUgaGFzaGVzIHRoZSBwYWNrZXQgYm9keVxuXHRcdFx0Ly8gc3RhcnRpbmcgZnJvbSBpdHMgZmlyc3QgZmllbGQsIHRoZSB2ZXJzaW9uIG51bWJlciwgdGhyb3VnaCB0aGUgZW5kXG5cdFx0XHQvLyBvZiB0aGUgaGFzaGVkIHN1YnBhY2tldCBkYXRhLiAgVGh1cywgdGhlIGZpZWxkcyBoYXNoZWQgYXJlIHRoZVxuXHRcdFx0Ly8gc2lnbmF0dXJlIHZlcnNpb24sIHRoZSBzaWduYXR1cmUgdHlwZSwgdGhlIHB1YmxpYy1rZXkgYWxnb3JpdGhtLCB0aGVcblx0XHRcdC8vIGhhc2ggYWxnb3JpdGhtLCB0aGUgaGFzaGVkIHN1YnBhY2tldCBsZW5ndGgsIGFuZCB0aGUgaGFzaGVkXG5cdFx0XHQvLyBzdWJwYWNrZXQgYm9keS5cblx0XHRcdHRoaXMuc2lnbmF0dXJlRGF0YSA9IGJ5dGVzLnN1YnN0cigwLCBpKTtcblxuXHRcdFx0aSArPSBzdWJwYWNrZXRzLmNhbGwodGhpcywgYnl0ZXMuc3Vic3RyKGkpLCBmYWxzZSk7XG5cblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1ZlcnNpb24gJyArIHZlcnNpb24gKyAnIG9mIHRoZSBzaWduYXR1cmUgaXMgdW5zdXBwb3J0ZWQuJyk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBUd28tb2N0ZXQgZmllbGQgaG9sZGluZyBsZWZ0IDE2IGJpdHMgb2Ygc2lnbmVkIGhhc2ggdmFsdWUuXG5cdFx0dGhpcy5zaWduZWRIYXNoVmFsdWUgPSBieXRlcy5zdWJzdHIoaSwgMik7XG5cdFx0aSArPSAyO1xuXG5cdFx0dGhpcy5zaWduYXR1cmUgPSBieXRlcy5zdWJzdHIoaSk7XG5cdH1cblxuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2lnbmF0dXJlRGF0YSArIFxuXHRcdFx0dXRpbC53cml0ZU51bWJlcigwLCAyKSArIC8vIE51bWJlciBvZiB1bnNpZ25lZCBzdWJwYWNrZXRzLlxuXHRcdFx0dGhpcy5zaWduZWRIYXNoVmFsdWUgK1xuXHRcdFx0dGhpcy5zaWduYXR1cmU7XG5cdH1cblxuXHQvKipcblx0ICogU2lnbnMgcHJvdmlkZWQgZGF0YS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHNlcmlhbGl6YXRpb24uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIENvbnRhaW5zIHBhY2tldHMgdG8gYmUgc2lnbmVkLlxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXl9IHByaXZhdGVrZXkgcHJpdmF0ZSBrZXkgdXNlZCB0byBzaWduIHRoZSBtZXNzYWdlLiBcblx0ICovXG5cdHRoaXMuc2lnbiA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xuXHRcdHZhciBzaWduYXR1cmVUeXBlID0gZW51bXMud3JpdGUoZW51bXMuc2lnbmF0dXJlLCB0aGlzLnNpZ25hdHVyZVR5cGUpLFxuXHRcdFx0cHVibGljS2V5QWxnb3JpdGhtID0gZW51bXMud3JpdGUoZW51bXMucHVibGljS2V5LCB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSksXG5cdFx0XHRoYXNoQWxnb3JpdGhtID0gZW51bXMud3JpdGUoZW51bXMuaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtKTtcblxuXHRcdHZhciByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDQpOyBcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShzaWduYXR1cmVUeXBlKTtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwdWJsaWNLZXlBbGdvcml0aG0pO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGhhc2hBbGdvcml0aG0pO1xuXG5cblx0XHQvLyBBZGQgc3VicGFja2V0cyBoZXJlXG5cdFx0cmVzdWx0ICs9IHV0aWwud3JpdGVOdW1iZXIoMCwgMik7XG5cblxuXHRcdHRoaXMuc2lnbmF0dXJlRGF0YSA9IHJlc3VsdDtcblxuXHRcdHZhciB0cmFpbGVyID0gdGhpcy5jYWxjdWxhdGVUcmFpbGVyKCk7XG5cdFx0XG5cdFx0dmFyIHRvSGFzaCA9IHRoaXMudG9TaWduKHNpZ25hdHVyZVR5cGUsIGRhdGEpICsgXG5cdFx0XHR0aGlzLnNpZ25hdHVyZURhdGEgKyB0cmFpbGVyO1xuXG5cdFx0dmFyIGhhc2ggPSBjcnlwdG8uaGFzaC5kaWdlc3QoaGFzaEFsZ29yaXRobSwgdG9IYXNoKTtcblx0XHRcblx0XHR0aGlzLnNpZ25lZEhhc2hWYWx1ZSA9IGhhc2guc3Vic3RyKDAsIDIpO1xuXG5cblx0XHR0aGlzLnNpZ25hdHVyZSA9IGNyeXB0by5zaWduYXR1cmUuc2lnbihoYXNoQWxnb3JpdGhtLCBcblx0XHRcdHB1YmxpY0tleUFsZ29yaXRobSwga2V5Lm1waSwgdG9IYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBjcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc3ViIHNpZ25hdHVyZSBwYWNrZXQgKFNlZSBSRkMgNDg4MCA1LjIuMy4xKVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHR5cGUgc3VicGFja2V0IHNpZ25hdHVyZSB0eXBlLiBTaWduYXR1cmUgdHlwZXMgYXMgZGVzY3JpYmVkIFxuXHQgKiBpbiBSRkM0ODgwIFNlY3Rpb24gNS4yLjMuMlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBkYXRhIHRvIGJlIGluY2x1ZGVkXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gYSBzdHJpbmctcmVwcmVzZW50YXRpb24gb2YgYSBzdWIgc2lnbmF0dXJlIHBhY2tldCAoU2VlIFJGQyA0ODgwIDUuMi4zLjEpXG5cdCAqL1xuXHRmdW5jdGlvbiB3cml0ZV9zdWJfcGFja2V0KHR5cGUsIGRhdGEpIHtcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcblx0XHRyZXN1bHQgKz0gcGFja2V0LndyaXRlU2ltcGxlTGVuZ3RoKGRhdGEubGVuZ3RoKzEpO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHR5cGUpO1xuXHRcdHJlc3VsdCArPSBkYXRhO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblx0XG5cdC8vIFY0IHNpZ25hdHVyZSBzdWIgcGFja2V0c1xuXHRcblx0dGhpcy5yZWFkX3N1Yl9wYWNrZXQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdHZhciBteXBvcyA9IDA7XG5cblx0XHRmdW5jdGlvbiByZWFkX2FycmF5KHByb3AsIGJ5dGVzKSB7XG5cdFx0XHR0aGlzW3Byb3BdID0gW107XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dGhpc1twcm9wXS5wdXNoKGJ5dGVzW2ldLmNoYXJDb2RlQXQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdC8vIFRoZSBsZWZ0d29zdCBiaXQgZGVub3RlcyBhIFwiY3JpdGljYWxcIiBwYWNrZXQsIGJ1dCB3ZSBpZ25vcmUgaXQuXG5cdFx0dmFyIHR5cGUgPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCkgJiAweDdGO1xuXG5cdFx0Ly8gc3VicGFja2V0IHR5cGVcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRjYXNlIDI6IC8vIFNpZ25hdHVyZSBDcmVhdGlvbiBUaW1lXG5cdFx0XHR0aGlzLmNyZWF0ZWQgPSB1dGlsLnJlYWREYXRlKGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOiAvLyBTaWduYXR1cmUgRXhwaXJhdGlvbiBUaW1lXG5cdFx0XHR2YXIgdGltZSA9IHV0aWwucmVhZERhdGUoYnl0ZXMuc3Vic3RyKG15cG9zKSk7XG5cblx0XHRcdHRoaXMuc2lnbmF0dXJlTmV2ZXJFeHBpcmVzID0gdGltZS5nZXRUaW1lKCkgPT0gMDtcblx0XHRcdHRoaXMuc2lnbmF0dXJlRXhwaXJhdGlvblRpbWUgPSB0aW1lO1xuXHRcdFx0XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDQ6IC8vIEV4cG9ydGFibGUgQ2VydGlmaWNhdGlvblxuXHRcdFx0dGhpcy5leHBvcnRhYmxlID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpID09IDE7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDU6IC8vIFRydXN0IFNpZ25hdHVyZVxuXHRcdFx0dGhpcy50cnVzdExldmVsID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0dGhpcy50cnVzdEFtb3VudCA9IGJ5dGVzW215cG9zKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgNjogLy8gUmVndWxhciBFeHByZXNzaW9uXG5cdFx0XHR0aGlzLnJlZ3VsYXJFeHByZXNzaW9uID0gYnl0ZXMuc3Vic3RyKG15cG9zKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgNzogLy8gUmV2b2NhYmxlXG5cdFx0XHR0aGlzLnJldm9jYWJsZSA9IGJ5dGVzW215cG9zKytdLmNoYXJDb2RlQXQoKSA9PSAxO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSA5OiAvLyBLZXkgRXhwaXJhdGlvbiBUaW1lXG5cdFx0XHR2YXIgdGltZSA9IHV0aWwucmVhZERhdGUoYnl0ZXMuc3Vic3RyKG15cG9zKSk7XG5cblx0XHRcdHRoaXMua2V5RXhwaXJhdGlvblRpbWUgPSB0aW1lO1xuXHRcdFx0dGhpcy5rZXlOZXZlckV4cGlyZXMgPSB0aW1lLmdldFRpbWUoKSA9PSAwO1xuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDExOiAvLyBQcmVmZXJyZWQgU3ltbWV0cmljIEFsZ29yaXRobXNcblx0XHRcdHRoaXMucHJlZmVycmVkU3ltbWV0cmljQWxnb3JpdGhtcyA9IFtdO1xuXG5cdFx0XHR3aGlsZShteXBvcyAhPSBieXRlcy5sZW5ndGgpIHtcblx0XHRcdFx0dGhpcy5wcmVmZXJyZWRTeW1tZXRyaWNBbGdvcml0aG1zLnB1c2goYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpKTtcblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAxMjogLy8gUmV2b2NhdGlvbiBLZXlcblx0XHRcdC8vICgxIG9jdGV0IG9mIGNsYXNzLCAxIG9jdGV0IG9mIHB1YmxpYy1rZXkgYWxnb3JpdGhtIElELCAyMFxuXHRcdFx0Ly8gb2N0ZXRzIG9mXG5cdFx0XHQvLyBmaW5nZXJwcmludClcblx0XHRcdHRoaXMucmV2b2NhdGlvbktleUNsYXNzID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0dGhpcy5yZXZvY2F0aW9uS2V5QWxnb3JpdGhtID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0dGhpcy5yZXZvY2F0aW9uS2V5RmluZ2VycHJpbnQgPSBieXRlcy5zdWJzdHIobXlwb3MsIDIwKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAxNjogLy8gSXNzdWVyXG5cdFx0XHR0aGlzLmlzc3VlcktleUlkID0gYnl0ZXMuc3Vic3RyKG15cG9zLCA4KTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAyMDogLy8gTm90YXRpb24gRGF0YVxuXHRcdFx0Ly8gV2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGFueXRoaW5nIGJ1dCBhIHRleHQgZmxhZ2dlZCBkYXRhLlxuXHRcdFx0aWYoYnl0ZXNbbXlwb3NdLmNoYXJDb2RlQXQoKSA9PSAweDgwKSB7XG5cblx0XHRcdFx0Ly8gV2UgZXh0cmFjdCBrZXkvdmFsdWUgdHVwbGUgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uXG5cdFx0XHRcdG15cG9zICs9IDQ7XG5cdFx0XHRcdHZhciBtID0gdXRpbC53cml0ZU51bWJlcihieXRlcy5zdWJzdHIobXlwb3MsIDIpKTtcblx0XHRcdFx0bXlwb3MgKz0gMlxuXHRcdFx0XHR2YXIgbiA9IHV0aWwud3JpdGVOdW1iZXIoYnl0ZXMuc3Vic3RyKG15cG9zLCAyKSk7XG5cdFx0XHRcdG15cG9zICs9IDJcblxuXHRcdFx0XHR2YXIgbmFtZSA9IGJ5dGVzLnN1YnN0cihteXBvcywgbSksXG5cdFx0XHRcdFx0dmFsdWUgPSBieXRlcy5zdWJzdHIobXlwb3MgKyBtLCBuKTtcblxuXHRcdFx0XHR0aGlzLm5vdGF0aW9uW25hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIG5vdGF0aW9uIGZsYWcuXCIpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMTogLy8gUHJlZmVycmVkIEhhc2ggQWxnb3JpdGhtc1xuXHRcdFx0cmVhZF9hcnJheS5jYWxsKHRoaXMsICdwcmVmZXJyZWRIYXNoQWxnb3JpdGhtcycsIGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMjogLy8gUHJlZmVycmVkIENvbXByZXNzaW9uIEFsZ29yaXRobXNcblx0XHRcdHJlYWRfYXJyYXkuY2FsbCh0aGlzLCAncHJlZmVycmVkQ29tcHJlc3Npb25BbGdvcml0aG1zICcsIGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMzogLy8gS2V5IFNlcnZlciBQcmVmZXJlbmNlc1xuXHRcdFx0cmVhZF9hcnJheS5jYWxsKHRoaXMsICdrZXlTZXJ2ZXJQcmVmZXJlbmNlc3MnLCBieXRlcy5zdWJzdHIobXlwb3MpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjQ6IC8vIFByZWZlcnJlZCBLZXkgU2VydmVyXG5cdFx0XHR0aGlzLnByZWZlcnJlZEtleVNlcnZlciA9IGJ5dGVzLnN1YnN0cihteXBvcyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDI1OiAvLyBQcmltYXJ5IFVzZXIgSURcblx0XHRcdHRoaXMuaXNQcmltYXJ5VXNlcklEID0gYnl0ZXNbbXlwb3MrK10gIT0gMDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjY6IC8vIFBvbGljeSBVUklcblx0XHRcdHRoaXMucG9saWN5VVJJID0gYnl0ZXMuc3Vic3RyKG15cG9zKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjc6IC8vIEtleSBGbGFnc1xuXHRcdFx0cmVhZF9hcnJheS5jYWxsKHRoaXMsICdrZXlGbGFncycsIGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyODogLy8gU2lnbmVyJ3MgVXNlciBJRFxuXHRcdFx0dGhpcy5zaWduZXJzVXNlcklkICs9IGJ5dGVzLnN1YnN0cihteXBvcyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDI5OiAvLyBSZWFzb24gZm9yIFJldm9jYXRpb25cblx0XHRcdHRoaXMucmVhc29uRm9yUmV2b2NhdGlvbkZsYWcgPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHR0aGlzLnJlYXNvbkZvclJldm9jYXRpb25TdHJpbmcgPSBieXRlcy5zdWJzdHIobXlwb3MpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzMDogLy8gRmVhdHVyZXNcblx0XHRcdHJlYWRfYXJyYXkuY2FsbCh0aGlzLCAnZmVhdHVyZXMnLCBieXRlcy5zdWJzdHIobXlwb3MpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMzE6IC8vIFNpZ25hdHVyZSBUYXJnZXRcblx0XHRcdC8vICgxIG9jdGV0IHB1YmxpYy1rZXkgYWxnb3JpdGhtLCAxIG9jdGV0IGhhc2ggYWxnb3JpdGhtLCBOIG9jdGV0cyBoYXNoKVxuXHRcdFx0dGhpcy5zaWduYXR1cmVUYXJnZXRQdWJsaWNLZXlBbGdvcml0aG0gPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHR0aGlzLnNpZ25hdHVyZVRhcmdldEhhc2hBbGdvcml0aG0gPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cblx0XHRcdHZhciBsZW4gPSBjcnlwdG8uZ2V0SGFzaEJ5dGVMZW5ndGgodGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoQWxnb3JpdGhtKTtcblxuXHRcdFx0dGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoID0gYnl0ZXMuc3Vic3RyKG15cG9zLCBsZW4pO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzMjogLy8gRW1iZWRkZWQgU2lnbmF0dXJlXG5cdFx0XHR0aGlzLmVtYmVkZGVkU2lnbmF0dXJlID0gbmV3IHBhY2tldF9zaWduYXR1cmUoKTtcblx0XHRcdHRoaXMuZW1iZWRkZWRTaWduYXR1cmUucmVhZChieXRlcy5zdWJzdHIobXlwb3MpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR1dGlsLnByaW50X2Vycm9yKFwib3BlbnBncC5wYWNrZXQuc2lnbmF0dXJlLmpzXFxuXCIrXG5cdFx0XHRcdCd1bmtub3duIHNpZ25hdHVyZSBzdWJwYWNrZXQgdHlwZSAnK3R5cGUrXCIgQDpcIitteXBvcytcblx0XHRcdFx0XCIgc3VicGxlbjpcIitzdWJwbGVuK1wiIGxlbjpcIitsZW4pO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIFByb2R1Y2VzIGRhdGEgdG8gcHJvZHVjZSBzaWduYXR1cmUgb25cblx0dGhpcy50b1NpZ24gPSBmdW5jdGlvbih0eXBlLCBkYXRhKSB7XG5cdFx0dmFyIHQgPSBlbnVtcy5zaWduYXR1cmVcblxuXHRcdHN3aXRjaCh0eXBlKSB7XG5cdFx0Y2FzZSB0LmJpbmFyeTpcblx0XHRcdHJldHVybiBkYXRhLmxpdGVyYWwuZ2V0Qnl0ZXMoKTtcblxuXHRcdGNhc2UgdC50ZXh0OlxuXHRcdFx0cmV0dXJuIHRoaXMudG9TaWduKHQuYmluYXJ5LCBkYXRhKVxuXHRcdFx0XHQucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKVxuXHRcdFx0XHQucmVwbGFjZSgvXFxuL2csICdcXHJcXG4nKTtcblx0XHRcdFx0XG5cdFx0Y2FzZSB0LnN0YW5kYWxvbmU6XG5cdFx0XHRyZXR1cm4gJydcblxuXHRcdGNhc2UgdC5jZXJ0X2dlbmVyaWM6XG5cdFx0Y2FzZSB0LmNlcnRfcGVyc29uYTpcblx0XHRjYXNlIHQuY2VydF9jYXN1YWw6XG5cdFx0Y2FzZSB0LmNlcnRfcG9zaXRpdmU6XG5cdFx0Y2FzZSB0LmNlcnRfcmV2b2NhdGlvbjpcblx0XHR7XG5cdFx0XHR2YXIgcGFja2V0LCB0YWc7XG5cblx0XHRcdGlmKGRhdGEudXNlcmlkICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0YWcgPSAweEI0O1xuXHRcdFx0XHRwYWNrZXQgPSBkYXRhLnVzZXJpZDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYoZGF0YS51c2VyYXR0cmlidXRlICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0YWcgPSAweEQxXG5cdFx0XHRcdHBhY2tldCA9IGRhdGEudXNlcmF0dHJpYnV0ZTtcblx0XHRcdH1cblx0XHRcdGVsc2UgdGhyb3cgbmV3IEVycm9yKCdFaXRoZXIgYSB1c2VyaWQgb3IgdXNlcmF0dHJpYnV0ZSBwYWNrZXQgbmVlZHMgdG8gYmUgJyArXG5cdFx0XHRcdCdzdXBwbGllZCBmb3IgY2VydGlmaWNhdGlvbi4nKTtcblxuXG5cdFx0XHR2YXIgYnl0ZXMgPSBwYWNrZXQud3JpdGUoKTtcblxuXHRcdFx0XG5cdFx0XHRyZXR1cm4gdGhpcy50b1NpZ24odC5rZXksIGRhdGEpICtcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSh0YWcpICtcblx0XHRcdFx0dXRpbC53cml0ZU51bWJlcihieXRlcy5sZW5ndGgsIDQpICtcblx0XHRcdFx0Ynl0ZXM7XG5cdFx0fVxuXHRcdGNhc2UgdC5zdWJrZXlfYmluZGluZzpcblx0XHRjYXNlIHQua2V5X2JpbmRpbmc6XG5cdFx0e1xuXHRcdFx0cmV0dXJuIHRoaXMudG9TaWduKHQua2V5LCBkYXRhKSArIHRoaXMudG9TaWduKHQua2V5LCB7IGtleTogZGF0YS5iaW5kIH0pO1xuXHRcdH1cblx0XHRjYXNlIHQua2V5OlxuXHRcdHtcblx0XHRcdGlmKGRhdGEua2V5ID09IHVuZGVmaW5lZClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdLZXkgcGFja2V0IGlzIHJlcXVpcmVkIGZvciB0aGlzIHNpZ3RhdHVyZS4nKTtcblx0XHRcdFxuXHRcdFx0cmV0dXJuIGRhdGEua2V5LndyaXRlT2xkKCk7XG5cdFx0fVxuXHRcdGNhc2UgdC5rZXlfcmV2b2NhdGlvbjpcblx0XHRjYXNlIHQuc3Via2V5X3Jldm9jYXRpb246XG5cdFx0XHRyZXR1cm4gdGhpcy50b1NpZ24odC5rZXksIGRhdGEpO1xuXHRcdGNhc2UgdC50aW1lc3RhbXA6XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0Y2FzZSB0LnRocmlkX3BhcnR5OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gc2lnbmF0dXJlIHR5cGUuJylcblx0XHR9XG5cdH1cblxuXHRcblx0dGhpcy5jYWxjdWxhdGVUcmFpbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gY2FsY3VsYXRpbmcgdGhlIHRyYWlsZXJcblx0XHR2YXIgdHJhaWxlciA9ICcnO1xuXHRcdHRyYWlsZXIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg0KTsgLy8gVmVyc2lvblxuXHRcdHRyYWlsZXIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEZGKTtcblx0XHR0cmFpbGVyICs9IHV0aWwud3JpdGVOdW1iZXIodGhpcy5zaWduYXR1cmVEYXRhLmxlbmd0aCwgNCk7XG5cdFx0cmV0dXJuIHRyYWlsZXJcblx0fVxuXG5cblx0LyoqXG5cdCAqIHZlcmlmeXMgdGhlIHNpZ25hdHVyZSBwYWNrZXQuIE5vdGU6IG5vdCBzaWduYXR1cmUgdHlwZXMgYXJlIGltcGxlbWVudGVkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIGRhdGEgd2hpY2ggb24gdGhlIHNpZ25hdHVyZSBhcHBsaWVzXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9tc2dfcHJpdmF0ZWtleX0ga2V5IHRoZSBwdWJsaWMga2V5IHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbWVzc2FnZSBpcyB2ZXJpZmllZCwgZWxzZSBmYWxzZS5cblx0ICovXG5cdHRoaXMudmVyaWZ5ID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XG5cdFx0dmFyIHNpZ25hdHVyZVR5cGUgPSBlbnVtcy53cml0ZShlbnVtcy5zaWduYXR1cmUsIHRoaXMuc2lnbmF0dXJlVHlwZSksXG5cdFx0XHRwdWJsaWNLZXlBbGdvcml0aG0gPSBlbnVtcy53cml0ZShlbnVtcy5wdWJsaWNLZXksIHRoaXMucHVibGljS2V5QWxnb3JpdGhtKSxcblx0XHRcdGhhc2hBbGdvcml0aG0gPSBlbnVtcy53cml0ZShlbnVtcy5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG0pO1xuXG5cdFx0dmFyIGJ5dGVzID0gdGhpcy50b1NpZ24oc2lnbmF0dXJlVHlwZSwgZGF0YSksXG5cdFx0XHR0cmFpbGVyID0gdGhpcy5jYWxjdWxhdGVUcmFpbGVyKCk7XG5cblxuXHRcdHZhciBtcGljb3VudCA9IDA7XG5cdFx0Ly8gQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgUlNBIHNpZ25hdHVyZXM6XG5cdFx0Ly8gXHQgICAgLSBtdWx0aXByZWNpc2lvbiBudW1iZXIgKE1QSSkgb2YgUlNBIHNpZ25hdHVyZSB2YWx1ZSBtKipkIG1vZCBuLlxuXHRcdGlmIChwdWJsaWNLZXlBbGdvcml0aG0gPiAwICYmIHB1YmxpY0tleUFsZ29yaXRobSA8IDQpXG5cdFx0XHRtcGljb3VudCA9IDE7XG5cdFx0Ly8gICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRFNBIHNpZ25hdHVyZXM6XG5cdFx0Ly8gICAgICAtIE1QSSBvZiBEU0EgdmFsdWUgci5cblx0XHQvLyAgICAgIC0gTVBJIG9mIERTQSB2YWx1ZSBzLlxuXHRcdGVsc2UgaWYgKHB1YmxpY0tleUFsZ29yaXRobSA9PSAxNylcblx0XHRcdG1waWNvdW50ID0gMjtcblx0XHRcblx0XHR2YXIgbXBpID0gW10sIGkgPSAwO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgbXBpY291bnQ7IGorKykge1xuXHRcdFx0bXBpW2pdID0gbmV3IHR5cGVfbXBpKCk7XG5cdFx0XHRpICs9IG1waVtqXS5yZWFkKHRoaXMuc2lnbmF0dXJlLnN1YnN0cihpKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy52ZXJpZmllZCA9IGNyeXB0by5zaWduYXR1cmUudmVyaWZ5KHB1YmxpY0tleUFsZ29yaXRobSwgXG5cdFx0XHRoYXNoQWxnb3JpdGhtLCBtcGksIGtleS5tcGksIFxuXHRcdFx0Ynl0ZXMgKyB0aGlzLnNpZ25hdHVyZURhdGEgKyB0cmFpbGVyKTtcblxuXHRcdHJldHVybiB0aGlzLnZlcmlmaWVkO1xuXHR9XG59XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpLFxuXHRjcnlwdG8gPSByZXF1aXJlKCcuLi9jcnlwdG8nKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bS4gRW5jcnlwdGVkIEludGVncml0eSBQcm90ZWN0ZWQgRGF0YSBcbiAqIFBhY2tldCAoVGFnIDE4KVxuICogXG4gKiBSRkM0ODgwIDUuMTM6IFRoZSBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBJbnRlZ3JpdHkgUHJvdGVjdGVkIERhdGEgcGFja2V0IGlzXG4gKiBhIHZhcmlhbnQgb2YgdGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgcGFja2V0LiBJdCBpcyBhIG5ldyBmZWF0dXJlXG4gKiBjcmVhdGVkIGZvciBPcGVuUEdQIHRoYXQgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIG9mIGRldGVjdGluZyBhIG1vZGlmaWNhdGlvbiB0b1xuICogZW5jcnlwdGVkIGRhdGEuIEl0IGlzIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhIE1vZGlmaWNhdGlvbiBEZXRlY3Rpb24gQ29kZVxuICogcGFja2V0LlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3N5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZCgpIHtcblx0LyoqIFRoZSBlbmNyeXB0ZWQgcGF5bG9hZC4gKi9cblx0dGhpcy5lbmNyeXB0ZWQgPSBudWxsOyAvLyBzdHJpbmdcblx0LyoqIEB0eXBlIHtCb29sZWFufVxuXHQgKiBJZiBhZnRlciBkZWNyeXB0aW5nIHRoZSBwYWNrZXQgdGhpcyBpcyBzZXQgdG8gdHJ1ZSxcblx0ICogYSBtb2RpZmljYXRpb24gaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIHRodXMgdGhlIGNvbnRlbnRzXG5cdCAqIHNob3VsZCBiZSBkaXNjYXJkZWQuXG5cdCAqL1xuXHR0aGlzLm1vZGlmaWNhdGlvbiA9IGZhbHNlO1xuXHR0aGlzLnBhY2tldHM7XG5cblxuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdC8vIC0gQSBvbmUtb2N0ZXQgdmVyc2lvbiBudW1iZXIuIFRoZSBvbmx5IGN1cnJlbnRseSBkZWZpbmVkIHZhbHVlIGlzXG5cdFx0Ly8gMS5cblx0XHR2YXIgdmVyc2lvbiA9IGJ5dGVzWzBdLmNoYXJDb2RlQXQoKTtcblxuXHRcdGlmICh2ZXJzaW9uICE9IDEpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYWNrZXQgdmVyc2lvbi4nKTtcblx0XHR9XG5cblx0XHQvLyAtIEVuY3J5cHRlZCBkYXRhLCB0aGUgb3V0cHV0IG9mIHRoZSBzZWxlY3RlZCBzeW1tZXRyaWMta2V5IGNpcGhlclxuXHRcdC8vICAgb3BlcmF0aW5nIGluIENpcGhlciBGZWVkYmFjayBtb2RlIHdpdGggc2hpZnQgYW1vdW50IGVxdWFsIHRvIHRoZVxuXHRcdC8vICAgYmxvY2sgc2l6ZSBvZiB0aGUgY2lwaGVyIChDRkItbiB3aGVyZSBuIGlzIHRoZSBibG9jayBzaXplKS5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IGJ5dGVzLnN1YnN0cigxKTtcblx0fVxuXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRcblx0XHRyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgxKSAvLyBWZXJzaW9uXG5cdFx0XHQrIHRoaXMuZW5jcnlwdGVkO1xuXHR9XG5cblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oc2Vzc2lvbktleUFsZ29yaXRobSwga2V5KSB7XG5cdFx0dmFyIGJ5dGVzID0gdGhpcy5wYWNrZXRzLndyaXRlKClcblx0XHRcblx0XHR2YXIgcHJlZml4cmFuZG9tID0gY3J5cHRvLmdldFByZWZpeFJhbmRvbShzZXNzaW9uS2V5QWxnb3JpdGhtKTtcblx0XHR2YXIgcHJlZml4ID0gcHJlZml4cmFuZG9tXG5cdFx0XHRcdCsgcHJlZml4cmFuZG9tLmNoYXJBdChwcmVmaXhyYW5kb20ubGVuZ3RoIC0gMilcblx0XHRcdFx0KyBwcmVmaXhyYW5kb20uY2hhckF0KHByZWZpeHJhbmRvbS5sZW5ndGggLSAxKVxuXG5cdFx0dmFyIHRvaGFzaCA9IGJ5dGVzO1xuXG5cblx0XHQvLyBNb2RpZmljYXRpb24gZGV0ZWN0aW9uIGNvZGUgcGFja2V0LlxuXHRcdHRvaGFzaCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDMpO1xuXHRcdHRvaGFzaCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MTQpO1xuXG5cblx0XHR0b2hhc2ggKz0gY3J5cHRvLmhhc2guc2hhMShwcmVmaXggKyB0b2hhc2gpO1xuXG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IGNyeXB0by5jZmIuZW5jcnlwdChwcmVmaXhyYW5kb20sXG5cdFx0XHRcdHNlc3Npb25LZXlBbGdvcml0aG0sIHRvaGFzaCwga2V5LCBmYWxzZSkuc3Vic3RyaW5nKDAsXG5cdFx0XHRcdHByZWZpeC5sZW5ndGggKyB0b2hhc2gubGVuZ3RoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNyeXB0cyB0aGUgZW5jcnlwdGVkIGRhdGEgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0IHJlYWRfcGFja2V0IG11c3Rcblx0ICogaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmVcblx0ICogXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gc2Vzc2lvbktleUFsZ29yaXRobVxuXHQgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZCBzeW1tZXRyaWMgZW5jcnlwdGlvbiBhbGdvcml0aG0gdG8gYmUgdXNlZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSBrZXkgb2YgY2lwaGVyIGJsb2Nrc2l6ZSBsZW5ndGggdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBkZWNyeXB0ZWQgZGF0YSBvZiB0aGlzIHBhY2tldFxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24oc2Vzc2lvbktleUFsZ29yaXRobSwga2V5KSB7XG5cdFx0dmFyIGRlY3J5cHRlZCA9IGNyeXB0by5jZmIuZGVjcnlwdChcblx0XHRcdFx0c2Vzc2lvbktleUFsZ29yaXRobSwga2V5LCB0aGlzLmVuY3J5cHRlZCwgZmFsc2UpO1xuXG5cblx0XHQvLyB0aGVyZSBtdXN0IGJlIGEgbW9kaWZpY2F0aW9uIGRldGVjdGlvbiBjb2RlIHBhY2tldCBhcyB0aGVcblx0XHQvLyBsYXN0IHBhY2tldCBhbmQgZXZlcnl0aGluZyBnZXRzIGhhc2hlZCBleGNlcHQgdGhlIGhhc2ggaXRzZWxmXG5cdFx0dGhpcy5oYXNoID0gY3J5cHRvLmhhc2guc2hhMShcblx0XHRcdGNyeXB0by5jZmIubWRjKHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQpXG5cdFx0XHQrIGRlY3J5cHRlZC5zdWJzdHJpbmcoMCwgZGVjcnlwdGVkLmxlbmd0aCAtIDIwKSk7XG5cblxuXHRcdHZhciBtZGMgPSBkZWNyeXB0ZWQuc3Vic3RyKGRlY3J5cHRlZC5sZW5ndGggLSAyMCwgMjApO1xuXG5cdFx0aWYodGhpcy5oYXNoICE9IG1kYykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNb2RpZmljYXRpb24gZGV0ZWN0ZWQuJyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMucGFja2V0cy5yZWFkKGRlY3J5cHRlZC5zdWJzdHIoMCwgZGVjcnlwdGVkLmxlbmd0aCAtIDIyKSk7XG5cdH1cbn07XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgdHlwZV9zMmsgPSByZXF1aXJlKCcuLi90eXBlL3Myay5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpO1xuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBQdWJsaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleSBQYWNrZXRzIChUYWcgMSlcbiAqIFxuICogUkZDNDg4MCA1LjE6IEEgUHVibGljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0IGhvbGRzIHRoZSBzZXNzaW9uIGtleVxuICogdXNlZCB0byBlbmNyeXB0IGEgbWVzc2FnZS4gWmVybyBvciBtb3JlIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5XG4gKiBwYWNrZXRzIGFuZC9vciBTeW1tZXRyaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleSBwYWNrZXRzIG1heSBwcmVjZWRlIGFcbiAqIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0LCB3aGljaCBob2xkcyBhbiBlbmNyeXB0ZWQgbWVzc2FnZS4gVGhlXG4gKiBtZXNzYWdlIGlzIGVuY3J5cHRlZCB3aXRoIHRoZSBzZXNzaW9uIGtleSwgYW5kIHRoZSBzZXNzaW9uIGtleSBpcyBpdHNlbGZcbiAqIGVuY3J5cHRlZCBhbmQgc3RvcmVkIGluIHRoZSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0KHMpLiBUaGVcbiAqIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0IGlzIHByZWNlZGVkIGJ5IG9uZSBQdWJsaWMtS2V5IEVuY3J5cHRlZFxuICogU2Vzc2lvbiBLZXkgcGFja2V0IGZvciBlYWNoIE9wZW5QR1Aga2V5IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGVuY3J5cHRlZC5cbiAqIFRoZSByZWNpcGllbnQgb2YgdGhlIG1lc3NhZ2UgZmluZHMgYSBzZXNzaW9uIGtleSB0aGF0IGlzIGVuY3J5cHRlZCB0byB0aGVpclxuICogcHVibGljIGtleSwgZGVjcnlwdHMgdGhlIHNlc3Npb24ga2V5LCBhbmQgdGhlbiB1c2VzIHRoZSBzZXNzaW9uIGtleSB0b1xuICogZGVjcnlwdCB0aGUgbWVzc2FnZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrZXRfc3ltX2VuY3J5cHRlZF9zZXNzaW9uX2tleSgpIHtcblx0dGhpcy50YWcgPSAzO1xuXHR0aGlzLnNlc3Npb25LZXlFbmNyeXB0aW9uQWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtID0gJ2FlczI1Nic7XG5cdHRoaXMuZW5jcnlwdGVkID0gbnVsbDtcblx0dGhpcy5zMmsgPSBuZXcgdHlwZV9zMmsoKTtcblxuXHQvKipcblx0ICogUGFyc2luZyBmdW5jdGlvbiBmb3IgYSBzeW1tZXRyaWMgZW5jcnlwdGVkIHNlc3Npb24ga2V5IHBhY2tldCAodGFnIDMpLlxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFBheWxvYWQgb2YgYSB0YWcgMSBwYWNrZXRcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmluZ1xuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlblxuXHQgKiAgICAgICAgICAgIExlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mXG5cdCAqICAgICAgICAgICAgaW5wdXQgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gT2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdC8vIEEgb25lLW9jdGV0IHZlcnNpb24gbnVtYmVyLiBUaGUgb25seSBjdXJyZW50bHkgZGVmaW5lZCB2ZXJzaW9uIGlzIDQuXG5cdFx0dGhpcy52ZXJzaW9uID0gYnl0ZXNbMF0uY2hhckNvZGVBdCgpO1xuXG5cdFx0Ly8gQSBvbmUtb2N0ZXQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIHN5bW1ldHJpYyBhbGdvcml0aG0gdXNlZC5cblx0XHR2YXIgYWxnbyA9IGVudW1zLnJlYWQoZW51bXMuc3ltbWV0cmljLCBieXRlc1sxXS5jaGFyQ29kZUF0KCkpO1xuXG5cdFx0Ly8gQSBzdHJpbmctdG8ta2V5IChTMkspIHNwZWNpZmllciwgbGVuZ3RoIGFzIGRlZmluZWQgYWJvdmUuXG5cdFx0dmFyIHMya2xlbmd0aCA9IHRoaXMuczJrLnJlYWQoYnl0ZXMuc3Vic3RyKDIpKTtcblxuXHRcdC8vIE9wdGlvbmFsbHksIHRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgaXRzZWxmLCB3aGljaCBpcyBkZWNyeXB0ZWRcblx0XHQvLyB3aXRoIHRoZSBzdHJpbmctdG8ta2V5IG9iamVjdC5cblx0XHR2YXIgZG9uZSA9IHMya2xlbmd0aCArIDI7XG5cblx0XHRpZihkb25lIDwgYnl0ZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmVuY3J5cHRlZCA9IGJ5dGVzLnN1YnN0cihkb25lKTtcblx0XHRcdHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0gPSBhbGdvXG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2Vzc2lvbktleUFsZ29yaXRobSA9IGFsZ287XG5cdH1cblxuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGFsZ28gPSB0aGlzLmVuY3J5cHRlZCA9PSBudWxsID8gXG5cdFx0XHR0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0gOlxuXHRcdFx0dGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobTtcblxuXHRcdHZhciBieXRlcyA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy52ZXJzaW9uKSArXG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLnN5bW1ldHJpYywgYWxnbykpICtcblx0XHRcdHRoaXMuczJrLndyaXRlKCk7XG5cblx0XHRpZih0aGlzLmVuY3J5cHRlZCAhPSBudWxsKVxuXHRcdFx0Ynl0ZXMgKz0gdGhpcy5lbmNyeXB0ZWQ7XG5cdFx0cmV0dXJuIGJ5dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY3J5cHRzIHRoZSBzZXNzaW9uIGtleSAob25seSBmb3IgcHVibGljIGtleSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXlcblx0ICogcGFja2V0cyAodGFnIDEpXG5cdCAqIFxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX21lc3NhZ2V9IG1zZ1xuXHQgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIG9iamVjdCAod2l0aCBtZW1iZXIgZW5jcnlwdGVkRGF0YVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXl9IGtleVxuXHQgKiAgICAgICAgICAgIFByaXZhdGUga2V5IHdpdGggc2VjTVBJcyB1bmxvY2tlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1bmVuY3J5cHRlZCBzZXNzaW9uIGtleVxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24ocGFzc3BocmFzZSkge1xuXHRcdHZhciBhbGdvID0gdGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSAhPSBudWxsID9cblx0XHRcdHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0gOlxuXHRcdFx0dGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtO1xuXG5cblx0XHR2YXIgbGVuZ3RoID0gY3J5cHRvLmNpcGhlclthbGdvXS5rZXlTaXplO1xuXHRcdHZhciBrZXkgPSB0aGlzLnMyay5wcm9kdWNlX2tleShwYXNzcGhyYXNlLCBsZW5ndGgpO1xuXG5cdFx0aWYodGhpcy5lbmNyeXB0ZWQgPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5zZXNzaW9uS2V5ID0ga2V5O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBkZWNyeXB0ZWQgPSBjcnlwdG8uY2ZiLmRlY3J5cHQoXG5cdFx0XHRcdHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQsIHRydWUpO1xuXG5cdFx0XHR0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0gPSBlbnVtcy5yZWFkKGVudW1zLnN5bW1ldHJpYyxcblx0XHRcdFx0ZGVjcnlwdGVkWzBdLmtleUNvZGVBdCgpKTtcblxuXHRcdFx0dGhpcy5zZXNzaW9uS2V5ID0gZGVjcnlwdGVkLnN1YnN0cigxKTtcblx0XHR9XG5cdH1cblxuXHR0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbihwYXNzcGhyYXNlKSB7XG5cdFx0dmFyIGxlbmd0aCA9IGNyeXB0by5nZXRLZXlMZW5ndGgodGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSk7XG5cdFx0dmFyIGtleSA9IHRoaXMuczJrLnByb2R1Y2Vfa2V5KHBhc3NwaHJhc2UsIGxlbmd0aCk7XG5cblx0XHR2YXIgcHJpdmF0ZV9rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuXHRcdFx0ZW51bXMud3JpdGUoZW51bXMuc3ltbWV0cmljLCB0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0pKSArXG5cblx0XHRcdGNyeXB0by5nZXRSYW5kb21CeXRlcyhcblx0XHRcdFx0Y3J5cHRvLmdldEtleUxlbmd0aCh0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0pKTtcblxuXHRcdHRoaXMuZW5jcnlwdGVkID0gY3J5cHRvLmNmYi5lbmNyeXB0KFxuXHRcdFx0XHRjcnlwdG8uZ2V0UHJlZml4UmFuZG9tKHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0pLCBcblx0XHRcdFx0dGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSwga2V5LCBwcml2YXRlX2tleSwgdHJ1ZSk7XG5cdH1cbn07XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBjcnlwdG8gPSByZXF1aXJlKCcuLi9jcnlwdG8nKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0IChUYWcgOSlcbiAqIFxuICogUkZDNDg4MCA1Ljc6IFRoZSBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIHBhY2tldCBjb250YWlucyBkYXRhIGVuY3J5cHRlZFxuICogd2l0aCBhIHN5bW1ldHJpYy1rZXkgYWxnb3JpdGhtLiBXaGVuIGl0IGhhcyBiZWVuIGRlY3J5cHRlZCwgaXQgY29udGFpbnMgb3RoZXJcbiAqIHBhY2tldHMgKHVzdWFsbHkgYSBsaXRlcmFsIGRhdGEgcGFja2V0IG9yIGNvbXByZXNzZWQgZGF0YSBwYWNrZXQsIGJ1dCBpblxuICogdGhlb3J5IG90aGVyIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgcGFja2V0cyBvciBzZXF1ZW5jZXMgb2YgcGFja2V0c1xuICogdGhhdCBmb3JtIHdob2xlIE9wZW5QR1AgbWVzc2FnZXMpLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3N5bW1ldHJpY2FsbHlfZW5jcnlwdGVkKCkge1xuXHR0aGlzLmVuY3J5cHRlZCA9IG51bGw7XG5cdC8qKiBEZWNyeXB0ZWQgcGFja2V0cyBjb250YWluZWQgd2l0aGluLiBcblx0ICogQHR5cGUge29wZW5wZ3BfcGFja2V0bGlzdH0gKi9cblx0dGhpcy5wYWNrZXRzO1xuXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0dGhpcy5lbmNyeXB0ZWQgPSBieXRlcztcblx0fVxuXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lbmNyeXB0ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogU3ltbWV0cmljYWxseSBkZWNyeXB0IHRoZSBwYWNrZXQgZGF0YVxuXHQgKiBcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBzZXNzaW9uS2V5QWxnb3JpdGhtXG5cdCAqICAgICAgICAgICAgIFN5bW1ldHJpYyBrZXkgYWxnb3JpdGhtIHRvIHVzZSAvLyBTZWUgUkZDNDg4MCA5LjJcblx0ICogQHBhcmFtIHtTdHJpbmd9IGtleVxuXHQgKiAgICAgICAgICAgICBLZXkgYXMgc3RyaW5nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbGVuZ3RoIHRvIHRoZVxuXHQgKiAgICAgICAgICAgIGFsZ29yaXRobVxuXHQgKiBAcmV0dXJuIFRoZSBkZWNyeXB0ZWQgZGF0YTtcblx0ICovXG5cdHRoaXMuZGVjcnlwdCA9IGZ1bmN0aW9uKHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSkge1xuXHRcdHZhciBkZWNyeXB0ZWQgPSBjcnlwdG8uY2ZiLmRlY3J5cHQoXG5cdFx0XHRcdHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQsIHRydWUpO1xuXG5cdFx0dGhpcy5wYWNrZXRzLnJlYWQoZGVjcnlwdGVkKTtcblx0fVxuXG5cdHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uKGFsZ28sIGtleSkge1xuXHRcdHZhciBkYXRhID0gdGhpcy5wYWNrZXRzLndyaXRlKCk7XG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IGNyeXB0by5jZmIuZW5jcnlwdChcblx0XHRcdFx0Y3J5cHRvLmdldFByZWZpeFJhbmRvbShhbGdvKSwgYWxnbywgZGF0YSwga2V5LCB0cnVlKTtcblx0fVxufTtcbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrZXRfdHJ1c3QoKSB7XG5cbn07XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKiogXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFVzZXIgQXR0cmlidXRlIFBhY2tldCAoVGFnIDE3KVxuICogIFRoZSBVc2VyIEF0dHJpYnV0ZSBwYWNrZXQgaXMgYSB2YXJpYXRpb24gb2YgdGhlIFVzZXIgSUQgcGFja2V0LiAgSXRcbiAqICBpcyBjYXBhYmxlIG9mIHN0b3JpbmcgbW9yZSB0eXBlcyBvZiBkYXRhIHRoYW4gdGhlIFVzZXIgSUQgcGFja2V0LFxuICogIHdoaWNoIGlzIGxpbWl0ZWQgdG8gdGV4dC4gIExpa2UgdGhlIFVzZXIgSUQgcGFja2V0LCBhIFVzZXIgQXR0cmlidXRlXG4gKiAgcGFja2V0IG1heSBiZSBjZXJ0aWZpZWQgYnkgdGhlIGtleSBvd25lciAoXCJzZWxmLXNpZ25lZFwiKSBvciBhbnkgb3RoZXJcbiAqICBrZXkgb3duZXIgd2hvIGNhcmVzIHRvIGNlcnRpZnkgaXQuICBFeGNlcHQgYXMgbm90ZWQsIGEgVXNlciBBdHRyaWJ1dGVcbiAqICBwYWNrZXQgbWF5IGJlIHVzZWQgYW55d2hlcmUgdGhhdCBhIFVzZXIgSUQgcGFja2V0IG1heSBiZSB1c2VkLlxuICpcbiAqICBXaGlsZSBVc2VyIEF0dHJpYnV0ZSBwYWNrZXRzIGFyZSBub3QgYSByZXF1aXJlZCBwYXJ0IG9mIHRoZSBPcGVuUEdQXG4gKiAgc3RhbmRhcmQsIGltcGxlbWVudGF0aW9ucyBTSE9VTEQgcHJvdmlkZSBhdCBsZWFzdCBlbm91Z2hcbiAqICBjb21wYXRpYmlsaXR5IHRvIHByb3Blcmx5IGhhbmRsZSBhIGNlcnRpZmljYXRpb24gc2lnbmF0dXJlIG9uIHRoZVxuICogIFVzZXIgQXR0cmlidXRlIHBhY2tldC4gIEEgc2ltcGxlIHdheSB0byBkbyB0aGlzIGlzIGJ5IHRyZWF0aW5nIHRoZVxuICogIFVzZXIgQXR0cmlidXRlIHBhY2tldCBhcyBhIFVzZXIgSUQgcGFja2V0IHdpdGggb3BhcXVlIGNvbnRlbnRzLCBidXRcbiAqICBhbiBpbXBsZW1lbnRhdGlvbiBtYXkgdXNlIGFueSBtZXRob2QgZGVzaXJlZC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrZXRfdXNlcl9hdHRyaWJ1dGUoKSB7XG5cdHRoaXMudGFnID0gMTc7XG5cdHRoaXMuYXR0cmlidXRlcyA9IFtdO1xuXG5cdC8qKlxuXHQgKiBwYXJzaW5nIGZ1bmN0aW9uIGZvciBhIHVzZXIgYXR0cmlidXRlIHBhY2tldCAodGFnIDE3KS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IHBheWxvYWQgb2YgYSB0YWcgMTcgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gcG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgaW5wdXQgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gb2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdHZhciBpID0gMDtcblx0XHR3aGlsZShpIDwgYnl0ZXMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgbGVuID0gb3BlbnBncF9wYWNrZXQucmVhZF9zaW1wbGVfbGVuZ3RoKGJ5dGVzKTtcblxuXHRcdFx0aSArPSBsZW4ub2Zmc2V0O1xuXHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnB1c2goYnl0ZXMuc3Vic3RyKGksIGxlbi5sZW4pKTtcblx0XHRcdGkgKz0gbGVuLmxlbjtcblx0XHR9XG5cdH1cbn07XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFVzZXIgSUQgUGFja2V0IChUYWcgMTMpXG4gKiBBIFVzZXIgSUQgcGFja2V0IGNvbnNpc3RzIG9mIFVURi04IHRleHQgdGhhdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnRcbiAqIHRoZSBuYW1lIGFuZCBlbWFpbCBhZGRyZXNzIG9mIHRoZSBrZXkgaG9sZGVyLiAgQnkgY29udmVudGlvbiwgaXRcbiAqIGluY2x1ZGVzIGFuIFJGQyAyODIyIFtSRkMyODIyXSBtYWlsIG5hbWUtYWRkciwgYnV0IHRoZXJlIGFyZSBub1xuICogcmVzdHJpY3Rpb25zIG9uIGl0cyBjb250ZW50LiAgVGhlIHBhY2tldCBsZW5ndGggaW4gdGhlIGhlYWRlclxuICogc3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIFVzZXIgSUQuIFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldF91c2VyaWQoKSB7XG5cdC8qKiBAdHlwZSB7U3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSB1c2VyIGlkLiBVc3VhbGx5IGluIHRoZSBmb3JtXG5cdCAqIEpvaG4gRG9lIDxqb2huQGV4YW1wbGUuY29tPiBcblx0ICovXG5cdHRoaXMudXNlcmlkID0gJyc7XG5cdFxuXHRcblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgdXNlciBpZCBwYWNrZXQgKHRhZyAxMykuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBwYXlsb2FkIG9mIGEgdGFnIDEzIHBhY2tldFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHBvc2l0aW9uIHBvc2l0aW9uIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyaW5nXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mIGlucHV0IFxuXHQgKiBhdCBwb3NpdGlvblxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhfSBvYmplY3QgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0dGhpcy51c2VyaWQgPSB1dGlsLmRlY29kZV91dGY4KGJ5dGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1c2VyIGlkIHBhY2tldFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXNlcl9pZCB0aGUgdXNlciBpZCBhcyBzdHJpbmcgKFwiSm9obiBEb2UgPGpvaG4uZG9lQG1haWwudXNcIilcblx0ICogQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdXRpbC5lbmNvZGVfdXRmOCh0aGlzLnVzZXJpZCk7XG5cdH1cbn1cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIEltcGxlbWVudGF0aW9uIG9mIHR5cGUga2V5IGlkIChSRkM0ODgwIDMuMylcbiAqICBBIEtleSBJRCBpcyBhbiBlaWdodC1vY3RldCBzY2FsYXIgdGhhdCBpZGVudGlmaWVzIGEga2V5LlxuICAgSW1wbGVtZW50YXRpb25zIFNIT1VMRCBOT1QgYXNzdW1lIHRoYXQgS2V5IElEcyBhcmUgdW5pcXVlLiAgVGhlXG4gICBzZWN0aW9uIFwiRW5oYW5jZWQgS2V5IEZvcm1hdHNcIiBiZWxvdyBkZXNjcmliZXMgaG93IEtleSBJRHMgYXJlXG4gICBmb3JtZWQuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ga2V5aWQoKSB7XG5cdHZhciBieXRlcyA9ICcnO1xuXG5cdGZvcih2YXIgaSA9IDA7IGkgPCA4OyBpKyspXG5cdFx0Ynl0ZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTtcblx0LyoqXG5cdCAqIFBhcnNpbmcgbWV0aG9kIGZvciBhIGtleSBpZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgSW5wdXQgdG8gcmVhZCB0aGUga2V5IGlkIGZyb20gXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gd2hlcmUgdG8gc3RhcnQgcmVhZGluZyB0aGUga2V5IFxuXHQgKiBpZCBmcm9tIGlucHV0XG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfdHlwZV9rZXlpZH0gVGhpcyBvYmplY3Rcblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0dGhpcy5ieXRlcyA9IGJ5dGVzLnN1YnN0cigwLCA4KTtcblx0fVxuXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5ieXRlcztcblx0fVxufTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8vIEhpbnQ6IFdlIGhvbGQgb3VyIE1QSXMgYXMgYW4gYXJyYXkgb2Ygb2N0ZXRzIGluIGJpZyBlbmRpYW4gZm9ybWF0IHByZWNlZWRpbmcgYSB0d29cbi8vIG9jdGV0IHNjYWxhcjogTVBJOiBbYSxiLGMsZCxlLGZdXG4vLyAtIE1QSSBzaXplOiAoYSA8PCA4KSB8IGIgXG4vLyAtIE1QSSA9IGMgfCBkIDw8IDggfCBlIDw8ICgoTVBJLmxlbmd0aCAtMikqOCkgfCBmICgoTVBJLmxlbmd0aCAtMikqOClcblxudmFyIEJpZ0ludGVnZXIgPSByZXF1aXJlKCcuLi9jcnlwdG8vcHVibGljX2tleS9qc2JuLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjSW1wbGVtZW50YXRpb24gb2YgdHlwZSBNUEkgKFJGQzQ4ODAgMy4yKVxuICogTXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgKGFsc28gY2FsbGVkIE1QSXMpIGFyZSB1bnNpZ25lZCBpbnRlZ2VycyB1c2VkXG4gKiB0byBob2xkIGxhcmdlIGludGVnZXJzIHN1Y2ggYXMgdGhlIG9uZXMgdXNlZCBpbiBjcnlwdG9ncmFwaGljXG4gKiBjYWxjdWxhdGlvbnMuXG4gKiBBbiBNUEkgY29uc2lzdHMgb2YgdHdvIHBpZWNlczogYSB0d28tb2N0ZXQgc2NhbGFyIHRoYXQgaXMgdGhlIGxlbmd0aFxuICogb2YgdGhlIE1QSSBpbiBiaXRzIGZvbGxvd2VkIGJ5IGEgc3RyaW5nIG9mIG9jdGV0cyB0aGF0IGNvbnRhaW4gdGhlXG4gKiBhY3R1YWwgaW50ZWdlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtcGkoKSB7XG5cdC8qKiBBbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgaW50ZWdlciAqL1xuXHR0aGlzLmRhdGEgPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBQYXJzaW5nIGZ1bmN0aW9uIGZvciBhIG1waSAoUkZDIDQ4ODAgMy4yKS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFBheWxvYWQgb2YgbXBpIGRhdGFcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IFxuXHQgKiBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gTGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgXG5cdCAqIGlucHV0IGF0IHBvc2l0aW9uXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfdHlwZV9tcGl9IE9iamVjdCByZXByZXNlbnRhdGlvblxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgYml0cyA9IChieXRlc1swXS5jaGFyQ29kZUF0KCkgPDwgOCkgfCBieXRlc1sxXS5jaGFyQ29kZUF0KCk7XG5cdFx0XG5cdFx0Ly8gQWRkaXRpb25hbCBydWxlczpcblx0XHQvL1xuXHRcdC8vICAgIFRoZSBzaXplIG9mIGFuIE1QSSBpcyAoKE1QSS5sZW5ndGggKyA3KSAvIDgpICsgMiBvY3RldHMuXG5cdFx0Ly9cblx0XHQvLyAgICBUaGUgbGVuZ3RoIGZpZWxkIG9mIGFuIE1QSSBkZXNjcmliZXMgdGhlIGxlbmd0aCBzdGFydGluZyBmcm9tIGl0c1xuXHRcdC8vXHQgIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLXplcm8gYml0LiAgVGh1cywgdGhlIE1QSSBbMDAgMDIgMDFdIGlzIG5vdFxuXHRcdC8vICAgIGZvcm1lZCBjb3JyZWN0bHkuICBJdCBzaG91bGQgYmUgWzAwIDAxIDAxXS5cblxuXHRcdC8vIFRPRE86IFZlcmlmaWNhdGlvbiBvZiB0aGlzIHNpemUgbWV0aG9kISBUaGlzIHNpemUgY2FsY3VsYXRpb24gYXNcblx0XHQvLyBcdFx0IHNwZWNpZmllZCBhYm92ZSBpcyBub3QgYXBwbGljYWJsZSBpbiBKYXZhU2NyaXB0XG5cdFx0dmFyIGJ5dGVsZW4gPSBNYXRoLmNlaWwoYml0cyAvIDgpO1xuXHRcdFxuXHRcdHZhciByYXcgPSBieXRlcy5zdWJzdHIoMiwgYnl0ZWxlbik7XG5cdFx0dGhpcy5mcm9tQnl0ZXMocmF3KTtcblxuXHRcdHJldHVybiAyICsgYnl0ZWxlbjtcblx0fVxuXG5cdHRoaXMuZnJvbUJ5dGVzID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR0aGlzLmRhdGEgPSBuZXcgQmlnSW50ZWdlcih1dGlsLmhleHN0cmR1bXAoYnl0ZXMpLCAxNik7IFxuXHR9XG5cblx0dGhpcy50b0J5dGVzID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMud3JpdGUoKS5zdWJzdHIoMik7XG5cdH1cblxuXHR0aGlzLmJ5dGVMZW5ndGggPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy50b0J5dGVzKCkubGVuZ3RoO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBtcGkgb2JqZWN0IHRvIGEgc3RyaW5nIGFzIHNwZWNpZmllZCBpbiBSRkM0ODgwIDMuMlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IG1waSBCeXRlIHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS50b01QSSgpO1xuXHR9XG5cblx0dGhpcy50b0JpZ0ludGVnZXIgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmNsb25lKCk7XG5cdH1cblxuXHR0aGlzLmZyb21CaWdJbnRlZ2VyID0gZnVuY3Rpb24oYm4pIHtcblx0XHR0aGlzLmRhdGEgPSBibi5jbG9uZSgpO1xuXHR9XG59XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpO1xuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RyaW5nLXRvLWtleSBzcGVjaWZpZXIgKFJGQzQ4ODAgMy43KVxuICogU3RyaW5nLXRvLWtleSAoUzJLKSBzcGVjaWZpZXJzIGFyZSB1c2VkIHRvIGNvbnZlcnQgcGFzc3BocmFzZSBzdHJpbmdzXG4gICBpbnRvIHN5bW1ldHJpYy1rZXkgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGtleXMuICBUaGV5IGFyZSB1c2VkIGluIHR3b1xuICAgcGxhY2VzLCBjdXJyZW50bHk6IHRvIGVuY3J5cHQgdGhlIHNlY3JldCBwYXJ0IG9mIHByaXZhdGUga2V5cyBpbiB0aGVcbiAgIHByaXZhdGUga2V5cmluZywgYW5kIHRvIGNvbnZlcnQgcGFzc3BocmFzZXMgdG8gZW5jcnlwdGlvbiBrZXlzIGZvclxuICAgc3ltbWV0cmljYWxseSBlbmNyeXB0ZWQgbWVzc2FnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gczJrKCkge1xuXHQvKiogQHR5cGUge29wZW5wZ3AuaGFzaH0gKi9cblx0dGhpcy5hbGdvcml0aG0gPSAnc2hhMjU2Jztcblx0LyoqIEB0eXBlIHtvcGVucGdwX3R5cGVfczJrLnR5cGV9ICovXG5cdHRoaXMudHlwZSA9ICdpdGVyYXRlZCc7XG5cdHRoaXMuYyA9IDk2O1xuXHQvKiogQHR5cGUge29wZW5wZ3BfYnl0ZWFycmF5fSBcblx0ICogRWlnaHQgYnl0ZXMgb2Ygc2FsdC4gKi9cblx0dGhpcy5zYWx0ID0gY3J5cHRvLnJhbmRvbS5nZXRSYW5kb21CeXRlcyg4KTtcblxuXG5cdC8vIEV4cG9uZW4gYmlhcywgZGVmaW5lZCBpbiBSRkM0ODgwXG5cdHZhciBleHBiaWFzID0gNjtcblxuXHR0aGlzLmdldF9jb3VudCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAoMTYgKyAodGhpcy5jICYgMTUpKSA8PCAoKHRoaXMuYyA+PiA0KSArIGV4cGJpYXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgc3RyaW5nLXRvLWtleSBzcGVjaWZpZXIgKFJGQyA0ODgwIDMuNykuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBQYXlsb2FkIG9mIHN0cmluZy10by1rZXkgc3BlY2lmaWVyXG5cdCAqIEByZXR1cm4ge0ludGVnZXJ9IEFjdHVhbCBsZW5ndGggb2YgdGhlIG9iamVjdFxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dGhpcy50eXBlID0gZW51bXMucmVhZChlbnVtcy5zMmssIGJ5dGVzW2krK10uY2hhckNvZGVBdCgpKTtcblx0XHR0aGlzLmFsZ29yaXRobSA9IGVudW1zLnJlYWQoZW51bXMuaGFzaCwgYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCkpO1xuXG5cdFx0c3dpdGNoICh0aGlzLnR5cGUpIHtcblx0XHRjYXNlICdzaW1wbGUnOlxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdzYWx0ZWQnOlxuXHRcdFx0dGhpcy5zYWx0ID0gYnl0ZXMuc3Vic3RyKGksIDgpO1xuXHRcdFx0aSArPSA4O1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdpdGVyYXRlZCc6XG5cdFx0XHR0aGlzLnNhbHQgPSBieXRlcy5zdWJzdHIoaSwgOCk7XG5cdFx0XHRpICs9IDg7XG5cblx0XHRcdC8vIE9jdGV0IDEwOiBjb3VudCwgYSBvbmUtb2N0ZXQsIGNvZGVkIHZhbHVlXG5cdFx0XHR0aGlzLmMgPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnZ251Jzpcblx0XHRcdGlmKGJ5dGVzLnN1YnN0cihpLCAzKSA9PSBcIkdOVVwiKSB7XG5cdFx0XHRcdGkgKz0gMzsgLy8gR05VXG5cdFx0XHRcdHZhciBnbnVFeHRUeXBlID0gMTAwMCArIGJ5dGVzW2krK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0XHRpZihnbnVFeHRUeXBlID09IDEwMDEpIHtcblx0XHRcdFx0XHR0aGlzLnR5cGUgPSBnbnVFeHRUeXBlO1xuXHRcdFx0XHRcdC8vIEdudVBHIGV4dGVuc2lvbiBtb2RlIDEwMDEgLS0gZG9uJ3Qgd3JpdGUgc2VjcmV0IGtleSBhdCBhbGxcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHMyayBnbnUgcHJvdGVjdGlvbiBtb2RlLlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzMmsgdHlwZS5cIik7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHMyayB0eXBlLlwiKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiBpO1xuXHR9XG5cdFxuXHRcblx0LyoqXG5cdCAqIHdyaXRlcyBhbiBzMmsgaGFzaCBiYXNlZCBvbiB0aGUgaW5wdXRzLlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFByb2R1Y2VkIGtleSBvZiBoYXNoQWxnb3JpdGhtIGhhc2ggbGVuZ3RoXG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGJ5dGVzID0gU3RyaW5nLmZyb21DaGFyQ29kZShlbnVtcy53cml0ZShlbnVtcy5zMmssIHRoaXMudHlwZSkpO1xuXHRcdGJ5dGVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZW51bXMud3JpdGUoZW51bXMuaGFzaCwgdGhpcy5hbGdvcml0aG0pKTtcblxuXHRcdHN3aXRjaCh0aGlzLnR5cGUpIHtcblx0XHRcdGNhc2UgJ3NpbXBsZSc6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2FsdGVkJzpcblx0XHRcdFx0Ynl0ZXMgKz0gdGhpcy5zYWx0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2l0ZXJhdGVkJzpcblx0XHRcdFx0Ynl0ZXMgKz0gdGhpcy5zYWx0O1xuXHRcdFx0XHRieXRlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuYyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gYnl0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogUHJvZHVjZXMgYSBrZXkgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXNzcGhyYXNlIGFuZCB0aGUgZGVmaW5lZCBcblx0ICogaGFzaEFsZ29yaXRobSBcblx0ICogQHBhcmFtIHtTdHJpbmd9IHBhc3NwaHJhc2UgUGFzc3BocmFzZSBjb250YWluaW5nIHVzZXIgaW5wdXRcblx0ICogQHJldHVybiB7U3RyaW5nfSBQcm9kdWNlZCBrZXkgd2l0aCBhIGxlbmd0aCBjb3JyZXNwb25kaW5nIHRvIFxuXHQgKiBoYXNoQWxnb3JpdGhtIGhhc2ggbGVuZ3RoXG5cdCAqL1xuXHR0aGlzLnByb2R1Y2Vfa2V5ID0gZnVuY3Rpb24ocGFzc3BocmFzZSwgbnVtQnl0ZXMpIHtcblx0XHRwYXNzcGhyYXNlID0gdXRpbC5lbmNvZGVfdXRmOChwYXNzcGhyYXNlKTtcblxuXHRcdGZ1bmN0aW9uIHJvdW5kKHByZWZpeCwgczJrKSB7XG5cdFx0XHR2YXIgYWxnb3JpdGhtID0gZW51bXMud3JpdGUoZW51bXMuaGFzaCwgczJrLmFsZ29yaXRobSk7XG5cblx0XHRcdHN3aXRjaChzMmsudHlwZSkge1xuXHRcdFx0XHRjYXNlICdzaW1wbGUnOlxuXHRcdFx0XHRcdHJldHVybiBjcnlwdG8uaGFzaC5kaWdlc3QoYWxnb3JpdGhtLCBwcmVmaXggKyBwYXNzcGhyYXNlKTtcblxuXHRcdFx0XHRjYXNlICdzYWx0ZWQnOlxuXHRcdFx0XHRcdHJldHVybiBjcnlwdG8uaGFzaC5kaWdlc3QoYWxnb3JpdGhtLCBcblx0XHRcdFx0XHRcdHByZWZpeCArIHMyay5zYWx0ICsgcGFzc3BocmFzZSk7XG5cblx0XHRcdFx0Y2FzZSAnaXRlcmF0ZWQnOlxuXHRcdFx0XHRcdHZhciBpc3AgPSBbXSxcblx0XHRcdFx0XHRcdGNvdW50ID0gczJrLmdldF9jb3VudCgpO1xuXHRcdFx0XHRcdFx0ZGF0YSA9IHMyay5zYWx0ICsgcGFzc3BocmFzZTtcblxuXHRcdFx0XHRcdHdoaWxlIChpc3AubGVuZ3RoICogZGF0YS5sZW5ndGggPCBjb3VudClcblx0XHRcdFx0XHRcdGlzcC5wdXNoKGRhdGEpO1xuXG5cdFx0XHRcdFx0aXNwID0gaXNwLmpvaW4oJycpO1x0XHRcdFxuXG5cdFx0XHRcdFx0aWYgKGlzcC5sZW5ndGggPiBjb3VudClcblx0XHRcdFx0XHRcdGlzcCA9IGlzcC5zdWJzdHIoMCwgY291bnQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNyeXB0by5oYXNoLmRpZ2VzdChhbGdvcml0aG0sIHByZWZpeCArIGlzcCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRcblx0XHR2YXIgcmVzdWx0ID0gJycsXG5cdFx0XHRwcmVmaXggPSAnJztcblxuXHRcdHdoaWxlKHJlc3VsdC5sZW5ndGggPD0gbnVtQnl0ZXMpIHtcblx0XHRcdHJlc3VsdCArPSByb3VuZChwcmVmaXgsIHRoaXMpO1xuXHRcdFx0cHJlZml4ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdC5zdWJzdHIoMCwgbnVtQnl0ZXMpO1xuXHR9XG59XG5cblxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIFV0aWwgPSBmdW5jdGlvbigpIHtcblxuXG5cblx0dGhpcy5yZWFkTnVtYmVyID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG5cdFx0dmFyIG4gPSAwO1xuXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRuIDw8PSA4O1xuXHRcdFx0biArPSBieXRlc1tpXS5jaGFyQ29kZUF0KClcblx0XHR9XG5cblx0XHRyZXR1cm4gbjtcblx0fVxuXG5cdHRoaXMud3JpdGVOdW1iZXIgPSBmdW5jdGlvbihuLCBieXRlcykge1xuXHRcdHZhciBiID0gJyc7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHtcblx0XHRcdGIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgobiA+PiAoOCAqIChieXRlcy0gaSAtIDEpKSkgJiAweEZGKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYjtcblx0fVxuXG5cblxuXHR0aGlzLnJlYWREYXRlID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgbiA9IHRoaXMucmVhZE51bWJlcihieXRlcyk7XG5cdFx0dmFyIGQgPSBuZXcgRGF0ZSgpO1xuXHRcdGQuc2V0VGltZShuICogMTAwMCk7XG5cdFx0cmV0dXJuIGQ7XG5cdH1cblxuXHR0aGlzLndyaXRlRGF0ZSA9IGZ1bmN0aW9uKHRpbWUpIHtcblx0XHR2YXIgbnVtZXJpYyA9IE1hdGgucm91bmQodGltZS5nZXRUaW1lKCkgLyAxMDAwKTtcblxuXHRcdHJldHVybiB0aGlzLndyaXRlTnVtYmVyKG51bWVyaWMsIDQpO1xuXHR9XG5cbiAgICB0aGlzLmVtYWlsUmVnRXggPSAvW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/Lztcblx0XG5cdHRoaXMuZGVidWcgPSBmYWxzZTtcblxuXHR0aGlzLmhleGR1bXAgPSBmdW5jdGlvbihzdHIpIHtcblx0ICAgIHZhciByPVtdO1xuXHQgICAgdmFyIGU9c3RyLmxlbmd0aDtcblx0ICAgIHZhciBjPTA7XG5cdCAgICB2YXIgaDtcblx0ICAgIHZhciBpID0gMDtcblx0ICAgIHdoaWxlKGM8ZSl7XG5cdCAgICAgICAgaD1zdHIuY2hhckNvZGVBdChjKyspLnRvU3RyaW5nKDE2KTtcblx0ICAgICAgICB3aGlsZShoLmxlbmd0aDwyKSBoPVwiMFwiK2g7XG5cdCAgICAgICAgci5wdXNoKFwiIFwiK2gpO1xuXHQgICAgICAgIGkrKztcblx0ICAgICAgICBpZiAoaSAlIDMyID09IDApXG5cdCAgICAgICAgXHRyLnB1c2goXCJcXG4gICAgICAgICAgIFwiKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiByLmpvaW4oJycpO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIENyZWF0ZSBoZXhzdHJpbmcgZnJvbSBhIGJpbmFyeVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyB0byBjb252ZXJ0XG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhleGFkZWNpbWFsIHZhbHVlc1xuXHQgKi9cblx0dGhpcy5oZXhzdHJkdW1wID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0aWYgKHN0ciA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdCAgICB2YXIgcj1bXTtcblx0ICAgIHZhciBlPXN0ci5sZW5ndGg7XG5cdCAgICB2YXIgYz0wO1xuXHQgICAgdmFyIGg7XG5cdCAgICB3aGlsZShjPGUpe1xuXHQgICAgICAgIGg9c3RyW2MrK10uY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KTtcblx0ICAgICAgICB3aGlsZShoLmxlbmd0aDwyKSBoPVwiMFwiK2g7XG5cdCAgICAgICAgci5wdXNoKFwiXCIraCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gci5qb2luKCcnKTtcblx0fTtcblx0XG5cdC8qKlxuXHQgKiBDcmVhdGUgYmluYXJ5IHN0cmluZyBmcm9tIGEgaGV4IGVuY29kZWQgc3RyaW5nXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgSGV4IHN0cmluZyB0byBjb252ZXJ0XG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJpbmFyeSB2YWx1ZXNcblx0ICovXG5cdHRoaXMuaGV4MmJpbiA9IGZ1bmN0aW9uKGhleCkge1xuXHQgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXgubGVuZ3RoOyBpICs9IDIpXG5cdCAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LnN1YnN0cihpLCAyKSwgMTYpKTtcblx0ICAgIHJldHVybiBzdHI7XG5cdH07XG5cdFxuXHQvKipcblx0ICogQ3JlYXRpbmcgYSBoZXggc3RyaW5nIGZyb20gYW4gYmluYXJ5IGFycmF5IG9mIGludGVnZXJzICgwLi4yNTUpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgQXJyYXkgb2YgYnl0ZXMgdG8gY29udmVydFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcnJheVxuXHQgKi9cblx0dGhpcy5oZXhpZHVtcCA9IGZ1bmN0aW9uKHN0cikge1xuXHQgICAgdmFyIHI9W107XG5cdCAgICB2YXIgZT1zdHIubGVuZ3RoO1xuXHQgICAgdmFyIGM9MDtcblx0ICAgIHZhciBoO1xuXHQgICAgd2hpbGUoYzxlKXtcblx0ICAgICAgICBoPXN0cltjKytdLnRvU3RyaW5nKDE2KTtcblx0ICAgICAgICB3aGlsZShoLmxlbmd0aDwyKSBoPVwiMFwiK2g7XG5cdCAgICAgICAgci5wdXNoKFwiXCIraCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gci5qb2luKCcnKTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGEgbmF0aXZlIGphdmFzY3JpcHQgc3RyaW5nIHRvIGEgc3RyaW5nIG9mIHV0ZjggYnl0ZXNcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiB7U3RyaW5nfSBBIHZhbGlkIHNxdWVuY2Ugb2YgdXRmOCBieXRlc1xuXHQgKi9cblx0dGhpcy5lbmNvZGVfdXRmOCA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgYSBzdHJpbmcgb2YgdXRmOCBieXRlcyB0byBhIG5hdGl2ZSBqYXZhc2NyaXB0IHN0cmluZ1xuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXRmOCBBIHZhbGlkIHNxdWVuY2Ugb2YgdXRmOCBieXRlc1xuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEEgbmF0aXZlIGphdmFzY3JpcHQgc3RyaW5nXG5cdCAqL1xuXHR0aGlzLmRlY29kZV91dGY4ID0gZnVuY3Rpb24odXRmOCkge1xuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHV0ZjgpKTtcblx0fTtcblxuXHR2YXIgc3RyMmJpbiA9IGZ1bmN0aW9uKHN0ciwgcmVzdWx0KSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRcdHJlc3VsdFtpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cdFxuXHR2YXIgYmluMnN0ciA9IGZ1bmN0aW9uKGJpbikge1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRyZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJpbltpXSkpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQuam9pbignJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgaW50ZWdlcnMoMC4yNTUpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiB7SW50ZWdlcltdfSBBbiBhcnJheSBvZiAoYmluYXJ5KSBpbnRlZ2Vyc1xuXHQgKi9cblx0dGhpcy5zdHIyYmluID0gZnVuY3Rpb24oc3RyKSB7IFxuXHRcdHJldHVybiBzdHIyYmluKHN0ciwgbmV3IEFycmF5KHN0ci5sZW5ndGgpKTtcblx0fTtcblx0XG5cdFxuXHQvKipcblx0ICogQ29udmVydCBhbiBhcnJheSBvZiBpbnRlZ2VycygwLjI1NSkgdG8gYSBzdHJpbmcgXG5cdCAqIEBwYXJhbSB7SW50ZWdlcltdfSBiaW4gQW4gYXJyYXkgb2YgKGJpbmFyeSkgaW50ZWdlcnMgdG8gY29udmVydFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFycmF5XG5cdCAqL1xuXHR0aGlzLmJpbjJzdHIgPSBiaW4yc3RyO1xuXHRcblx0LyoqXG5cdCAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBVaW50OEFycmF5XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiB7VWludDhBcnJheX0gVGhlIGFycmF5IG9mIChiaW5hcnkpIGludGVnZXJzXG5cdCAqL1xuXHR0aGlzLnN0cjJVaW50OEFycmF5ID0gZnVuY3Rpb24oc3RyKSB7IFxuXHRcdHJldHVybiBzdHIyYmluKHN0ciwgbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpKSk7IFxuXHR9O1xuXHRcblx0LyoqXG5cdCAqIENvbnZlcnQgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nLiBUaGlzIGN1cnJlbnRseSBmdW5jdGlvbnMgXG5cdCAqIHRoZSBzYW1lIGFzIGJpbjJzdHIuIFxuXHQgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJpbiBBbiBhcnJheSBvZiAoYmluYXJ5KSBpbnRlZ2VycyB0byBjb252ZXJ0XG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcnJheVxuXHQgKi9cblx0dGhpcy5VaW50OEFycmF5MnN0ciA9IGJpbjJzdHI7XG5cdFxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyBhIDE2Yml0IHN1bSBvZiBhIHN0cmluZyBieSBhZGRpbmcgZWFjaCBjaGFyYWN0ZXIgXG5cdCAqIGNvZGVzIG1vZHVsdXMgNjU1MzVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU3RyaW5nIHRvIGNyZWF0ZSBhIHN1bSBvZlxuXHQgKiBAcmV0dXJuIHtJbnRlZ2VyfSBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHN1bSBvZiBhbGwgY2hhcmFjdGVyIFxuXHQgKiBjb2RlcyAlIDY1NTM1XG5cdCAqL1xuXHR0aGlzLmNhbGNfY2hlY2tzdW0gPSBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0dmFyIGNoZWNrc3VtID0geyAgczogMCwgYWRkOiBmdW5jdGlvbiAoc2FkZCkgeyB0aGlzLnMgPSAodGhpcy5zICsgc2FkZCkgJSA2NTUzNjsgfX07XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjaGVja3N1bS5hZGQodGV4dC5jaGFyQ29kZUF0KGkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNoZWNrc3VtLnM7XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGEgZGVidWcgbWVzc2FnZS4gRGVidWcgXG5cdCAqIG1lc3NhZ2VzIGFyZSBvbmx5IHByaW50ZWQgaWZcblx0ICogb3BlbnBncC5jb25maWcuZGVidWcgaXMgc2V0IHRvIHRydWUuIFRoZSBjYWxsaW5nXG5cdCAqIEphdmFzY3JpcHQgY29udGV4dCBNVVNUIGRlZmluZVxuXHQgKiBhIFwic2hvd01lc3NhZ2VzKHRleHQpXCIgZnVuY3Rpb24uIExpbmUgZmVlZHMgKCdcXG4nKVxuXHQgKiBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gSFRNTCBsaW5lIGZlZWRzICc8YnIvPidcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTdHJpbmcgb2YgdGhlIGRlYnVnIG1lc3NhZ2Vcblx0ICogQHJldHVybiB7U3RyaW5nfSBBbiBIVE1MIHR0IGVudGl0eSBjb250YWluaW5nIGEgcGFyYWdyYXBoIHdpdGggYSBcblx0ICogc3R5bGUgYXR0cmlidXRlIHdoZXJlIHRoZSBkZWJ1ZyBtZXNzYWdlIGlzIEhUTUxlbmNvZGVkIGluLiBcblx0ICovXG5cdHRoaXMucHJpbnRfZGVidWcgPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZiAodGhpcy5kZWJ1Zykge1xuXHRcdFx0Y29uc29sZS5sb2coc3RyKTtcblx0XHR9XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGEgZGVidWcgbWVzc2FnZS4gRGVidWcgXG5cdCAqIG1lc3NhZ2VzIGFyZSBvbmx5IHByaW50ZWQgaWZcblx0ICogb3BlbnBncC5jb25maWcuZGVidWcgaXMgc2V0IHRvIHRydWUuIFRoZSBjYWxsaW5nXG5cdCAqIEphdmFzY3JpcHQgY29udGV4dCBNVVNUIGRlZmluZVxuXHQgKiBhIFwic2hvd01lc3NhZ2VzKHRleHQpXCIgZnVuY3Rpb24uIExpbmUgZmVlZHMgKCdcXG4nKVxuXHQgKiBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gSFRNTCBsaW5lIGZlZWRzICc8YnIvPidcblx0ICogRGlmZmVyZW50IHRoYW4gcHJpbnRfZGVidWcgYmVjYXVzZSB3aWxsIGNhbGwgaGV4c3RyZHVtcCBpZmYgbmVjZXNzYXJ5LlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyBvZiB0aGUgZGVidWcgbWVzc2FnZVxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEFuIEhUTUwgdHQgZW50aXR5IGNvbnRhaW5pbmcgYSBwYXJhZ3JhcGggd2l0aCBhIFxuXHQgKiBzdHlsZSBhdHRyaWJ1dGUgd2hlcmUgdGhlIGRlYnVnIG1lc3NhZ2UgaXMgSFRNTGVuY29kZWQgaW4uIFxuXHQgKi9cblx0dGhpcy5wcmludF9kZWJ1Z19oZXhzdHJfZHVtcCA9IGZ1bmN0aW9uKHN0cixzdHJUb0hleCkge1xuXHRcdGlmICh0aGlzLmRlYnVnKSB7XG5cdFx0XHRzdHIgPSBzdHIgKyB0aGlzLmhleHN0cmR1bXAoc3RyVG9IZXgpO1xuXHRcdFx0Y29uc29sZS5sb2coc3RyKTtcblx0XHR9XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UuIFxuXHQgKiBUaGUgY2FsbGluZyBKYXZhc2NyaXB0IGNvbnRleHQgTVVTVCBkZWZpbmVcblx0ICogYSBcInNob3dNZXNzYWdlcyh0ZXh0KVwiIGZ1bmN0aW9uLiBMaW5lIGZlZWRzICgnXFxuJylcblx0ICogYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIEhUTUwgbGluZSBmZWVkcyAnPGJyLz4nXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIG9mIHRoZSBlcnJvciBtZXNzYWdlXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gQSBIVE1MIHBhcmFncmFwaCBlbnRpdHkgd2l0aCBhIHN0eWxlIGF0dHJpYnV0ZSBcblx0ICogY29udGFpbmluZyB0aGUgSFRNTCBlbmNvZGVkIGVycm9yIG1lc3NhZ2Vcblx0ICovXG5cdHRoaXMucHJpbnRfZXJyb3IgPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZih0aGlzLmRlYnVnKVxuXHRcdFx0dGhyb3cgc3RyO1xuXHRcdGNvbnNvbGUubG9nKHN0cik7XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGFuIGluZm8gbWVzc2FnZS4gXG5cdCAqIFRoZSBjYWxsaW5nIEphdmFzY3JpcHQgY29udGV4dCBNVVNUIGRlZmluZVxuXHQgKiBhIFwic2hvd01lc3NhZ2VzKHRleHQpXCIgZnVuY3Rpb24uIExpbmUgZmVlZHMgKCdcXG4nKVxuXHQgKiBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gSFRNTCBsaW5lIGZlZWRzICc8YnIvPicuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIG9mIHRoZSBpbmZvIG1lc3NhZ2Vcblx0ICogQHJldHVybiB7U3RyaW5nfSBBIEhUTUwgcGFyYWdyYXBoIGVudGl0eSB3aXRoIGEgc3R5bGUgYXR0cmlidXRlIFxuXHQgKiBjb250YWluaW5nIHRoZSBIVE1MIGVuY29kZWQgaW5mbyBtZXNzYWdlXG5cdCAqL1xuXHR0aGlzLnByaW50X2luZm8gPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZih0aGlzLmRlYnVnKVxuXHRcdFx0Y29uc29sZS5sb2coc3RyKTtcblx0fTtcblx0XG5cdHRoaXMucHJpbnRfd2FybmluZyA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdGNvbnNvbGUubG9nKHN0cik7XG5cdH07XG5cdFxuXHR0aGlzLmdldExlZnROQml0cyA9IGZ1bmN0aW9uIChzdHJpbmcsIGJpdGNvdW50KSB7XG5cdFx0dmFyIHJlc3QgPSBiaXRjb3VudCAlIDg7XG5cdFx0aWYgKHJlc3QgPT0gMClcblx0XHRcdHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGJpdGNvdW50IC8gOCk7XG5cdFx0dmFyIGJ5dGVzID0gKGJpdGNvdW50IC0gcmVzdCkgLyA4ICsxO1xuXHRcdHZhciByZXN1bHQgPSBzdHJpbmcuc3Vic3RyaW5nKDAsIGJ5dGVzKTtcblx0XHRyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0KHJlc3VsdCwgOC1yZXN0KTsgLy8gK1N0cmluZy5mcm9tQ2hhckNvZGUoc3RyaW5nLmNoYXJDb2RlQXQoYnl0ZXMgLTEpIDw8ICg4LXJlc3QpICYgMHhGRik7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNoaWZ0aW5nIGEgc3RyaW5nIHRvIG4gYml0cyByaWdodFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIHN0cmluZyB0byBzaGlmdFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGJpdGNvdW50IEFtb3VudCBvZiBiaXRzIHRvIHNoaWZ0IChNVVNUIGJlIHNtYWxsZXIgXG5cdCAqIHRoYW4gOSlcblx0ICogQHJldHVybiB7U3RyaW5nfSBSZXN1bHRpbmcgc3RyaW5nLiBcblx0ICovXG5cdHRoaXMuc2hpZnRSaWdodCA9IGZ1bmN0aW9uKHZhbHVlLCBiaXRjb3VudCkge1xuXHRcdHZhciB0ZW1wID0gdXRpbC5zdHIyYmluKHZhbHVlKTtcbiAgICAgICAgaWYgKGJpdGNvdW50ICUgOCAhPSAwKSB7XG4gICAgICAgIFx0Zm9yICh2YXIgaSA9IHRlbXAubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIFx0XHR0ZW1wW2ldID4+PSBiaXRjb3VudCAlIDg7XG4gICAgICAgIFx0XHRpZiAoaSA+IDApXG4gICAgICAgIFx0XHRcdHRlbXBbaV0gfD0gKHRlbXBbaSAtIDFdIDw8ICg4IC0gKGJpdGNvdW50ICUgOCkpKSAmIDB4RkY7XG4gICAgICAgIFx0fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICBcdHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5iaW4yc3RyKHRlbXApO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIFJldHVybiB0aGUgYWxnb3JpdGhtIHR5cGUgYXMgc3RyaW5nXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbWVzc2FnZSB0eXBlXG5cdCAqL1xuXHR0aGlzLmdldF9oYXNoQWxnb3JpdGhtU3RyaW5nID0gZnVuY3Rpb24oYWxnbykge1xuXHRcdHN3aXRjaChhbGdvKSB7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFwiTUQ1XCI7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFwiU0hBMVwiO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBcIlJJUEVNRDE2MFwiO1xuXHRcdGNhc2UgODpcblx0XHRcdHJldHVybiBcIlNIQTI1NlwiO1xuXHRcdGNhc2UgOTpcblx0XHRcdHJldHVybiBcIlNIQTM4NFwiO1xuXHRcdGNhc2UgMTA6XG5cdFx0XHRyZXR1cm4gXCJTSEE1MTJcIjtcblx0XHRjYXNlIDExOlxuXHRcdFx0cmV0dXJuIFwiU0hBMjI0XCI7XG5cdFx0fVxuXHRcdHJldHVybiBcInVua25vd25cIjtcblx0fTtcbn07XG5cbi8qKlxuICogYW4gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZC4gXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gbmV3IFV0aWwoKTtcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiQUVTIFJpam5kYWVsIGNpcGhlciB0ZXN0IHdpdGggdGVzdCB2ZWN0b3JzIGZyb20gZWNiX3RibC50eHRcIiwgZnVuY3Rpb24oKSB7XG4gIHZhciBvcGVucGdwID0gcmVxdWlyZSgnLi4vLi4vLi4vJyk7XG4gIHZhciB1dGlsID0gb3BlbnBncC51dGlsO1xuXG4gIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoKTtcblxuICBmdW5jdGlvbiB0ZXN0X2FlcyhpbnB1dCwga2V5LCBvdXRwdXQpIHtcbiAgICB2YXIgYWVzID0gbmV3IG9wZW5wZ3AuY2lwaGVyLmFlczEyOCh1dGlsLmJpbjJzdHIoa2V5KSk7XG5cbiAgICB2YXIgcmVzdWx0ID0gdXRpbC5iaW4yc3RyKGFlcy5lbmNyeXB0KGlucHV0KSk7XG5cbiAgICByZXR1cm4gdXRpbC5oZXhzdHJkdW1wKHJlc3VsdCkgPT0gdXRpbC5oZXhzdHJkdW1wKHV0aWwuYmluMnN0cihvdXRwdXQpKTtcbiAgfTtcblxuICB2YXIgdGVzdHZlY3RvcnMxMjggPSBbW1sweDAwLDB4MDEsMHgwMiwweDAzLDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwQSwweDBCLDB4MEMsMHgwRCwweDBGLDB4MTAsMHgxMSwweDEyXSxbMHg1MCwweDY4LDB4MTIsMHhBNCwweDVGLDB4MDgsMHhDOCwweDg5LDB4QjksMHg3RiwweDU5LDB4ODAsMHgwMywweDhCLDB4ODMsMHg1OV0sWzB4RDgsMHhGNSwweDMyLDB4NTMsMHg4MiwweDg5LDB4RUYsMHg3RCwweDA2LDB4QjUsMHgwNiwweEE0LDB4RkQsMHg1QiwweEU5LDB4QzldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgxNCwweDE1LDB4MTYsMHgxNywweDE5LDB4MUEsMHgxQiwweDFDLDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMywweDI0LDB4MjUsMHgyNl0sWzB4NUMsMHg2RCwweDcxLDB4Q0EsMHgzMCwweERFLDB4OEIsMHg4QiwweDAwLDB4NTQsMHg5OSwweDg0LDB4RDIsMHhFQywweDdELDB4NEJdLFsweDU5LDB4QUIsMHgzMCwweEY0LDB4RDQsMHhFRSwweDZFLDB4NEYsMHhGOSwweDkwLDB4N0UsMHhGNiwweDVCLDB4MUYsMHhCNiwweDhDXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4MjgsMHgyOSwweDJBLDB4MkIsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzcsMHgzOCwweDM5LDB4M0FdLFsweDUzLDB4RjMsMHhGNCwweEM2LDB4NEYsMHg4NiwweDE2LDB4RTQsMHhFNywweEM1LDB4NjEsMHg5OSwweEY0LDB4OEYsMHgyMSwweEY2XSxbMHhCRiwweDFFLDB4RDIsMHhGQywweEIyLDB4QUYsMHgzRiwweEQ0LDB4MTQsMHg0MywweEI1LDB4NkQsMHg4NSwweDAyLDB4NUMsMHhCMV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDNDLDB4M0QsMHgzRSwweDNGLDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NiwweDQ3LDB4NDgsMHg0OSwweDRCLDB4NEMsMHg0RCwweDRFXSxbMHhBMSwweEVCLDB4NjUsMHhBMywweDQ4LDB4NzEsMHg2NSwweEZCLDB4MEYsMHgxQywweDI3LDB4RkYsMHg5OSwweDU5LDB4RjcsMHgwM10sWzB4NzMsMHgxNiwweDYzLDB4MkQsMHg1QywweDMyLDB4MjMsMHgzRSwweERDLDB4QjAsMHg3OCwweDA1LDB4NjAsMHhFQSwweEU4LDB4QjJdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg1MCwweDUxLDB4NTIsMHg1MywweDU1LDB4NTYsMHg1NywweDU4LDB4NUEsMHg1QiwweDVDLDB4NUQsMHg1RiwweDYwLDB4NjEsMHg2Ml0sWzB4MzUsMHg1MywweEVDLDB4RjAsMHhCMSwweDczLDB4OTUsMHg1OCwweEIwLDB4OEUsMHgzNSwweDBBLDB4OTgsMHhBMywweDlCLDB4RkFdLFsweDQwLDB4OEMsMHgwNywweDNFLDB4M0UsMHgyNSwweDM4LDB4MDcsMHgyQiwweDcyLDB4NjIsMHg1RSwweDY4LDB4QjgsMHgzNiwweDRCXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4NjQsMHg2NSwweDY2LDB4NjcsMHg2OSwweDZBLDB4NkIsMHg2QywweDZFLDB4NkYsMHg3MCwweDcxLDB4NzMsMHg3NCwweDc1LDB4NzZdLFsweDY3LDB4NDIsMHg5OSwweDY5LDB4NDksMHgwQiwweDk3LDB4MTEsMHhBRSwweDJCLDB4MDEsMHhEQywweDQ5LDB4N0EsMHhGRCwweEU4XSxbMHhFMSwweEY5LDB4NEQsMHhGQSwweDc3LDB4NjUsMHg5NywweEJFLDB4QUMsMHhBMiwweDYyLDB4RjIsMHhGNiwweDM2LDB4NkYsMHhFQV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDc4LDB4NzksMHg3QSwweDdCLDB4N0QsMHg3RSwweDdGLDB4ODAsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg3LDB4ODgsMHg4OSwweDhBXSxbMHg5MywweDM4LDB4NUMsMHgxRiwweDJBLDB4RUMsMHg4QiwweEVELDB4MTksMHgyRiwweDVBLDB4OEUsMHgxNiwweDFELDB4RDUsMHgwOF0sWzB4RjIsMHg5RSwweDk4LDB4NkMsMHg2QSwweDFDLDB4MjcsMHhENywweEIyLDB4OUYsMHhGRCwweDdFLDB4RTksMHgyQiwweDc1LDB4RjFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg4QywweDhELDB4OEUsMHg4RiwweDkxLDB4OTIsMHg5MywweDk0LDB4OTYsMHg5NywweDk4LDB4OTksMHg5QiwweDlDLDB4OUQsMHg5RV0sWzB4QjUsMHhCRiwweDk0LDB4NkIsMHhFMSwweDlCLDB4RUIsMHg4RCwweEIzLDB4OTgsMHgzQiwweDVGLDB4NEMsMHg2RSwweDhELDB4REJdLFsweDEzLDB4MUMsMHg4OCwweDZBLDB4NTcsMHhGOCwweEMyLDB4RTcsMHgxMywweEFCLDB4QTYsMHg5NSwweDVFLDB4MkIsMHg1NSwweEI1XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4QTAsMHhBMSwweEEyLDB4QTMsMHhBNSwweEE2LDB4QTcsMHhBOCwweEFBLDB4QUIsMHhBQywweEFELDB4QUYsMHhCMCwweEIxLDB4QjJdLFsweDQxLDB4MzIsMHgxRSwweEUxLDB4MEUsMHgyMSwweEJELDB4OTAsMHg3MiwweDI3LDB4QzQsMHg0NSwweDBGLDB4RjQsMHgyMywweDI0XSxbMHhEMiwweEFCLDB4NzYsMHg2MiwweERGLDB4OUIsMHg4QywweDc0LDB4MDIsMHgxMCwweEU1LDB4RUUsMHhCNiwweDFDLDB4MTksMHg5RF1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEI0LDB4QjUsMHhCNiwweEI3LDB4QjksMHhCQSwweEJCLDB4QkMsMHhCRSwweEJGLDB4QzAsMHhDMSwweEMzLDB4QzQsMHhDNSwweEM2XSxbMHgwMCwweEE4LDB4MkYsMHg1OSwweEM5LDB4MUMsMHg4NCwweDg2LDB4RDEsMHgyQywweDBBLDB4ODAsMHgxMiwweDRGLDB4NjAsMHg4OV0sWzB4MTQsMHhDMSwweDA1LDB4NTQsMHhCMiwweDg1LDB4OUMsMHg0OCwweDRDLDB4QUIsMHg1OCwweDY5LDB4QkIsMHhFNywweEM0LDB4NzBdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHhDOCwweEM5LDB4Q0EsMHhDQiwweENELDB4Q0UsMHhDRiwweEQwLDB4RDIsMHhEMywweEQ0LDB4RDUsMHhENywweEQ4LDB4RDksMHhEQV0sWzB4N0MsMHhFMCwweEZELDB4MDcsMHg2NywweDU0LDB4NjksMHgxQiwweDRCLDB4QkQsMHg5RiwweEFGLDB4OEEsMHgxMywweDcyLDB4RkVdLFsweERCLDB4NEQsMHg0OSwweDhGLDB4MEEsMHg0OSwweENGLDB4NTUsMHg0NCwweDVELDB4NTAsMHgyQywweDFGLDB4OUEsMHhCMywweEI1XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4REMsMHhERCwweERFLDB4REYsMHhFMSwweEUyLDB4RTMsMHhFNCwweEU2LDB4RTcsMHhFOCwweEU5LDB4RUIsMHhFQywweEVELDB4RUVdLFsweDIzLDB4NjAsMHg1QSwweDgyLDB4NDMsMHhEMCwweDc3LDB4NjQsMHg1NCwweDFCLDB4QzUsMHhBRCwweDM1LDB4NUIsMHgzMSwweDI5XSxbMHg2RCwweDk2LDB4RkUsMHhGNywweEQ2LDB4NjUsMHg5MCwweEE3LDB4N0EsMHg3NywweEJCLDB4MjAsMHg1NiwweDY2LDB4N0YsMHg3Rl1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEYwLDB4RjEsMHhGMiwweEYzLDB4RjUsMHhGNiwweEY3LDB4RjgsMHhGQSwweEZCLDB4RkMsMHhGRCwweEZFLDB4MDEsMHgwMCwweDAyXSxbMHgxMiwweEE4LDB4Q0YsMHhBMiwweDNFLDB4QTcsMHg2NCwweEZELDB4ODcsMHg2MiwweDMyLDB4QjQsMHhFOCwweDQyLDB4QkMsMHg0NF0sWzB4MzEsMHg2RiwweEI2LDB4OEUsMHhEQiwweEE3LDB4MzYsMHhDNSwweDNFLDB4NzgsMHg0NywweDdCLDB4RjksMHgxMywweDcyLDB4NUNdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgwNCwweDA1LDB4MDYsMHgwNywweDA5LDB4MEEsMHgwQiwweDBDLDB4MEUsMHgwRiwweDEwLDB4MTEsMHgxMywweDE0LDB4MTUsMHgxNl0sWzB4QkMsMHhBRiwweDMyLDB4NDEsMHg1RSwweDgzLDB4MDgsMHhCMywweDcyLDB4M0UsMHg1RiwweERELDB4ODUsMHgzQywweENDLDB4ODBdLFsweDY5LDB4MzYsMHhGMiwweEI5LDB4M0EsMHhGOCwweDM5LDB4N0YsMHhEMywweEE3LDB4NzEsMHhGQywweDAxLDB4MUMsMHg4QywweDM3XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0IsMHgzQywweDNELDB4M0VdLFsweDg5LDB4QUYsMHhBRSwweDY4LDB4NUQsMHg4MCwweDFBLDB4RDcsMHg0NywweEFDLDB4RTksMHgxRiwweEM0LDB4OUEsMHhERCwweEUwXSxbMHhGMywweEY5LDB4MkYsMHg3QSwweDlDLDB4NTksMHgxNywweDlDLDB4MUYsMHhDQywweDJDLDB4MkIsMHhBMCwweEIwLDB4ODIsMHhDRF1dXTtcbiAgXG4gIHZhciB0ZXN0dmVjdG9yczE5MiA9IFtbWzB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNSwweDA2LDB4MDcsMHgwOCwweDBBLDB4MEIsMHgwQywweDBELDB4MEYsMHgxMCwweDExLDB4MTIsMHgxNCwweDE1LDB4MTYsMHgxNywweDE5LDB4MUEsMHgxQiwweDFDXSxbMHgyRCwweDMzLDB4RUUsMHhGMiwweEMwLDB4NDMsMHgwQSwweDhBLDB4OUUsMHhCRiwweDQ1LDB4RTgsMHgwOSwweEM0LDB4MEIsMHhCNl0sWzB4REYsMHhGNCwweDk0LDB4NUUsMHgwMywweDM2LDB4REYsMHg0QywweDFDLDB4NTYsMHhCQywweDcwLDB4MEUsMHhGRiwweDgzLDB4N0ZdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgxRSwweDFGLDB4MjAsMHgyMSwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjgsMHgyOSwweDJBLDB4MkIsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzcsMHgzOCwweDM5LDB4M0FdLFsweDZBLDB4QTMsMHg3NSwweEQxLDB4RkEsMHgxNSwweDVBLDB4NjEsMHhGQiwweDcyLDB4MzUsMHgzRSwweDBBLDB4NUEsMHg4NywweDU2XSxbMHhCNiwweEZELDB4REUsMHhGNCwweDc1LDB4MjcsMHg2NSwweEUzLDB4NDcsMHhENSwweEQyLDB4REMsMHgxOSwweDZELDB4MTIsMHg1Ml1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDNDLDB4M0QsMHgzRSwweDNGLDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NiwweDQ3LDB4NDgsMHg0OSwweDRCLDB4NEMsMHg0RCwweDRFLDB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NSwweDU2LDB4NTcsMHg1OF0sWzB4QkMsMHgzNywweDM2LDB4NTEsMHg4QiwweDk0LDB4OTAsMHhEQywweEI4LDB4RUQsMHg2MCwweEVCLDB4MjYsMHg3NSwweDhFLDB4RDRdLFsweEQyLDB4MzYsMHg4NCwweEUzLDB4RDksMHg2MywweEIzLDB4QUYsMHhDRiwweDFBLDB4MTEsMHg0QSwweENBLDB4OTAsMHhDQiwweEQ2XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4NUEsMHg1QiwweDVDLDB4NUQsMHg1RiwweDYwLDB4NjEsMHg2MiwweDY0LDB4NjUsMHg2NiwweDY3LDB4NjksMHg2QSwweDZCLDB4NkMsMHg2RSwweDZGLDB4NzAsMHg3MSwweDczLDB4NzQsMHg3NSwweDc2XSxbMHhBQSwweDIxLDB4NDQsMHgwMiwweEI0LDB4NkMsMHhGRiwweEI5LDB4RjcsMHg2MSwweEVDLDB4MTEsMHgyNiwweDNBLDB4MzEsMHgxRV0sWzB4M0EsMHg3QSwweEMwLDB4MjcsMHg3NSwweDNFLDB4MkEsMHgxOCwweEMyLDB4Q0UsMHhBQiwweDlFLDB4MTcsMHhDMSwweDFGLDB4RDBdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg3OCwweDc5LDB4N0EsMHg3QiwweDdELDB4N0UsMHg3RiwweDgwLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NywweDg4LDB4ODksMHg4QSwweDhDLDB4OEQsMHg4RSwweDhGLDB4OTEsMHg5MiwweDkzLDB4OTRdLFsweDAyLDB4QUUsMHhBOCwweDZFLDB4NTcsMHgyRSwweEVBLDB4QjYsMHg2QiwweDJDLDB4M0EsMHhGNSwweEU5LDB4QTQsMHg2RiwweEQ2XSxbMHg4RiwweDY3LDB4ODYsMHhCRCwweDAwLDB4NzUsMHgyOCwweEJBLDB4MjYsMHg2MCwweDNDLDB4MTYsMHgwMSwweENELDB4RDAsMHhEOF1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDk2LDB4OTcsMHg5OCwweDk5LDB4OUIsMHg5QywweDlELDB4OUUsMHhBMCwweEExLDB4QTIsMHhBMywweEE1LDB4QTYsMHhBNywweEE4LDB4QUEsMHhBQiwweEFDLDB4QUQsMHhBRiwweEIwLDB4QjEsMHhCMl0sWzB4RTIsMHhBRSwweEY2LDB4QUMsMHhDMywweDNCLDB4OTYsMHg1QywweDRGLDB4QTEsMHhGOSwweDFDLDB4NzUsMHhGRiwweDZGLDB4MzZdLFsweEQxLDB4N0QsMHgwNywweDNCLDB4MDEsMHhFNywweDE1LDB4MDIsMHhFMiwweDhCLDB4NDcsMHhBQiwweDU1LDB4MTEsMHg2OCwweEIzXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4QjQsMHhCNSwweEI2LDB4QjcsMHhCOSwweEJBLDB4QkIsMHhCQywweEJFLDB4QkYsMHhDMCwweEMxLDB4QzMsMHhDNCwweEM1LDB4QzYsMHhDOCwweEM5LDB4Q0EsMHhDQiwweENELDB4Q0UsMHhDRiwweEQwXSxbMHgwNiwweDU5LDB4REYsMHg0NiwweDQyLDB4NzEsMHg2MiwweEI5LDB4NDMsMHg0OCwweDY1LDB4REQsMHg5NCwweDk5LDB4RjksMHgxRF0sWzB4QTQsMHg2OSwweERBLDB4NTEsMHg3MSwweDE5LDB4RkEsMHhCOSwweDU4LDB4NzYsMHhGNCwweDFELDB4MDYsMHhENCwweDBGLDB4RkFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHhEMiwweEQzLDB4RDQsMHhENSwweEQ3LDB4RDgsMHhEOSwweERBLDB4REMsMHhERCwweERFLDB4REYsMHhFMSwweEUyLDB4RTMsMHhFNCwweEU2LDB4RTcsMHhFOCwweEU5LDB4RUIsMHhFQywweEVELDB4RUVdLFsweDQ5LDB4QTQsMHg0MiwweDM5LDB4QzcsMHg0OCwweEZFLDB4QjQsMHg1NiwweEY1LDB4OUMsMHgyNywweDZBLDB4NTYsMHg1OCwweERGXSxbMHg2MCwweDkxLDB4QUEsMHgzQiwweDY5LDB4NUMsMHgxMSwweEY1LDB4QzAsMHhCNiwweEFELDB4MjYsMHhEMywweEQ4LDB4NjIsMHhGRl1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEYwLDB4RjEsMHhGMiwweEYzLDB4RjUsMHhGNiwweEY3LDB4RjgsMHhGQSwweEZCLDB4RkMsMHhGRCwweEZFLDB4MDEsMHgwMCwweDAyLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOSwweDBBLDB4MEIsMHgwQ10sWzB4NjYsMHgyMCwweDhGLDB4NkUsMHg5RCwweDA0LDB4NTIsMHg1QiwweERFLDB4REIsMHgyNywweDMzLDB4QjYsMHhBNiwweEJFLDB4MzddLFsweDcwLDB4RjksMHhFNiwweDdGLDB4OUYsMHg4RCwweEYxLDB4MjksMHg0MSwweDMxLDB4NjYsMHgyRCwweEM2LDB4RTYsMHg5MywweDY0XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4MEUsMHgwRiwweDEwLDB4MTEsMHgxMywweDE0LDB4MTUsMHgxNiwweDE4LDB4MTksMHgxQSwweDFCLDB4MUQsMHgxRSwweDFGLDB4MjAsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI3LDB4MjgsMHgyOSwweDJBXSxbMHgzMywweDkzLDB4RjgsMHhERiwweEM3LDB4MjksMHhDOSwweDdGLDB4NTQsMHg4MCwweEI5LDB4NTAsMHhCQywweDk2LDB4NjYsMHhCMF0sWzB4RDEsMHg1NCwweERDLDB4QUYsMHhBRCwweDhCLDB4MjAsMHg3RiwweEE1LDB4Q0IsMHhDOSwweDVFLDB4OTksMHg5NiwweEI1LDB4NTldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgyQywweDJELDB4MkUsMHgyRiwweDMxLDB4MzIsMHgzMywweDM0LDB4MzYsMHgzNywweDM4LDB4MzksMHgzQiwweDNDLDB4M0QsMHgzRSwweDQwLDB4NDEsMHg0MiwweDQzLDB4NDUsMHg0NiwweDQ3LDB4NDhdLFsweDYwLDB4NjgsMHgzNCwweEM4LDB4Q0UsMHgwNiwweDNGLDB4MzIsMHgzNCwweENGLDB4MTEsMHg0NSwweDMyLDB4NUQsMHhCRCwweDcxXSxbMHg0OSwweDM0LDB4RDUsMHg0MSwweEU4LDB4QjQsMHg2RiwweEEzLDB4MzksMHhDOCwweDA1LDB4QTcsMHhBRSwweEI5LDB4RTUsMHhEQV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDRBLDB4NEIsMHg0QywweDRELDB4NEYsMHg1MCwweDUxLDB4NTIsMHg1NCwweDU1LDB4NTYsMHg1NywweDU5LDB4NUEsMHg1QiwweDVDLDB4NUUsMHg1RiwweDYwLDB4NjEsMHg2MywweDY0LDB4NjUsMHg2Nl0sWzB4RkUsMHhDMSwweEMwLDB4NEYsMHg1MiwweDlCLDB4QkQsMHgxNywweEQ4LDB4Q0UsMHhDRiwweENDLDB4NDcsMHgxOCwweEIxLDB4N0ZdLFsweDYyLDB4NTYsMHg0QywweDczLDB4OEYsMHgzRSwweEZFLDB4MTgsMHg2RSwweDFBLDB4MTIsMHg3QSwweDBDLDB4NEQsMHgzQywweDYxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4NjgsMHg2OSwweDZBLDB4NkIsMHg2RCwweDZFLDB4NkYsMHg3MCwweDcyLDB4NzMsMHg3NCwweDc1LDB4NzcsMHg3OCwweDc5LDB4N0EsMHg3QywweDdELDB4N0UsMHg3RiwweDgxLDB4ODIsMHg4MywweDg0XSxbMHgzMiwweERGLDB4OTksMHhCNCwweDMxLDB4RUQsMHg1RCwweEM1LDB4QUMsMHhGOCwweENBLDB4RjYsMHhEQywweDZDLDB4RTQsMHg3NV0sWzB4MDcsMHg4MCwweDVBLDB4QTAsMHg0MywweDk4LDB4NkUsMHhCMiwweDM2LDB4OTMsMHhFMiwweDNCLDB4RUYsMHg4RiwweDM0LDB4MzhdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg4NiwweDg3LDB4ODgsMHg4OSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OTAsMHg5MSwweDkyLDB4OTMsMHg5NSwweDk2LDB4OTcsMHg5OCwweDlBLDB4OUIsMHg5QywweDlELDB4OUYsMHhBMCwweEExLDB4QTJdLFsweDdGLDB4REMsMHgyQiwweDc0LDB4NkYsMHgzRiwweDY2LDB4NTIsMHg5NiwweDk0LDB4M0IsMHg4MywweDcxLDB4MEQsMHgxRiwweDgyXSxbMHhERiwweDBCLDB4NDksMHgzMSwweDAzLDB4OEIsMHhBRCwweEU4LDB4NDgsMHhERSwweEUzLDB4QjQsMHhCOCwweDVBLDB4QTQsMHg0Ql1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEE0LDB4QTUsMHhBNiwweEE3LDB4QTksMHhBQSwweEFCLDB4QUMsMHhBRSwweEFGLDB4QjAsMHhCMSwweEIzLDB4QjQsMHhCNSwweEI2LDB4QjgsMHhCOSwweEJBLDB4QkIsMHhCRCwweEJFLDB4QkYsMHhDMF0sWzB4OEYsMHhCQSwweDE1LDB4MTAsMHhBMywweEM1LDB4QjgsMHg3RSwweDJFLDB4QUEsMHgzRiwweDdBLDB4OTEsMHg0NSwweDVDLDB4QTJdLFsweDU5LDB4MkQsMHg1RiwweERFLDB4RDcsMHg2NSwweDgyLDB4RTQsMHgxNCwweDNDLDB4NjUsMHgwOSwweDkzLDB4MDksMHg0NywweDdDXV1dO1xuICBcbiAgdmFyIHRlc3R2ZWN0b3JzMjU2ID0gW1tbMHgwMCwweDAxLDB4MDIsMHgwMywweDA1LDB4MDYsMHgwNywweDA4LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgwRiwweDEwLDB4MTEsMHgxMiwweDE0LDB4MTUsMHgxNiwweDE3LDB4MTksMHgxQSwweDFCLDB4MUMsMHgxRSwweDFGLDB4MjAsMHgyMSwweDIzLDB4MjQsMHgyNSwweDI2XSxbMHg4MywweDRFLDB4QUQsMHhGQywweENBLDB4QzcsMHhFMSwweEIzLDB4MDYsMHg2NCwweEIxLDB4QUIsMHhBNCwweDQ4LDB4MTUsMHhBQl0sWzB4MTksMHg0NiwweERBLDB4QkYsMHg2QSwweDAzLDB4QTIsMHhBMiwweEMzLDB4RDAsMHhCMCwweDUwLDB4ODAsMHhBRSwweEQ2LDB4RkNdXSxcbiAgICAgICAgICAgICAgW1sweDI4LDB4MjksMHgyQSwweDJCLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM3LDB4MzgsMHgzOSwweDNBLDB4M0MsMHgzRCwweDNFLDB4M0YsMHg0MSwweDQyLDB4NDMsMHg0NCwweDQ2LDB4NDcsMHg0OCwweDQ5LDB4NEIsMHg0QywweDRELDB4NEVdLFsweEQ5LDB4REMsMHg0RCwweEJBLDB4MzAsMHgyMSwweEIwLDB4NUQsMHg2NywweEMwLDB4NTEsMHg4RiwweDcyLDB4QjYsMHgyQiwweEYxXSxbMHg1RSwweEQzLDB4MDEsMHhENywweDQ3LDB4RDMsMHhDQywweDcxLDB4NTQsMHg0NSwweEVCLDB4REUsMHhDNiwweDJGLDB4MkYsMHhCNF1dLFxuICAgICAgICAgICAgICBbWzB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NSwweDU2LDB4NTcsMHg1OCwweDVBLDB4NUIsMHg1QywweDVELDB4NUYsMHg2MCwweDYxLDB4NjIsMHg2NCwweDY1LDB4NjYsMHg2NywweDY5LDB4NkEsMHg2QiwweDZDLDB4NkUsMHg2RiwweDcwLDB4NzEsMHg3MywweDc0LDB4NzUsMHg3Nl0sWzB4QTIsMHg5MSwweEQ4LDB4NjMsMHgwMSwweEE0LDB4QTcsMHgzOSwweEY3LDB4MzksMHgyMSwweDczLDB4QUEsMHgzQywweDYwLDB4NENdLFsweDY1LDB4ODUsMHhDOCwweEY0LDB4M0QsMHgxMywweEE2LDB4QkUsMHhBQiwweDY0LDB4MTksMHhGQywweDU5LDB4MzUsMHhCOSwweEQwXV0sXG4gICAgICAgICAgICAgIFtbMHg3OCwweDc5LDB4N0EsMHg3QiwweDdELDB4N0UsMHg3RiwweDgwLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NywweDg4LDB4ODksMHg4QSwweDhDLDB4OEQsMHg4RSwweDhGLDB4OTEsMHg5MiwweDkzLDB4OTQsMHg5NiwweDk3LDB4OTgsMHg5OSwweDlCLDB4OUMsMHg5RCwweDlFXSxbMHg0MiwweDY0LDB4QjIsMHg2OSwweDY0LDB4OTgsMHhERSwweDRELDB4RjcsMHg5NywweDg4LDB4QTksMHhGOCwweDNFLDB4OTMsMHg5MF0sWzB4MkEsMHg1QiwweDU2LDB4QTUsMHg5NiwweDY4LDB4MEYsMHhDQywweDBFLDB4MDUsMHhGNSwweEUwLDB4RjEsMHg1MSwweEVDLDB4QUVdXSxcbiAgICAgICAgICAgICAgW1sweEEwLDB4QTEsMHhBMiwweEEzLDB4QTUsMHhBNiwweEE3LDB4QTgsMHhBQSwweEFCLDB4QUMsMHhBRCwweEFGLDB4QjAsMHhCMSwweEIyLDB4QjQsMHhCNSwweEI2LDB4QjcsMHhCOSwweEJBLDB4QkIsMHhCQywweEJFLDB4QkYsMHhDMCwweEMxLDB4QzMsMHhDNCwweEM1LDB4QzZdLFsweEVFLDB4OTksMHgzMiwweEIzLDB4NzIsMHgxOCwweDA0LDB4RDUsMHhBOCwweDNFLDB4RjUsMHg5NCwweDkyLDB4NDUsMHhCNiwweEY2XSxbMHhGNSwweEQ2LDB4RkYsMHg0MSwweDRGLDB4RDIsMHhDNiwweDE4LDB4MTQsMHg5NCwweEQyLDB4MEMsMHgzNywweEYyLDB4QjgsMHhDNF1dLFxuICAgICAgICAgICAgICBbWzB4QzgsMHhDOSwweENBLDB4Q0IsMHhDRCwweENFLDB4Q0YsMHhEMCwweEQyLDB4RDMsMHhENCwweEQ1LDB4RDcsMHhEOCwweEQ5LDB4REEsMHhEQywweERELDB4REUsMHhERiwweEUxLDB4RTIsMHhFMywweEU0LDB4RTYsMHhFNywweEU4LDB4RTksMHhFQiwweEVDLDB4RUQsMHhFRV0sWzB4RTYsMHgyNCwweDhGLDB4NTUsMHhDNSwweEZELDB4Q0IsMHhDQSwweDlDLDB4QkIsMHhCMCwweDFDLDB4ODgsMHhBMiwweEVBLDB4NzddLFsweDg1LDB4MzksMHg5QywweDAxLDB4RjUsMHg5RiwweEZGLDB4QjUsMHgyMCwweDRGLDB4MTksMHhGOCwweDQ4LDB4MkYsMHgwMCwweEI4XV0sXG4gICAgICAgICAgICAgIFtbMHhGMCwweEYxLDB4RjIsMHhGMywweEY1LDB4RjYsMHhGNywweEY4LDB4RkEsMHhGQiwweEZDLDB4RkQsMHhGRSwweDAxLDB4MDAsMHgwMiwweDA0LDB4MDUsMHgwNiwweDA3LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRSwweDBGLDB4MTAsMHgxMSwweDEzLDB4MTQsMHgxNSwweDE2XSxbMHhCOCwweDM1LDB4OEUsMHg0MSwweEI5LDB4REYsMHhGNiwweDVGLDB4RDQsMHg2MSwweEQ1LDB4NUEsMHg5OSwweDI2LDB4NjIsMHg0N10sWzB4OTIsMHgwOSwweDdCLDB4NEMsMHg4OCwweEEwLDB4NDEsMHhERCwweEY5LDB4ODEsMHg0NCwweEJDLDB4OEQsMHgyMiwweEU4LDB4RTddXSxcbiAgICAgICAgICAgICAgW1sweDE4LDB4MTksMHgxQSwweDFCLDB4MUQsMHgxRSwweDFGLDB4MjAsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI3LDB4MjgsMHgyOSwweDJBLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0IsMHgzQywweDNELDB4M0VdLFsweEYwLDB4RTIsMHhENywweDIyLDB4NjAsMHhBRiwweDU4LDB4RTIsMHgxRSwweDAxLDB4NUEsMHhCMywweEE0LDB4QzAsMHhEOSwweDA2XSxbMHg4OSwweEJELDB4NUIsMHg3MywweEIzLDB4NTYsMHhBQiwweDQxLDB4MkEsMHhFRiwweDlGLDB4NzYsMHhDRSwweEEyLDB4RDYsMHg1Q11dLFxuICAgICAgICAgICAgICBbWzB4NDAsMHg0MSwweDQyLDB4NDMsMHg0NSwweDQ2LDB4NDcsMHg0OCwweDRBLDB4NEIsMHg0QywweDRELDB4NEYsMHg1MCwweDUxLDB4NTIsMHg1NCwweDU1LDB4NTYsMHg1NywweDU5LDB4NUEsMHg1QiwweDVDLDB4NUUsMHg1RiwweDYwLDB4NjEsMHg2MywweDY0LDB4NjUsMHg2Nl0sWzB4NDcsMHg1QiwweDhCLDB4ODIsMHgzQywweEU4LDB4ODksMHgzRCwweEIzLDB4QzQsMHg0QSwweDlGLDB4MkEsMHgzNywweDlGLDB4RjddLFsweDI1LDB4MzYsMHg5NiwweDkwLDB4OTMsMHhDNSwweDVGLDB4RjksMHg0NSwweDQ2LDB4OTIsMHhGMiwweEZBLDB4QzIsMHhGNSwweDMwXV0sXG4gICAgICAgICAgICAgIFtbMHg2OCwweDY5LDB4NkEsMHg2QiwweDZELDB4NkUsMHg2RiwweDcwLDB4NzIsMHg3MywweDc0LDB4NzUsMHg3NywweDc4LDB4NzksMHg3QSwweDdDLDB4N0QsMHg3RSwweDdGLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhCLDB4OEMsMHg4RCwweDhFXSxbMHg2OCwweDhGLDB4NTIsMHg4MSwweDk0LDB4NTgsMHgxMiwweDg2LDB4MkYsMHg1RiwweDMwLDB4NzYsMHhDRiwweDgwLDB4NDEsMHgyRl0sWzB4MDcsMHhGQywweDc2LDB4QTgsMHg3MiwweDg0LDB4M0YsMHgzRiwweDZFLDB4MDAsMHg4MSwweEVFLDB4OTMsMHg5NiwweEQ2LDB4MzddXSxcbiAgICAgICAgICAgICAgW1sweDkwLDB4OTEsMHg5MiwweDkzLDB4OTUsMHg5NiwweDk3LDB4OTgsMHg5QSwweDlCLDB4OUMsMHg5RCwweDlGLDB4QTAsMHhBMSwweEEyLDB4QTQsMHhBNSwweEE2LDB4QTcsMHhBOSwweEFBLDB4QUIsMHhBQywweEFFLDB4QUYsMHhCMCwweEIxLDB4QjMsMHhCNCwweEI1LDB4QjZdLFsweDA4LDB4RDEsMHhEMiwweEJDLDB4NzUsMHgwQSwweEY1LDB4NTMsMHgzNiwweDVELDB4MzUsMHhFNywweDVBLDB4RkEsMHhDRSwweEFBXSxbMHhFMywweDhCLDB4QTgsMHhFQywweDJBLDB4QTcsMHg0MSwweDM1LDB4OEQsMHhDQywweDkzLDB4RTgsMHhGMSwweDQxLDB4QzQsMHg5MV1dLFxuICAgICAgICAgICAgICBbWzB4QjgsMHhCOSwweEJBLDB4QkIsMHhCRCwweEJFLDB4QkYsMHhDMCwweEMyLDB4QzMsMHhDNCwweEM1LDB4QzcsMHhDOCwweEM5LDB4Q0EsMHhDQywweENELDB4Q0UsMHhDRiwweEQxLDB4RDIsMHhEMywweEQ0LDB4RDYsMHhENywweEQ4LDB4RDksMHhEQiwweERDLDB4REQsMHhERV0sWzB4ODcsMHgwNywweDEyLDB4MUYsMHg0NywweENDLDB4M0UsMHhGQywweEVDLDB4QTUsMHhGOSwweEE4LDB4NDcsMHg0OSwweDUwLDB4QTFdLFsweEQwLDB4MjgsMHhFRSwweDIzLDB4RTQsMHhBOCwweDkwLDB4NzUsMHhEMCwweEIwLDB4M0UsMHg4NiwweDhELDB4N0QsMHgzQSwweDQyXV0sXG4gICAgICAgICAgICAgIFtbMHhFMCwweEUxLDB4RTIsMHhFMywweEU1LDB4RTYsMHhFNywweEU4LDB4RUEsMHhFQiwweEVDLDB4RUQsMHhFRiwweEYwLDB4RjEsMHhGMiwweEY0LDB4RjUsMHhGNiwweEY3LDB4RjksMHhGQSwweEZCLDB4RkMsMHhGRSwweEZFLDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwNSwweDA2XSxbMHhFNSwweDFBLDB4QTAsMHhCMSwweDM1LDB4REIsMHhBNSwweDY2LDB4OTMsMHg5QywweDNCLDB4NjMsMHg1OSwweEE5LDB4ODAsMHhDNV0sWzB4OEMsMHhEOSwweDQyLDB4M0QsMHhGQywweDQ1LDB4OUUsMHg1NCwweDcxLDB4NTUsMHhDNSwweEQxLDB4RDUsMHgyMiwweEU1LDB4NDBdXSxcbiAgICAgICAgICAgICAgW1sweDA4LDB4MDksMHgwQSwweDBCLDB4MEQsMHgwRSwweDBGLDB4MTAsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUMsMHgxRCwweDFFLDB4MUYsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI2LDB4MjcsMHgyOCwweDI5LDB4MkIsMHgyQywweDJELDB4MkVdLFsweDA2LDB4OUEsMHgwMCwweDdGLDB4QzcsMHg2QSwweDQ1LDB4OUYsMHg5OCwweEJBLDB4RjksMHgxNywweEZFLDB4REYsMHg5NSwweDIxXSxbMHgwOCwweDBFLDB4OTUsMHgxNywweEVCLDB4MTYsMHg3NywweDcxLDB4OUEsMHhDRiwweDcyLDB4ODAsMHg4NiwweDA0LDB4MEEsMHhFM11dLFxuICAgICAgICAgICAgICBbWzB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNSwweDM2LDB4MzcsMHgzOCwweDNBLDB4M0IsMHgzQywweDNELDB4M0YsMHg0MCwweDQxLDB4NDIsMHg0NCwweDQ1LDB4NDYsMHg0NywweDQ5LDB4NEEsMHg0QiwweDRDLDB4NEUsMHg0RiwweDUwLDB4NTEsMHg1MywweDU0LDB4NTUsMHg1Nl0sWzB4NzIsMHg2MSwweDY1LDB4QzEsMHg3MiwweDNGLDB4QkMsMHhGNiwweEMwLDB4MjYsMHhENywweEQwLDB4MEIsMHgwOSwweDEwLDB4MjddLFsweDdDLDB4MTcsMHgwMCwweDIxLDB4MUEsMHgzOSwweDkxLDB4RkMsMHgwRSwweENELDB4RUQsMHgwQSwweEIzLDB4RTUsMHg3NiwweEIwXV1dO1xuXG4gIHZhciByZXMgPSB0cnVlO1xuICB2YXIgaiA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHZlY3RvcnMxMjgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVzMiA9IHRlc3RfYWVzKHRlc3R2ZWN0b3JzMTI4W2ldWzFdLHRlc3R2ZWN0b3JzMTI4W2ldWzBdLHRlc3R2ZWN0b3JzMTI4W2ldWzJdKTtcbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgMTI4IGJpdCBrZXkgdmVjdG9yIHdpdGggYmxvY2sgXCIrXG4gICAgICAgIHV0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxMjhbaV1bMV0pK1xuICAgICAgICBcIiBhbmQga2V5IFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxMjhbaV1bMF0pK1xuICAgICAgICBcIiBzaG91bGQgYmUgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yczEyOFtpXVsyXSksXG4gICAgICAgIGZhbHNlKTtcbiAgICAgIGorKztcbiAgICB9XG4gIH1cbiAgaWYgKHJlcykge1xuICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIjEyOCBiaXQga2V5IHRlc3QgdmVjdG9ycyBjb21wbGV0ZWQuXCIsdHJ1ZSlcbiAgICBqKys7XG4gIH1cbiAgXG4gIHJlcyA9IHRydWU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHZlY3RvcnMxOTIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVzMiA9IHRlc3RfYWVzKHRlc3R2ZWN0b3JzMTkyW2ldWzFdLHRlc3R2ZWN0b3JzMTkyW2ldWzBdLHRlc3R2ZWN0b3JzMTkyW2ldWzJdKTtcbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgMTkyIGJpdCBrZXkgdmVjdG9yIHdpdGggYmxvY2sgXCIrXG4gICAgICAgIHV0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxOTJbaV1bMV0pK1xuICAgICAgICBcIiBhbmQga2V5IFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxOTJbaV1bMF0pK1xuICAgICAgICBcIiBzaG91bGQgYmUgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yczE5MltpXVsyXSksXG4gICAgICAgIGZhbHNlKTtcbiAgICAgIGorKztcbiAgICB9XG4gIH1cbiAgaWYgKHJlcykge1xuICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIjE5MiBiaXQga2V5IHRlc3QgdmVjdG9ycyBjb21wbGV0ZWQuXCIsdHJ1ZSlcbiAgICBqKys7XG4gIH1cblxuICByZXMgPSB0cnVlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3R2ZWN0b3JzMjU2Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlczIgPSB0ZXN0X2Flcyh0ZXN0dmVjdG9yczI1NltpXVsxXSx0ZXN0dmVjdG9yczI1NltpXVswXSx0ZXN0dmVjdG9yczI1NltpXVsyXSk7XG4gICAgcmVzICY9IHJlczI7XG4gICAgaWYgKCFyZXMyKSB7XG4gICAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCJUZXN0aW5nIDI1NiBiaXQga2V5IHZlY3RvciB3aXRoIGJsb2NrIFwiK1xuICAgICAgICB1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzMjU2W2ldWzFdKStcbiAgICAgICAgXCIgYW5kIGtleSBcIit1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzMjU2W2ldWzBdKStcbiAgICAgICAgXCIgc2hvdWxkIGJlIFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMyNTZbaV1bMl0pLFxuICAgICAgICBmYWxzZSk7XG4gICAgICBqKys7XG4gICAgfVxuICB9XG4gIGlmIChyZXMpIHtcbiAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCIyNTYgYml0IGtleSB0ZXN0IHZlY3RvcnMgY29tcGxldGVkLlwiLCB0cnVlKVxuICAgIGorKztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiQmxvd2Zpc2ggY2lwaGVyIHRlc3Qgd2l0aCB0ZXN0IHZlY3RvcnMgZnJvbSBodHRwOi8vd3d3LnNjaG5laWVyLmNvbS9jb2RlL3ZlY3RvcnMudHh0XCIsIGZ1bmN0aW9uKCkge1xuICB2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuICAgIHV0aWwgPSBvcGVucGdwLnV0aWwsXG4gICAgQkZlbmNyeXB0ID0gb3BlbnBncC5jaXBoZXIuYmxvd2Zpc2g7XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmdW5jdGlvbiB0ZXN0X2JmKGlucHV0LCBrZXksIG91dHB1dCkge1xuICAgIHZhciBibG93ZmlzaCA9IG5ldyBvcGVucGdwLmNpcGhlci5ibG93ZmlzaCh1dGlsLmJpbjJzdHIoa2V5KSk7XG4gICAgdmFyIHJlc3VsdCA9IHV0aWwuYmluMnN0cihibG93ZmlzaC5lbmNyeXB0KGlucHV0KSk7XG5cbiAgICByZXR1cm4gKHV0aWwuaGV4c3RyZHVtcChyZXN1bHQpID09IHV0aWwuaGV4c3RyZHVtcCh1dGlsLmJpbjJzdHIob3V0cHV0KSkpO1xuICB9XG4gIHZhciB0ZXN0dmVjdG9ycyA9IFtbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NEUsMHhGOSwweDk3LDB4NDUsMHg2MSwweDk4LDB4REQsMHg3OF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZdLFsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZdLFsweDUxLDB4ODYsMHg2RiwweEQ1LDB4QjgsMHg1RSwweENCLDB4OEFdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxXSxbMHg3RCwweDg1LDB4NkYsMHg5QSwweDYxLDB4MzAsMHg2MywweEYyXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMV0sWzB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMV0sWzB4MjQsMHg2NiwweERELDB4ODcsMHg4QiwweDk2LDB4M0MsMHg5RF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTFdLFsweDYxLDB4RjksMHhDMywweDgwLDB4MjIsMHg4MSwweEIwLDB4OTZdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExXSxbMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGXSxbMHg3RCwweDBDLDB4QzYsMHgzMCwweEFGLDB4REEsMHgxRSwweEM3XV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NEUsMHhGOSwweDk3LDB4NDUsMHg2MSwweDk4LDB4REQsMHg3OF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweEZFLDB4REMsMHhCQSwweDk4LDB4NzYsMHg1NCwweDMyLDB4MTBdLFsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweDBBLDB4Q0UsMHhBQiwweDBGLDB4QzYsMHhBMCwweEEyLDB4OERdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHg3QywweEExLDB4MTAsMHg0NSwweDRBLDB4MUEsMHg2RSwweDU3XSxbMHgwMSwweEExLDB4RDYsMHhEMCwweDM5LDB4NzcsMHg2NywweDQyXSxbMHg1OSwweEM2LDB4ODIsMHg0NSwweEVCLDB4MDUsMHgyOCwweDJCXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDEsMHgzMSwweEQ5LDB4NjEsMHg5RCwweEMxLDB4MzcsMHg2RV0sWzB4NUMsMHhENSwweDRDLDB4QTgsMHgzRCwweEVGLDB4NTcsMHhEQV0sWzB4QjEsMHhCOCwweENDLDB4MEIsMHgyNSwweDBGLDB4MDksMHhBMF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDA3LDB4QTEsMHgxMywweDNFLDB4NEEsMHgwQiwweDI2LDB4ODZdLFsweDAyLDB4NDgsMHhENCwweDM4LDB4MDYsMHhGNiwweDcxLDB4NzJdLFsweDE3LDB4MzAsMHhFNSwweDc3LDB4OEIsMHhFQSwweDFELDB4QTRdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgzOCwweDQ5LDB4NjcsMHg0QywweDI2LDB4MDIsMHgzMSwweDlFXSxbMHg1MSwweDQ1LDB4NEIsMHg1OCwweDJELDB4REYsMHg0NCwweDBBXSxbMHhBMiwweDVFLDB4NzgsMHg1NiwweENGLDB4MjYsMHg1MSwweEVCXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDQsMHhCOSwweDE1LDB4QkEsMHg0MywweEZFLDB4QjUsMHhCNl0sWzB4NDIsMHhGRCwweDQ0LDB4MzAsMHg1OSwweDU3LDB4N0YsMHhBMl0sWzB4MzUsMHgzOCwweDgyLDB4QjEsMHgwOSwweENFLDB4OEYsMHgxQV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAxLDB4MTMsMHhCOSwweDcwLDB4RkQsMHgzNCwweEYyLDB4Q0VdLFsweDA1LDB4OUIsMHg1RSwweDA4LDB4NTEsMHhDRiwweDE0LDB4M0FdLFsweDQ4LDB4RjQsMHhEMCwweDg4LDB4NEMsMHgzNywweDk5LDB4MThdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMSwweDcwLDB4RjEsMHg3NSwweDQ2LDB4OEYsMHhCNSwweEU2XSxbMHgwNywweDU2LDB4RDgsMHhFMCwweDc3LDB4NDcsMHg2MSwweEQyXSxbMHg0MywweDIxLDB4OTMsMHhCNywweDg5LDB4NTEsMHhGQywweDk4XV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4NDMsMHgyOSwweDdGLDB4QUQsMHgzOCwweEUzLDB4NzMsMHhGRV0sWzB4NzYsMHgyNSwweDE0LDB4QjgsMHgyOSwweEJGLDB4NDgsMHg2QV0sWzB4MTMsMHhGMCwweDQxLDB4NTQsMHhENiwweDlELDB4MUEsMHhFNV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDA3LDB4QTcsMHgxMywweDcwLDB4NDUsMHhEQSwweDJBLDB4MTZdLFsweDNCLDB4REQsMHgxMSwweDkwLDB4NDksMHgzNywweDI4LDB4MDJdLFsweDJFLDB4RUQsMHhEQSwweDkzLDB4RkYsMHhEMywweDlDLDB4NzldXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwNCwweDY4LDB4OTEsMHgwNCwweEMyLDB4RkQsMHgzQiwweDJGXSxbMHgyNiwweDk1LDB4NUYsMHg2OCwweDM1LDB4QUYsMHg2MCwweDlBXSxbMHhEOCwweDg3LDB4RTAsMHgzOSwweDNDLDB4MkQsMHhBNiwweEUzXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MzcsMHhEMCwweDZCLDB4QjUsMHgxNiwweENCLDB4NzUsMHg0Nl0sWzB4MTYsMHg0RCwweDVFLDB4NDAsMHg0RiwweDI3LDB4NTIsMHgzMl0sWzB4NUYsMHg5OSwweEQwLDB4NEYsMHg1QiwweDE2LDB4MzksMHg2OV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDFGLDB4MDgsMHgyNiwweDBELDB4MUEsMHhDMiwweDQ2LDB4NUVdLFsweDZCLDB4MDUsMHg2RSwweDE4LDB4NzUsMHg5RiwweDVDLDB4Q0FdLFsweDRBLDB4MDUsMHg3QSwweDNCLDB4MjQsMHhEMywweDk3LDB4N0JdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHg1OCwweDQwLDB4MjMsMHg2NCwweDFBLDB4QkEsMHg2MSwweDc2XSxbMHgwMCwweDRCLDB4RDYsMHhFRiwweDA5LDB4MTcsMHg2MCwweDYyXSxbMHg0NSwweDIwLDB4MzEsMHhDMSwweEU0LDB4RkEsMHhEQSwweDhFXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDIsMHg1OCwweDE2LDB4MTYsMHg0NiwweDI5LDB4QjAsMHgwN10sWzB4NDgsMHgwRCwweDM5LDB4MDAsMHg2RSwweEU3LDB4NjIsMHhGMl0sWzB4NzUsMHg1NSwweEFFLDB4MzksMHhGNSwweDlCLDB4ODcsMHhCRF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDQ5LDB4NzksMHgzRSwweEJDLDB4NzksMHhCMywweDI1LDB4OEZdLFsweDQzLDB4NzUsMHg0MCwweEM4LDB4NjksMHg4RiwweDNDLDB4RkFdLFsweDUzLDB4QzUsMHg1RiwweDlDLDB4QjQsMHg5RiwweEMwLDB4MTldXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHg0RiwweEIwLDB4NUUsMHgxNSwweDE1LDB4QUIsMHg3MywweEE3XSxbMHgwNywweDJELDB4NDMsMHhBMCwweDc3LDB4MDcsMHg1MiwweDkyXSxbMHg3QSwweDhFLDB4N0IsMHhGQSwweDkzLDB4N0UsMHg4OSwweEEzXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4NDksMHhFOSwweDVELDB4NkQsMHg0QywweEEyLDB4MjksMHhCRl0sWzB4MDIsMHhGRSwweDU1LDB4NzcsMHg4MSwweDE3LDB4RjEsMHgyQV0sWzB4Q0YsMHg5QywweDVELDB4N0EsMHg0OSwweDg2LDB4QUQsMHhCNV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAxLDB4ODMsMHgxMCwweERDLDB4NDAsMHg5QiwweDI2LDB4RDZdLFsweDFELDB4OUQsMHg1QywweDUwLDB4MTgsMHhGNywweDI4LDB4QzJdLFsweEQxLDB4QUIsMHhCMiwweDkwLDB4NjUsMHg4QiwweEM3LDB4NzhdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgxQywweDU4LDB4N0YsMHgxQywweDEzLDB4OTIsMHg0RiwweEVGXSxbMHgzMCwweDU1LDB4MzIsMHgyOCwweDZELDB4NkYsMHgyOSwweDVBXSxbMHg1NSwweENCLDB4MzcsMHg3NCwweEQxLDB4M0UsMHhGMiwweDAxXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMV0sWzB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweEFCLDB4Q0QsMHhFRl0sWzB4RkEsMHgzNCwweEVDLDB4NDgsMHg0NywweEIyLDB4NjgsMHhCMl1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDFGLDB4MUYsMHgxRiwweDFGLDB4MEUsMHgwRSwweDBFLDB4MEVdLFsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweEE3LDB4OTAsMHg3OSwweDUxLDB4MDgsMHhFQSwweDNDLDB4QUVdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHhFMCwweEZFLDB4RTAsMHhGRSwweEYxLDB4RkUsMHhGMSwweEZFXSxbMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGXSxbMHhDMywweDlFLDB4MDcsMHgyRCwweDlGLDB4QUMsMHg2MywweDFEXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRl0sWzB4MDEsMHg0OSwweDMzLDB4RTAsMHhDRCwweEFGLDB4RjYsMHhFNF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZdLFsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEYyLDB4MUUsMHg5QSwweDc3LDB4QjcsMHgxQywweDQ5LDB4QkNdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGXSxbMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHgyNCwweDU5LDB4NDYsMHg4OCwweDU3LDB4NTQsMHgzNiwweDlBXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4RkUsMHhEQywweEJBLDB4OTgsMHg3NiwweDU0LDB4MzIsMHgxMF0sWzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRl0sWzB4NkIsMHg1QywweDVBLDB4OUMsMHg1RCwweDlFLDB4MEEsMHg1QV1dXTtcblxuICB2YXIgcmVzID0gdHJ1ZTtcbiAgdmFyIGogPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3R2ZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlczIgPSB0ZXN0X2JmKHRlc3R2ZWN0b3JzW2ldWzFdLHRlc3R2ZWN0b3JzW2ldWzBdLHRlc3R2ZWN0b3JzW2ldWzJdKTtcbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgdmVjdG9yIFwiK2krXCIgd2l0aCBibG9jayBcIitcbiAgICAgICAgdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVswXSkrXG4gICAgICAgIFwiIGFuZCBrZXkgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVsxXSkrXG4gICAgICAgIFwiIHNob3VsZCBiZSBcIit1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzW2ldWzJdKSwgZmFsc2UpO1xuICAgICAgaisrO1xuICAgIH1cbiAgfVxuICBpZiAocmVzKSB7XG4gICAgcmVzdWx0W2pdID0gbmV3IHVuaXQucmVzdWx0KFwiMzQgdGVzdCB2ZWN0b3JzIGNvbXBsZXRlZCBcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIHVuaXQgPSByZXF1aXJlKCcuLi8uLi91bml0LmpzJyk7XG5cbnVuaXQucmVnaXN0ZXIoXCJDQVNULTEyOCBjaXBoZXIgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzIxNDRcIiwgZnVuY3Rpb24oKSB7XG5cdHZhciBvcGVucGdwID0gcmVxdWlyZSgnLi4vLi4vLi4vJyksXG5cdFx0dXRpbCA9IG9wZW5wZ3AudXRpbDtcblxuXHR2YXIgcmVzdWx0ID0gW107XG5cdGZ1bmN0aW9uIHRlc3RfY2FzdChpbnB1dCwga2V5LCBvdXRwdXQpIHtcblx0XHR2YXIgY2FzdDUgPSBuZXcgb3BlbnBncC5jaXBoZXIuY2FzdDUodXRpbC5iaW4yc3RyKGtleSkpO1xuXHRcdHZhciByZXN1bHQgPSB1dGlsLmJpbjJzdHIoY2FzdDUuZW5jcnlwdChpbnB1dCkpO1xuXG5cdFx0cmV0dXJuIHV0aWwuaGV4c3RyZHVtcChyZXN1bHQpID09IHV0aWwuaGV4c3RyZHVtcCh1dGlsLmJpbjJzdHIob3V0cHV0KSk7XG5cdH1cblx0XG5cdHZhciB0ZXN0dmVjdG9ycyA9IFtbWzB4MDEsMHgyMywweDQ1LDB4NjcsMHgxMiwweDM0LDB4NTYsMHg3OCwweDIzLDB4NDUsMHg2NywweDg5LDB4MzQsMHg1NiwweDc4LDB4OUFdLFsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweDIzLDB4OEIsMHg0RiwweEU1LDB4ODQsMHg3RSwweDQ0LDB4QjJdXV07XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0dmVjdG9ycy5sZW5ndGg7IGkrKykge1xuXHRcdHJlc3VsdFtpXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgdmVjdG9yIHdpdGggYmxvY2sgXCIrXG5cdFx0XHRcdHV0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnNbaV1bMF0pK1xuXHRcdFx0XHRcIiBhbmQga2V5IFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnNbaV1bMV0pK1xuXHRcdFx0XHRcIiBzaG91bGQgYmUgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVsyXSksXG5cdFx0XHR0ZXN0X2Nhc3QodGVzdHZlY3RvcnNbaV1bMV0sdGVzdHZlY3RvcnNbaV1bMF0sdGVzdHZlY3RvcnNbaV1bMl0pKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgdW5pdCA9IHJlcXVpcmUoJy4uLy4uL3VuaXQuanMnKTtcblxudW5pdC5yZWdpc3RlcihcIlRyaXBsZURFUyAoRURFKSBjaXBoZXIgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9uaXN0cHVicy84MDAtMjAvODAwLTIwLnBkZlwiLCBmdW5jdGlvbigpIHtcbiAgdmFyIG9wZW5wZ3AgPSByZXF1aXJlKCcuLi8uLi8uLi8nKSxcbiAgICB1dGlsID0gb3BlbnBncC51dGlsO1xuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleSA9IHV0aWwuYmluMnN0cihbMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdKTtcbiAgdmFyIHRlc3R2ZWN0b3JzID0gW1tbMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg5NSwweEY4LDB4QTUsMHhFNSwweERELDB4MzEsMHhEOSwweDAwXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4REQsMHg3RiwweDEyLDB4MUMsMHhBNSwweDAxLDB4NTYsMHgxOV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweDJFLDB4ODYsMHg1MywweDEwLDB4NEYsMHgzOCwweDM0LDB4RUFdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg0QiwweEQzLDB4ODgsMHhGRiwweDZDLDB4RDgsMHgxRCwweDRGXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MjAsMHhCOSwweEU3LDB4NjcsMHhCMiwweEZCLDB4MTQsMHg1Nl1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweDU1LDB4NTcsMHg5MywweDgwLDB4RDcsMHg3MSwweDM4LDB4RUZdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg2QywweEM1LDB4REUsMHhGQSwweEFGLDB4MDQsMHg1MSwweDJGXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MEQsMHg5RiwweDI3LDB4OUIsMHhBNSwweEQ4LDB4NzIsMHg2MF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEQ5LDB4MDMsMHgxQiwweDAyLDB4NzEsMHhCRCwweDVBLDB4MEFdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg0MiwweDQyLDB4NTAsMHhCMywweDdDLDB4M0QsMHhEOSwweDUxXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4QjgsMHgwNiwweDFCLDB4N0UsMHhDRCwweDlBLDB4MjEsMHhFNV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEYxLDB4NUQsMHgwRiwweDI4LDB4NkIsMHg2NSwweEJELDB4MjhdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHhBRCwweEQwLDB4Q0MsMHg4RCwweDZFLDB4NUQsMHhFQiwweEExXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RTYsMHhENSwweEY4LDB4MjcsMHg1MiwweEFELDB4NjMsMHhEMV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEVDLDB4QkYsMHhFMywweEJELDB4M0YsMHg1OSwweDFBLDB4NUVdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHhGMywweDU2LDB4ODMsMHg0MywweDc5LDB4RDEsMHg2NSwweENEXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MkIsMHg5RiwweDk4LDB4MkYsMHgyMCwweDAzLDB4N0YsMHhBOV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweDg4LDB4OUQsMHhFMCwweDY4LDB4QTEsMHg2RiwweDBCLDB4RTZdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHhFMSwweDlFLDB4MjcsMHg1RCwweDg0LDB4NkEsMHgxMiwweDk4XV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MzIsMHg5QSwweDhFLDB4RDUsMHgyMywweEQ3LDB4MUEsMHhFQ11dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEU3LDB4RkMsMHhFMiwweDI1LDB4NTcsMHhEMiwweDNDLDB4OTddXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHgxMiwweEE5LDB4RjUsMHg4MSwweDdGLDB4RjIsMHhENiwweDVEXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4QTQsMHg4NCwweEMzLDB4QUQsMHgzOCwweERDLDB4OUMsMHgxOV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RkIsMHhFMCwweDBBLDB4OEEsMHgxRSwweEY4LDB4QUQsMHg3Ml1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NzUsMHgwRCwweDA3LDB4OTQsMHgwNywweDUyLDB4MTMsMHg2M11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NjQsMHhGRSwweEVELDB4OUMsMHg3MiwweDRDLDB4MkYsMHhBRl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RjAsMHgyQiwweDI2LDB4M0IsMHgzMiwweDhFLDB4MkIsMHg2MF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4OUQsMHg2NCwweDU1LDB4NUEsMHg5QSwweDEwLDB4QjgsMHg1Ml1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RDEsMHgwNiwweEZGLDB4MEIsMHhFRCwweDUyLDB4NTUsMHhEN11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RTEsMHg2NSwweDJDLDB4NkIsMHgxMywweDhDLDB4NjQsMHhBNV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RTQsMHgyOCwweDU4LDB4MTEsMHg4NiwweEVDLDB4OEYsMHg0Nl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4QUUsMHhCNSwweEY1LDB4RUQsMHhFMiwweDJELDB4MUEsMHgzNl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMF0sWzB4RTksMHg0MywweEQ3LDB4NTYsMHg4QSwweEVDLDB4MEMsMHg1Q11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMF0sWzB4REYsMHg5OCwweEM4LDB4MjcsMHg2RiwweDU0LDB4QjAsMHg0Ql1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMF0sWzB4QjEsMHg2MCwweEU0LDB4NjgsMHgwRiwweDZDLDB4NjksMHg2Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMF0sWzB4RkEsMHgwNywweDUyLDB4QjAsMHg3RCwweDlDLDB4NEEsMHhCOF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMF0sWzB4Q0EsMHgzQSwweDJCLDB4MDMsMHg2RCwweEJDLDB4ODUsMHgwMl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMF0sWzB4NUUsMHgwOSwweDA1LDB4NTEsMHg3QiwweEI1LDB4OUIsMHhDRl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMF0sWzB4ODEsMHg0RSwweEVCLDB4M0IsMHg5MSwweEQ5LDB4MDcsMHgyNl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMF0sWzB4NEQsMHg0OSwweERCLDB4MTUsMHgzMiwweDkxLDB4OUMsMHg5Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMF0sWzB4MjUsMHhFQiwweDVGLDB4QzMsMHhGOCwweENGLDB4MDYsMHgyMV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgwMF0sWzB4QUIsMHg2QSwweDIwLDB4QzAsMHg2MiwweDBELDB4MUMsMHg2Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMF0sWzB4NzksMHhFOSwweDBELDB4QkMsMHg5OCwweEY5LDB4MkMsMHhDQV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMF0sWzB4ODYsMHg2RSwweENFLDB4REQsMHg4MCwweDcyLDB4QkIsMHgwRV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMF0sWzB4OEIsMHg1NCwweDUzLDB4NkYsMHgyRiwweDNFLDB4NjQsMHhBOF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMF0sWzB4RUEsMHg1MSwweEQzLDB4OTcsMHg1NSwweDk1LDB4QjgsMHg2Ql1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMF0sWzB4Q0EsMHhGRiwweEM2LDB4QUMsMHg0NSwweDQyLDB4REUsMHgzMV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMF0sWzB4OEQsMHhENCwweDVBLDB4MkQsMHhERiwweDkwLDB4NzksMHg2Q11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMF0sWzB4MTAsMHgyOSwweEQ1LDB4NUUsMHg4OCwweDBFLDB4QzIsMHhEMF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMF0sWzB4NUQsMHg4NiwweENCLDB4MjMsMHg2MywweDlELDB4QkUsMHhBOV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMF0sWzB4MUQsMHgxQywweEE4LDB4NTMsMHhBRSwweDdDLDB4MEMsMHg1Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMF0sWzB4Q0UsMHgzMywweDIzLDB4MjksMHgyNCwweDhGLDB4MzIsMHgyOF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMF0sWzB4ODQsMHgwNSwweEQxLDB4QUIsMHhFMiwweDRGLDB4QjksMHg0Ml1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMF0sWzB4RTYsMHg0MywweEQ3LDB4ODAsMHg5MCwweENBLDB4NDIsMHgwN11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMF0sWzB4NDgsMHgyMiwweDFCLDB4OTksMHgzNywweDc0LDB4OEEsMHgyM11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMF0sWzB4REQsMHg3QywweDBCLDB4QkQsMHg2MSwweEZBLDB4RkQsMHg1NF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MF0sWzB4MkYsMHhCQywweDI5LDB4MUEsMHg1NywweDBELDB4QjUsMHhDNF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MF0sWzB4RTAsMHg3QywweDMwLDB4RDcsMHhFNCwweEUyLDB4NkUsMHgxMl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMF0sWzB4MDksMHg1MywweEUyLDB4MjUsMHg4RSwweDhFLDB4OTAsMHhBMV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMF0sWzB4NUIsMHg3MSwweDFCLDB4QzQsMHhDRSwweEVCLDB4RjIsMHhFRV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOF0sWzB4Q0MsMHgwOCwweDNGLDB4MUUsMHg2RCwweDlFLDB4ODUsMHhGNl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNF0sWzB4RDIsMHhGRCwweDg4LDB4NjcsMHhENSwweDBELDB4MkQsMHhGRV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMl0sWzB4MDYsMHhFNywweEVBLDB4MjIsMHhDRSwweDkyLDB4NzAsMHg4Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMV0sWzB4MTYsMHg2QiwweDQwLDB4QjQsMHg0QSwweEJBLDB4NEIsMHhENl1dXTtcclxuXG4gIHZhciByZXMgPSB0cnVlO1xuICB2YXIgaiA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHZlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzID0gbmV3IG9wZW5wZ3AuY2lwaGVyLmRlcyhrZXkpO1xuXG4gICAgdmFyIGVuY3IgPSB1dGlsLmJpbjJzdHIoZGVzLmVuY3J5cHQodGVzdHZlY3RvcnNbaV1bMF0sIGtleSkpO1xuICAgIHZhciByZXMyID0gZW5jciA9PSB1dGlsLmJpbjJzdHIodGVzdHZlY3RvcnNbaV1bMV0pO1xuXG4gICAgcmVzICY9IHJlczI7XG5cbiAgICBpZiAoIXJlczIpIHtcbiAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCJUZXN0aW5nIHZlY3RvciB3aXRoIGJsb2NrIFwiICtcbiAgICAgICAgdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVswXSkgK1xuICAgICAgICBcIiBhbmQga2V5IFwiICsgdXRpbC5oZXhzdHJkdW1wKGtleSkgK1xuICAgICAgICBcIiBzaG91bGQgYmUgXCIgKyB1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzW2ldWzFdKSArIFwiICE9IFwiICtcbiAgICAgICAgdXRpbC5oZXhpZHVtcChlbmNyKSxcbiAgICAgIGZhbHNlKTtcbiAgICBqKys7XG4gICAgfVxuICB9XG4gIGlmIChyZXMpIHtcbiAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCJBbGwgM0RFUyBFREUgdGVzdCB2ZWN0b3JzIGNvbXBsZXRlZFwiLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cblxudW5pdC5yZWdpc3RlcihcIkRFUyBlbmNyeXB0L2RlY3J5cHQgcGFkZGluZyB0ZXN0c1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuICAgICAgdXRpbCA9IG9wZW5wZ3AudXRpbDtcblxuICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgIHZhciBrZXkgPSB1dGlsLmJpbjJzdHIoWzB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUZdKTtcclxuICAgIHZhciB0ZXN0dmVjdG9ycyA9IG5ldyBBcnJheSgpO1xyXG4gICAgdGVzdHZlY3RvcnNbMF0gPSBbW1sweDAxXSwgWzB4MjQsIDB4QzcsIDB4NEEsIDB4OUEsIDB4NzksIDB4NzUsIDB4NEIsIDB4QzddXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDIsIDB4MDNdLCBbMHhBNywgMHg3QSwgMHg5QSwgMHg1OSwgMHg4QSwgMHg4NiwgMHg4NSwgMHhDNV1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwMywgMHgwNCwgMHgwNV0sIFsweDAxLCAweENGLCAweEVCLCAweDZBLCAweDc0LCAweDYwLCAweEY1LCAweDAyXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA0LCAweDA1LCAweDA2LCAweDA3XSwgWzB4QTgsIDB4RjAsIDB4M0QsIDB4NTksIDB4QkEsIDB4NkIsIDB4MEUsIDB4NzZdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDldLCBbMHg4NiwgMHg0MCwgMHgzMywgMHg2MSwgMHgzRiwgMHg1NSwgMHg3MywgMHg0OV1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQl0sIFsweDEzLCAweDIxLCAweDNFLCAweDBFLCAweENFLCAweDJDLCAweDk0LCAweDAxXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBEXSwgWzB4MzAsIDB4NDksIDB4OTcsIDB4QzEsIDB4REEsIDB4RDUsIDB4NTksIDB4QTVdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEZdLCBbMHg4MywgMHgyNSwgMHg3OSwgMHgwNiwgMHg1NCwgMHhBNCwgMHg0NCwgMHhEOV1dXTtcclxuICAgIHRlc3R2ZWN0b3JzWzFdID0gW1tbMHgwMV0sIFsweEYyLCAweEFCLCAweDFDLCAweDlFLCAweDcwLCAweDdELCAweENDLCAweDkyXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDAyLCAweDAzXSwgWzB4NkIsIDB4NEMsIDB4NjcsIDB4MjQsIDB4OUYsIDB4QjcsIDB4NEQsIDB4QUNdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDMsIDB4MDQsIDB4MDVdLCBbMHg2OCwgMHg5NSwgMHhBQiwgMHhBOCwgMHhFQSwgMHg1MywgMHgxMywgMHgyM11dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNCwgMHgwNSwgMHgwNiwgMHgwN10sIFsweEM4LCAweERFLCAweDYwLCAweDhGLCAweEY2LCAweDA5LCAweDkwLCAweEI1XV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5XSwgWzB4MTksIDB4MTMsIDB4NTAsIDB4MjAsIDB4NzAsIDB4NDAsIDB4MkUsIDB4MDldXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEJdLCBbMHhBOCwgMHgyMywgMHg0MCwgMHhDNiwgMHgxNywgMHhBNiwgMHgzMSwgMHg0QV1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRF0sIFsweDM2LCAweDYyLCAweEYyLCAweDk5LCAweDY4LCAweEQ0LCAweEJGLCAweDdDXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGXSwgWzB4ODMsIDB4MjUsIDB4NzksIDB4MDYsIDB4NTQsIDB4QTQsIDB4NDQsIDB4RDksIDB4MDgsIDB4NkYsIDB4OUEsIDB4MUQsIDB4NzQsIDB4QzksIDB4NEQsIDB4NEVdXV07XHJcbiAgICB0ZXN0dmVjdG9yc1syXSA9IFtbWzB4MDFdLCBbMHg4MywgMHg2OCwgMHhFNCwgMHg5QywgMHg4NCwgMHhDQywgMHhDQiwgMHhGMF1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwMiwgMHgwM10sIFsweEJCLCAweEE4LCAweDBCLCAweDY2LCAweDFCLCAweDYyLCAweEM0LCAweEM4XV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDAzLCAweDA0LCAweDA1XSwgWzB4OUEsIDB4RDcsIDB4NUEsIDB4MjQsIDB4RkQsIDB4M0YsIDB4QkYsIDB4MjJdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDQsIDB4MDUsIDB4MDYsIDB4MDddLCBbMHgxNCwgMHg0RSwgMHg2OCwgMHg2RCwgMHgyRSwgMHhDMSwgMHhCNywgMHg1Ml1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOV0sIFsweDEyLCAweDBBLCAweDUxLCAweDA4LCAweEY5LCAweEEzLCAweDAzLCAweDc0XV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCXSwgWzB4QjIsIDB4MDcsIDB4RDEsIDB4MDUsIDB4RjYsIDB4NjcsIDB4QUYsIDB4QkFdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MERdLCBbMHhDQSwgMHg1OSwgMHg2MSwgMHgzQSwgMHg4MywgMHgyMywgMHgyNiwgMHhERF1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRl0sIFsweDgzLCAweDI1LCAweDc5LCAweDA2LCAweDU0LCAweEE0LCAweDQ0LCAweEQ5XV1dO1xyXG5cclxuICAgIHZhciBkZXMgPSBuZXcgb3BlbnBncC5jaXBoZXIub3JpZ2luYWxEZXMoa2V5KTtcclxuXHJcbiAgICB2YXIgcmVzID0gdHJ1ZTtcclxuICAgIHZhciBqID0gMDtcclxuXHJcbiAgICBmb3IgKHZhciBwYWRkaW5nID0gMDsgcGFkZGluZyA8IDM7IHBhZGRpbmcrKykge1xyXG4gICAgICAgIHZhciB0aGlzVmVjdG9yU2V0ID0gdGVzdHZlY3RvcnNbcGFkZGluZ107XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpc1ZlY3RvclNldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jcnlwdGVkID0gZGVzLmVuY3J5cHQodGhpc1ZlY3RvclNldFtpXVswXSwgcGFkZGluZyk7XHJcbiAgICAgICAgICAgIHZhciBkZWNyeXB0ZWQgPSBkZXMuZGVjcnlwdChlbmNyeXB0ZWQsIHBhZGRpbmcpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlczIgPSAodXRpbC5iaW4yc3RyKGVuY3J5cHRlZCkgPT0gdXRpbC5iaW4yc3RyKHRoaXNWZWN0b3JTZXRbaV1bMV0pKTtcclxuICAgICAgICAgICAgdmFyIHJlczMgPSAodXRpbC5iaW4yc3RyKGRlY3J5cHRlZCkgPT0gdXRpbC5iaW4yc3RyKHRoaXNWZWN0b3JTZXRbaV1bMF0pKTtcclxuICAgICAgICAgICAgcmVzICY9IHJlczI7XHJcbiAgICAgICAgICAgIHJlcyAmPSByZXMzO1xyXG4gICAgICAgICAgICBpZiAoIXJlczIgfHwgIXJlczMpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcclxuICAgICAgICAgICAgICAgICAgICBcIlRlc3RpbmcgdmVjdG9yIHdpdGggYmxvY2sgW1wiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5oZXhpZHVtcCh0aGlzVmVjdG9yU2V0W2ldWzBdKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXSBhbmQga2V5IFtcIiArIHV0aWwuaGV4c3RyZHVtcChrZXkpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJdIGFuZCBwYWRkaW5nIFtcIiArIHBhZGRpbmcgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIl0gc2hvdWxkIGJlIFwiICsgdXRpbC5oZXhpZHVtcCh0aGlzVmVjdG9yU2V0W2ldWzFdKSArIFwiIC0gQWN0dWFsbHkgW0VOQzpcIiArIHV0aWwuaGV4aWR1bXAoZW5jcnlwdGVkKSArIFwiLCBERUM6XCIgKyB1dGlsLmhleGlkdW1wKGRlY3J5cHRlZCkgKyBcIl1cIixcclxuICAgICAgICAgICAgICAgICAgICBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBqKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgcmVzdWx0W2pdID0gbmV3IHVuaXQucmVzdWx0KFwiQWxsIERFUyB0ZXN0IHZlY3RvcnMgY29tcGxldGVkXCIsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufSk7XHJcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiVHdvZmlzaCB0ZXN0IHdpdGggdGVzdCB2ZWN0b3JzIGZyb20gaHR0cDovL3d3dy5zY2huZWllci5jb20vY29kZS9lY2JfaXZhbC50eHRcIiwgZnVuY3Rpb24oKSB7XG4gIHZhciBvcGVucGdwID0gcmVxdWlyZSgnLi4vLi4vLi4vJyksXG4gICAgdXRpbCA9IG9wZW5wZ3AudXRpbDtcblxuICBmdW5jdGlvbiBURmVuY3J5cHQoYmxvY2ssIGtleSkge1xuICAgIHZhciB0ZiA9IG5ldyBvcGVucGdwLmNpcGhlci50d29maXNoKGtleSk7XG5cbiAgICByZXR1cm4gdGYuZW5jcnlwdChibG9jayk7XG4gIH1cblxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN0YXJ0ID0gWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF07XG4gIHZhciBzdGFydF9zaG9ydCA9IFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTtcbiAgdmFyIHRlc3R2ZWN0b3JzID0gW1sweDU3LDB4RkYsMHg3MywweDlELDB4NEQsMHhDOSwweDJDLDB4MUIsMHhENywweEZDLDB4MDEsMHg3MCwweDBDLDB4QzgsMHgyMSwweDZGXSxcbiAgICAgICAgICAgIFsweEQ0LDB4M0IsMHhCNywweDU1LDB4NkUsMHhBMywweDJFLDB4NDYsMHhGMiwweEEyLDB4ODIsMHhCNywweEQ0LDB4NUIsMHg0RSwweDBEXSxcbiAgICAgICAgICAgIFsweDkwLDB4QUYsMHhFOSwweDFCLDB4QjIsMHg4OCwweDU0LDB4NEYsMHgyQywweDMyLDB4REMsMHgyMywweDlCLDB4MjYsMHgzNSwweEU2XSxcbiAgICAgICAgICAgIFsweDZDLDB4QjQsMHg1NiwweDFDLDB4NDAsMHhCRiwweDBBLDB4OTcsMHgwNSwweDkzLDB4MUMsMHhCNiwweEQ0LDB4MDgsMHhFNywweEZBXSxcbiAgICAgICAgICAgIFsweDMwLDB4NTksMHhENiwweEQ2LDB4MTcsMHg1MywweEI5LDB4NTgsMHhEOSwweDJGLDB4NDcsMHg4MSwweEM4LDB4NjQsMHgwRSwweDU4XSxcbiAgICAgICAgICAgIFsweEU2LDB4OTQsMHg2NSwweDc3LDB4MDUsMHgwNSwweEQ3LDB4RjgsMHgwRSwweEY2LDB4OEMsMHhBMywweDhBLDB4QjMsMHhBMywweEQ2XSxcbiAgICAgICAgICAgIFsweDVBLDB4QjYsMHg3QSwweDVGLDB4ODUsMHgzOSwweEE0LDB4QTUsMHhGRCwweDlGLDB4MDMsMHg3MywweEJBLDB4NDYsMHgzNCwweDY2XSxcbiAgICAgICAgICAgIFsweERDLDB4MDksMHg2QiwweENELDB4OTksMHhGQywweDcyLDB4RjcsMHg5OSwweDM2LDB4RDQsMHhDNywweDQ4LDB4RTcsMHg1QSwweEY3XSxcbiAgICAgICAgICAgIFsweEM1LDB4QTMsMHhFNywweENFLDB4RTAsMHhGMSwweEI3LDB4MjYsMHgwNSwweDI4LDB4QTYsMHg4RiwweEI0LDB4RUEsMHgwNSwweEYyXSxcbiAgICAgICAgICAgIFsweDQzLDB4RDUsMHhDRSwweEMzLDB4MjcsMHhCMiwweDRBLDB4QjksMHgwQSwweEQzLDB4NEEsMHg3OSwweEQwLDB4NDYsMHg5MSwweDUxXV07XG4gIHRlc3R2ZWN0b3JzWzQ3XSA9ICBbMHg0MywweDEwLDB4NTgsMHhGNCwweERCLDB4QzcsMHhGNywweDM0LDB4REEsMHg0RiwweDAyLDB4RjAsMHg0QywweEM0LDB4RjQsMHg1OV07XG4gIHRlc3R2ZWN0b3JzWzQ4XSA9ICBbMHgzNywweEZFLDB4MjYsMHhGRiwweDFDLDB4RjYsMHg2MSwweDc1LDB4RjUsMHhERCwweEY0LDB4QzMsMHgzQiwweDk3LDB4QTIsMHgwNV07XG4gIHZhciByZXMgPSB0cnVlO1xuICB2YXIgaiA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDk7IGkrKykge1xuICAgIHZhciByZXMyID0gZmFsc2U7XG4gICAgdmFyIGJsaywga2V5LCBjdDtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgYmxrID0gc3RhcnRfc2hvcnQ7XG4gICAgICBrZXkgPSB1dGlsLmJpbjJzdHIoc3RhcnQpO1xuICAgICAgY3QgPSB0ZXN0dmVjdG9yc1swXTtcbiAgICAgIHJlczIgPSAodXRpbC5iaW4yc3RyKFRGZW5jcnlwdChibGssa2V5KSkgPT0gdXRpbC5iaW4yc3RyKGN0KSk7XG4gICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICBibGsgPSB0ZXN0dmVjdG9yc1swXTtcbiAgICAgIGtleSA9IHV0aWwuYmluMnN0cihzdGFydCk7XG4gICAgICBjdCA9IHRlc3R2ZWN0b3JzWzFdO1xuICAgICAgcmVzMiA9ICh1dGlsLmJpbjJzdHIoVEZlbmNyeXB0KGJsayxrZXkpKSA9PSB1dGlsLmJpbjJzdHIoY3QpKTtcbiAgICB9IGVsc2UgaWYgKGkgPT09IDIpIHtcbiAgICAgIGJsayA9IHRlc3R2ZWN0b3JzW2ktMV07XG4gICAgICBrZXkgPSB1dGlsLmJpbjJzdHIodGVzdHZlY3RvcnNbaS0yXS5jb25jYXQoc3RhcnRfc2hvcnQpKTtcbiAgICAgIGN0ID0gdGVzdHZlY3RvcnNbaV07XG4gICAgICByZXMyID0gKHV0aWwuYmluMnN0cihURmVuY3J5cHQoYmxrLGtleSkpID09IHV0aWwuYmluMnN0cihjdCkpO1xuICAgIH0gZWxzZSBpZiAoaSA8IDEwIHx8IGkgPiA0Nikge1xuICAgICAgYmxrID0gdGVzdHZlY3RvcnNbaS0xXTtcbiAgICAgIGtleSA9IHV0aWwuYmluMnN0cih0ZXN0dmVjdG9yc1tpLTJdLmNvbmNhdCh0ZXN0dmVjdG9yc1tpLTNdKSk7XG4gICAgICBjdCA9IHRlc3R2ZWN0b3JzW2ldO1xuICAgICAgcmVzMiA9ICh1dGlsLmJpbjJzdHIoVEZlbmNyeXB0KGJsayxrZXkpKSA9PSB1dGlsLmJpbjJzdHIoY3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVzdHZlY3RvcnNbaV0gPSBURmVuY3J5cHQodGVzdHZlY3RvcnNbaS0xXSx1dGlsLmJpbjJzdHIodGVzdHZlY3RvcnNbaS0yXS5jb25jYXQodGVzdHZlY3RvcnNbaS0zXSkpKTtcbiAgICAgIHJlczIgPSB0cnVlO1xuICAgIH1cbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgdmVjdG9yIHdpdGggYmxvY2sgXCIrdXRpbC5oZXhpZHVtcChibGspK1wiIHdpdGgga2V5IFwiKyB1dGlsLmhleHN0cmR1bXAoa2V5KSArXCIgc2hvdWxkIGJlIFwiK3V0aWwuaGV4aWR1bXAoY3QpK1wiIGJ1dCBpcyBcIit1dGlsLmhleGlkdW1wKFRGZW5jcnlwdChibGssa2V5KSksIGZhbHNlKTtcbiAgICAgIGorKztcbiAgICB9XG4gIH1cbiAgaWYgKHJlcykge1xuICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIjQ5IHRlc3QgdmVjdG9ycyBjb21wbGV0ZWRcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIHVuaXQgPSByZXF1aXJlKCcuLi8uLi91bml0LmpzJyk7XG5cbnVuaXQucmVnaXN0ZXIoXCJNRDUgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIFJGQyAxMzIxXCIsIGZ1bmN0aW9uKCkge1xuXHR2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuXHRcdHV0aWwgPSBvcGVucGdwLnV0aWwsXG5cdFx0TUQ1ID0gb3BlbnBncC5oYXNoLm1kNTtcblxuXHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG5cdHJlc3VsdFswXSA9IG5ldyB1bml0LnJlc3VsdChcIk1ENSAoXFxcIlxcXCIpID0gZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2VcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChNRDUoXCJcIikpID09IFwiZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2VcIik7XG5cdHJlc3VsdFsxXSA9IG5ldyB1bml0LnJlc3VsdChcIk1ENSAoXFxcImFcXFwiKSA9IDBjYzE3NWI5YzBmMWI2YTgzMWMzOTllMjY5NzcyNjYxXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoTUQ1IChcImFiY1wiKSkgPT0gXCI5MDAxNTA5ODNjZDI0ZmIwZDY5NjNmN2QyOGUxN2Y3MlwiKTtcblx0cmVzdWx0WzJdID0gbmV3IHVuaXQucmVzdWx0KFwiTUQ1IChcXFwibWVzc2FnZSBkaWdlc3RcXFwiKSA9IGY5NmI2OTdkN2NiNzkzOGQ1MjVhMmYzMWFhZjE2MWQwXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoTUQ1IChcIm1lc3NhZ2UgZGlnZXN0XCIpKSA9PSBcImY5NmI2OTdkN2NiNzkzOGQ1MjVhMmYzMWFhZjE2MWQwXCIpO1xuXHRyZXN1bHRbM10gPSBuZXcgdW5pdC5yZXN1bHQoXCJNRDUgKFxcXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxcXCIpID0gYzNmY2QzZDc2MTkyZTQwMDdkZmI0OTZjY2E2N2UxM2JcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChNRDUgKFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIikpID09IFwiYzNmY2QzZDc2MTkyZTQwMDdkZmI0OTZjY2E2N2UxM2JcIik7XG5cdHJlc3VsdFs0XSA9IG5ldyB1bml0LnJlc3VsdChcIk1ENSAoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XFxcIikgPSBkMTc0YWI5OGQyNzdkOWY1YTU2MTFjMmM5ZjQxOWQ5ZlwiLFxuXHRcdFx0dXRpbC5oZXhzdHJkdW1wKE1ENSAoXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiKSkgPT0gXCJkMTc0YWI5OGQyNzdkOWY1YTU2MTFjMmM5ZjQxOWQ5ZlwiKTtcblx0cmVzdWx0WzVdID0gbmV3IHVuaXQucmVzdWx0KFwiTUQ1IChcXFwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBcXFwiKSA9IDU3ZWRmNGEyMmJlM2M5NTVhYzQ5ZGEyZTIxMDdiNjdhXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoTUQ1IChcIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIpKSA9PSBcIjU3ZWRmNGEyMmJlM2M5NTVhYzQ5ZGEyZTIxMDdiNjdhXCIpO1xuXHRyZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgdW5pdCA9IHJlcXVpcmUoJy4uLy4uL3VuaXQuanMnKTtcblxudW5pdC5yZWdpc3RlcihcIlJJUEUtTUQgMTYwIGJpdHMgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIGh0dHA6Ly9ob21lcy5lc2F0Lmt1bGV1dmVuLmJlL35ib3NzZWxhZS9yaXBlbWQxNjAuaHRtbFwiLCBmdW5jdGlvbigpIHtcblxuXHR2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuXHRcdHV0aWwgPSBvcGVucGdwLnV0aWwsXG5cdFx0Uk1Ec3RyaW5nID0gb3BlbnBncC5oYXNoLnJpcGVtZDtcblxuXHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG5cdHJlc3VsdFswXSA9IG5ldyB1bml0LnJlc3VsdChcIlJNRHN0cmluZyAoXFxcIlxcXCIpID0gOWMxMTg1YTVjNWU5ZmM1NDYxMjgwODk3N2VlOGY1NDhiMjI1OGQzMVwiLFxuXHRcdFx0dXRpbC5oZXhzdHJkdW1wKFJNRHN0cmluZyhcIlwiKSkgPT0gXCI5YzExODVhNWM1ZTlmYzU0NjEyODA4OTc3ZWU4ZjU0OGIyMjU4ZDMxXCIpO1xuXHRyZXN1bHRbMV0gPSBuZXcgdW5pdC5yZXN1bHQoXCJSTURzdHJpbmcgKFxcXCJhXFxcIikgPSAwYmRjOWQyZDI1NmIzZWU5ZGFhZTM0N2JlNmY0ZGM4MzVhNDY3ZmZlXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoUk1Ec3RyaW5nKFwiYVwiKSkgPT0gXCIwYmRjOWQyZDI1NmIzZWU5ZGFhZTM0N2JlNmY0ZGM4MzVhNDY3ZmZlXCIpO1xuXHRyZXN1bHRbMl0gPSBuZXcgdW5pdC5yZXN1bHQoXCJSTURzdHJpbmcgKFxcXCJhYmNcXFwiKSA9IDhlYjIwOGY3ZTA1ZDk4N2E5YjA0NGE4ZTk4YzZiMDg3ZjE1YTBiZmNcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChSTURzdHJpbmcoXCJhYmNcIikpID09IFwiOGViMjA4ZjdlMDVkOTg3YTliMDQ0YThlOThjNmIwODdmMTVhMGJmY1wiKTtcblx0cmVzdWx0WzNdID0gbmV3IHVuaXQucmVzdWx0KFwiUk1Ec3RyaW5nIChcXFwibWVzc2FnZSBkaWdlc3RcXFwiKSA9IDVkMDY4OWVmNDlkMmZhZTU3MmI4ODFiMTIzYTg1ZmZhMjE1OTVmMzZcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChSTURzdHJpbmcoXCJtZXNzYWdlIGRpZ2VzdFwiKSkgPT0gXCI1ZDA2ODllZjQ5ZDJmYWU1NzJiODgxYjEyM2E4NWZmYTIxNTk1ZjM2XCIpO1xuXHRyZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgdW5pdCA9IHJlcXVpcmUoJy4uLy4uL3VuaXQuanMnKTtcblxuXG51bml0LnJlZ2lzdGVyKFwiU0hBKiB0ZXN0IHdpdGggdGVzdCB2ZWN0b3JzIGZyb20gTklTVCBGSVBTIDE4MC0yXCIsIGZ1bmN0aW9uKCkge1xuXHR2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuXHRcdHV0aWwgPSBvcGVucGdwLnV0aWwsXG5cdFx0aGFzaCA9IG9wZW5wZ3AuaGFzaDtcblxuXHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG5cdFxuXHRyZXN1bHRbMF0gPSBuZXcgdW5pdC5yZXN1bHQoXCJTSEExIC0gYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCA9IGhhc2guc2hhMShcXFwiYWJjXFxcIikgXCIsXG5cdFx0XHRcImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWRcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGExKFwiYWJjXCIpKSk7XG5cdHJlc3VsdFsxXSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTEgLSA4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxID0gaGFzaC5zaGExKFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCI4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxXCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhMShcImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxXCIpKSk7XG5cdHJlc3VsdFsyXSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTIyNCAtIDIzMDk3ZDIyMzQwNWQ4MjI4NjQyYTQ3N2JkYTI1NWIzMmFhZGJjZTRiZGEwYjNmN2UzNmM5ZGE3ID0gaGFzaC5zaGEyMjQoXFxcImFiY1xcXCIpIFwiLFxuXHRcdFx0XCIyMzA5N2QyMjM0MDVkODIyODY0MmE0NzdiZGEyNTViMzJhYWRiY2U0YmRhMGIzZjdlMzZjOWRhN1wiID09IHV0aWwuaGV4c3RyZHVtcChoYXNoLnNoYTIyNChcImFiY1wiKSkpO1xuXHRyZXN1bHRbM10gPSBuZXcgdW5pdC5yZXN1bHQoXCJTSEEyMjQgLSA3NTM4OGIxNjUxMjc3NmNjNWRiYTVkYTFmZDg5MDE1MGIwYzY0NTVjYjRmNThiMTk1MjUyMjUyNSA9IGhhc2guc2hhMjI0KFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCI3NTM4OGIxNjUxMjc3NmNjNWRiYTVkYTFmZDg5MDE1MGIwYzY0NTVjYjRmNThiMTk1MjUyMjUyNVwiID09IHV0aWwuaGV4c3RyZHVtcChoYXNoLnNoYTIyNChcImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxXCIpKSk7XG5cdHJlc3VsdFs0XSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTI1NiAtIGJhNzgxNmJmOGYwMWNmZWE0MTQxNDBkZTVkYWUyMjIzYjAwMzYxYTM5NjE3N2E5Y2I0MTBmZjYxZjIwMDE1YWQgPSBoYXNoLnNoYTI1NihcXFwiYWJjXFxcIikgXCIsXG5cdFx0XHRcImJhNzgxNmJmOGYwMWNmZWE0MTQxNDBkZTVkYWUyMjIzYjAwMzYxYTM5NjE3N2E5Y2I0MTBmZjYxZjIwMDE1YWRcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGEyNTYoXCJhYmNcIikpKTtcblx0cmVzdWx0WzVdID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBMjU2IC0gMjQ4ZDZhNjFkMjA2MzhiOGU1YzAyNjkzMGMzZTYwMzlhMzNjZTQ1OTY0ZmYyMTY3ZjZlY2VkZDQxOWRiMDZjMSA9IGhhc2guc2hhMjU2KFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCIyNDhkNmE2MWQyMDYzOGI4ZTVjMDI2OTMwYzNlNjAzOWEzM2NlNDU5NjRmZjIxNjdmNmVjZWRkNDE5ZGIwNmMxXCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhMjU2KFwiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHFcIikpKTtcblx0cmVzdWx0WzZdID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBMzg0IC0gY2IwMDc1M2Y0NWEzNWU4YmI1YTAzZDY5OWFjNjUwMDcyNzJjMzJhYjBlZGVkMTYzMWE4YjYwNWE0M2ZmNWJlZDgwODYwNzJiYTFlN2NjMjM1OGJhZWNhMTM0YzgyNWE3ID0gaGFzaC5zaGEzODQoXFxcImFiY1xcXCIpIFwiLFxuXHRcdFx0XCJjYjAwNzUzZjQ1YTM1ZThiYjVhMDNkNjk5YWM2NTAwNzI3MmMzMmFiMGVkZWQxNjMxYThiNjA1YTQzZmY1YmVkODA4NjA3MmJhMWU3Y2MyMzU4YmFlY2ExMzRjODI1YTdcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGEzODQoXCJhYmNcIikpKTtcblx0cmVzdWx0WzddID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBMzg0IC0gMzM5MWZkZGRmYzhkYzczOTM3MDdhNjViMWI0NzA5Mzk3Y2Y4YjFkMTYyYWYwNWFiZmU4ZjQ1MGRlNWYzNmJjNmIwNDU1YTg1MjBiYzRlNmY1ZmU5NWIxZmUzYzg0NTJiID0gc3RyMzg0KFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCIzMzkxZmRkZGZjOGRjNzM5MzcwN2E2NWIxYjQ3MDkzOTdjZjhiMWQxNjJhZjA1YWJmZThmNDUwZGU1ZjM2YmM2YjA0NTVhODUyMGJjNGU2ZjVmZTk1YjFmZTNjODQ1MmJcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGEzODQoXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVwiKSkpO1x0XHRcdFx0XHRcblx0cmVzdWx0WzhdID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBNTEyIC0gZGRhZjM1YTE5MzYxN2FiYWNjNDE3MzQ5YWUyMDQxMzExMmU2ZmE0ZTg5YTk3ZWEyMGE5ZWVlZTY0YjU1ZDM5YTIxOTI5OTJhMjc0ZmMxYTgzNmJhM2MyM2EzZmVlYmJkNDU0ZDQ0MjM2NDNjZTgwZTJhOWFjOTRmYTU0Y2E0OWYgPSBoYXNoLnNoYTUxMihcXFwiYWJjXFxcIikgXCIsXG5cdFx0XHRcImRkYWYzNWExOTM2MTdhYmFjYzQxNzM0OWFlMjA0MTMxMTJlNmZhNGU4OWE5N2VhMjBhOWVlZWU2NGI1NWQzOWEyMTkyOTkyYTI3NGZjMWE4MzZiYTNjMjNhM2ZlZWJiZDQ1NGQ0NDIzNjQzY2U4MGUyYTlhYzk0ZmE1NGNhNDlmXCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhNTEyKFwiYWJjXCIpKSk7XG5cdHJlc3VsdFs5XSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTUxMiAtIDIwNGE4ZmM2ZGRhODJmMGEwY2VkN2JlYjhlMDhhNDE2NTdjMTZlZjQ2OGIyMjhhODI3OWJlMzMxYTcwM2MzMzU5NmZkMTVjMTNiMWIwN2Y5YWExZDNiZWE1Nzc4OWNhMDMxYWQ4NWM3YTcxZGQ3MDM1NGVjNjMxMjM4Y2EzNDQ1ID0gaGFzaC5zaGE1MTIoXFxcImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxXFxcIikgXCIsXG5cdFx0XHRcIjIwNGE4ZmM2ZGRhODJmMGEwY2VkN2JlYjhlMDhhNDE2NTdjMTZlZjQ2OGIyMjhhODI3OWJlMzMxYTcwM2MzMzU5NmZkMTVjMTNiMWIwN2Y5YWExZDNiZWE1Nzc4OWNhMDMxYWQ4NWM3YTcxZGQ3MDM1NGVjNjMxMjM4Y2EzNDQ1XCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhNTEyKFwiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHFcIikpKTtcdFx0XHRcdFx0XG5cdHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiRnVuY3Rpb25hbCB0ZXN0aW5nIG9mIG9wZW5wZ3AuY3J5cHRvLiogbWV0aG9kc1wiLCBmdW5jdGlvbigpIHtcblx0dmFyIG9wZW5wZ3AgPSByZXF1aXJlKCcuLi8uLi8nKTtcbiAgdmFyIHV0aWwgPSBvcGVucGdwLnV0aWw7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIFJTQXB1Yk1QSXN0cnMgPSBbXG4gICAgICAgICAgICAgIHV0aWwuYmluMnN0cihbMHgwOCwweDAwLDB4YWMsMHgxNSwweGIzLDB4ZDYsMHhkMiwweDBmLDB4ZjAsMHg3YSwweGRkLDB4MjEsMHhiNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJmLDB4NjEsMHhmYSwweGNhLDB4OTMsMHg4NiwweGM4LDB4NTUsMHg1YSwweDRiLDB4YTYsMHhhNCwweDFhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAsMHhhMiwweDNhLDB4MzcsMHgwNiwweDA4LDB4ZDgsMHgxNSwweDhlLDB4ODUsMHg0NSwweGFhLDB4YjcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZCwweDdiLDB4MGIsMHg3MywweDk0LDB4NTUsMHgwYywweDVjLDB4ZWMsMHhjMCwweDIyLDB4NGIsMHhhMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY0LDB4MjAsMHg3ZCwweDRkLDB4YTgsMHg5NiwweDFhLDB4NjQsMHgzOCwweDkzLDB4Y2QsMHhlYywweDczLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWQsMHhmOSwweDg5LDB4ODgsMHgyNCwweDNkLDB4NDgsMHhmZiwweDNiLDB4ODcsMHg2MiwweGQwLDB4ODQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhlYSwweGZmLDB4MzksMHhiNSwweDI3LDB4NzAsMHhlYSwweDRhLDB4YjIsMHgyZSwweDlkLDB4ZjEsMHg3YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIzLDB4ZWMsMHhmNCwweDVlLDB4ZWEsMHg2MSwweDNkLDB4ZTUsMHhkOCwweDBkLDB4ZjksMHg1OSwweDZkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgsMHgwMCwweGViLDB4Y2IsMHhjOSwweDU1LDB4MDAsMHg3MiwweDMwLDB4MWYsMHg2NSwweDlkLDB4ZDYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNywweDU4LDB4NWYsMHhhNiwweDRhLDB4YTAsMHhkZCwweGUxLDB4NzYsMHhmMiwweGVmLDB4MjEsMHg5ZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0LDB4ZmMsMHhhYSwweDViLDB4NTIsMHg2ZSwweGMxLDB4YTIsMHhiOSwweGJkLDB4YjksMHhmNCwweDllLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDksMHg5MiwweGYyLDB4YWYsMHg1NywweDg2LDB4ZjIsMHhlZiwweDcwLDB4YmYsMHg1MSwweDQwLDB4ZmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiZiwweDU2LDB4NTEsMHhlOCwweDJjLDB4YTIsMHg0ZiwweGY4LDB4YTQsMHhkNywweDM2LDB4MTgsMHg4NSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlLDB4MDksMHgwZCwweGJjLDB4OGQsMHg2NSwweDVlLDB4OGEsMHgxZCwweDk4LDB4YjAsMHg0ZCwweDlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzEsMHhjZiwweDgyLDB4ZTEsMHhiNywweDQzLDB4NWQsMHg1YSwweDcyLDB4Y2QsMHg1NSwweGQyLDB4ZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMSwweGI0LDB4NzgsMHhiZiwweGExLDB4N2QsMHhhYywweGQ5LDB4MWIsMHhjNCwweGZhLDB4MzksMHgzNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkyLDB4MDksMHhmOSwweDA4LDB4MmEsMHg2YiwweDlkLDB4MTQsMHg1NiwweDEyLDB4NGMsMHhlOSwweGE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjksMHhjMSwweGYzLDB4YTksMHgwYiwweGZjLDB4MzEsMHg3NSwweDU4LDB4NzQsMHgyYSwweDg4LDB4YWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhlZSwweGM5LDB4YTQsMHhjZCwweDE1LDB4ZGMsMHgxYiwweDhkLDB4NjQsMHhjMSwweDM2LDB4MTcsMHhjNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhkLDB4NWUsMHg5OSwweDdhLDB4NWIsMHg5ZiwweDM5LDB4ZDAsMHgwMCwweDZlLDB4ZjldKSxcbiAgICAgICAgICAgICAgdXRpbC5iaW4yc3RyKFsweDAwLDB4MTEsMHgwMSwweDAwLDB4MDFdKV07XG4gIHZhciBSU0FzZWNNUElzdHJzID0gW1xuICAgICAgICAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDcsMHhmZSwweDIzLDB4ZmYsMHhjZSwweDQ1LDB4NmMsMHg2MCwweDY1LDB4NDAsMHg2ZSwweGFlLDB4MzUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwweDU2LDB4NjAsMHhlZSwweGFiLDB4ZmEsMHgxMCwweDQyLDB4YmEsMHhjNywweDA0LDB4YWYsMHg2MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNkLDB4M2YsMHg2MiwweGNhLDB4NGIsMHhmYSwweGUxLDB4YTksMHg3MCwweGNkLDB4MzQsMHg4YiwweGM4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGUsMHhlNCwweGM0LDB4YmEsMHg4MywweDE3LDB4NWYsMHhhNCwweGI4LDB4ZWEsMHg2MCwweGMyLDB4NGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YSwweGYyLDB4YTksMHgwMywweGViLDB4ZjYsMHhhYSwweGMyLDB4YjgsMHg4YiwweDQzLDB4MTIsMHhlOSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGY3LDB4ODgsMHhkMiwweDVhLDB4YTYsMHhhYSwweDIzLDB4NzEsMHgzMSwweDc0LDB4ZGIsMHgxOSwweDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUsMHg0MSwweDFiLDB4NDMsMHg2OCwweDYyLDB4ZDgsMHhjMCwweDkzLDB4OTEsMHhlOCwweGZjLDB4YjEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhOSwweDlhLDB4NTIsMHg2YywweGUwLDB4YmYsMHg0MywweDAxLDB4YTgsMHgzNywweDE0LDB4MjgsMHhiZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBiLDB4MTUsMHg1NiwweDNlLDB4YTUsMHg3OSwweGEwLDB4YzQsMHg0MiwweDg4LDB4ZWUsMHhlYiwweDFiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjQsMHg3YSwweDRhLDB4NTgsMHgzMSwweDU4LDB4ODEsMHhkMiwweDNlLDB4ZGUsMHgwNywweDY0LDB4OTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMCwweDYwLDB4ZDMsMHg5YSwweDI5LDB4Y2EsMHhjNiwweDY3LDB4NzUsMHgwNywweGNhLDB4OTIsMHgzOSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU2LDB4ZjYsMHgxMSwweDg0LDB4YmEsMHg2ZCwweDRiLDB4ZTYsMHg2ZiwweDY2LDB4YzIsMHgxNywweGViLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDYsMHg2OSwweDFjLDB4YmIsMHhkZiwweGMwLDB4MzgsMHgwMCwweGQ2LDB4MDEsMHhlNiwweDcwLDB4OWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YiwweDliLDB4NzAsMHhlZCwweDVjLDB4YjgsMHhjZiwweGU4LDB4NjgsMHg3MSwweGJlLDB4MjQsMHg2ZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIxLDB4YTMsMHgxMywweGNjLDB4ZjEsMHhiYywweDY3LDB4ZGMsMHhlMCwweDY5LDB4MDksMHg4MiwweDNjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2IsMHgwZiwweDE0LDB4OTgsMHg0OCwweDMwLDB4YjIsMHg3MCwweGM2LDB4OWUsMHhmYSwweDQ2LDB4OGYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMSwweGMwLDB4NjUsMHg4ZSwweGM2LDB4YWUsMHhkYywweDQ3LDB4OTEsMHgxMywweDFlLDB4ZDYsMHg0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYyLDB4YWQsMHhkYSwweGMyLDB4YzcsMHgzOSwweDc4LDB4OTksMHhkZSwweDU3LDB4MTQsMHg0NSwweDdmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzIsMHgzOCwweGEzLDB4NDQsMHgwZiwweGU3LDB4MzksMHg0YywweDZmLDB4MGYsMHgzMiwweDdlLDB4ZjEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YywweDg0LDB4OTcsMHhkZCwweGEwLDB4MGMsMHg4NywweDY2LDB4N2QsMHg3NSwweDc5XSksXG4gICAgICAgICAgICAgIHV0aWwuYmluMnN0cihbMHgwNCwweDAwLDB4YzIsMHhiYywweDcxLDB4ZjcsMHg0MSwweDRhLDB4MDksMHg2NiwweDcwLDB4MDIsMHg2OCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhiLDB4ZWIsMHhlMiwweDM0LDB4ZDEsMHgxMiwweDgzLDB4OTMsMHg3NSwweGU5LDB4NzEsMHgzMiwweGUyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZWQsMHgxOCwweDZmLDB4OGUsMHgzYSwweGZmLDB4MjIsMHg3MCwweDI4LDB4MDEsMHhiZiwweDRhLDB4MzksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSwweGJiLDB4M2MsMHg0YSwweGJjLDB4YjgsMHgxMywweGZjLDB4MTQsMHhmNiwweDcxLDB4YTEsMHg0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFjLDB4MDIsMHhhMSwweDczLDB4ODEsMHhjYywweGEwLDB4MzUsMHgwMiwweDNlLDB4OTcsMHhiNSwweGM0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTQsMHgzMywweGYxLDB4ZDEsMHhkZiwweDE0LDB4M2YsMHhmYiwweDhmLDB4YjksMHg3NSwweDcwLDB4ZGMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NCwweDNmLDB4MDcsMHgzNSwweDhmLDB4NTMsMHhhYSwweGIyLDB4ZDYsMHg4OCwweDUxLDB4NzEsMHg0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxLDB4MjQsMHhlYywweDdkLDB4Y2EsMHhmNiwweGEyLDB4YjMsMHhiYiwweGFkLDB4MmUsMHg2MCwweGZiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWMsMHhlZSwweDQ5LDB4ZDAsMHg0ZSwweDVjLDB4ZTMsMHgxZiwweDg4LDB4NDgsMHhlNCwweDY4LDB4MTQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZCwweDcxLDB4YmEsMHhkNywweDRkLDB4MzUsMHgxMCwweDg2LDB4MzcsMHg2MiwweGUwLDB4YTUsMHgwYl0pLFxuICAgICAgICAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDQsMHgwMCwweGUyLDB4MzgsMHhmOSwweGM4LDB4M2MsMHhkMSwweGNmLDB4NjIsMHg5MywweGMzLDB4NzcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NiwweDk3LDB4NDQsMHhlOCwweGM4LDB4Y2EsMHg5MywweDlhLDB4ZWYsMHhmMCwweDYzLDB4NzYsMHgyNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNiLDB4MWMsMHg0NiwweGZmLDB4OTAsMHgxMywweDkxLDB4MTUsMHg5NywweDdlLDB4ODgsMHg5NSwweGQ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2YsMHgyZiwweDUyLDB4NmUsMHgwZCwweDU1LDB4NTUsMHgyZSwweGYxLDB4NTgsMHg1YywweDdlLDB4NTYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhkNCwweDQ4LDB4YWEsMHhkYiwweDhjLDB4NDQsMHg0ZCwweDg0LDB4NjksMHgzMywweDg3LDB4MDcsMHhiMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdlLDB4ZjUsMHhhMCwweDYwLDB4ZmIsMHg3MywweDU5LDB4NDYsMHgyOSwweGNiLDB4MWUsMHgzZiwweDdjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmYsMHhhNiwweDUzLDB4ZTMsMHg4YywweGVmLDB4ZDUsMHhlYiwweGJiLDB4YzgsMHg5YSwweDhlLDB4NjYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YSwweDQ3LDB4MmYsMHhlMSwweGJhLDB4NWUsMHgzMiwweGQ0LDB4NTIsMHgwNCwweDg4LDB4OWQsMHg2MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlLDB4YmEsMHg3MSwweDJkLDB4ZjcsMHg2MSwweGQ1LDB4ZmMsMHgyNiwweGJmLDB4ZDgsMHg2MCwweDkyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2IsMHg5NCwweGY4LDB4NmYsMHgzZCwweDk3LDB4MGIsMHgwYywweDUyLDB4OGMsMHhiMywweGI2LDB4OGJdKSxcbiAgICAgICAgICAgICAgdXRpbC5iaW4yc3RyKFsweDA0LDB4MDAsMHhiNywweGM1LDB4NGQsMHg2ZSwweDJmLDB4ZGQsMHhlZiwweGVjLDB4MDcsMHg3MCwweGEyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2MsMHgxYywweDlkLDB4OGUsMHg2NiwweDYwLDB4N2MsMHg2MSwweDFlLDB4NDUsMHhlOSwweGRjLDB4ODIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyZiwweGM1LDB4N2UsMHgxYSwweGM2LDB4ZDAsMHg5MiwweGM1LDB4MjIsMHg5YiwweDlhLDB4ZmIsMHg3MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk1LDB4OTksMHhmMiwweDdjLDB4ZGIsMHgyYSwweDkzLDB4N2IsMHg1YSwweDI5LDB4NzMsMHgyNCwweDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEsMHg0OSwweGI1LDB4ZjIsMHg1ZiwweGJlLDB4ZTcsMHg2NCwweDRkLDB4ZGEsMHg1MiwweDllLDB4YzEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSwweDQwLDB4NWUsMHgwMywweDkyLDB4OGQsMHgzOSwweDk1LDB4MWYsMHg2OCwweDlmLDB4MDAsMHgyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjLDB4NmYsMHhjZiwweGQ5LDB4NmQsMHg2OCwweGY3LDB4MDAsMHg0ZiwweDBlLDB4YzgsMHgwYiwweGZhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTEsMHhlMCwweDIyLDB4ZjAsMHhmZiwweGE3LDB4NDIsMHhkNCwweGRlLDB4MGIsMHg0NywweDhmLDB4MmIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmNSwweDRkLDB4MDQsMHgzMiwweDkxLDB4ODksMHg0YiwweDBlLDB4MDUsMHg4ZCwweDcwLDB4ZjksMHhiYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGU3LDB4ZDYsMHg3NiwweGVhLDB4MGUsMHgxYSwweDkwLDB4MzAsMHhmNSwweDk4LDB4MDEsMHhjNSwweDczXSldO1xuICBcbiAgdmFyIERTQXB1Yk1QSXN0cnMgPSBbXG4gICAgICAgICAgdXRpbC5iaW4yc3RyKFsweDA4LDB4MDAsMHhhOCwweDg1LDB4NWMsMHgyOCwweDA1LDB4OTQsMHgwMywweGJlLDB4MDcsMHg2YywweDEzLDB4M2UsMHg2NSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmIsMHhiNSwweGUxLDB4OTksMHg3YywweGZhLDB4ODQsMHhlMywweGFjLDB4NDcsMHhhNSwweGM0LDB4NDYsMHhkOCwweDVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHg0NCwweGU5LDB4YzEsMHg2YiwweDY5LDB4ZjcsMHgxMCwweDc2LDB4NDksMHhhNywweDI1LDB4ODUsMHhmNCwweDFiLDB4ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAweGM2LDB4NjAsMHhjNCwweDViLDB4YWEsMHhkNCwweDg3LDB4ZDYsMHg4ZiwweDkyLDB4NTYsMHg3ZCwweDU1LDB4M2YsMHg0NSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4YWUsMHgxMiwweDczLDB4ZGEsMHgyOSwweDhjLDB4YmEsMHgzMiwweGNjLDB4ZDcsMHhhNCwweGQwLDB4MjQsMHhiMCwweDdjLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHhkOCwweDBjLDB4M2EsMHg5MSwweDZmLDB4OTgsMHg0MCwweDljLDB4OWEsMHhhOCwweGNjLDB4MjgsMHgyNywweDk1LDB4MGIsXG4gICAgICAgICAgICAgICAgICAgICAgICAweGUxLDB4NWIsMHhiOSwweDNiLDB4MWMsMHgxYywweGQyLDB4ZWMsMHhhYiwweDA3LDB4MjUsMHg4ZCwweDdhLDB4MmEsMHgyYixcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYsMHgxNCwweGU4LDB4ZGEsMHg3MSwweGQyLDB4YWIsMHhiYSwweDg1LDB4MTQsMHgwZCwweGM1LDB4ZTAsMHg4OCwweGViLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHhhNSwweGUyLDB4ZDUsMHg0OCwweDNkLDB4NzQsMHgwYywweDQxLDB4ZWIsMHhmZCwweGI2LDB4NGUsMHhmOSwweDJjLDB4ODIsXG4gICAgICAgICAgICAgICAgICAgICAgICAweDE3LDB4ZGQsMHg2NCwweDFlLDB4MTksMHgzOSwweGEzLDB4N2YsMHhmOSwweDAwLDB4Y2QsMHg5YiwweGRhLDB4MmUsMHhiZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4NzEsMHgxMiwweGRmLDB4MGQsMHg3YywweDBhLDB4NmIsMHgyZCwweDIxLDB4M2IsMHg5YywweDY2LDB4OTMsMHg0YSwweDFlLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHg5MCwweDc5LDB4ZDMsMHg1YSwweDViLDB4ZTUsMHhiOSwweDk0LDB4MWIsMHhlNiwweDQ3LDB4OTksMHgwNiwweDk4LDB4ZDgsXG4gICAgICAgICAgICAgICAgICAgICAgICAweDJhLDB4ZTUsMHhlMiwweGE2LDB4OTUsMHg2YSwweDA3LDB4YzgsMHhhYywweDdjLDB4ZTksMHhmYywweGEyLDB4NmEsMHgxNixcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MmMsMHg5NCwweDk4LDB4YmQsMHg5MSwweDBhLDB4N2MsMHg3YywweDJjLDB4YjksMHg3ZSwweGEyLDB4NTEsMHg4YiwweDQ1LFxuICAgICAgICAgICAgICAgICAgICAgICAgMHgxZCwweDQ2LDB4MzQsMHhhOCwweDUyLDB4MmIsMHhkZCwweGQ5LDB4YTgsMHhiYywweDQ2LDB4NzgsMHg2NiwweGUxLDB4NzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAweDExLDB4ZjEsMHhjYiwweDFhLDB4YjYsMHg0ZSwweDA1LDB4NTQsMHhmNywweGU5LDB4YmUsMHg0YywweDI1LDB4NTksMHgwOCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4OWYsMHhmOCwweGVhLDB4MjUsMHg5NywweDMzLDB4ZDYsMHhjOSwweDBmLDB4NTksMHgwZSwweGZkLDB4OWYsMHhkYywweGUyLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHhjMCwweGNmLDB4MmZdKSxcbiAgICAgIHV0aWwuYmluMnN0cihbMHgwMSwweDAwLDB4ZTEsMHg3MiwweDJjLDB4ZDAsMHhiYiwweDFhLDB4NGYsMHhiNiwweGI2LDB4OTUsMHg3NywweDcxLDB4MmUsXG4gICAgICAgICAgICAgICAgICAgIDB4MDEsMHg0OCwweDNlLDB4MzUsMHg1NCwweDY0LDB4MmIsMHhlZCwweDQwLDB4NWYsMHg2NSwweDBjLDB4NTcsMHgyOCwweDVmLFxuICAgICAgICAgICAgICAgICAgICAweGZkLDB4ZmQsMHhmZiwweGQ3XSksXG4gICAgICB1dGlsLmJpbjJzdHIoWzB4MDcsMHhmZiwweDVkLDB4OWYsMHhjNCwweGI1LDB4NjMsMHgyNSwweDlkLDB4NzIsMHg4OCwweGU1LDB4NTMsMHg0NiwweDk4LFxuICAgICAgICAgICAgICAgICAgICAweGUzLDB4ZTksMHg2MiwweGNiLDB4MGMsMHhhMSwweGI3LDB4NzUsMHg5ZiwweDE4LDB4NDEsMHg5NCwweDMyLDB4MjgsMHgyOSxcbiAgICAgICAgICAgICAgICAgICAgMHg2ZCwweDY5LDB4ZTAsMHgzZiwweDdkLDB4N2IsMHgyYiwweDA2LDB4NWEsMHgzMywweDVjLDB4ZDQsMHgzNiwweDMxLDB4MDksXG4gICAgICAgICAgICAgICAgICAgIDB4NTQsMHg4NSwweDlkLDB4YjgsMHgyMCwweGZlLDB4ZGEsMHhmYywweGNkLDB4MWYsMHhiMSwweDJjLDB4MTUsMHgwOCwweDlkLFxuICAgICAgICAgICAgICAgICAgICAweDMyLDB4NTMsMHgyZiwweGMxLDB4NDIsMHgyMiwweDY5LDB4ZmYsMHg2NywweDJlLDB4MzksMHg5NywweDUwLDB4NjYsMHgzOSxcbiAgICAgICAgICAgICAgICAgICAgMHhkYSwweGNmLDB4ZmQsMHg2NCwweDZmLDB4OTEsMHgwNSwweDY0LDB4MzcsMHhjNSwweDA3LDB4MjQsMHhhYSwweDQwLDB4YTAsXG4gICAgICAgICAgICAgICAgICAgIDB4NzUsMHg4MiwweDFkLDB4OTcsMHg5NiwweDEyLDB4ZjEsMHhiZCwweDllLDB4MDksMHgyNiwweDNjLDB4OTcsMHg1ZCwweDU3LFxuICAgICAgICAgICAgICAgICAgICAweGI4LDB4NWMsMHg3ZCwweDg5LDB4MDMsMHg4MiwweGNkLDB4NDAsMHhlNSwweDAzLDB4ZTYsMHg0YSwweGZiLDB4YmMsMHhkMixcbiAgICAgICAgICAgICAgICAgICAgMHhlZiwweDdhLDB4ODksMHgwMiwweDA4LDB4YzgsMHg1MiwweGZhLDB4OTcsMHg3NCwweDY2LDB4MzIsMHhhZSwweGE2LDB4NTIsXG4gICAgICAgICAgICAgICAgICAgIDB4NGIsMHhlZiwweDVmLDB4Y2UsMHg5MSwweDIzLDB4M2YsMHhhYiwweDlkLDB4NjIsMHgyMSwweGVmLDB4NDgsMHg2ZCwweDA3LFxuICAgICAgICAgICAgICAgICAgICAweDVhLDB4YmEsMHhkZiwweDAwLDB4OTEsMHg1NCwweGVhLDB4NWMsMHhmYSwweDRiLDB4MTYsMHgyOCwweDFhLDB4Y2UsMHg0OCxcbiAgICAgICAgICAgICAgICAgICAgMHhiNywweDVjLDB4NTAsMHhhNSwweDU5LDB4YTQsMHhiNCwweGFmLDB4MWYsMHhlYiwweDhkLDB4NTgsMHgzZiwweDBhLDB4YTUsXG4gICAgICAgICAgICAgICAgICAgIDB4OTcsMHgyYiwweDUxLDB4NTYsMHhlOCwweDg4LDB4ZjYsMHgwNywweGJjLDB4ZGYsMHhmYSwweDJiLDB4N2IsMHg4OCwweGUwLFxuICAgICAgICAgICAgICAgICAgICAweDQ2LDB4YzgsMHg3YSwweDNlLDB4ZDgsMHg4MCwweGRiLDB4NGQsMHg4NywweDYxLDB4NGYsMHg2NCwweGNkLDB4ZWIsMHhlOCxcbiAgICAgICAgICAgICAgICAgICAgMHgwZCwweDg2LDB4MTYsMHhjYywweGRkLDB4NmMsMHg3NiwweDY2LDB4YzEsMHg3MywweGI3LDB4MDgsMHg5OCwweDg5LDB4MmYsXG4gICAgICAgICAgICAgICAgICAgIDB4NjcsMHg2OSwweGQxLDB4ZmMsMHg5NywweDRkLDB4YTIsMHhjZSwweGFkLDB4YmIsMHg2ZiwweGFiLDB4YTUsMHhkNiwweDE4LFxuICAgICAgICAgICAgICAgICAgICAweGIzLDB4MWEsMHg5NiwweDAyLDB4YmMsMHgzMSwweDQyLDB4YTIsMHhhZCwweDc3LDB4ZTgsMHhlMiwweDRjLDB4OTksMHhmOSxcbiAgICAgICAgICAgICAgICAgICAgMHhkZCwweGJlLDB4Y2RdKSxcbiAgICAgIHV0aWwuYmluMnN0cihbMHgwNywweGZmLDB4NWQsMHhmZSwweDljLDB4OTgsMHhlZiwweDNhLDB4YTYsMHg0OSwweGYwLDB4MTAsMHg2NywweDc5LDB4MmEsXG4gICAgICAgICAgICAgICAgICAgIDB4OWQsMHg3OSwweDQzLDB4MDYsMHhhNCwweGE4LDB4NmIsMHgxYSwweDZkLDB4MWYsMHg3NywweDZlLDB4MDAsMHgzMSwweGI5LFxuICAgICAgICAgICAgICAgICAgICAweGVkLDB4YzksMHg2NiwweGZmLDB4ZjEsMHgyMSwweDMyLDB4ZmEsMHg2MiwweDQzLDB4Y2QsMHg5NywweGQzLDB4M2QsMHhhZixcbiAgICAgICAgICAgICAgICAgICAgMHhiNCwweDI5LDB4MjksMHgyNiwweDRlLDB4MWMsMHhhMCwweGFkLDB4MWMsMHgwNywweDI4LDB4M2YsMHhlNSwweDQzLDB4MTAsXG4gICAgICAgICAgICAgICAgICAgIDB4YmEsMHhiNCwweDA4LDB4ZTAsMHhkYywweGEyLDB4YzMsMHg1YiwweDFmLDB4YmQsMHg5NCwweGM3LDB4NDMsMHhlNSwweGYyLFxuICAgICAgICAgICAgICAgICAgICAweDE3LDB4MzAsMHg1NCwweDdmLDB4MTQsMHhiZSwweGY0LDB4YmQsMHg5MSwweDNiLDB4ZTQsMHgzNiwweGE0LDB4NTAsMHg1YixcbiAgICAgICAgICAgICAgICAgICAgMHgzNywweDg5LDB4NWUsMHhjYywweGM3LDB4NzQsMHg1NCwweDMyLDB4MjAsMHgwOSwweDYzLDB4OTgsMHhiNywweGQ5LDB4YWYsXG4gICAgICAgICAgICAgICAgICAgIDB4N2YsMHhiMCwweDZjLDB4MjcsMHg0MywweGZlLDB4NTIsMHhlNiwweDFhLDB4ODgsMHg1OSwweDI1LDB4ZmMsMHhlYiwweDQzLFxuICAgICAgICAgICAgICAgICAgICAweDUwLDB4YzcsMHg2NSwweDQzLDB4YzEsMHg4NiwweDczLDB4NTgsMHg1MywweDNhLDB4Y2YsMHg3YSwweGEzLDB4MWQsMHg1NixcbiAgICAgICAgICAgICAgICAgICAgMHhjOCwweDRhLDB4ODAsMHg3MCwweGI3LDB4YmYsMHhmMiwweGEzLDB4ZWMsMHhlOCwweDc3LDB4MDUsMHgzMywweDA5LDB4OWQsXG4gICAgICAgICAgICAgICAgICAgIDB4YWEsMHhjYSwweGEwLDB4ZTEsMHg2NCwweDY0LDB4NmYsMHg3NiwweDk5LDB4NDEsMHg3NSwweDc4LDB4OTAsMHhmNiwweGU3LFxuICAgICAgICAgICAgICAgICAgICAweDIzLDB4ZTYsMHhlYywweDUwLDB4ZTUsMHg5OSwweGE4LDB4M2UsMHgxYSwweDRiLDB4YzksMHg4OCwweDU4LDB4NjYsMHhhZSxcbiAgICAgICAgICAgICAgICAgICAgMHgxYSwweDUzLDB4NWUsMHhlNCwweGI3LDB4ODYsMHhjZiwweGE2LDB4ZTUsMHhhZCwweGI0LDB4ODAsMHhhMCwweGYxLDB4MGQsXG4gICAgICAgICAgICAgICAgICAgIDB4OTYsMHhiOCwweDQxLDB4ZDAsMHgwNywweDlhLDB4MjEsMHg4ZCwweDUwLDB4N2YsMHg0ZiwweDczLDB4MTMsMHhhMiwweGUyLFxuICAgICAgICAgICAgICAgICAgICAweDAyLDB4MDcsMHhjMywweGEzLDB4MGYsMHgwOSwweDE4LDB4N2YsMHhmNywweDZiLDB4OTAsMHg3MCwweGMwLDB4ZjksMHgwYyxcbiAgICAgICAgICAgICAgICAgICAgMHg2NywweDhkLDB4OWQsMHgxNCwweGI2LDB4OWQsMHgzMiwweDgyLDB4ZDAsMHhiNSwweGM2LDB4NTcsMHhmMCwweDkxLDB4ZDksXG4gICAgICAgICAgICAgICAgICAgIDB4YzMsMHgyNiwweGFlLDB4OWYsMHhhOSwweDY3LDB4NDksMHg5NiwweDVjLDB4MDcsMHgzZSwweDQ3LDB4NWMsMHhlZCwweDYwLFxuICAgICAgICAgICAgICAgICAgICAweDA3LDB4YWMsMHg2YV0pXTtcbiAgdmFyIERTQXNlY01QSXN0cnMgPSBbdXRpbC5iaW4yc3RyKFsweDAxLDB4MDAsMHg5YiwweDU4LDB4YTgsMHhmNCwweDA0LDB4YjEsMHhkNSwweDE0LDB4MDksMHhlMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTEsMHhhMSwweDhhLDB4MGIsMHhhMywweGMzLDB4YTMsMHg2NiwweGFhLDB4MjcsMHg5OSwweDUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYywweDRkLDB4YmEsMHgyNCwweGVlLDB4ZGYsMHhkZiwweGI4LDB4OGUsMHg4ZV0pXTtcbiAgICAgICAgICAgIFxuICB2YXIgRWxnYW1hbHB1Yk1QSXN0cnMgPSBcbiAgICAgICAgICBbdXRpbC5iaW4yc3RyKFsweDA4LDB4MDAsMHhlYSwweGNjLDB4YmUsMHhlMiwweGU0LDB4NWEsMHg1MSwweDE4LDB4OTMsMHhhMSwweDEyLDB4MmYsXG4gICAgICAgICAgICAgICAgICAgICAweDAwLDB4OTksMHg0MiwweGQ4LDB4NWMsMHgxYywweDJmLDB4YjYsMHgzYywweGQ5LDB4OTQsMHg2MSwweGI0LDB4NTUsXG4gICAgICAgICAgICAgICAgICAgICAweDhkLDB4NGUsMHg3MywweGU2LDB4NjksMHhiYywweDFkLDB4MzMsMHhlMywweDJkLDB4OTEsMHgyMywweDY5LDB4OTUsXG4gICAgICAgICAgICAgICAgICAgICAweDk4LDB4ZDcsMHgxOCwweDVhLDB4YWYsMHhhNywweDkzLDB4YzYsMHgwNSwweDkzLDB4M2EsMHhjNywweGVhLDB4ZDAsXG4gICAgICAgICAgICAgICAgICAgICAweGIxLDB4YTksMHhjNywweGFiLDB4NDEsMHg4OSwweGM4LDB4MzgsMHg5OSwweGRjLDB4MWEsMHg1NywweDM1LDB4MWEsXG4gICAgICAgICAgICAgICAgICAgICAweDI3LDB4NjIsMHg0MCwweDcxLDB4OWYsMHgzNiwweDFjLDB4NmQsMHgxOCwweDFjLDB4OTMsMHhmNywweGJhLDB4MzUsXG4gICAgICAgICAgICAgICAgICAgICAweDA2LDB4ZWQsMHgzMCwweGI4LDB4ZDksMHg4YSwweDdjLDB4MDMsMHhhZiwweGJhLDB4NDAsMHgxZiwweDYyLDB4ZjEsXG4gICAgICAgICAgICAgICAgICAgICAweDZkLDB4ODcsMHgyYywweGE2LDB4MmUsMHg0NiwweGIwLDB4YWEsMHhiYywweGJjLDB4OTMsMHhmYSwweDliLDB4NDcsXG4gICAgICAgICAgICAgICAgICAgICAweDNmLDB4NzAsMHgxZiwweDJhLDB4YzIsMHg2NiwweDljLDB4N2MsMHg2OSwweGUwLDB4MmIsMHgwNSwweGVlLDB4YjcsXG4gICAgICAgICAgICAgICAgICAgICAweGE3LDB4N2YsMHhmMywweDIxLDB4NDgsMHg4NSwweGMyLDB4OTUsMHg1ZiwweDZmLDB4MWUsMHhiMywweDliLDB4OTcsXG4gICAgICAgICAgICAgICAgICAgICAweGY4LDB4MTQsMHhjMywweGZmLDB4NGQsMHg5NywweDI1LDB4MjksMHg5NCwweDQxLDB4NGIsMHg5MCwweGQ4LDB4YmEsXG4gICAgICAgICAgICAgICAgICAgICAweDcxLDB4NDUsMHg0YiwweDFlLDB4MmYsMHhjYSwweDgyLDB4NWYsMHg1NiwweDc3LDB4ZTksMHhkMywweDg4LDB4NWQsXG4gICAgICAgICAgICAgICAgICAgICAweDhiLDB4ZWMsMHg5MiwweDhiLDB4OGEsMHgyMywweDg4LDB4MDUsMHhmOCwweDJjLDB4YTgsMHhmMSwweDcwLDB4NzYsXG4gICAgICAgICAgICAgICAgICAgICAweGU3LDB4YmYsMHg3NSwweGE4LDB4MzEsMHgxNCwweDhlLDB4NzYsMHhjOCwweDAxLDB4YTYsMHgyNSwweDI3LDB4NDksXG4gICAgICAgICAgICAgICAgICAgICAweGFmLDB4ZGMsMHhmNCwweGY2LDB4ZjQsMHhjZSwweDkwLDB4ODQsMHgxNSwweDJiLDB4NGQsMHhiMywweGNjLDB4NzcsXG4gICAgICAgICAgICAgICAgICAgICAweGRiLDB4NjUsMHg3MSwweDc1LDB4ZDMsMHgwMCwweDFkLDB4MjIsMHhjNSwweDQyLDB4MmYsMHg1MSwweGZhLDB4N2IsXG4gICAgICAgICAgICAgICAgICAgICAweGViLDB4NmUsMHgwMywweGQ5LDB4NDEsMHhkZCwweDJkLDB4MWEsMHhkZCwweDA3LDB4NzQsMHg4YiwweGI3LDB4YTIsXG4gICAgICAgICAgICAgICAgICAgICAweGZhLDB4YjIsMHg1OSwweDBlLDB4MGUsMHg5NCwweDdjLDB4MDAsMHhhZCwweDk1LDB4MjMsMHg0MiwweDkxLDB4MTgsXG4gICAgICAgICAgICAgICAgICAgICAweDRjLDB4OTcsMHhmMSwweDI3LDB4NjIsMHg3N10pLFxuICAgICAgIHV0aWwuYmluMnN0cihbMHgwMCwweDAzLDB4MDVdKSxcbiAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDcsMHhmZiwweDU3LDB4MTksMHg3NiwweGZjLDB4MDksMHg2YSwweDdhLDB4ZjcsMHhiYSwweGIyLDB4NDIsMHhiZixcbiAgICAgICAgICAgICAgICAgICAgIDB4Y2QsMHgyYiwweGMxLDB4MWEsMHg3OSwweDI1LDB4OGMsMHhhZCwweGY0LDB4M2EsMHgwYSwweDdhLDB4OWIsMHg0YyxcbiAgICAgICAgICAgICAgICAgICAgIDB4NDYsMHgzYywweGUwLDB4NGYsMHhjYywweDZlLDB4ZTUsMHg3YSwweDMzLDB4M2EsMHg0ZSwweDgwLDB4Y2IsMHhkMyxcbiAgICAgICAgICAgICAgICAgICAgIDB4NjIsMHhkNywweDhmLDB4ZTIsMHhjOCwweGIwLDB4ZDAsMHhjYiwweDQ5LDB4YzksMHg5ZSwweDJkLDB4OTcsMHgxNixcbiAgICAgICAgICAgICAgICAgICAgIDB4M2EsMHg3ZCwweGIxLDB4ZTEsMHhkMywweGQ5LDB4ZDcsMHgzZiwweDIwLDB4NjAsMHhlMywweDNlLDB4NzcsMHhlYSxcbiAgICAgICAgICAgICAgICAgICAgIDB4MGMsMHhlNCwweDdiLDB4ZjAsMHgzOSwweDFhLDB4MGQsMHhkOSwweDhmLDB4NzMsMHhkMiwweDUxLDB4YjgsMHgwYyxcbiAgICAgICAgICAgICAgICAgICAgIDB4MGUsMHgxNSwweDFlLDB4YWQsMHg3YywweGQ4LDB4OWQsMHg3NCwweDZlLDB4YTIsMHgxNywweDZiLDB4NTgsMHgxNCxcbiAgICAgICAgICAgICAgICAgICAgIDB4MmIsMHhiNywweGFkLDB4OGEsMHhkNywweDY2LDB4YzAsMHhkZiwweGVhLDB4MmQsMHhmYywweGM0LDB4NmUsMHg2OCxcbiAgICAgICAgICAgICAgICAgICAgIDB4YjYsMHg0YywweDlhLDB4MTYsMHhhNCwweDNkLDB4YzIsMHgyNiwweDBjLDB4YjcsMHhkNCwweDEzLDB4N2IsMHgyMixcbiAgICAgICAgICAgICAgICAgICAgIDB4ZmQsMHg4NCwweGQ3LDB4MGYsMHhkYywweDQyLDB4NzUsMHgwNSwweDg1LDB4MjksMHgwMCwweDMxLDB4MWQsMHhlYyxcbiAgICAgICAgICAgICAgICAgICAgIDB4NGUsMHgyMiwweDhiLDB4ZjYsMHgzNywweDgzLDB4NDUsMHhlNSwweGIzLDB4MzEsMHg2MSwweDJjLDB4MDIsMHhhMSxcbiAgICAgICAgICAgICAgICAgICAgIDB4YzYsMHg5ZCwweGVhLDB4YmEsMHgzZCwweDhhLDB4YWIsMHgwZiwweDYxLDB4NWUsMHgxNCwweDY0LDB4NjksMHgxZSxcbiAgICAgICAgICAgICAgICAgICAgIDB4YTAsMHgxNSwweDQ4LDB4ODYsMHhlNSwweDExLDB4MDYsMHhlOCwweGRlLDB4MzQsMHhjNywweGE3LDB4M2QsMHgzNSxcbiAgICAgICAgICAgICAgICAgICAgIDB4ZDEsMHg3NiwweGMyLDB4YmUsMHgwMSwweDgyLDB4NjEsMHg4ZCwweGU3LDB4N2UsMHgyOCwweDFkLDB4NGUsMHg4YyxcbiAgICAgICAgICAgICAgICAgICAgIDB4YjksMHhlOCwweDdlLDB4YTQsMHg1ZiwweGE2LDB4M2EsMHg5ZSwweDVkLDB4YWMsMHhmMywweDYwLDB4MjIsMHgxNCxcbiAgICAgICAgICAgICAgICAgICAgIDB4ZDUsMHhkNSwweGJlLDB4MWYsMHhmMCwweDE5LDB4ZTYsMHg4MSwweGZkLDB4NWQsMHhlMSwweGY4LDB4NzYsMHg1ZixcbiAgICAgICAgICAgICAgICAgICAgIDB4ZTMsMHhkYSwweGJhLDB4MTksMHhmMywweGNiLDB4MTAsMHhhMCwweDZiLDB4ZDAsMHgyZCwweGJlLDB4NDAsMHg0MixcbiAgICAgICAgICAgICAgICAgICAgIDB4N2IsMHg5YiwweDE1LDB4YTQsMHgyZCwweGVjLDB4Y2YsMHgwOSwweGQ2LDB4ZTMsMHg5MiwweGMzLDB4OGQsMHg2NSxcbiAgICAgICAgICAgICAgICAgICAgIDB4NmIsMHg2MCwweDk3LDB4ZGEsMHg2YiwweGNhXSldO1xuXG4gIHZhciBFbGdhbWFsc2VjTVBJc3RycyA9IFtcbiAgICAgICAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDEsMHg1MiwweDAyLDB4ODAsMHg4NywweGY2LDB4ZTQsMHg0OSwweGQ3LDB4MmUsMHgzZSwweGZlLDB4NjAsMHhiOSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTMsMHgyYSwweGYwLDB4NjcsMHg1OCwweGU5LDB4ZjYsMHg0NywweDgzLDB4ZGUsMHg3ZSwweGZiLDB4YmIsMHhiZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZGYsMHg0OCwweDEyLDB4MWIsMHgwNiwweDdkLDB4MTMsMHhiYywweDNiLDB4NDksMHhmOSwweDg2LDB4ZDQsMHg1MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZWQsMHgyZCwweDY4XSldO1xuXG4gIHZhciBSU0FwdWJNUElzID0gW107XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgUlNBcHViTVBJc1tpXSA9IG5ldyBvcGVucGdwLm1waSgpO1xuICAgIFJTQXB1Yk1QSXNbaV0ucmVhZChSU0FwdWJNUElzdHJzW2ldKTtcbiAgfVxuXG4gIHZhciBSU0FzZWNNUElzID0gW107XG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBSU0FzZWNNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgUlNBc2VjTVBJc1tpXS5yZWFkKFJTQXNlY01QSXN0cnNbaV0pO1xuICB9XG4gICAgXG4gIHZhciBEU0FzZWNNUElzID0gW107XG4gIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHtcbiAgICBEU0FzZWNNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRFNBc2VjTVBJc1tpXS5yZWFkKERTQXNlY01QSXN0cnNbaV0pO1xuICB9XG4gICAgXG4gIHZhciBEU0FwdWJNUElzID0gW107XG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBEU0FwdWJNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRFNBcHViTVBJc1tpXS5yZWFkKERTQXB1Yk1QSXN0cnNbaV0pO1xuICB9XG4gIHZhciBFbGdhbWFsc2VjTVBJcyA9IFtdO1xuICBmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7XG4gICAgRWxnYW1hbHNlY01QSXNbaV0gPSBuZXcgb3BlbnBncC5tcGkoKTtcbiAgICBFbGdhbWFsc2VjTVBJc1tpXS5yZWFkKEVsZ2FtYWxzZWNNUElzdHJzW2ldKTtcbiAgfVxuICAgIFxuICB2YXIgRWxnYW1hbHB1Yk1QSXMgPSBbXTtcbiAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIEVsZ2FtYWxwdWJNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRWxnYW1hbHB1Yk1QSXNbaV0ucmVhZChFbGdhbWFscHViTVBJc3Ryc1tpXSk7XG4gIH1cblxuICAvL09yaWdpbmFsbHkgd2UgcGFzc2VkIHB1YmxpYyBhbmQgc2VjcmV0IE1QSSBzZXBhcmF0ZWx5LCBub3cgdGhleSBhcmUgam9pbmVkLiBJcyB0aGlzIHdoYXQgd2Ugd2FudCB0byBkbyBsb25nIHRlcm0/XG4gIC8vIFJTQVxuICB2YXIgUlNBc2lnbmVkRGF0YSA9IG9wZW5wZ3Auc2lnbmF0dXJlLnNpZ24oMiwgMSwgUlNBcHViTVBJcy5jb25jYXQoUlNBc2VjTVBJcyksIFwiZm9vYmFyXCIpO1xuICB2YXIgUlNBc2lnbmVkRGF0YU1QSSA9IG5ldyBvcGVucGdwLm1waSgpO1xuICBSU0FzaWduZWREYXRhTVBJLnJlYWQoUlNBc2lnbmVkRGF0YSk7XG4gIHJlc3VsdFswXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgUlNBIFNpZ24gYW5kIFZlcmlmeVwiLFxuICAgICAgb3BlbnBncC5zaWduYXR1cmUudmVyaWZ5KDEsIDIsIFtSU0FzaWduZWREYXRhTVBJXSwgUlNBcHViTVBJcywgXCJmb29iYXJcIikpO1xuXG4gIC8vIERTQSBcbiAgdmFyIERTQXNpZ25lZERhdGEgPSBvcGVucGdwLnNpZ25hdHVyZS5zaWduKDIsIDE3LCBEU0FwdWJNUElzLmNvbmNhdChEU0FzZWNNUElzKSwgXCJmb29iYXJcIik7XG4gIFxuICB2YXIgRFNBbXNnTVBJcyA9IFtdO1xuICAgIERTQW1zZ01QSXNbMF0gPSBuZXcgb3BlbnBncC5tcGkoKTtcbiAgICBEU0Ftc2dNUElzWzFdID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRFNBbXNnTVBJc1swXS5yZWFkKERTQXNpZ25lZERhdGEuc3Vic3RyaW5nKDAsMzQpKTtcbiAgICBEU0Ftc2dNUElzWzFdLnJlYWQoRFNBc2lnbmVkRGF0YS5zdWJzdHJpbmcoMzQsNjgpKTtcbiAgcmVzdWx0WzFdID0gbmV3IHVuaXQucmVzdWx0KFwiVGVzdGluZyBEU0EgU2lnbiBhbmQgVmVyaWZ5XCIsXG4gICAgICBvcGVucGdwLnNpZ25hdHVyZS52ZXJpZnkoMTcsIDIsIERTQW1zZ01QSXMsIERTQXB1Yk1QSXMsIFwiZm9vYmFyXCIpKTtcbiAgXG4gIHZhciBzeW1tQWxnbyA9IFwiYWVzMjU2XCI7IC8vIEFFUzI1NlxuICB2YXIgc3ltbUtleSA9IG9wZW5wZ3AuZ2VuZXJhdGVTZXNzaW9uS2V5KHN5bW1BbGdvKTtcbiAgdmFyIHN5bW1lbmNEYXRhT0NGQiA9IG9wZW5wZ3AuY2ZiLmVuY3J5cHQob3BlbnBncC5nZXRQcmVmaXhSYW5kb20oc3ltbUFsZ28pLCBzeW1tQWxnbywgXCJmb29iYXJmb29iYXIxMjM0NTY3ODkwXCIsIHN5bW1LZXksIHRydWUpO1xuICB2YXIgc3ltbWVuY0RhdGFDRkIgID0gb3BlbnBncC5jZmIuZW5jcnlwdChvcGVucGdwLmdldFByZWZpeFJhbmRvbShzeW1tQWxnbyksIHN5bW1BbGdvLCBcImZvb2JhcmZvb2JhcjEyMzQ1Njc4OTBcIiwgc3ltbUtleSwgZmFsc2UpO1xuICBcbiAgcmVzdWx0WzJdID0gbmV3IHVuaXQucmVzdWx0KFwiVGVzdGluZyBzeW1tZXRyaWMgZW5jcnlwdCBhbmQgZGVjcnlwdCB3aXRoIE9wZW5QR1AgQ0ZCIHJlc3luY1wiLFxuICAgICAgb3BlbnBncC5jZmIuZGVjcnlwdChzeW1tQWxnbyxzeW1tS2V5LHN5bW1lbmNEYXRhT0NGQix0cnVlKSA9PSBcImZvb2JhcmZvb2JhcjEyMzQ1Njc4OTBcIik7XG4gIHJlc3VsdFszXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3Rpbmcgc3ltbWV0cmljIGVuY3J5cHQgYW5kIGRlY3J5cHQgd2l0aG91dCBPcGVuUEdQIENGQiByZXN5bmMgKHVzZWQgaW4gbW9kaWZpY2F0aW9uIGRldGVjdGlvbiBjb2RlIFxcXCJNRENcXFwiIHBhY2tldHMpXCIsXG4gICAgICBvcGVucGdwLmNmYi5kZWNyeXB0KHN5bW1BbGdvLHN5bW1LZXksc3ltbWVuY0RhdGFDRkIsZmFsc2UpID09IFwiZm9vYmFyZm9vYmFyMTIzNDU2Nzg5MFwiKTtcbiAgXG4gIGRlYnVnZ2VyO1xuICB2YXIgUlNBVW5lbmNyeXB0ZWREYXRhID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gIFJTQVVuZW5jcnlwdGVkRGF0YS5mcm9tQnl0ZXMob3BlbnBncC5wa2NzMS5lbWUuZW5jb2RlKHN5bW1LZXksIFJTQXB1Yk1QSXNbMF0uYnl0ZUxlbmd0aCgpKSk7XG4gIHZhciBSU0FFbmNyeXB0ZWREYXRhID0gb3BlbnBncC5wdWJsaWNLZXlFbmNyeXB0KFwicnNhX2VuY3J5cHRfc2lnblwiLCBSU0FwdWJNUElzLCBSU0FVbmVuY3J5cHRlZERhdGEpO1xuXG4gIHJlc3VsdFs0XSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgYXN5bW1ldHJpYyBlbmNyeXB0IGFuZCBkZWNyeXB0IHVzaW5nIFJTQSB3aXRoIGVtZV9wa2NzMSBwYWRkaW5nXCIsXG4gICAgICBvcGVucGdwLnBrY3MxLmVtZS5kZWNvZGUob3BlbnBncC5wdWJsaWNLZXlEZWNyeXB0KFwicnNhX2VuY3J5cHRfc2lnblwiLCBSU0FwdWJNUElzLmNvbmNhdChSU0FzZWNNUElzKSwgUlNBRW5jcnlwdGVkRGF0YSkud3JpdGUoKS5zdWJzdHJpbmcoMiksIFJTQXB1Yk1QSXNbMF0uYnl0ZUxlbmd0aCgpKSA9PSBzeW1tS2V5KTtcblxuICB2YXIgRWxnYW1hbFVuZW5jcnlwdGVkRGF0YSA9IG5ldyBvcGVucGdwLm1waSgpO1xuICBFbGdhbWFsVW5lbmNyeXB0ZWREYXRhLmZyb21CeXRlcyhvcGVucGdwLnBrY3MxLmVtZS5lbmNvZGUoc3ltbUtleSwgRWxnYW1hbHB1Yk1QSXNbMF0uYnl0ZUxlbmd0aCgpKSk7XG4gIHZhciBFbGdhbWFsRW5jcnlwdGVkRGF0YSA9IG9wZW5wZ3AucHVibGljS2V5RW5jcnlwdChcImVsZ2FtYWxcIiwgRWxnYW1hbHB1Yk1QSXMsIEVsZ2FtYWxVbmVuY3J5cHRlZERhdGEpO1xuXG4gIHJlc3VsdFs1XSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgYXN5bW1ldHJpYyBlbmNyeXB0IGFuZCBkZWNyeXB0IHVzaW5nIEVsZ2FtYWwgd2l0aCBlbWVfcGtjczEgcGFkZGluZ1wiLFxuICAgICAgb3BlbnBncC5wa2NzMS5lbWUuZGVjb2RlKG9wZW5wZ3AucHVibGljS2V5RGVjcnlwdChcImVsZ2FtYWxcIiwgRWxnYW1hbHB1Yk1QSXMuY29uY2F0KEVsZ2FtYWxzZWNNUElzKSwgRWxnYW1hbEVuY3J5cHRlZERhdGEpLndyaXRlKCkuc3Vic3RyaW5nKDIpLCBFbGdhbWFscHViTVBJc1swXS5ieXRlTGVuZ3RoKCkpID09IHN5bW1LZXkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsIlxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3VuaXQuanMnKTtcblxucmVxdWlyZSgnLi9jcnlwdG8vaGFzaC9zaGEuanMnKTtcbnJlcXVpcmUoJy4vY3J5cHRvL2hhc2gvbWQ1LmpzJyk7XG5yZXF1aXJlKCcuL2NyeXB0by9oYXNoL3JpcGVtZC5qcycpO1xuXG5yZXF1aXJlKCcuL2NyeXB0by9jaXBoZXIvYWVzLmpzJyk7XG5yZXF1aXJlKCcuL2NyeXB0by9jaXBoZXIvYmxvd2Zpc2guanMnKTtcbnJlcXVpcmUoJy4vY3J5cHRvL2NpcGhlci9jYXN0NS5qcycpO1xucmVxdWlyZSgnLi9jcnlwdG8vY2lwaGVyL2Rlcy5qcycpO1xucmVxdWlyZSgnLi9jcnlwdG8vY2lwaGVyL3R3b2Zpc2guanMnKTtcblxucmVxdWlyZSgnLi9jcnlwdG8vb3BlbnBncC5jcnlwdG8uanMnKTtcbiIsInZhciBwcm9jZXNzPXJlcXVpcmUoXCJfX2Jyb3dzZXJpZnlfcHJvY2Vzc1wiKTtcbm1vZHVsZS5leHBvcnRzID0ge1xuXHR0ZXN0czogW10sXG5cdHJlZ2lzdGVyOiBmdW5jdGlvbihzdHJfdGl0bGUsIGZ1bmNfcnVudGVzdCkge1xuXHRcdHRoaXMudGVzdHMucHVzaCh7IHRpdGxlOiBzdHJfdGl0bGUsIHJ1bjogZnVuY19ydW50ZXN0IH0pO1xuXHR9LFxuXHRcblx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGVzdCA9IHRoaXMudGVzdHMuc2hpZnQoKTtcblxuXHRcdHZhciByZXN1bHQgPSB7XG5cdFx0XHR0aXRsZTogdGVzdC50aXRsZVxuXHRcdH07XG5cblxuXHRcdHJlc3VsdC50ZXN0cyA9IHRlc3QucnVuKCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdHJ1bl9hbGw6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwYXNzZWQgPSB0cnVlO1xuXG5cdFx0d2hpbGUodGhpcy50ZXN0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0gdGhpcy5ydW4oKTtcblxuXHRcdFx0Y29uc29sZS5sb2coJ1Rlc3Q6ICcgKyByZXN1bHQudGl0bGUpO1xuXG5cdFx0XHRmb3IodmFyIGkgaW4gcmVzdWx0LnRlc3RzKSB7XG5cblx0XHRcdFx0dmFyIHJlcyA9IHJlc3VsdC50ZXN0c1tpXS5yZXN1bHQgP1xuXHRcdFx0XHRcdCdTVUNDRVNTJyA6ICdGQUlMRUQnO1xuXG5cdFx0XHRcdGNvbnNvbGUubG9nKHJlc3VsdC50ZXN0c1tpXS5kZXNjcmlwdGlvbiArICcgJyArIHJlcyk7XG5cblx0XHRcdFx0cGFzc2VkID0gcGFzc2VkICYmIHJlc3VsdC50ZXN0c1tpXS5yZXN1bHQ7XG5cdFx0XHR9XHRcdFx0XHRcblx0XHR9XG5cblx0XHRpZighcGFzc2VkKSBwcm9jZXNzLmV4aXQoMSk7XG5cdH0sXG5cdFx0XG5cdHJlc3VsdDogZnVuY3Rpb24oc3RyX2Rlc2NyaXB0aW9uLCBib29sZWFuX3Jlc3VsdCkge1xuXHRcdHRoaXMuZGVzY3JpcHRpb24gPSBzdHJfZGVzY3JpcHRpb247XG5cdFx0dGhpcy5yZXN1bHQgPSBib29sZWFuX3Jlc3VsdDtcblx0fVxufVxuXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG5wcm9jZXNzLm5leHRUaWNrID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FuU2V0SW1tZWRpYXRlID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cuc2V0SW1tZWRpYXRlO1xuICAgIHZhciBjYW5Qb3N0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAmJiB3aW5kb3cucG9zdE1lc3NhZ2UgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXJcbiAgICA7XG5cbiAgICBpZiAoY2FuU2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZikgeyByZXR1cm4gd2luZG93LnNldEltbWVkaWF0ZShmKSB9O1xuICAgIH1cblxuICAgIGlmIChjYW5Qb3N0KSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKGV2LnNvdXJjZSA9PT0gd2luZG93ICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbiJdfQ== +//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jb21wcmVzc2lvbi9qeGcuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vY2ZiLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL2NpcGhlci9hZXMuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vY2lwaGVyL2Jsb3dmaXNoLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL2NpcGhlci9jYXN0NS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9jaXBoZXIvZGVzLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL2NpcGhlci9pbmRleC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9jaXBoZXIvdHdvZmlzaC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9jcnlwdG8uanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vaGFzaC9pbmRleC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9oYXNoL21kNS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9oYXNoL3JpcGUtbWQuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vaGFzaC9zaGEuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vaW5kZXguanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vcGtjczEuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vcHVibGljX2tleS9kc2EuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvY29tcHJlc3NlZC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9wdWJsaWNfa2V5L2VsZ2FtYWwuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vcHVibGljX2tleS9pbmRleC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2NyeXB0by9wdWJsaWNfa2V5L2pzYm4uanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vcHVibGljX2tleS9yc2EuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9jcnlwdG8vcmFuZG9tLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvY3J5cHRvL3NpZ25hdHVyZS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL2VuY29kaW5nL2FybW9yLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvZW5jb2RpbmcvYmFzZTY0LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvZW51bXMuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9pbmRleC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL29wZW5wZ3AuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvYWxsX3BhY2tldHMuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvaW5kZXguanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvbGl0ZXJhbC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9tYXJrZXIuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvb25lX3Bhc3Nfc2lnbmF0dXJlLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3BhY2tldC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9wYWNrZXRsaXN0LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3B1YmxpY19rZXkuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvcHVibGljX2tleV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvcHVibGljX3N1YmtleS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9zZWNyZXRfa2V5LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3NlY3JldF9zdWJrZXkuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy9wYWNrZXQvc2lnbmF0dXJlLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3N5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3BhY2tldC9zeW1fZW5jcnlwdGVkX3Nlc3Npb25fa2V5LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3N5bW1ldHJpY2FsbHlfZW5jcnlwdGVkLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3RydXN0LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3VzZXJfYXR0cmlidXRlLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvcGFja2V0L3VzZXJpZC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3R5cGUva2V5aWQuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3NyYy90eXBlL21waS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvc3JjL3R5cGUvczJrLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC9zcmMvdXRpbC91dGlsLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L2NyeXB0by9jaXBoZXIvYWVzLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L2NyeXB0by9jaXBoZXIvYmxvd2Zpc2guanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3Rlc3QvY3J5cHRvL2NpcGhlci9jYXN0NS5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvdGVzdC9jcnlwdG8vY2lwaGVyL2Rlcy5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvdGVzdC9jcnlwdG8vY2lwaGVyL3R3b2Zpc2guanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3Rlc3QvY3J5cHRvL2hhc2gvbWQ1LmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L2NyeXB0by9oYXNoL3JpcGVtZC5qcyIsIi9Vc2Vycy96ZXVzL0RvY3VtZW50cy9HZW5lcmFsL1Byb2plY3RzL29wZW5wZ3Bqcy9naXQvdGVzdC9jcnlwdG8vaGFzaC9zaGEuanMiLCIvVXNlcnMvemV1cy9Eb2N1bWVudHMvR2VuZXJhbC9Qcm9qZWN0cy9vcGVucGdwanMvZ2l0L3Rlc3QvY3J5cHRvL29wZW5wZ3AuY3J5cHRvLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L2NyeXB0by9vcGVucGdwLnNpZ2NoZWNrLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L3Rlc3QtYWxsLmpzIiwiL1VzZXJzL3pldXMvRG9jdW1lbnRzL0dlbmVyYWwvUHJvamVjdHMvb3BlbnBncGpzL2dpdC90ZXN0L3VuaXQuanMiLCIvdXNyL2xvY2FsL3NoYXJlL25wbS9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2luc2VydC1tb2R1bGUtZ2xvYmFscy9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9UQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3J6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJKWEcgPSB7ZXhpc3RzOiAoZnVuY3Rpb24odW5kZWZpbmVkKXtyZXR1cm4gZnVuY3Rpb24odil7cmV0dXJuICEodj09PXVuZGVmaW5lZCB8fCB2PT09bnVsbCk7fX0pKCl9O1xuSlhHLmRlY29tcHJlc3MgPSBmdW5jdGlvbihzdHIpIHtyZXR1cm4gdW5lc2NhcGUoKG5ldyBKWEcuVXRpbC5VbnppcChKWEcuVXRpbC5CYXNlNjQuZGVjb2RlQXNBcnJheShzdHIpKSkudW56aXAoKVswXVswXSk7fTtcbi8qXG4gICAgQ29weXJpZ2h0IDIwMDgtMjAxMlxuICAgICAgICBNYXR0aGlhcyBFaG1hbm4sXG4gICAgICAgIE1pY2hhZWwgR2VyaGFldXNlcixcbiAgICAgICAgQ2Fyc3RlbiBNaWxsZXIsXG4gICAgICAgIEJpYW5jYSBWYWxlbnRpbixcbiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sXG4gICAgICAgIFBldGVyIFdpbGZhaHJ0XG5cbiAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBKU1hHcmFwaC5cbiAgICBcbiAgICBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgb3IgTEdQTCBWZXJzaW9uIDMgbGljZW5zZXMuXG5cbiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAgICBhbG9uZyB3aXRoIEpTWENvbXByZXNzb3IuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gICAgXG4gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgXG4gICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LlxuXG4qL1xuXG4vKipcbiAgKiBAY2xhc3MgVXRpbCBjbGFzc1xuICAqIEBjbGFzc2Rlc2MgVXRpbGl0aWVzIGZvciB1bmNvbXByZXNzaW5nIGFuZCBiYXNlNjQgZGVjb2RpbmdcbiAgKiBDbGFzcyBmb3IgZ3VuemlwcGluZywgdW56aXBwaW5nIGFuZCBiYXNlNjQgZGVjb2Rpbmcgb2YgZmlsZXMuXG4gICogSXQgaXMgdXNlZCBmb3IgcmVhZGluZyBHRU9ORXhULCBHZW9nZWJyYSBhbmQgSW50ZXJnZW8gZmlsZXMuXG4gICpcbiAgKiBPbmx5IEh1ZmZtYW4gY29kZXMgYXJlIGRlY29kZWQgaW4gZ3VuemlwLlxuICAqIFRoZSBjb2RlIGlzIGJhc2VkIG9uIHRoZSBzb3VyY2UgY29kZSBmb3IgZ3VuemlwLmMgYnkgUGFzaSBPamFsYSBcbiAgKiB7QGxpbmsgaHR0cDovL3d3dy5jcy50dXQuZmkvfmFsYmVydC9EZXYvZ3VuemlwL2d1bnppcC5jfVxuICAqIHtAbGluayBodHRwOi8vd3d3LmNzLnR1dC5maS9+YWxiZXJ0fVxuICAqL1xuSlhHLlV0aWwgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuLyoqXG4gKiBVbnppcCB6aXAgZmlsZXNcbiAqL1xuSlhHLlV0aWwuVW56aXAgPSBmdW5jdGlvbiAoYmFycmF5KXtcbiAgICB2YXIgb3V0cHV0QXJyID0gW10sXG4gICAgICAgIG91dHB1dCA9IFwiXCIsXG4gICAgICAgIGRlYnVnID0gZmFsc2UsXG4gICAgICAgIGdwZmxhZ3MsXG4gICAgICAgIGZpbGVzID0gMCxcbiAgICAgICAgdW56aXBwZWQgPSBbXSxcbiAgICAgICAgY3JjLFxuICAgICAgICBidWYzMmsgPSBuZXcgQXJyYXkoMzI3NjgpLFxuICAgICAgICBiSWR4ID0gMCxcbiAgICAgICAgbW9kZVpJUD1mYWxzZSxcblxuICAgICAgICBDUkMsIFNJWkUsXG4gICAgXG4gICAgICAgIGJpdFJldmVyc2UgPSBbXG4gICAgICAgIDB4MDAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4MjAsIDB4YTAsIDB4NjAsIDB4ZTAsXG4gICAgICAgIDB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsXG4gICAgICAgIDB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsXG4gICAgICAgIDB4MTgsIDB4OTgsIDB4NTgsIDB4ZDgsIDB4MzgsIDB4YjgsIDB4NzgsIDB4ZjgsXG4gICAgICAgIDB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsXG4gICAgICAgIDB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsXG4gICAgICAgIDB4MGMsIDB4OGMsIDB4NGMsIDB4Y2MsIDB4MmMsIDB4YWMsIDB4NmMsIDB4ZWMsXG4gICAgICAgIDB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsXG4gICAgICAgIDB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsXG4gICAgICAgIDB4MTIsIDB4OTIsIDB4NTIsIDB4ZDIsIDB4MzIsIDB4YjIsIDB4NzIsIDB4ZjIsXG4gICAgICAgIDB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsXG4gICAgICAgIDB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsXG4gICAgICAgIDB4MDYsIDB4ODYsIDB4NDYsIDB4YzYsIDB4MjYsIDB4YTYsIDB4NjYsIDB4ZTYsXG4gICAgICAgIDB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsXG4gICAgICAgIDB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsXG4gICAgICAgIDB4MWUsIDB4OWUsIDB4NWUsIDB4ZGUsIDB4M2UsIDB4YmUsIDB4N2UsIDB4ZmUsXG4gICAgICAgIDB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsXG4gICAgICAgIDB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsXG4gICAgICAgIDB4MDksIDB4ODksIDB4NDksIDB4YzksIDB4MjksIDB4YTksIDB4NjksIDB4ZTksXG4gICAgICAgIDB4MTksIDB4OTksIDB4NTksIDB4ZDksIDB4MzksIDB4YjksIDB4NzksIDB4ZjksXG4gICAgICAgIDB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsXG4gICAgICAgIDB4MTUsIDB4OTUsIDB4NTUsIDB4ZDUsIDB4MzUsIDB4YjUsIDB4NzUsIDB4ZjUsXG4gICAgICAgIDB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsXG4gICAgICAgIDB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsXG4gICAgICAgIDB4MDMsIDB4ODMsIDB4NDMsIDB4YzMsIDB4MjMsIDB4YTMsIDB4NjMsIDB4ZTMsXG4gICAgICAgIDB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsXG4gICAgICAgIDB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsXG4gICAgICAgIDB4MWIsIDB4OWIsIDB4NWIsIDB4ZGIsIDB4M2IsIDB4YmIsIDB4N2IsIDB4ZmIsXG4gICAgICAgIDB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsXG4gICAgICAgIDB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsXG4gICAgICAgIDB4MGYsIDB4OGYsIDB4NGYsIDB4Y2YsIDB4MmYsIDB4YWYsIDB4NmYsIDB4ZWYsXG4gICAgICAgIDB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmZcbiAgICBdLFxuICAgIFxuICAgIGNwbGVucyA9IFtcbiAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSxcbiAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDBcbiAgICBdLFxuXG4gICAgY3BsZXh0ID0gW1xuICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLFxuICAgICAgICAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwLCA5OSwgOTlcbiAgICBdLCAvKiA5OT09aW52YWxpZCAqL1xuXG4gICAgY3BkaXN0ID0gW1xuICAgICAgICAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA3LCAweDAwMDksIDB4MDAwZCxcbiAgICAgICAgMHgwMDExLCAweDAwMTksIDB4MDAyMSwgMHgwMDMxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDgxLCAweDAwYzEsXG4gICAgICAgIDB4MDEwMSwgMHgwMTgxLCAweDAyMDEsIDB4MDMwMSwgMHgwNDAxLCAweDA2MDEsIDB4MDgwMSwgMHgwYzAxLFxuICAgICAgICAweDEwMDEsIDB4MTgwMSwgMHgyMDAxLCAweDMwMDEsIDB4NDAwMSwgMHg2MDAxXG4gICAgXSxcblxuICAgIGNwZGV4dCA9IFtcbiAgICAgICAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMiwgIDIsXG4gICAgICAgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LFxuICAgICAgICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCxcbiAgICAgICAgMTEsIDExLCAxMiwgMTIsIDEzLCAxM1xuICAgIF0sXG4gICAgXG4gICAgYm9yZGVyID0gWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdLFxuICAgIFxuICAgIGJBID0gYmFycmF5LFxuXG4gICAgYnl0ZXBvcz0wLFxuICAgIGJpdHBvcz0wLFxuICAgIGJiID0gMSxcbiAgICBiaXRzPTAsXG4gICAgXG4gICAgTkFNRU1BWCA9IDI1NixcbiAgICBcbiAgICBuYW1lQnVmID0gW10sXG4gICAgXG4gICAgZmlsZW91dDtcbiAgICBcbiAgICBmdW5jdGlvbiByZWFkQnl0ZSgpe1xuICAgICAgICBiaXRzKz04O1xuICAgICAgICBpZiAoYnl0ZXBvczxiQS5sZW5ndGgpe1xuICAgICAgICAgICAgLy9pZiAoZGVidWcpXG4gICAgICAgICAgICAvLyAgICBkb2N1bWVudC53cml0ZShieXRlcG9zK1wiOiBcIitiQVtieXRlcG9zXStcIjxicj5cIik7XG4gICAgICAgICAgICByZXR1cm4gYkFbYnl0ZXBvcysrXTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGJ5dGVBbGlnbigpe1xuICAgICAgICBiYiA9IDE7XG4gICAgfTtcbiAgICBcbiAgICBmdW5jdGlvbiByZWFkQml0KCl7XG4gICAgICAgIHZhciBjYXJyeTtcbiAgICAgICAgYml0cysrO1xuICAgICAgICBjYXJyeSA9IChiYiAmIDEpO1xuICAgICAgICBiYiA+Pj0gMTtcbiAgICAgICAgaWYgKGJiPT0wKXtcbiAgICAgICAgICAgIGJiID0gcmVhZEJ5dGUoKTtcbiAgICAgICAgICAgIGNhcnJ5ID0gKGJiICYgMSk7XG4gICAgICAgICAgICBiYiA9IChiYj4+MSkgfCAweDgwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYXJyeTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVhZEJpdHMoYSkge1xuICAgICAgICB2YXIgcmVzID0gMCxcbiAgICAgICAgICAgIGkgPSBhO1xuICAgIFxuICAgICAgICB3aGlsZShpLS0pIHtcbiAgICAgICAgICAgIHJlcyA9IChyZXM8PDEpIHwgcmVhZEJpdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGEpIHtcbiAgICAgICAgICAgIHJlcyA9IGJpdFJldmVyc2VbcmVzXT4+KDgtYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgICAgICBcbiAgICBmdW5jdGlvbiBmbHVzaEJ1ZmZlcigpe1xuICAgICAgICAvL2RvY3VtZW50LndyaXRlKCdGTFVTSEJVRkZFUjonK2J1ZjMyayk7XG4gICAgICAgIGJJZHggPSAwO1xuICAgIH07XG4gICAgZnVuY3Rpb24gYWRkQnVmZmVyKGEpe1xuICAgICAgICBTSVpFKys7XG4gICAgICAgIC8vQ1JDPXVwZGNyYyhhLGNyYyk7XG4gICAgICAgIGJ1ZjMya1tiSWR4KytdID0gYTtcbiAgICAgICAgb3V0cHV0QXJyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhKSk7XG4gICAgICAgIC8vb3V0cHV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO1xuICAgICAgICBpZihiSWR4PT0weDgwMDApe1xuICAgICAgICAgICAgLy9kb2N1bWVudC53cml0ZSgnQUREQlVGRkVSOicrYnVmMzJrKTtcbiAgICAgICAgICAgIGJJZHg9MDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgZnVuY3Rpb24gSHVmTm9kZSgpIHtcbiAgICAgICAgdGhpcy5iMD0wO1xuICAgICAgICB0aGlzLmIxPTA7XG4gICAgICAgIHRoaXMuanVtcCA9IG51bGw7XG4gICAgICAgIHRoaXMuanVtcHBvcyA9IC0xO1xuICAgIH07XG5cbiAgICB2YXIgTElURVJBTFMgPSAyODg7XG4gICAgXG4gICAgdmFyIGxpdGVyYWxUcmVlID0gbmV3IEFycmF5KExJVEVSQUxTKTtcbiAgICB2YXIgZGlzdGFuY2VUcmVlID0gbmV3IEFycmF5KDMyKTtcbiAgICB2YXIgdHJlZXBvcz0wO1xuICAgIHZhciBQbGFjZXMgPSBudWxsO1xuICAgIHZhciBQbGFjZXMyID0gbnVsbDtcbiAgICBcbiAgICB2YXIgaW1wRGlzdGFuY2VUcmVlID0gbmV3IEFycmF5KDY0KTtcbiAgICB2YXIgaW1wTGVuZ3RoVHJlZSA9IG5ldyBBcnJheSg2NCk7XG4gICAgXG4gICAgdmFyIGxlbiA9IDA7XG4gICAgdmFyIGZwb3MgPSBuZXcgQXJyYXkoMTcpO1xuICAgIGZwb3NbMF09MDtcbiAgICB2YXIgZmxlbnM7XG4gICAgdmFyIGZtYXg7XG4gICAgXG4gICAgZnVuY3Rpb24gSXNQYXQoKSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBpZiAoZnBvc1tsZW5dID49IGZtYXgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKGZsZW5zW2Zwb3NbbGVuXV0gPT0gbGVuKVxuICAgICAgICAgICAgICAgIHJldHVybiBmcG9zW2xlbl0rKztcbiAgICAgICAgICAgIGZwb3NbbGVuXSsrO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFJlYygpIHtcbiAgICAgICAgdmFyIGN1cnBsYWNlID0gUGxhY2VzW3RyZWVwb3NdO1xuICAgICAgICB2YXIgdG1wO1xuICAgICAgICBpZiAoZGVidWcpXG4gICAgXHRcdGRvY3VtZW50LndyaXRlKFwiPGJyPmxlbjpcIitsZW4rXCIgdHJlZXBvczpcIit0cmVlcG9zKTtcbiAgICAgICAgaWYobGVuPT0xNykgeyAvL3dhciAxN1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHRyZWVwb3MrKztcbiAgICAgICAgbGVuKys7XG4gICAgXHRcbiAgICAgICAgdG1wID0gSXNQYXQoKTtcbiAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPklzUGF0IFwiK3RtcCk7XG4gICAgICAgIGlmKHRtcCA+PSAwKSB7XG4gICAgICAgICAgICBjdXJwbGFjZS5iMCA9IHRtcDsgICAgLyogbGVhZiBjZWxsIGZvciAwLWJpdCAqL1xuICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcIjxicj5iMCBcIitjdXJwbGFjZS5iMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIE5vdCBhIExlYWYgY2VsbCAqL1xuICAgICAgICBjdXJwbGFjZS5iMCA9IDB4ODAwMDtcbiAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPmIwIFwiK2N1cnBsYWNlLmIwKTtcbiAgICAgICAgaWYoUmVjKCkpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdG1wID0gSXNQYXQoKTtcbiAgICAgICAgaWYodG1wID49IDApIHtcbiAgICAgICAgICAgIGN1cnBsYWNlLmIxID0gdG1wOyAgICAvKiBsZWFmIGNlbGwgZm9yIDEtYml0ICovXG4gICAgICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPmIxIFwiK2N1cnBsYWNlLmIxKTtcbiAgICAgICAgICAgIGN1cnBsYWNlLmp1bXAgPSBudWxsOyAgICAvKiBKdXN0IGZvciB0aGUgZGlzcGxheSByb3V0aW5lICovXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBOb3QgYSBMZWFmIGNlbGwgKi9cbiAgICAgICAgICAgIGN1cnBsYWNlLmIxID0gMHg4MDAwO1xuICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcIjxicj5iMSBcIitjdXJwbGFjZS5iMSk7XG4gICAgICAgICAgICBjdXJwbGFjZS5qdW1wID0gUGxhY2VzW3RyZWVwb3NdO1xuICAgICAgICAgICAgY3VycGxhY2UuanVtcHBvcyA9IHRyZWVwb3M7XG4gICAgICAgICAgICBpZihSZWMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgbGVuLS07XG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDcmVhdGVUcmVlKGN1cnJlbnRUcmVlLCBudW12YWwsIGxlbmd0aHMsIHNob3cpIHtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIC8qIENyZWF0ZSB0aGUgSHVmZm1hbiBkZWNvZGUgdHJlZS90YWJsZSAqL1xuICAgICAgICAvL2RvY3VtZW50LndyaXRlKFwiPGJyPmNyZWF0ZXRyZWU8YnI+XCIpO1xuICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCJjdXJyZW50VHJlZSBcIitjdXJyZW50VHJlZStcIiBudW12YWwgXCIrbnVtdmFsK1wiIGxlbmd0aHMgXCIrbGVuZ3RocytcIiBzaG93IFwiK3Nob3cpO1xuICAgICAgICBQbGFjZXMgPSBjdXJyZW50VHJlZTtcbiAgICAgICAgdHJlZXBvcz0wO1xuICAgICAgICBmbGVucyA9IGxlbmd0aHM7XG4gICAgICAgIGZtYXggID0gbnVtdmFsO1xuICAgICAgICBmb3IgKGk9MDtpPDE3O2krKylcbiAgICAgICAgICAgIGZwb3NbaV0gPSAwO1xuICAgICAgICBsZW4gPSAwO1xuICAgICAgICBpZihSZWMoKSkge1xuICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZGVyciwgXCJpbnZhbGlkIGh1ZmZtYW4gdHJlZVxcblwiKTtcbiAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgIFx0YWxlcnQoXCJpbnZhbGlkIGh1ZmZtYW4gdHJlZVxcblwiKTtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVidWcpe1xuICAgICAgICBcdGRvY3VtZW50LndyaXRlKCc8YnI+VHJlZTogJytQbGFjZXMubGVuZ3RoKTtcbiAgICAgICAgXHRmb3IgKHZhciBhPTA7YTwzMjthKyspe1xuICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcIlBsYWNlc1tcIithK1wiXS5iMD1cIitQbGFjZXNbYV0uYjArXCI8YnI+XCIpO1xuICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcIlBsYWNlc1tcIithK1wiXS5iMT1cIitQbGFjZXNbYV0uYjErXCI8YnI+XCIpO1xuICAgICAgICBcdH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICAvKmlmKHNob3cpIHtcbiAgICAgICAgICAgIHZhciB0bXA7XG4gICAgICAgICAgICBmb3IodG1wPWN1cnJlbnRUcmVlO3RtcDxQbGFjZXM7dG1wKyspIHtcbiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgXCIweCUwM3ggIDB4JTAzeCAoMHglMDR4KVwiLHRtcC1jdXJyZW50VHJlZSwgdG1wLT5qdW1wP3RtcC0+anVtcC1jdXJyZW50VHJlZTowLCh0bXAtPmp1bXA/dG1wLT5qdW1wLWN1cnJlbnRUcmVlOjApKjYrMHhjZjApO1xuICAgICAgICAgICAgICAgIGlmKCEodG1wLmIwICYgMHg4MDAwKSkge1xuICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCBcIiAgMHglMDN4ICglYylcIiwgdG1wLT5iMCwodG1wLT5iMDwyNTYgJiYgaXNwcmludCh0bXAtPmIwKSk/dG1wLT5iMDon77+9Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKCEodG1wLmIxICYgMHg4MDAwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZigodG1wLmIwICYgMHg4MDAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCBcIiAgICAgICAgICAgXCIpO1xuICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgXCIgIDB4JTAzeCAoJWMpXCIsIHRtcC0+YjEsKHRtcC0+YjE8MjU2ICYmIGlzcHJpbnQodG1wLT5iMSkpP3RtcC0+YjE6J++/vScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgXCJcXG5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0qL1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuICAgIFxuICAgIGZ1bmN0aW9uIERlY29kZVZhbHVlKGN1cnJlbnRUcmVlKSB7XG4gICAgICAgIHZhciBsZW4sIGksXG4gICAgICAgICAgICB4dHJlZXBvcz0wLFxuICAgICAgICAgICAgWCA9IGN1cnJlbnRUcmVlW3h0cmVlcG9zXSxcbiAgICAgICAgICAgIGI7XG5cbiAgICAgICAgLyogZGVjb2RlIG9uZSBzeW1ib2wgb2YgdGhlIGRhdGEgKi9cbiAgICAgICAgd2hpbGUoMSkge1xuICAgICAgICAgICAgYj1yZWFkQml0KCk7XG4gICAgICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiYj1cIitiKTtcbiAgICAgICAgICAgIGlmKGIpIHtcbiAgICAgICAgICAgICAgICBpZighKFguYjEgJiAweDgwMDApKXtcbiAgICAgICAgICAgICAgICBcdGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcInJldDFcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBYLmIxOyAgICAvKiBJZiBsZWFmIG5vZGUsIHJldHVybiBkYXRhICovXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFggPSBYLmp1bXA7XG4gICAgICAgICAgICAgICAgbGVuID0gY3VycmVudFRyZWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8bGVuO2krKyl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VHJlZVtpXT09PVgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgeHRyZWVwb3M9aTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8veHRyZWVwb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYoIShYLmIwICYgMHg4MDAwKSl7XG4gICAgICAgICAgICAgICAgXHRpZiAoZGVidWcpXG4gICAgICAgICAgICAgICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCJyZXQyXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWC5iMDsgICAgLyogSWYgbGVhZiBub2RlLCByZXR1cm4gZGF0YSAqL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1grKzsgLy8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9cbiAgICAgICAgICAgICAgICB4dHJlZXBvcysrO1xuICAgICAgICAgICAgICAgIFggPSBjdXJyZW50VHJlZVt4dHJlZXBvc107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwicmV0M1wiKTtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gICAgXG4gICAgZnVuY3Rpb24gRGVmbGF0ZUxvb3AoKSB7XG4gICAgdmFyIGxhc3QsIGMsIHR5cGUsIGksIGxlbjtcblxuICAgIGRvIHtcbiAgICAgICAgLyppZigobGFzdCA9IHJlYWRCaXQoKSkpe1xuICAgICAgICAgICAgZnByaW50ZihlcnJmcCwgXCJMYXN0IEJsb2NrOiBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcHJpbnRmKGVycmZwLCBcIk5vdCBMYXN0IEJsb2NrOiBcIik7XG4gICAgICAgIH0qL1xuICAgICAgICBsYXN0ID0gcmVhZEJpdCgpO1xuICAgICAgICB0eXBlID0gcmVhZEJpdHMoMik7XG4gICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBcdGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICBcdGFsZXJ0KFwiU3RvcmVkXFxuXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgXHRpZiAoZGVidWcpXG4gICAgICAgICAgICAgICAgXHRhbGVydChcIkZpeGVkIEh1ZmZtYW4gY29kZXNcXG5cIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBcdGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICBcdGFsZXJ0KFwiRHluYW1pYyBIdWZmbWFuIGNvZGVzXFxuXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgXHRpZiAoZGVidWcpXG4gICAgICAgICAgICAgICAgXHRhbGVydChcIlJlc2VydmVkIGJsb2NrIHR5cGUhIVxcblwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBcdGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICBcdGFsZXJ0KFwiVW5leHBlY3RlZCB2YWx1ZSAlZCFcXG5cIiwgdHlwZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlPT0wKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2tMZW4sIGNTdW07XG5cbiAgICAgICAgICAgIC8vIFN0b3JlZCBcbiAgICAgICAgICAgIGJ5dGVBbGlnbigpO1xuICAgICAgICAgICAgYmxvY2tMZW4gPSByZWFkQnl0ZSgpO1xuICAgICAgICAgICAgYmxvY2tMZW4gfD0gKHJlYWRCeXRlKCk8PDgpO1xuXG4gICAgICAgICAgICBjU3VtID0gcmVhZEJ5dGUoKTtcbiAgICAgICAgICAgIGNTdW0gfD0gKHJlYWRCeXRlKCk8PDgpO1xuXG4gICAgICAgICAgICBpZigoKGJsb2NrTGVuIF4gfmNTdW0pICYgMHhmZmZmKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKFwiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcXG5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZShibG9ja0xlbi0tKSB7XG4gICAgICAgICAgICAgICAgYyA9IHJlYWRCeXRlKCk7XG4gICAgICAgICAgICAgICAgYWRkQnVmZmVyKGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYodHlwZT09MSkge1xuICAgICAgICAgICAgdmFyIGo7XG5cbiAgICAgICAgICAgIC8qIEZpeGVkIEh1ZmZtYW4gdGFibGVzIC0tIGZpeGVkIGRlY29kZSByb3V0aW5lICovXG4gICAgICAgICAgICB3aGlsZSgxKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIDI1NiAgICAwMDAwMDAwICAgICAgICAwXG4gICAgICAgICAgICAgICAgOiAgIDogICAgIDpcbiAgICAgICAgICAgICAgICAyNzkgICAgMDAxMDExMSAgICAgICAgMjNcbiAgICAgICAgICAgICAgICAwICAgMDAxMTAwMDAgICAgNDhcbiAgICAgICAgICAgICAgICA6ICAgIDogICAgICA6XG4gICAgICAgICAgICAgICAgMTQzICAgIDEwMTExMTExICAgIDE5MVxuICAgICAgICAgICAgICAgIDI4MCAxMTAwMDAwMCAgICAxOTJcbiAgICAgICAgICAgICAgICA6ICAgIDogICAgICA6XG4gICAgICAgICAgICAgICAgMjg3IDExMDAwMTExICAgIDE5OVxuICAgICAgICAgICAgICAgIDE0NCAgICAxMTAwMTAwMDAgICAgNDAwXG4gICAgICAgICAgICAgICAgOiAgICA6ICAgICAgIDpcbiAgICAgICAgICAgICAgICAyNTUgICAgMTExMTExMTExICAgIDUxMVxuICAgIFxuICAgICAgICAgICAgICAgIE5vdGUgdGhlIGJpdCBvcmRlciFcbiAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICBqID0gKGJpdFJldmVyc2VbcmVhZEJpdHMoNyldPj4xKTtcbiAgICAgICAgICAgIGlmKGogPiAyMykge1xuICAgICAgICAgICAgICAgIGogPSAoajw8MSkgfCByZWFkQml0KCk7ICAgIC8qIDQ4Li4yNTUgKi9cblxuICAgICAgICAgICAgICAgIGlmKGogPiAxOTkpIHsgICAgLyogMjAwLi4yNTUgKi9cbiAgICAgICAgICAgICAgICAgICAgaiAtPSAxMjg7ICAgIC8qICA3Mi4uMTI3ICovXG4gICAgICAgICAgICAgICAgICAgIGogPSAoajw8MSkgfCByZWFkQml0KCk7ICAgICAgICAvKiAxNDQuLjI1NSA8PCAqL1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiAgNDguLjE5OSAqL1xuICAgICAgICAgICAgICAgICAgICBqIC09IDQ4OyAgICAvKiAgIDAuLjE1MSAqL1xuICAgICAgICAgICAgICAgICAgICBpZihqID4gMTQzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqID0gaisxMzY7ICAgIC8qIDI4MC4uMjg3IDw8ICovXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDAuLjE0MyA8PCAqL1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgICAgLyogICAwLi4yMyAqL1xuICAgICAgICAgICAgICAgIGogKz0gMjU2OyAgICAvKiAyNTYuLjI3OSA8PCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoaiA8IDI1Nikge1xuICAgICAgICAgICAgICAgIGFkZEJ1ZmZlcihqKTtcbiAgICAgICAgICAgICAgICAvL2RvY3VtZW50LndyaXRlKFwib3V0OlwiK1N0cmluZy5mcm9tQ2hhckNvZGUoaikpO1xuICAgICAgICAgICAgICAgIC8qZnByaW50ZihlcnJmcCwgXCJAJWQgJTAyeFxcblwiLCBTSVpFLCBqKTsqL1xuICAgICAgICAgICAgfSBlbHNlIGlmKGogPT0gMjU2KSB7XG4gICAgICAgICAgICAgICAgLyogRU9GICovXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBsZW4sIGRpc3Q7XG5cbiAgICAgICAgICAgICAgICBqIC09IDI1NiArIDE7ICAgIC8qIGJ5dGVzICsgRU9GICovXG4gICAgICAgICAgICAgICAgbGVuID0gcmVhZEJpdHMoY3BsZXh0W2pdKSArIGNwbGVuc1tqXTtcblxuICAgICAgICAgICAgICAgIGogPSBiaXRSZXZlcnNlW3JlYWRCaXRzKDUpXT4+MztcbiAgICAgICAgICAgICAgICBpZihjcGRleHRbal0gPiA4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3QgPSByZWFkQml0cyg4KTtcbiAgICAgICAgICAgICAgICAgICAgZGlzdCB8PSAocmVhZEJpdHMoY3BkZXh0W2pdLTgpPDw4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkaXN0ID0gcmVhZEJpdHMoY3BkZXh0W2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlzdCArPSBjcGRpc3Rbal07XG5cbiAgICAgICAgICAgICAgICAvKmZwcmludGYoZXJyZnAsIFwiQCVkIChsJTAyeCxkJTA0eClcXG5cIiwgU0laRSwgbGVuLCBkaXN0KTsqL1xuICAgICAgICAgICAgICAgIGZvcihqPTA7ajxsZW47aisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gYnVmMzJrWyhiSWR4IC0gZGlzdCkgJiAweDdmZmZdO1xuICAgICAgICAgICAgICAgICAgICBhZGRCdWZmZXIoYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyB3aGlsZVxuICAgICAgICB9IGVsc2UgaWYodHlwZT09Mikge1xuICAgICAgICAgICAgdmFyIGosIG4sIGxpdGVyYWxDb2RlcywgZGlzdENvZGVzLCBsZW5Db2RlcztcbiAgICAgICAgICAgIHZhciBsbCA9IG5ldyBBcnJheSgyODgrMzIpOyAgICAvLyBcInN0YXRpY1wiIGp1c3QgdG8gcHJlc2VydmUgc3RhY2tcbiAgICBcbiAgICAgICAgICAgIC8vIER5bmFtaWMgSHVmZm1hbiB0YWJsZXMgXG4gICAgXG4gICAgICAgICAgICBsaXRlcmFsQ29kZXMgPSAyNTcgKyByZWFkQml0cyg1KTtcbiAgICAgICAgICAgIGRpc3RDb2RlcyA9IDEgKyByZWFkQml0cyg1KTtcbiAgICAgICAgICAgIGxlbkNvZGVzID0gNCArIHJlYWRCaXRzKDQpO1xuICAgICAgICAgICAgLy9kb2N1bWVudC53cml0ZShcIjxicj5wYXJhbTogXCIrbGl0ZXJhbENvZGVzK1wiIFwiK2Rpc3RDb2RlcytcIiBcIitsZW5Db2RlcytcIjxicj5cIik7XG4gICAgICAgICAgICBmb3Ioaj0wOyBqPDE5OyBqKyspIHtcbiAgICAgICAgICAgICAgICBsbFtqXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGRlY29kZSB0cmVlIGNvZGUgbGVuZ3Roc1xuICAgIFxuICAgICAgICAgICAgLy9kb2N1bWVudC53cml0ZShcIjxicj5cIik7XG4gICAgICAgICAgICBmb3Ioaj0wOyBqPGxlbkNvZGVzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBsbFtib3JkZXJbal1dID0gcmVhZEJpdHMoMyk7XG4gICAgICAgICAgICAgICAgLy9kb2N1bWVudC53cml0ZShsbFtib3JkZXJbal1dK1wiIFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vZnByaW50ZihlcnJmcCwgXCJcXG5cIik7XG4gICAgICAgICAgICAvL2RvY3VtZW50LndyaXRlKCc8YnI+bGw6JytsbCk7XG4gICAgICAgICAgICBsZW4gPSBkaXN0YW5jZVRyZWUubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspXG4gICAgICAgICAgICAgICAgZGlzdGFuY2VUcmVlW2ldPW5ldyBIdWZOb2RlKCk7XG4gICAgICAgICAgICBpZihDcmVhdGVUcmVlKGRpc3RhbmNlVHJlZSwgMTksIGxsLCAwKSkge1xuICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVidWcpe1xuICAgICAgICAgICAgXHRkb2N1bWVudC53cml0ZShcIjxicj5kaXN0YW5jZVRyZWVcIik7XG4gICAgICAgICAgICBcdGZvcih2YXIgYT0wO2E8ZGlzdGFuY2VUcmVlLmxlbmd0aDthKyspe1xuICAgICAgICAgICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+XCIrZGlzdGFuY2VUcmVlW2FdLmIwK1wiIFwiK2Rpc3RhbmNlVHJlZVthXS5iMStcIiBcIitkaXN0YW5jZVRyZWVbYV0uanVtcCtcIiBcIitkaXN0YW5jZVRyZWVbYV0uanVtcHBvcyk7XG4gICAgICAgICAgICAgICAgXHQvKmlmIChkaXN0YW5jZVRyZWVbYV0uanVtcHBvcyE9LTEpXG4gICAgICAgICAgICAgICAgICAgIFx0ZG9jdW1lbnQud3JpdGUoXCIgXCIrZGlzdGFuY2VUcmVlW2FdLmp1bXAuYjArXCIgXCIrZGlzdGFuY2VUcmVlW2FdLmp1bXAuYjEpO1xuICAgICAgICAgICAgICAgIFx0Ki9cbiAgICAgICAgICAgIFx0fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9kb2N1bWVudC53cml0ZSgnPEJSPnRyZWUgY3JlYXRlZCcpO1xuICAgIFxuICAgICAgICAgICAgLy9yZWFkIGluIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3Roc1xuICAgICAgICAgICAgbiA9IGxpdGVyYWxDb2RlcyArIGRpc3RDb2RlcztcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgdmFyIHo9LTE7XG4gICAgICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPm49XCIrbitcIiBiaXRzOiBcIitiaXRzK1wiPGJyPlwiKTtcbiAgICAgICAgICAgIHdoaWxlKGkgPCBuKSB7XG4gICAgICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgICAgIGogPSBEZWNvZGVWYWx1ZShkaXN0YW5jZVRyZWUpO1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICBcdGRvY3VtZW50LndyaXRlKFwiPGJyPlwiK3orXCIgaTpcIitpK1wiIGRlY29kZTogXCIraitcIiAgICBiaXRzIFwiK2JpdHMrXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGlmKGo8MTYpIHsgICAgLy8gbGVuZ3RoIG9mIGNvZGUgaW4gYml0cyAoMC4uMTUpXG4gICAgICAgICAgICAgICAgICAgICAgIGxsW2krK10gPSBqO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZihqPT0xNikgeyAgICAvLyByZXBlYXQgbGFzdCBsZW5ndGggMyB0byA2IHRpbWVzIFxuICAgICAgICAgICAgICAgICAgICAgICB2YXIgbDtcbiAgICAgICAgICAgICAgICAgICAgaiA9IDMgKyByZWFkQml0cygyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoaStqID4gbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGwgPSBpID8gbGxbaS0xXSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlKGotLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGxbaSsrXSA9IGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZihqPT0xNykgeyAgICAgICAgLy8gMyB0byAxMCB6ZXJvIGxlbmd0aCBjb2Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDMgKyByZWFkQml0cygzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgIC8vIGogPT0gMTg6IDExIHRvIDEzOCB6ZXJvIGxlbmd0aCBjb2RlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPSAxMSArIHJlYWRCaXRzKDcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKGkraiA+IG4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3aGlsZShqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxsW2krK10gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLypmb3Ioaj0wOyBqPGxpdGVyYWxDb2RlcytkaXN0Q29kZXM7IGorKykge1xuICAgICAgICAgICAgICAgIC8vZnByaW50ZihlcnJmcCwgXCIlZCBcIiwgbGxbal0pO1xuICAgICAgICAgICAgICAgIGlmICgoaiY3KT09NylcbiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihlcnJmcCwgXCJcXG5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcHJpbnRmKGVycmZwLCBcIlxcblwiKTsqL1xuICAgICAgICAgICAgLy8gQ2FuIG92ZXJ3cml0ZSB0cmVlIGRlY29kZSB0cmVlIGFzIGl0IGlzIG5vdCB1c2VkIGFueW1vcmVcbiAgICAgICAgICAgIGxlbiA9IGxpdGVyYWxUcmVlLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKVxuICAgICAgICAgICAgICAgIGxpdGVyYWxUcmVlW2ldPW5ldyBIdWZOb2RlKCk7XG4gICAgICAgICAgICBpZihDcmVhdGVUcmVlKGxpdGVyYWxUcmVlLCBsaXRlcmFsQ29kZXMsIGxsLCAwKSkge1xuICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZW4gPSBsaXRlcmFsVHJlZS5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKylcbiAgICAgICAgICAgICAgICBkaXN0YW5jZVRyZWVbaV09bmV3IEh1Zk5vZGUoKTtcbiAgICAgICAgICAgIHZhciBsbDIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGZvciAoaT1saXRlcmFsQ29kZXM7IGkgPGxsLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBsbDJbaS1saXRlcmFsQ29kZXNdPWxsW2ldO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIGlmKENyZWF0ZVRyZWUoZGlzdGFuY2VUcmVlLCBkaXN0Q29kZXMsIGxsMiwgMCkpIHtcbiAgICAgICAgICAgICAgICBmbHVzaEJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICBcdFx0ZG9jdW1lbnQud3JpdGUoXCI8YnI+bGl0ZXJhbFRyZWVcIik7XG4gICAgICAgICAgICBvdXRlcjpcbiAgICAgICAgICAgIHdoaWxlKDEpIHtcbiAgICAgICAgICAgICAgICBqID0gRGVjb2RlVmFsdWUobGl0ZXJhbFRyZWUpO1xuICAgICAgICAgICAgICAgIGlmKGogPj0gMjU2KSB7ICAgICAgICAvLyBJbiBDNjQ6IGlmIGNhcnJ5IHNldFxuICAgICAgICAgICAgICAgICAgICB2YXIgbGVuLCBkaXN0O1xuICAgICAgICAgICAgICAgICAgICBqIC09IDI1NjtcbiAgICAgICAgICAgICAgICAgICAgaWYoaiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFT0ZcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVhZEJpdHMoY3BsZXh0W2pdKSArIGNwbGVuc1tqXTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgaiA9IERlY29kZVZhbHVlKGRpc3RhbmNlVHJlZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGNwZGV4dFtqXSA+IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSByZWFkQml0cyg4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgfD0gKHJlYWRCaXRzKGNwZGV4dFtqXS04KTw8OCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID0gcmVhZEJpdHMoY3BkZXh0W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IGNwZGlzdFtqXTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUobGVuLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJJZHggLSBkaXN0IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBidWYzMmtbKGJJZHggLSBkaXN0KSAmIDB4N2ZmZl07XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRCdWZmZXIoYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGRCdWZmZXIoaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSB3aGlsZSghbGFzdCk7XG4gICAgZmx1c2hCdWZmZXIoKTtcblxuICAgIGJ5dGVBbGlnbigpO1xuICAgIHJldHVybiAwO1xufTtcblxuSlhHLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaTtcblx0dGhpcy51bnppcCgpO1xuXHQvL2FsZXJ0KHVuemlwcGVkWzBdWzFdKTtcblx0Zm9yIChpPTA7aTx1bnppcHBlZC5sZW5ndGg7aSsrKXtcblx0XHRpZih1bnppcHBlZFtpXVsxXT09bmFtZSkge1xuXHRcdFx0cmV0dXJuIHVuemlwcGVkW2ldWzBdO1xuXHRcdH1cblx0fVxuXHRcbiAgfTtcblxuSlhHLlV0aWwuVW56aXAucHJvdG90eXBlLmRlZmxhdGUgPSBmdW5jdGlvbigpIHtcbiAgICBvdXRwdXRBcnIgPSBbXTtcbiAgICB2YXIgdG1wID0gW107XG4gICAgbW9kZVpJUCA9IGZhbHNlO1xuICAgIERlZmxhdGVMb29wKCk7XG4gICAgaWYgKGRlYnVnKVxuICAgICAgICBhbGVydChvdXRwdXRBcnIuam9pbignJykpO1xuICAgIHVuemlwcGVkW2ZpbGVzXSA9IG5ldyBBcnJheSgyKTtcbiAgICB1bnppcHBlZFtmaWxlc11bMF0gPSBvdXRwdXRBcnIuam9pbignJyk7XG4gICAgdW56aXBwZWRbZmlsZXNdWzFdID0gXCJERUZMQVRFXCI7XG4gICAgZmlsZXMrKztcbiAgICByZXR1cm4gdW56aXBwZWQ7XG59ICAgIFxuICAgIFxuSlhHLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwID0gZnVuY3Rpb24oKSB7XG5cdC8vY29udmVydFRvQnl0ZUFycmF5KGlucHV0KTtcblx0aWYgKGRlYnVnKVxuXHRcdGFsZXJ0KGJBKTtcblx0Lypmb3IgKGk9MDtpPGJBLmxlbmd0aCo4O2krKyl7XG5cdFx0ZG9jdW1lbnQud3JpdGUocmVhZEJpdCgpKTtcblx0XHRpZiAoKGkrMSklOD09MClcblx0XHRcdGRvY3VtZW50LndyaXRlKFwiIFwiKTtcblx0fSovXG5cdC8qZm9yIChpPTA7aTxiQS5sZW5ndGg7aSsrKXtcblx0XHRkb2N1bWVudC53cml0ZShyZWFkQnl0ZSgpK1wiIFwiKTtcblx0XHRpZiAoKGkrMSklOD09MClcblx0XHRcdGRvY3VtZW50LndyaXRlKFwiIFwiKTtcblx0fVxuXHRmb3IgKGk9MDtpPGJBLmxlbmd0aDtpKyspe1xuXHRcdGRvY3VtZW50LndyaXRlKGJBW2ldK1wiIFwiKTtcblx0XHRpZiAoKGkrMSklMTY9PTApXG5cdFx0XHRkb2N1bWVudC53cml0ZShcIjxicj5cIik7XG5cdH1cdFxuXHQqL1xuXHQvL2FsZXJ0KGJBKTtcblx0bmV4dEZpbGUoKTtcblx0cmV0dXJuIHVuemlwcGVkO1xuICB9O1xuICAgIFxuIGZ1bmN0aW9uIG5leHRGaWxlKCl7XG4gXHRpZiAoZGVidWcpXG4gXHRcdGFsZXJ0KFwiTkVYVEZJTEVcIik7XG4gXHRvdXRwdXRBcnIgPSBbXTtcbiBcdHZhciB0bXAgPSBbXTtcbiBcdG1vZGVaSVAgPSBmYWxzZTtcblx0dG1wWzBdID0gcmVhZEJ5dGUoKTtcblx0dG1wWzFdID0gcmVhZEJ5dGUoKTtcblx0aWYgKGRlYnVnKVxuXHRcdGFsZXJ0KFwidHlwZTogXCIrdG1wWzBdK1wiIFwiK3RtcFsxXSk7XG5cdGlmICh0bXBbMF0gPT0gcGFyc2VJbnQoXCI3OFwiLDE2KSAmJiB0bXBbMV0gPT0gcGFyc2VJbnQoXCJkYVwiLDE2KSl7IC8vR1pJUFxuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGFsZXJ0KFwiR0VPTkV4VC1HWklQXCIpO1xuXHRcdERlZmxhdGVMb29wKCk7XG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQob3V0cHV0QXJyLmpvaW4oJycpKTtcblx0XHR1bnppcHBlZFtmaWxlc10gPSBuZXcgQXJyYXkoMik7XG4gICAgXHR1bnppcHBlZFtmaWxlc11bMF0gPSBvdXRwdXRBcnIuam9pbignJyk7XG4gICAgXHR1bnppcHBlZFtmaWxlc11bMV0gPSBcImdlb25leHQuZ3h0XCI7XG4gICAgXHRmaWxlcysrO1xuXHR9XG5cdGlmICh0bXBbMF0gPT0gcGFyc2VJbnQoXCI3OFwiLDE2KSAmJiB0bXBbMV0gPT0gcGFyc2VJbnQoXCI5Y1wiLDE2KSl7IC8vWkxJQlxuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGFsZXJ0KFwiWkxJQlwiKTtcblx0XHREZWZsYXRlTG9vcCgpO1xuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGFsZXJ0KG91dHB1dEFyci5qb2luKCcnKSk7XG5cdFx0dW56aXBwZWRbZmlsZXNdID0gbmV3IEFycmF5KDIpO1xuICAgIFx0dW56aXBwZWRbZmlsZXNdWzBdID0gb3V0cHV0QXJyLmpvaW4oJycpO1xuICAgIFx0dW56aXBwZWRbZmlsZXNdWzFdID0gXCJaTElCXCI7XG4gICAgXHRmaWxlcysrO1xuXHR9XG5cdGlmICh0bXBbMF0gPT0gcGFyc2VJbnQoXCIxZlwiLDE2KSAmJiB0bXBbMV0gPT0gcGFyc2VJbnQoXCI4YlwiLDE2KSl7IC8vR1pJUFxuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGFsZXJ0KFwiR1pJUFwiKTtcblx0XHQvL0RlZmxhdGVMb29wKCk7XG5cdFx0c2tpcGRpcigpO1xuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGFsZXJ0KG91dHB1dEFyci5qb2luKCcnKSk7XG5cdFx0dW56aXBwZWRbZmlsZXNdID0gbmV3IEFycmF5KDIpO1xuICAgIFx0dW56aXBwZWRbZmlsZXNdWzBdID0gb3V0cHV0QXJyLmpvaW4oJycpO1xuICAgIFx0dW56aXBwZWRbZmlsZXNdWzFdID0gXCJmaWxlXCI7XG4gICAgXHRmaWxlcysrO1xuXHR9XG5cdGlmICh0bXBbMF0gPT0gcGFyc2VJbnQoXCI1MFwiLDE2KSAmJiB0bXBbMV0gPT0gcGFyc2VJbnQoXCI0YlwiLDE2KSl7IC8vWklQXG5cdFx0bW9kZVpJUCA9IHRydWU7XG5cdFx0dG1wWzJdID0gcmVhZEJ5dGUoKTtcblx0XHR0bXBbM10gPSByZWFkQnl0ZSgpO1xuXHRcdGlmICh0bXBbMl0gPT0gcGFyc2VJbnQoXCIzXCIsMTYpICYmIHRtcFszXSA9PSBwYXJzZUludChcIjRcIiwxNikpe1xuXHRcdFx0Ly9NT0RFX1pJUFxuXHRcdFx0dG1wWzBdID0gcmVhZEJ5dGUoKTtcblx0XHRcdHRtcFsxXSA9IHJlYWRCeXRlKCk7XG5cdFx0XHRpZiAoZGVidWcpXG5cdFx0XHRcdGFsZXJ0KFwiWklQLVZlcnNpb246IFwiK3RtcFsxXStcIiBcIit0bXBbMF0vMTArXCIuXCIrdG1wWzBdJTEwKTtcblx0XHRcdFxuXHRcdFx0Z3BmbGFncyA9IHJlYWRCeXRlKCk7XG5cdFx0XHRncGZsYWdzIHw9IChyZWFkQnl0ZSgpPDw4KTtcblx0XHRcdGlmIChkZWJ1Zylcblx0XHRcdFx0YWxlcnQoXCJncGZsYWdzOiBcIitncGZsYWdzKTtcblx0XHRcdFxuXHRcdFx0dmFyIG1ldGhvZCA9IHJlYWRCeXRlKCk7XG5cdFx0XHRtZXRob2QgfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdFx0aWYgKGRlYnVnKVxuXHRcdFx0XHRhbGVydChcIm1ldGhvZDogXCIrbWV0aG9kKTtcblx0XHRcdFxuXHRcdFx0cmVhZEJ5dGUoKTtcblx0XHRcdHJlYWRCeXRlKCk7XG5cdFx0XHRyZWFkQnl0ZSgpO1xuXHRcdFx0cmVhZEJ5dGUoKTtcblx0XHRcdFxuXHRcdFx0dmFyIGNyYyA9IHJlYWRCeXRlKCk7XG5cdFx0XHRjcmMgfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdFx0Y3JjIHw9IChyZWFkQnl0ZSgpPDwxNik7XG5cdFx0XHRjcmMgfD0gKHJlYWRCeXRlKCk8PDI0KTtcblx0XHRcdFxuXHRcdFx0dmFyIGNvbXBTaXplID0gcmVhZEJ5dGUoKTtcblx0XHRcdGNvbXBTaXplIHw9IChyZWFkQnl0ZSgpPDw4KTtcblx0XHRcdGNvbXBTaXplIHw9IChyZWFkQnl0ZSgpPDwxNik7XG5cdFx0XHRjb21wU2l6ZSB8PSAocmVhZEJ5dGUoKTw8MjQpO1xuXHRcdFx0XG5cdFx0XHR2YXIgc2l6ZSA9IHJlYWRCeXRlKCk7XG5cdFx0XHRzaXplIHw9IChyZWFkQnl0ZSgpPDw4KTtcblx0XHRcdHNpemUgfD0gKHJlYWRCeXRlKCk8PDE2KTtcblx0XHRcdHNpemUgfD0gKHJlYWRCeXRlKCk8PDI0KTtcblx0XHRcdFxuXHRcdFx0aWYgKGRlYnVnKVxuXHRcdFx0XHRhbGVydChcImxvY2FsIENSQzogXCIrY3JjK1wiXFxubG9jYWwgU2l6ZTogXCIrc2l6ZStcIlxcbmxvY2FsIENvbXBTaXplOiBcIitjb21wU2l6ZSk7XG5cdFx0XHRcblx0XHRcdHZhciBmaWxlbGVuID0gcmVhZEJ5dGUoKTtcblx0XHRcdGZpbGVsZW4gfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdFx0XG5cdFx0XHR2YXIgZXh0cmFsZW4gPSByZWFkQnl0ZSgpO1xuXHRcdFx0ZXh0cmFsZW4gfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRcdFx0XG5cdFx0XHRpZiAoZGVidWcpXG5cdFx0XHRcdGFsZXJ0KFwiZmlsZWxlbiBcIitmaWxlbGVuKTtcblx0XHRcdGkgPSAwO1xuXHRcdFx0bmFtZUJ1ZiA9IFtdO1xuXHRcdFx0d2hpbGUgKGZpbGVsZW4tLSl7IFxuXHRcdFx0XHR2YXIgYyA9IHJlYWRCeXRlKCk7XG5cdFx0XHRcdGlmIChjID09IFwiL1wiIHwgYyA9PVwiOlwiKXtcblx0XHRcdFx0XHRpID0gMDtcblx0XHRcdFx0fSBlbHNlIGlmIChpIDwgTkFNRU1BWC0xKVxuXHRcdFx0XHRcdG5hbWVCdWZbaSsrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZGVidWcpXG5cdFx0XHRcdGFsZXJ0KFwibmFtZUJ1ZjogXCIrbmFtZUJ1Zik7XG5cdFx0XHRcblx0XHRcdC8vbmFtZUJ1ZltpXSA9IFwiXFwwXCI7XG5cdFx0XHRpZiAoIWZpbGVvdXQpXG5cdFx0XHRcdGZpbGVvdXQgPSBuYW1lQnVmO1xuXHRcdFx0XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHR3aGlsZSAoaSA8IGV4dHJhbGVuKXtcblx0XHRcdFx0YyA9IHJlYWRCeXRlKCk7XG5cdFx0XHRcdGkrKztcblx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHRDUkMgPSAweGZmZmZmZmZmO1xuXHRcdFx0U0laRSA9IDA7XG5cdFx0XHRcblx0XHRcdGlmIChzaXplID0gMCAmJiBmaWxlT3V0LmNoYXJBdChmaWxlb3V0Lmxlbmd0aC0xKT09XCIvXCIpe1xuXHRcdFx0XHQvL3NraXBkaXJcblx0XHRcdFx0aWYgKGRlYnVnKVxuXHRcdFx0XHRcdGFsZXJ0KFwic2tpcGRpclwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChtZXRob2QgPT0gOCl7XG5cdFx0XHRcdERlZmxhdGVMb29wKCk7XG5cdFx0XHRcdGlmIChkZWJ1Zylcblx0XHRcdFx0XHRhbGVydChvdXRwdXRBcnIuam9pbignJykpO1xuXHRcdFx0XHR1bnppcHBlZFtmaWxlc10gPSBuZXcgQXJyYXkoMik7XG5cdFx0XHRcdHVuemlwcGVkW2ZpbGVzXVswXSA9IG91dHB1dEFyci5qb2luKCcnKTtcbiAgICBcdFx0XHR1bnppcHBlZFtmaWxlc11bMV0gPSBuYW1lQnVmLmpvaW4oJycpO1xuICAgIFx0XHRcdGZpbGVzKys7XG5cdFx0XHRcdC8vcmV0dXJuIG91dHB1dEFyci5qb2luKCcnKTtcblx0XHRcdH1cblx0XHRcdHNraXBkaXIoKTtcblx0XHR9XG5cdH1cbiB9O1xuXHRcbmZ1bmN0aW9uIHNraXBkaXIoKXtcbiAgICB2YXIgY3JjLCBcbiAgICAgICAgdG1wID0gW10sXG4gICAgICAgIGNvbXBTaXplLCBzaXplLCBvcywgaSwgYztcbiAgICBcblx0aWYgKChncGZsYWdzICYgOCkpIHtcblx0XHR0bXBbMF0gPSByZWFkQnl0ZSgpO1xuXHRcdHRtcFsxXSA9IHJlYWRCeXRlKCk7XG5cdFx0dG1wWzJdID0gcmVhZEJ5dGUoKTtcblx0XHR0bXBbM10gPSByZWFkQnl0ZSgpO1xuXHRcdFxuXHRcdGlmICh0bXBbMF0gPT0gcGFyc2VJbnQoXCI1MFwiLDE2KSAmJiBcbiAgICAgICAgICAgIHRtcFsxXSA9PSBwYXJzZUludChcIjRiXCIsMTYpICYmIFxuICAgICAgICAgICAgdG1wWzJdID09IHBhcnNlSW50KFwiMDdcIiwxNikgJiYgXG4gICAgICAgICAgICB0bXBbM10gPT0gcGFyc2VJbnQoXCIwOFwiLDE2KSlcbiAgICAgICAge1xuICAgICAgICAgICAgY3JjID0gcmVhZEJ5dGUoKTtcbiAgICAgICAgICAgIGNyYyB8PSAocmVhZEJ5dGUoKTw8OCk7XG4gICAgICAgICAgICBjcmMgfD0gKHJlYWRCeXRlKCk8PDE2KTtcbiAgICAgICAgICAgIGNyYyB8PSAocmVhZEJ5dGUoKTw8MjQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjcmMgPSB0bXBbMF0gfCAodG1wWzFdPDw4KSB8ICh0bXBbMl08PDE2KSB8ICh0bXBbM108PDI0KTtcblx0XHR9XG5cdFx0XG5cdFx0Y29tcFNpemUgPSByZWFkQnl0ZSgpO1xuXHRcdGNvbXBTaXplIHw9IChyZWFkQnl0ZSgpPDw4KTtcblx0XHRjb21wU2l6ZSB8PSAocmVhZEJ5dGUoKTw8MTYpO1xuXHRcdGNvbXBTaXplIHw9IChyZWFkQnl0ZSgpPDwyNCk7XG5cdFx0XG5cdFx0c2l6ZSA9IHJlYWRCeXRlKCk7XG5cdFx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cdFx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8MTYpO1xuXHRcdHNpemUgfD0gKHJlYWRCeXRlKCk8PDI0KTtcblx0XHRcblx0XHRpZiAoZGVidWcpXG5cdFx0XHRhbGVydChcIkNSQzpcIik7XG5cdH1cblxuXHRpZiAobW9kZVpJUClcblx0XHRuZXh0RmlsZSgpO1xuXHRcblx0dG1wWzBdID0gcmVhZEJ5dGUoKTtcblx0aWYgKHRtcFswXSAhPSA4KSB7XG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQoXCJVbmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCFcIik7XG4gICAgICAgIHJldHVybiAwO1x0XG5cdH1cblx0XG5cdGdwZmxhZ3MgPSByZWFkQnl0ZSgpO1xuXHRpZiAoZGVidWcpe1xuXHRcdGlmICgoZ3BmbGFncyAmIH4ocGFyc2VJbnQoXCIxZlwiLDE2KSkpKVxuXHRcdFx0YWxlcnQoXCJVbmtub3duIGZsYWdzIHNldCFcIik7XG5cdH1cblx0XG5cdHJlYWRCeXRlKCk7XG5cdHJlYWRCeXRlKCk7XG5cdHJlYWRCeXRlKCk7XG5cdHJlYWRCeXRlKCk7XG5cdFxuXHRyZWFkQnl0ZSgpO1xuXHRvcyA9IHJlYWRCeXRlKCk7XG5cdFxuXHRpZiAoKGdwZmxhZ3MgJiA0KSl7XG5cdFx0dG1wWzBdID0gcmVhZEJ5dGUoKTtcblx0XHR0bXBbMl0gPSByZWFkQnl0ZSgpO1xuXHRcdGxlbiA9IHRtcFswXSArIDI1Nip0bXBbMV07XG5cdFx0aWYgKGRlYnVnKVxuXHRcdFx0YWxlcnQoXCJFeHRyYSBmaWVsZCBzaXplOiBcIitsZW4pO1xuXHRcdGZvciAoaT0wO2k8bGVuO2krKylcblx0XHRcdHJlYWRCeXRlKCk7XG5cdH1cblx0XG5cdGlmICgoZ3BmbGFncyAmIDgpKXtcblx0XHRpPTA7XG5cdFx0bmFtZUJ1Zj1bXTtcblx0XHR3aGlsZSAoYz1yZWFkQnl0ZSgpKXtcblx0XHRcdGlmKGMgPT0gXCI3XCIgfHwgYyA9PSBcIjpcIilcblx0XHRcdFx0aT0wO1xuXHRcdFx0aWYgKGk8TkFNRU1BWC0xKVxuXHRcdFx0XHRuYW1lQnVmW2krK10gPSBjO1xuXHRcdH1cblx0XHQvL25hbWVCdWZbaV0gPSBcIlxcMFwiO1xuXHRcdGlmIChkZWJ1Zylcblx0XHRcdGFsZXJ0KFwib3JpZ2luYWwgZmlsZSBuYW1lOiBcIituYW1lQnVmKTtcblx0fVxuXHRcdFxuXHRpZiAoKGdwZmxhZ3MgJiAxNikpe1xuXHRcdHdoaWxlIChjPXJlYWRCeXRlKCkpe1xuXHRcdFx0Ly9GSUxFIENPTU1FTlRcblx0XHR9XG5cdH1cblx0XG5cdGlmICgoZ3BmbGFncyAmIDIpKXtcblx0XHRyZWFkQnl0ZSgpO1xuXHRcdHJlYWRCeXRlKCk7XG5cdH1cblx0XG5cdERlZmxhdGVMb29wKCk7XG5cdFxuXHRjcmMgPSByZWFkQnl0ZSgpO1xuXHRjcmMgfD0gKHJlYWRCeXRlKCk8PDgpO1xuXHRjcmMgfD0gKHJlYWRCeXRlKCk8PDE2KTtcblx0Y3JjIHw9IChyZWFkQnl0ZSgpPDwyNCk7XG5cdFxuXHRzaXplID0gcmVhZEJ5dGUoKTtcblx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8OCk7XG5cdHNpemUgfD0gKHJlYWRCeXRlKCk8PDE2KTtcblx0c2l6ZSB8PSAocmVhZEJ5dGUoKTw8MjQpO1xuXHRcblx0aWYgKG1vZGVaSVApXG5cdFx0bmV4dEZpbGUoKTtcblx0XG59O1xuXG59O1xuXG4vKipcbiogIEJhc2U2NCBlbmNvZGluZyAvIGRlY29kaW5nXG4qICB7QGxpbmsgaHR0cDovL3d3dy53ZWJ0b29sa2l0LmluZm8vfVxuKi9cbkpYRy5VdGlsLkJhc2U2NCA9IHtcblxuICAgIC8vIHByaXZhdGUgcHJvcGVydHlcbiAgICBfa2V5U3RyIDogXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLFxuXG4gICAgLy8gcHVibGljIG1ldGhvZCBmb3IgZW5jb2RpbmdcbiAgICBlbmNvZGUgOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IFtdLFxuICAgICAgICAgICAgY2hyMSwgY2hyMiwgY2hyMywgZW5jMSwgZW5jMiwgZW5jMywgZW5jNCxcbiAgICAgICAgICAgIGkgPSAwO1xuXG4gICAgICAgIGlucHV0ID0gSlhHLlV0aWwuQmFzZTY0Ll91dGY4X2VuY29kZShpbnB1dCk7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgY2hyMSA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgICAgICAgIGNocjIgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICAgICAgICBjaHIzID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuXG4gICAgICAgICAgICBlbmMxID0gY2hyMSA+PiAyO1xuICAgICAgICAgICAgZW5jMiA9ICgoY2hyMSAmIDMpIDw8IDQpIHwgKGNocjIgPj4gNCk7XG4gICAgICAgICAgICBlbmMzID0gKChjaHIyICYgMTUpIDw8IDIpIHwgKGNocjMgPj4gNik7XG4gICAgICAgICAgICBlbmM0ID0gY2hyMyAmIDYzO1xuXG4gICAgICAgICAgICBpZiAoaXNOYU4oY2hyMikpIHtcbiAgICAgICAgICAgICAgICBlbmMzID0gZW5jNCA9IDY0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05hTihjaHIzKSkge1xuICAgICAgICAgICAgICAgIGVuYzQgPSA2NDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3V0cHV0LnB1c2goW3RoaXMuX2tleVN0ci5jaGFyQXQoZW5jMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5U3RyLmNoYXJBdChlbmMyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlTdHIuY2hhckF0KGVuYzMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleVN0ci5jaGFyQXQoZW5jNCldLmpvaW4oJycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignJyk7XG4gICAgfSxcblxuICAgIC8vIHB1YmxpYyBtZXRob2QgZm9yIGRlY29kaW5nXG4gICAgZGVjb2RlIDogZnVuY3Rpb24gKGlucHV0LCB1dGY4KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSBbXSxcbiAgICAgICAgICAgIGNocjEsIGNocjIsIGNocjMsXG4gICAgICAgICAgICBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0LFxuICAgICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgXCJcIik7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgZW5jMSA9IHRoaXMuX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgICAgIGVuYzIgPSB0aGlzLl9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgICAgICBlbmMzID0gdGhpcy5fa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICAgICAgZW5jNCA9IHRoaXMuX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgICAgICAgY2hyMSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7XG4gICAgICAgICAgICBjaHIyID0gKChlbmMyICYgMTUpIDw8IDQpIHwgKGVuYzMgPj4gMik7XG4gICAgICAgICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICAgICAgICBvdXRwdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjEpKTtcblxuICAgICAgICAgICAgaWYgKGVuYzMgIT0gNjQpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNocjIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmM0ICE9IDY0KSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaHIzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5qb2luKCcnKTsgXG4gICAgICAgIFxuICAgICAgICBpZiAodXRmOCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gSlhHLlV0aWwuQmFzZTY0Ll91dGY4X2RlY29kZShvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG5cbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZSBtZXRob2QgZm9yIFVURi04IGVuY29kaW5nXG4gICAgX3V0ZjhfZW5jb2RlIDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxyXFxuL2csXCJcXG5cIik7XG4gICAgICAgIHZhciB1dGZ0ZXh0ID0gXCJcIjtcblxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xuXG4gICAgICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KG4pO1xuXG4gICAgICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoKGMgPiAxMjcpICYmIChjIDwgMjA0OCkpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gMTIpIHwgMjI0KTtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjID4+IDYpICYgNjMpIHwgMTI4KTtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXRmdGV4dDtcbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZSBtZXRob2QgZm9yIFVURi04IGRlY29kaW5nXG4gICAgX3V0ZjhfZGVjb2RlIDogZnVuY3Rpb24gKHV0ZnRleHQpIHtcbiAgICAgICAgdmFyIHN0cmluZyA9IFtdLFxuICAgICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgICBjID0gMCwgYzIgPSAwLCBjMyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKCBpIDwgdXRmdGV4dC5sZW5ndGggKSB7XG4gICAgICAgICAgICBjID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICBzdHJpbmcucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKChjID4gMTkxKSAmJiAoYyA8IDIyNCkpIHtcbiAgICAgICAgICAgICAgICBjMiA9IHV0ZnRleHQuY2hhckNvZGVBdChpKzEpO1xuICAgICAgICAgICAgICAgIHN0cmluZy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMzEpIDw8IDYpIHwgKGMyICYgNjMpKSk7XG4gICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYzIgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsxKTtcbiAgICAgICAgICAgICAgICBjMyA9IHV0ZnRleHQuY2hhckNvZGVBdChpKzIpO1xuICAgICAgICAgICAgICAgIHN0cmluZy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpKTtcbiAgICAgICAgICAgICAgICBpICs9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZy5qb2luKCcnKTtcbiAgICB9LFxuICAgIFxuICAgIF9kZXN0cmlwOiBmdW5jdGlvbiAoc3RyaXBwZWQsIHdyYXApe1xuICAgICAgICB2YXIgbGluZXMgPSBbXSwgbGluZW5vLCBpLFxuICAgICAgICAgICAgZGVzdHJpcHBlZCA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKHdyYXA9PW51bGwpIFxuICAgICAgICAgICAgd3JhcCA9IDc2O1xuICAgICAgICAgICAgXG4gICAgICAgIHN0cmlwcGVkLnJlcGxhY2UoLyAvZywgXCJcIik7XG4gICAgICAgIGxpbmVubyA9IHN0cmlwcGVkLmxlbmd0aCAvIHdyYXA7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lbm87IGkrKylcbiAgICAgICAgICAgIGxpbmVzW2ldPXN0cmlwcGVkLnN1YnN0cihpICogd3JhcCwgd3JhcCk7XG4gICAgICAgIGlmIChsaW5lbm8gIT0gc3RyaXBwZWQubGVuZ3RoIC8gd3JhcClcbiAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aF09c3RyaXBwZWQuc3Vic3RyKGxpbmVubyAqIHdyYXAsIHN0cmlwcGVkLmxlbmd0aC0obGluZW5vICogd3JhcCkpO1xuICAgICAgICAgICAgXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGRlc3RyaXBwZWQucHVzaChsaW5lc1tpXSk7XG4gICAgICAgIHJldHVybiBkZXN0cmlwcGVkLmpvaW4oJ1xcbicpO1xuICAgIH0sXG4gICAgXG4gICAgZGVjb2RlQXNBcnJheTogZnVuY3Rpb24gKGlucHV0KXtcbiAgICAgICAgdmFyIGRlYyA9IHRoaXMuZGVjb2RlKGlucHV0KSxcbiAgICAgICAgICAgIGFyID0gW10sIGk7XG4gICAgICAgIGZvciAoaT0wO2k8ZGVjLmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgYXJbaV09ZGVjLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyO1xuICAgIH0sXG4gICAgXG4gICAgZGVjb2RlR0VPTkV4VCA6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gZGVjb2RlQXNBcnJheShkZXN0cmlwKGlucHV0KSxmYWxzZSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5KWEcuVXRpbC5hc2NpaUNoYXJDb2RlQXQgPSBmdW5jdGlvbihzdHIsaSl7XG5cdHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cdGlmIChjPjI1NSl7XG4gICAgXHRzd2l0Y2ggKGMpIHtcblx0XHRcdGNhc2UgODM2NDogYz0xMjg7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMTg6IGM9MTMwO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA0MDI6IGM9MTMxO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjIyOiBjPTEzMjtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODIzMDogYz0xMzM7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMjQ6IGM9MTM0O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjI1OiBjPTEzNTtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgNzEwOiBjPTEzNjtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODI0MDogYz0xMzc7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDM1MjogYz0xMzg7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyNDk6IGM9MTM5O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSAzMzg6IGM9MTQwO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSAzODE6IGM9MTQyO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjE2OiBjPTE0NTtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODIxNzogYz0xNDY7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMjA6IGM9MTQ3O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjIxOiBjPTE0ODtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODIyNjogYz0xNDk7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyMTE6IGM9MTUwO1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSA4MjEyOiBjPTE1MTtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgNzMyOiBjPTE1Mjtcblx0ICAgIFx0YnJlYWs7XG5cdCAgICBcdGNhc2UgODQ4MjogYz0xNTM7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDM1MzogYz0xNTQ7XG5cdCAgICBcdGJyZWFrO1xuXHQgICAgXHRjYXNlIDgyNTA6IGM9MTU1O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSAzMzk6IGM9MTU2O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSAzODI6IGM9MTU4O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0Y2FzZSAzNzY6IGM9MTU5O1xuXHQgICAgXHRicmVhaztcblx0ICAgIFx0ZGVmYXVsdDpcblx0ICAgIFx0YnJlYWs7XG5cdCAgICB9XG5cdH1cblx0cmV0dXJuIGM7XG59O1xuXG4vKipcbiAqIERlY29kaW5nIHN0cmluZyBpbnRvIHV0Zi04XG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIHRvIGRlY29kZVxuICogQHJldHVybiB7U3RyaW5nfSB1dGY4IGRlY29kZWQgc3RyaW5nXG4gKi9cbkpYRy5VdGlsLnV0ZjhEZWNvZGUgPSBmdW5jdGlvbih1dGZ0ZXh0KSB7XG4gIHZhciBzdHJpbmcgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgYyA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMztcbiAgaWYgKCFKWEcuZXhpc3RzKHV0ZnRleHQpKSByZXR1cm4gJyc7XG4gIFxuICB3aGlsZSAoIGkgPCB1dGZ0ZXh0Lmxlbmd0aCApIHtcbiAgICBjID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgIHN0cmluZy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZigoYyA+IDE5MSkgJiYgKGMgPCAyMjQpKSB7XG4gICAgICBjMiA9IHV0ZnRleHQuY2hhckNvZGVBdChpKzEpO1xuICAgICAgc3RyaW5nLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpKTtcbiAgICAgIGkgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYzIgPSB1dGZ0ZXh0LmNoYXJDb2RlQXQoaSsxKTtcbiAgICAgIGMzID0gdXRmdGV4dC5jaGFyQ29kZUF0KGkrMik7XG4gICAgICBzdHJpbmcucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDE1KSA8PCAxMikgfCAoKGMyICYgNjMpIDw8IDYpIHwgKGMzICYgNjMpKSk7XG4gICAgICBpICs9IDM7XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3RyaW5nLmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSB1dWlkLlxuICogaHR0cDovL3d3dy5icm9vZmEuY29tXG4gKiBtYWlsdG86cm9iZXJ0QGJyb29mYS5jb21cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAgUm9iZXJ0IEtpZWZmZXJcbiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLlxuICpcbiAqIEVYQU1QTEVTOlxuICogICA+Pj4gTWF0aC51dWlkKClcbiAqICAgXCI5MjMyOUQzOS02RjVDLTQ1MjAtQUJGQy1BQUI2NDU0NEUxNzJcIlxuICovXG5KWEcuVXRpbC5nZW5VVUlEID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gUHJpdmF0ZSBhcnJheSBvZiBjaGFycyB0byB1c2VcbiAgICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLnNwbGl0KCcnKSxcbiAgICAgICAgdXVpZCA9IG5ldyBBcnJheSgzNiksIHJuZD0wLCByO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzNjsgaSsrKSB7XG4gICAgICBpZiAoaT09OCB8fCBpPT0xMyB8fCAgaT09MTggfHwgaT09MjMpIHtcbiAgICAgICAgdXVpZFtpXSA9ICctJztcbiAgICAgIH0gZWxzZSBpZiAoaT09MTQpIHtcbiAgICAgICAgdXVpZFtpXSA9ICc0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChybmQgPD0gMHgwMikgcm5kID0gMHgyMDAwMDAwICsgKE1hdGgucmFuZG9tKCkqMHgxMDAwMDAwKXwwO1xuICAgICAgICByID0gcm5kICYgMHhmO1xuICAgICAgICBybmQgPSBybmQgPj4gNDtcbiAgICAgICAgdXVpZFtpXSA9IGNoYXJzWyhpID09IDE5KSA/IChyICYgMHgzKSB8IDB4OCA6IHJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1dWlkLmpvaW4oJycpO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEpYRztcbiIsIi8vIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSCBcblxuLy8gbW9kaWZpZWQgdmVyc2lvbiBvZiBodHRwOi8vd3d3LmhhbmV3aW4ubmV0L2VuY3J5cHQvUEdkZWNvZGUuanM6XG5cbi8qIE9wZW5QR1AgZW5jcnlwdGlvbiB1c2luZyBSU0EvQUVTXG4gKiBDb3B5cmlnaHQgMjAwNS0yMDA2IEhlcmJlcnQgSGFuZXdpbmtlbCwgd3d3LmhhbmVXSU4uZGVcbiAqIHZlcnNpb24gMi4wLCBjaGVjayB3d3cuaGFuZVdJTi5kZSBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uXG5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMsIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgXG4gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIG9yIHNlbGwgdGhpcyBzb2Z0d2FyZSwgd2l0aCBvclxuICogd2l0aG91dCBmZWUsIGZvciBhbnkgcHVycG9zZSBhbmQgYnkgYW55IGluZGl2aWR1YWwgb3Igb3JnYW5pemF0aW9uLCBpcyBoZXJlYnlcbiAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFwcGVhciBcbiAqIGluIGFsbCBjb3BpZXMuIERpc3RyaWJ1dGlvbiBhcyBhIHBhcnQgb2YgYW4gYXBwbGljYXRpb24gb3IgYmluYXJ5IG11c3RcbiAqIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyXG4gKiBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gb3IgZGlzdHJpYnV0aW9uLlxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpLFxuXHRjaXBoZXIgPSByZXF1aXJlKCcuL2NpcGhlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuXHQvKipcblx0ICogQW4gYXJyYXkgb2YgYnl0ZXMsIHRoYXQgaXMgaW50ZWdlcnMgd2l0aCB2YWx1ZXMgZnJvbSAwIHRvIDI1NVxuXHQgKiBAdHlwZWRlZiB7KEFycmF5fFVpbnQ4QXJyYXkpfSBvcGVucGdwX2J5dGVfYXJyYXlcblx0ICovXG5cblx0LyoqXG5cdCAqIEJsb2NrIGNpcGhlciBmdW5jdGlvblxuXHQgKiBAY2FsbGJhY2sgb3BlbnBncF9jaXBoZXJfYmxvY2tfZm5cblx0ICogQHBhcmFtIHtvcGVucGdwX2J5dGVfYXJyYXl9IGJsb2NrIEEgYmxvY2sgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9ieXRlX2FycmF5fSBrZXkgdG8gdXNlIGluIGVuY3J5cHRpb24vZGVjcnlwdGlvblxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX2J5dGVfYXJyYXl9IEVuY3J5cHRlZC9kZWNyeXB0ZWQgYmxvY2tcblx0ICovXG5cblxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBlbmNyeXB0cyBhIGdpdmVuIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXhyYW5kb20gXG5cdCAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgYmxvY2tjaXBoZXIgdG8gZW5jcnlwdCBhIG1lc3NhZ2Vcblx0ICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeHJhbmRvbSByYW5kb20gYnl0ZXMgb2YgYmxvY2tfc2l6ZSBsZW5ndGggcHJvdmlkZWQgXG5cdCAqICBhcyBhIHN0cmluZyB0byBiZSB1c2VkIGluIHByZWZpeGluZyB0aGUgZGF0YVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfY2lwaGVyX2Jsb2NrX2ZufSBibG9ja2NpcGhlcmZuIHRoZSBhbGdvcml0aG0gZW5jcnlwdCBmdW5jdGlvbiB0byBlbmNyeXB0XG5cdCAqICBkYXRhIGluIG9uZSBibG9ja19zaXplIGVuY3J5cHRpb24uIFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGJsb2NrX3NpemUgdGhlIGJsb2NrIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGFsZ29yaXRobSB1c2VkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBwbGFpbnRleHQgZGF0YSB0byBiZSBlbmNyeXB0ZWQgcHJvdmlkZWQgYXMgYSBzdHJpbmdcblx0ICogQHBhcmFtIHtvcGVucGdwX2J5dGVfYXJyYXl9IGtleSBrZXkgdG8gYmUgdXNlZCB0byBlbmNyeXB0IHRoZSBkYXRhLiBUaGlzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBcblx0ICogIGJsb2NrY2lwaGVyZm5cblx0ICogQHBhcmFtIHtCb29sZWFufSByZXN5bmMgYSBib29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgaWYgYSByZXN5bmMgb2YgdGhlIFxuXHQgKiAgSVYgc2hvdWxkIGJlIHVzZWQgb3Igbm90LiBUaGUgZW5jcnlwdGVkZGF0YXBhY2tldCB1c2VzIHRoZSBcblx0ICogIFwib2xkXCIgc3R5bGUgd2l0aCBhIHJlc3luYy4gRW5jcnlwdGlvbiB3aXRoaW4gYW4gXG5cdCAqICBlbmNyeXB0ZWRpbnRlZ3JpdHlwcm90ZWN0ZWRkYXRhIHBhY2tldCBpcyBub3QgcmVzeW5jaW5nIHRoZSBJVi5cblx0ICogQHJldHVybiB7U3RyaW5nfSBhIHN0cmluZyB3aXRoIHRoZSBlbmNyeXB0ZWQgZGF0YVxuXHQgKi9cblx0ZW5jcnlwdDogZnVuY3Rpb24gKHByZWZpeHJhbmRvbSwgY2lwaGVyZm4sIHBsYWludGV4dCwga2V5LCByZXN5bmMpIHtcblx0XHRjaXBoZXJmbiA9IG5ldyBjaXBoZXJbY2lwaGVyZm5dKGtleSk7XG5cdFx0dmFyIGJsb2NrX3NpemUgPSBjaXBoZXJmbi5ibG9ja1NpemU7XG5cblx0XHR2YXIgRlIgPSBuZXcgQXJyYXkoYmxvY2tfc2l6ZSk7XG5cdFx0dmFyIEZSRSA9IG5ldyBBcnJheShibG9ja19zaXplKTtcblxuXHRcdHByZWZpeHJhbmRvbSA9IHByZWZpeHJhbmRvbSArIHByZWZpeHJhbmRvbS5jaGFyQXQoYmxvY2tfc2l6ZS0yKSArcHJlZml4cmFuZG9tLmNoYXJBdChibG9ja19zaXplLTEpO1xuXHRcdHV0aWwucHJpbnRfZGVidWcoXCJwcmVmaXhyYW5kb206XCIrdXRpbC5oZXhzdHJkdW1wKHByZWZpeHJhbmRvbSkpO1xuXHRcdHZhciBjaXBoZXJ0ZXh0ID0gXCJcIjtcblx0XHQvLyAxLiAgVGhlIGZlZWRiYWNrIHJlZ2lzdGVyIChGUikgaXMgc2V0IHRvIHRoZSBJViwgd2hpY2ggaXMgYWxsIHplcm9zLlxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSBGUltpXSA9IDA7XG5cdFx0XG5cdFx0Ly8gMi4gIEZSIGlzIGVuY3J5cHRlZCB0byBwcm9kdWNlIEZSRSAoRlIgRW5jcnlwdGVkKS4gIFRoaXMgaXMgdGhlXG5cdFx0Ly8gICAgIGVuY3J5cHRpb24gb2YgYW4gYWxsLXplcm8gdmFsdWUuXG5cdFx0RlJFID0gY2lwaGVyZm4uZW5jcnlwdChGUik7XG5cdFx0Ly8gMy4gIEZSRSBpcyB4b3JlZCB3aXRoIHRoZSBmaXJzdCBCUyBvY3RldHMgb2YgcmFuZG9tIGRhdGEgcHJlZml4ZWQgdG9cblx0XHQvLyAgICAgdGhlIHBsYWludGV4dCB0byBwcm9kdWNlIENbMV0gdGhyb3VnaCBDW0JTXSwgdGhlIGZpcnN0IEJTIG9jdGV0c1xuXHRcdC8vICAgICBvZiBjaXBoZXJ0ZXh0LlxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSBjaXBoZXJ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoRlJFW2ldIF4gcHJlZml4cmFuZG9tLmNoYXJDb2RlQXQoaSkpO1xuXHRcdFxuXHRcdC8vIDQuICBGUiBpcyBsb2FkZWQgd2l0aCBDWzFdIHRocm91Z2ggQ1tCU10uXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIEZSW2ldID0gY2lwaGVydGV4dC5jaGFyQ29kZUF0KGkpO1xuXHRcdFxuXHRcdC8vIDUuICBGUiBpcyBlbmNyeXB0ZWQgdG8gcHJvZHVjZSBGUkUsIHRoZSBlbmNyeXB0aW9uIG9mIHRoZSBmaXJzdCBCU1xuXHRcdC8vIFx0ICAgb2N0ZXRzIG9mIGNpcGhlcnRleHQuXG5cdFx0RlJFID0gY2lwaGVyZm4uZW5jcnlwdChGUik7XG5cblx0XHQvLyA2LiAgVGhlIGxlZnQgdHdvIG9jdGV0cyBvZiBGUkUgZ2V0IHhvcmVkIHdpdGggdGhlIG5leHQgdHdvIG9jdGV0cyBvZlxuXHRcdC8vICAgICBkYXRhIHRoYXQgd2VyZSBwcmVmaXhlZCB0byB0aGUgcGxhaW50ZXh0LiAgVGhpcyBwcm9kdWNlcyBDW0JTKzFdXG5cdFx0Ly8gICAgIGFuZCBDW0JTKzJdLCB0aGUgbmV4dCB0d28gb2N0ZXRzIG9mIGNpcGhlcnRleHQuXG5cdFx0Y2lwaGVydGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEZSRVswXSBeIHByZWZpeHJhbmRvbS5jaGFyQ29kZUF0KGJsb2NrX3NpemUpKTtcblx0XHRjaXBoZXJ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoRlJFWzFdIF4gcHJlZml4cmFuZG9tLmNoYXJDb2RlQXQoYmxvY2tfc2l6ZSsxKSk7XG5cblx0XHRpZiAocmVzeW5jKSB7XG5cdFx0XHQvLyA3LiAgKFRoZSByZXN5bmMgc3RlcCkgRlIgaXMgbG9hZGVkIHdpdGggQzMtQzEwLlxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIEZSW2ldID0gY2lwaGVydGV4dC5jaGFyQ29kZUF0KGkrMik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSBGUltpXSA9IGNpcGhlcnRleHQuY2hhckNvZGVBdChpKTtcblx0XHR9XG5cdFx0Ly8gOC4gIEZSIGlzIGVuY3J5cHRlZCB0byBwcm9kdWNlIEZSRS5cblx0XHRGUkUgPSBjaXBoZXJmbi5lbmNyeXB0KEZSLCBrZXkpO1xuXHRcdFxuXHRcdGlmIChyZXN5bmMpIHtcblx0XHRcdC8vIDkuICBGUkUgaXMgeG9yZWQgd2l0aCB0aGUgZmlyc3QgOCBvY3RldHMgb2YgdGhlIGdpdmVuIHBsYWludGV4dCwgbm93XG5cdFx0XHQvL1x0ICAgdGhhdCB3ZSBoYXZlIGZpbmlzaGVkIGVuY3J5cHRpbmcgdGhlIDEwIG9jdGV0cyBvZiBwcmVmaXhlZCBkYXRhLlxuXHRcdFx0Ly8gXHQgICBUaGlzIHByb2R1Y2VzIEMxMS1DMTgsIHRoZSBuZXh0IDggb2N0ZXRzIG9mIGNpcGhlcnRleHQuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKylcblx0XHRcdFx0Y2lwaGVydGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEZSRVtpXSBeIHBsYWludGV4dC5jaGFyQ29kZUF0KGkpKTtcblx0XHRcdGZvcihuPWJsb2NrX3NpemUrMjsgbiA8IHBsYWludGV4dC5sZW5ndGg7IG4rPWJsb2NrX3NpemUpIHtcblx0XHRcdFx0Ly8gMTAuIEZSIGlzIGxvYWRlZCB3aXRoIEMxMS1DMThcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIEZSW2ldID0gY2lwaGVydGV4dC5jaGFyQ29kZUF0KG4raSk7XG5cdFx0XHRcblx0XHRcdFx0Ly8gMTEuIEZSIGlzIGVuY3J5cHRlZCB0byBwcm9kdWNlIEZSRS5cblx0XHRcdFx0RlJFID0gY2lwaGVyZm4uZW5jcnlwdChGUik7XG5cdFx0XHRcblx0XHRcdFx0Ly8gMTIuIEZSRSBpcyB4b3JlZCB3aXRoIHRoZSBuZXh0IDggb2N0ZXRzIG9mIHBsYWludGV4dCwgdG8gcHJvZHVjZSB0aGVcblx0XHRcdFx0Ly8gbmV4dCA4IG9jdGV0cyBvZiBjaXBoZXJ0ZXh0LiAgVGhlc2UgYXJlIGxvYWRlZCBpbnRvIEZSIGFuZCB0aGVcblx0XHRcdFx0Ly8gcHJvY2VzcyBpcyByZXBlYXRlZCB1bnRpbCB0aGUgcGxhaW50ZXh0IGlzIHVzZWQgdXAuXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSBjaXBoZXJ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoRlJFW2ldIF4gcGxhaW50ZXh0LmNoYXJDb2RlQXQoKG4tMikraSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHBsYWludGV4dCA9IFwiICBcIitwbGFpbnRleHQ7XG5cdFx0XHQvLyA5LiAgRlJFIGlzIHhvcmVkIHdpdGggdGhlIGZpcnN0IDggb2N0ZXRzIG9mIHRoZSBnaXZlbiBwbGFpbnRleHQsIG5vd1xuXHRcdFx0Ly9cdCAgIHRoYXQgd2UgaGF2ZSBmaW5pc2hlZCBlbmNyeXB0aW5nIHRoZSAxMCBvY3RldHMgb2YgcHJlZml4ZWQgZGF0YS5cblx0XHRcdC8vIFx0ICAgVGhpcyBwcm9kdWNlcyBDMTEtQzE4LCB0aGUgbmV4dCA4IG9jdGV0cyBvZiBjaXBoZXJ0ZXh0LlxuXHRcdFx0Zm9yICh2YXIgaSA9IDI7IGkgPCBibG9ja19zaXplOyBpKyspIGNpcGhlcnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShGUkVbaV0gXiBwbGFpbnRleHQuY2hhckNvZGVBdChpKSk7XG5cdFx0XHR2YXIgdGVtcENpcGhlcnRleHQgPSBjaXBoZXJ0ZXh0LnN1YnN0cmluZygwLDIqYmxvY2tfc2l6ZSkuc3BsaXQoJycpO1xuXHRcdFx0dmFyIHRlbXBDaXBoZXJ0ZXh0U3RyaW5nID0gY2lwaGVydGV4dC5zdWJzdHJpbmcoYmxvY2tfc2l6ZSk7XG5cdFx0XHRmb3Iobj1ibG9ja19zaXplOyBuPHBsYWludGV4dC5sZW5ndGg7IG4rPWJsb2NrX3NpemUpIHtcblx0XHRcdFx0Ly8gMTAuIEZSIGlzIGxvYWRlZCB3aXRoIEMxMS1DMThcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIEZSW2ldID0gdGVtcENpcGhlcnRleHRTdHJpbmcuY2hhckNvZGVBdChpKTtcblx0XHRcdFx0dGVtcENpcGhlcnRleHRTdHJpbmc9Jyc7XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyAxMS4gRlIgaXMgZW5jcnlwdGVkIHRvIHByb2R1Y2UgRlJFLlxuXHRcdFx0XHRGUkUgPSBjaXBoZXJmbi5lbmNyeXB0KEZSKTtcblx0XHRcdFx0XG5cdFx0XHRcdC8vIDEyLiBGUkUgaXMgeG9yZWQgd2l0aCB0aGUgbmV4dCA4IG9jdGV0cyBvZiBwbGFpbnRleHQsIHRvIHByb2R1Y2UgdGhlXG5cdFx0XHRcdC8vICAgICBuZXh0IDggb2N0ZXRzIG9mIGNpcGhlcnRleHQuICBUaGVzZSBhcmUgbG9hZGVkIGludG8gRlIgYW5kIHRoZVxuXHRcdFx0XHQvLyAgICAgcHJvY2VzcyBpcyByZXBlYXRlZCB1bnRpbCB0aGUgcGxhaW50ZXh0IGlzIHVzZWQgdXAuXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKXsgdGVtcENpcGhlcnRleHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKEZSRVtpXSBeIHBsYWludGV4dC5jaGFyQ29kZUF0KG4raSkpKTtcblx0XHRcdFx0dGVtcENpcGhlcnRleHRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShGUkVbaV0gXiBwbGFpbnRleHQuY2hhckNvZGVBdChuK2kpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y2lwaGVydGV4dCA9IHRlbXBDaXBoZXJ0ZXh0LmpvaW4oJycpO1xuXHRcdFx0XG5cdFx0fVxuXG5cdFx0Y2lwaGVydGV4dCA9IGNpcGhlcnRleHQuc3Vic3RyaW5nKDAsIHBsYWludGV4dC5sZW5ndGggKyAyICsgYmxvY2tfc2l6ZSk7XG5cblx0XHRyZXR1cm4gY2lwaGVydGV4dDtcblx0fSxcblxuXHQvKipcblx0ICogRGVjcnlwdHMgdGhlIHByZWZpeGVkIGRhdGEgZm9yIHRoZSBNb2RpZmljYXRpb24gRGV0ZWN0aW9uIENvZGUgKE1EQykgY29tcHV0YXRpb25cblx0ICogQHBhcmFtIHtvcGVucGdwX2Jsb2NrX2NpcGhlcl9mbn0gY2lwaGVyZm4uZW5jcnlwdCBDaXBoZXIgZnVuY3Rpb24gdG8gdXNlXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gYmxvY2tfc2l6ZSBCbG9ja3NpemUgb2YgdGhlIGFsZ29yaXRobVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfYnl0ZV9hcnJheX0ga2V5IFRoZSBrZXkgZm9yIGVuY3J5cHRpb25cblx0ICogQHBhcmFtIHtTdHJpbmd9IGNpcGhlcnRleHQgVGhlIGVuY3J5cHRlZCBkYXRhXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gcGxhaW50ZXh0IERhdGEgb2YgRChjaXBoZXJ0ZXh0KSB3aXRoIGJsb2Nrc2l6ZSBsZW5ndGggKzJcblx0ICovXG5cdG1kYzogZnVuY3Rpb24gKGNpcGhlcmZuLCBrZXksIGNpcGhlcnRleHQpIHtcblx0XHRjaXBoZXJmbiA9IG5ldyBjaXBoZXJbY2lwaGVyZm5dKGtleSk7XG5cdFx0dmFyIGJsb2NrX3NpemUgPSBjaXBoZXJmbi5ibG9ja1NpemU7XG5cblx0XHR2YXIgaWJsb2NrID0gbmV3IEFycmF5KGJsb2NrX3NpemUpO1xuXHRcdHZhciBhYmxvY2sgPSBuZXcgQXJyYXkoYmxvY2tfc2l6ZSk7XG5cdFx0dmFyIGk7XG5cblxuXHRcdC8vIGluaXRpYWxpc2F0aW9uIHZlY3RvclxuXHRcdGZvcihpPTA7IGkgPCBibG9ja19zaXplOyBpKyspIGlibG9ja1tpXSA9IDA7XG5cblx0XHRpYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGlibG9jayk7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKVxuXHRcdHtcblx0XHRcdGFibG9ja1tpXSA9IGNpcGhlcnRleHQuY2hhckNvZGVBdChpKTtcblx0XHRcdGlibG9ja1tpXSBePSBhYmxvY2tbaV07XG5cdFx0fVxuXG5cdFx0YWJsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChhYmxvY2spO1xuXG5cdFx0cmV0dXJuIHV0aWwuYmluMnN0cihpYmxvY2spK1xuXHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZShhYmxvY2tbMF1eY2lwaGVydGV4dC5jaGFyQ29kZUF0KGJsb2NrX3NpemUpKStcblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoYWJsb2NrWzFdXmNpcGhlcnRleHQuY2hhckNvZGVBdChibG9ja19zaXplKzEpKTtcblx0fSxcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gZGVjcnlwdHMgYSBnaXZlbiBwbGFpbnRleHQgdXNpbmcgdGhlIHNwZWNpZmllZFxuXHQgKiBibG9ja2NpcGhlciB0byBkZWNyeXB0IGEgbWVzc2FnZVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfY2lwaGVyX2Jsb2NrX2ZufSBibG9ja2NpcGhlcmZuIFRoZSBhbGdvcml0aG0gX2VuY3J5cHRfIGZ1bmN0aW9uIHRvIGVuY3J5cHRcblx0ICogIGRhdGEgaW4gb25lIGJsb2NrX3NpemUgZW5jcnlwdGlvbi5cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBibG9ja19zaXplIHRoZSBibG9jayBzaXplIGluIGJ5dGVzIG9mIHRoZSBhbGdvcml0aG0gdXNlZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gcGxhaW50ZXh0IGNpcGhlcnRleHQgdG8gYmUgZGVjcnlwdGVkIHByb3ZpZGVkIGFzIGEgc3RyaW5nXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9ieXRlX2FycmF5fSBrZXkga2V5IHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgY2lwaGVydGV4dC4gVGhpcyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgXG5cdCAqICBibG9ja2NpcGhlcmZuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVzeW5jIGEgYm9vbGVhbiB2YWx1ZSBzcGVjaWZ5aW5nIGlmIGEgcmVzeW5jIG9mIHRoZSBcblx0ICogIElWIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4gVGhlIGVuY3J5cHRlZGRhdGFwYWNrZXQgdXNlcyB0aGUgXG5cdCAqICBcIm9sZFwiIHN0eWxlIHdpdGggYSByZXN5bmMuIERlY3J5cHRpb24gd2l0aGluIGFuIFxuXHQgKiAgZW5jcnlwdGVkaW50ZWdyaXR5cHJvdGVjdGVkZGF0YSBwYWNrZXQgaXMgbm90IHJlc3luY2luZyB0aGUgSVYuXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gYSBzdHJpbmcgd2l0aCB0aGUgcGxhaW50ZXh0IGRhdGFcblx0ICovXG5cblx0ZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlcmZuLCBrZXksIGNpcGhlcnRleHQsIHJlc3luYykge1xuXHRcdGNpcGhlcmZuID0gbmV3IGNpcGhlcltjaXBoZXJmbl0oa2V5KTtcblx0XHR2YXIgYmxvY2tfc2l6ZSA9IGNpcGhlcmZuLmJsb2NrU2l6ZTtcblxuXHRcdHZhciBpYmxvY2sgPSBuZXcgQXJyYXkoYmxvY2tfc2l6ZSk7XG5cdFx0dmFyIGFibG9jayA9IG5ldyBBcnJheShibG9ja19zaXplKTtcblx0XHR2YXIgaSwgbiA9ICcnO1xuXHRcdHZhciB0ZXh0ID0gW107XG5cblx0XHQvLyBpbml0aWFsaXNhdGlvbiB2ZWN0b3Jcblx0XHRmb3IoaT0wOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSBpYmxvY2tbaV0gPSAwO1xuXG5cdFx0aWJsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChpYmxvY2ssIGtleSk7XG5cdFx0Zm9yKGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKVxuXHRcdHtcblx0XHRcdGFibG9ja1tpXSA9IGNpcGhlcnRleHQuY2hhckNvZGVBdChpKTtcblx0XHRcdGlibG9ja1tpXSBePSBhYmxvY2tbaV07XG5cdFx0fVxuXG5cdFx0YWJsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChhYmxvY2ssIGtleSk7XG5cblx0XHQvLyB0ZXN0IGNoZWNrIG9jdGV0c1xuXHRcdGlmKGlibG9ja1tibG9ja19zaXplLTJdIT0oYWJsb2NrWzBdXmNpcGhlcnRleHQuY2hhckNvZGVBdChibG9ja19zaXplKSlcblx0XHR8fCBpYmxvY2tbYmxvY2tfc2l6ZS0xXSE9KGFibG9ja1sxXV5jaXBoZXJ0ZXh0LmNoYXJDb2RlQXQoYmxvY2tfc2l6ZSsxKSkpXG5cdFx0e1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEuJyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8qICBSRkM0ODgwOiBUYWcgMTggYW5kIFJlc3luYzpcblx0XHQgKiAgWy4uLl0gVW5saWtlIHRoZSBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCwgbm9cblx0XHQgKiAgc3BlY2lhbCBDRkIgcmVzeW5jaHJvbml6YXRpb24gaXMgZG9uZSBhZnRlciBlbmNyeXB0aW5nIHRoaXMgcHJlZml4XG5cdFx0ICogIGRhdGEuICBTZWUgXCJPcGVuUEdQIENGQiBNb2RlXCIgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cblxuXHRcdCAqL1xuXHRcdFxuXHRcdGlmIChyZXN5bmMpIHtcblx0XHRcdGZvcihpPTA7IGk8YmxvY2tfc2l6ZTsgaSsrKSBpYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQoaSsyKTtcblx0XHRcdGZvcihuPWJsb2NrX3NpemUrMjsgbjxjaXBoZXJ0ZXh0Lmxlbmd0aDsgbis9YmxvY2tfc2l6ZSlcblx0XHRcdHtcblx0XHRcdFx0YWJsb2NrID0gY2lwaGVyZm4uZW5jcnlwdChpYmxvY2spO1xuXG5cdFx0XHRcdGZvcihpID0gMDsgaTxibG9ja19zaXplICYmIGkrbiA8IGNpcGhlcnRleHQubGVuZ3RoOyBpKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQobitpKTtcblx0XHRcdFx0XHR0ZXh0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhYmxvY2tbaV1eaWJsb2NrW2ldKSk7IFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvcihpPTA7IGk8YmxvY2tfc2l6ZTsgaSsrKSBpYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRmb3Iobj1ibG9ja19zaXplOyBuPGNpcGhlcnRleHQubGVuZ3RoOyBuKz1ibG9ja19zaXplKVxuXHRcdFx0e1xuXHRcdFx0XHRhYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KGlibG9jayk7XG5cdFx0XHRcdGZvcihpID0gMDsgaTxibG9ja19zaXplICYmIGkrbiA8IGNpcGhlcnRleHQubGVuZ3RoOyBpKyspXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpYmxvY2tbaV0gPSBjaXBoZXJ0ZXh0LmNoYXJDb2RlQXQobitpKTtcblx0XHRcdFx0XHR0ZXh0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhYmxvY2tbaV1eaWJsb2NrW2ldKSk7IFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIG4gPSByZXN5bmMgPyAwIDogMjtcblxuXHRcdHRleHQgPSB0ZXh0LmpvaW4oJycpO1xuXG5cdFx0dGV4dCA9IHRleHQuc3Vic3RyaW5nKG4sIGNpcGhlcnRleHQubGVuZ3RoIC0gYmxvY2tfc2l6ZSAtIDIpO1xuXG5cdFx0XG5cdFx0cmV0dXJuIHRleHQ7XG5cdH0sXG5cblxuXHRub3JtYWxFbmNyeXB0OiBmdW5jdGlvbihjaXBoZXJmbiwga2V5LCBwbGFpbnRleHQsIGl2KSB7XG5cdFx0Y2lwaGVyZm4gPSBuZXcgY2lwaGVyW2NpcGhlcmZuXShrZXkpO1xuXHRcdHZhciBibG9ja19zaXplID0gY2lwaGVyZm4uYmxvY2tTaXplO1xuXG5cdFx0dmFyIGJsb2NraSA9XCJcIjtcblx0XHR2YXIgYmxvY2tjID0gXCJcIjtcblx0XHR2YXIgcG9zID0gMDtcblx0XHR2YXIgY3lwaGVydGV4dCA9IFtdO1xuXHRcdHZhciB0ZW1wQmxvY2sgPSBbXTtcblx0XHRibG9ja2MgPSBpdi5zdWJzdHJpbmcoMCxibG9ja19zaXplKTtcblx0XHR3aGlsZSAocGxhaW50ZXh0Lmxlbmd0aCA+IGJsb2NrX3NpemUqcG9zKSB7XG5cdFx0XHR2YXIgZW5jYmxvY2sgPSBjaXBoZXJmbi5lbmNyeXB0KHV0aWwuc3RyMmJpbihibG9ja2MpKTtcblx0XHRcdGJsb2NraSA9IHBsYWludGV4dC5zdWJzdHJpbmcoKHBvcypibG9ja19zaXplKSwocG9zKmJsb2NrX3NpemUpK2Jsb2NrX3NpemUpO1xuXHRcdFx0Zm9yICh2YXIgaT0wOyBpIDwgYmxvY2tpLmxlbmd0aDsgaSsrKVxuXHRcdFx0XHR0ZW1wQmxvY2sucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJsb2NraS5jaGFyQ29kZUF0KGkpIF4gZW5jYmxvY2tbaV0pKTtcblx0XHRcdGJsb2NrYyA9IHRlbXBCbG9jay5qb2luKCcnKTtcblx0XHRcdHRlbXBCbG9jayA9IFtdO1xuXHRcdFx0Y3lwaGVydGV4dC5wdXNoKGJsb2NrYyk7XG5cdFx0XHRwb3MrKztcblx0XHR9XG5cdFx0cmV0dXJuIGN5cGhlcnRleHQuam9pbignJyk7XG5cdH0sXG5cblx0bm9ybWFsRGVjcnlwdDogZnVuY3Rpb24oY2lwaGVyZm4sIGtleSwgY2lwaGVydGV4dCwgaXYpIHsgXG5cdFx0Y2lwaGVyZm4gPSBuZXcgY2lwaGVyW2NpcGhlcmZuXShrZXkpO1xuXHRcdHZhciBibG9ja19zaXplID0gY2lwaGVyZm4uYmxvY2tTaXplO1xuXG5cdFx0dmFyIGJsb2NrcCA9XCJcIjtcblx0XHR2YXIgcG9zID0gMDtcblx0XHR2YXIgcGxhaW50ZXh0ID0gW107XG5cdFx0dmFyIG9mZnNldCA9IDA7XG5cdFx0aWYgKGl2ID09IG51bGwpXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgYmxvY2twICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XG5cdFx0ZWxzZVxuXHRcdFx0YmxvY2twID0gaXYuc3Vic3RyaW5nKDAsYmxvY2tfc2l6ZSk7XG5cdFx0d2hpbGUgKGNpcGhlcnRleHQubGVuZ3RoID4gKGJsb2NrX3NpemUqcG9zKSkge1xuXHRcdFx0dmFyIGRlY2Jsb2NrID0gY2lwaGVyZm4uZW5jcnlwdCh1dGlsLnN0cjJiaW4oYmxvY2twKSk7XG5cdFx0XHRibG9ja3AgPSBjaXBoZXJ0ZXh0LnN1YnN0cmluZygocG9zKihibG9ja19zaXplKSkrb2Zmc2V0LChwb3MqKGJsb2NrX3NpemUpKSsoYmxvY2tfc2l6ZSkrb2Zmc2V0KTtcblx0XHRcdGZvciAodmFyIGk9MDsgaSA8IGJsb2NrcC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRwbGFpbnRleHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJsb2NrcC5jaGFyQ29kZUF0KGkpIF4gZGVjYmxvY2tbaV0pKTtcblx0XHRcdH1cblx0XHRcdHBvcysrO1xuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gcGxhaW50ZXh0LmpvaW4oJycpO1xuXHR9XG59XG4iLCJcbi8qIFJpam5kYWVsIChBRVMpIEVuY3J5cHRpb25cbiAqIENvcHlyaWdodCAyMDA1IEhlcmJlcnQgSGFuZXdpbmtlbCwgd3d3LmhhbmVXSU4uZGVcbiAqIHZlcnNpb24gMS4xLCBjaGVjayB3d3cuaGFuZVdJTi5kZSBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uXG5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMsIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgXG4gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIG9yIHNlbGwgdGhpcyBzb2Z0d2FyZSwgd2l0aCBvclxuICogd2l0aG91dCBmZWUsIGZvciBhbnkgcHVycG9zZSBhbmQgYnkgYW55IGluZGl2aWR1YWwgb3Igb3JnYW5pemF0aW9uLCBpcyBoZXJlYnlcbiAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFwcGVhciBcbiAqIGluIGFsbCBjb3BpZXMuIERpc3RyaWJ1dGlvbiBhcyBhIHBhcnQgb2YgYW4gYXBwbGljYXRpb24gb3IgYmluYXJ5IG11c3RcbiAqIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyXG4gKiBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gb3IgZGlzdHJpYnV0aW9uLlxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbCcpO1xuXG4vLyBUaGUgcm91bmQgY29uc3RhbnRzIHVzZWQgaW4gc3Via2V5IGV4cGFuc2lvblxudmFyIFJjb24gPSBbIFxuMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgXG4weGFiLCAweDRkLCAweDlhLCAweDJmLCAweDVlLCAweGJjLCAweDYzLCAweGM2LCAweDk3LCAweDM1LCAweDZhLCAweGQ0LCBcbjB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEgXTtcblxuLy8gUHJlY29tcHV0ZWQgbG9va3VwIHRhYmxlIGZvciB0aGUgU0JveFxudmFyIFMgPSBbXG4gOTksIDEyNCwgMTE5LCAxMjMsIDI0MiwgMTA3LCAxMTEsIDE5NywgIDQ4LCAgIDEsIDEwMywgIDQzLCAyNTQsIDIxNSwgMTcxLCBcbjExOCwgMjAyLCAxMzAsIDIwMSwgMTI1LCAyNTAsICA4OSwgIDcxLCAyNDAsIDE3MywgMjEyLCAxNjIsIDE3NSwgMTU2LCAxNjQsIFxuMTE0LCAxOTIsIDE4MywgMjUzLCAxNDcsICAzOCwgIDU0LCAgNjMsIDI0NywgMjA0LCAgNTIsIDE2NSwgMjI5LCAyNDEsIDExMywgXG4yMTYsICA0OSwgIDIxLCAgIDQsIDE5OSwgIDM1LCAxOTUsICAyNCwgMTUwLCAgIDUsIDE1NCwgICA3LCAgMTgsIDEyOCwgMjI2LCBcbjIzNSwgIDM5LCAxNzgsIDExNywgICA5LCAxMzEsICA0NCwgIDI2LCAgMjcsIDExMCwgIDkwLCAxNjAsICA4MiwgIDU5LCAyMTQsIFxuMTc5LCAgNDEsIDIyNywgIDQ3LCAxMzIsICA4MywgMjA5LCAgIDAsIDIzNywgIDMyLCAyNTIsIDE3NywgIDkxLCAxMDYsIDIwMywgXG4xOTAsICA1NywgIDc0LCAgNzYsICA4OCwgMjA3LCAyMDgsIDIzOSwgMTcwLCAyNTEsICA2NywgIDc3LCAgNTEsIDEzMywgIDY5LCBcbjI0OSwgICAyLCAxMjcsICA4MCwgIDYwLCAxNTksIDE2OCwgIDgxLCAxNjMsICA2NCwgMTQzLCAxNDYsIDE1NywgIDU2LCAyNDUsIFxuMTg4LCAxODIsIDIxOCwgIDMzLCAgMTYsIDI1NSwgMjQzLCAyMTAsIDIwNSwgIDEyLCAgMTksIDIzNiwgIDk1LCAxNTEsICA2OCwgIFxuMjMsICAxOTYsIDE2NywgMTI2LCAgNjEsIDEwMCwgIDkzLCAgMjUsIDExNSwgIDk2LCAxMjksICA3OSwgMjIwLCAgMzQsICA0MiwgXG4xNDQsIDEzNiwgIDcwLCAyMzgsIDE4NCwgIDIwLCAyMjIsICA5NCwgIDExLCAyMTksIDIyNCwgIDUwLCAgNTgsICAxMCwgIDczLFxuICA2LCAgMzYsICA5MiwgMTk0LCAyMTEsIDE3MiwgIDk4LCAxNDUsIDE0OSwgMjI4LCAxMjEsIDIzMSwgMjAwLCAgNTUsIDEwOSwgXG4xNDEsIDIxMywgIDc4LCAxNjksIDEwOCwgIDg2LCAyNDQsIDIzNCwgMTAxLCAxMjIsIDE3NCwgICA4LCAxODYsIDEyMCwgIDM3LCAgXG4gNDYsICAyOCwgMTY2LCAxODAsIDE5OCwgMjMyLCAyMjEsIDExNiwgIDMxLCAgNzUsIDE4OSwgMTM5LCAxMzgsIDExMiwgIDYyLCBcbjE4MSwgMTAyLCAgNzIsICAgMywgMjQ2LCAgMTQsICA5NywgIDUzLCAgODcsIDE4NSwgMTM0LCAxOTMsICAyOSwgMTU4LCAyMjUsXG4yNDgsIDE1MiwgIDE3LCAxMDUsIDIxNywgMTQyLCAxNDgsIDE1NSwgIDMwLCAxMzUsIDIzMywgMjA2LCAgODUsICA0MCwgMjIzLFxuMTQwLCAxNjEsIDEzNywgIDEzLCAxOTEsIDIzMCwgIDY2LCAxMDQsICA2NSwgMTUzLCAgNDUsICAxNSwgMTc2LCAgODQsIDE4NywgIFxuIDIyIF07XG5cbnZhciBUMSA9IFtcbjB4YTU2MzYzYzYsIDB4ODQ3YzdjZjgsIDB4OTk3Nzc3ZWUsIDB4OGQ3YjdiZjYsXG4weDBkZjJmMmZmLCAweGJkNmI2YmQ2LCAweGIxNmY2ZmRlLCAweDU0YzVjNTkxLFxuMHg1MDMwMzA2MCwgMHgwMzAxMDEwMiwgMHhhOTY3NjdjZSwgMHg3ZDJiMmI1NixcbjB4MTlmZWZlZTcsIDB4NjJkN2Q3YjUsIDB4ZTZhYmFiNGQsIDB4OWE3Njc2ZWMsXG4weDQ1Y2FjYThmLCAweDlkODI4MjFmLCAweDQwYzljOTg5LCAweDg3N2Q3ZGZhLFxuMHgxNWZhZmFlZiwgMHhlYjU5NTliMiwgMHhjOTQ3NDc4ZSwgMHgwYmYwZjBmYixcbjB4ZWNhZGFkNDEsIDB4NjdkNGQ0YjMsIDB4ZmRhMmEyNWYsIDB4ZWFhZmFmNDUsXG4weGJmOWM5YzIzLCAweGY3YTRhNDUzLCAweDk2NzI3MmU0LCAweDViYzBjMDliLFxuMHhjMmI3Yjc3NSwgMHgxY2ZkZmRlMSwgMHhhZTkzOTMzZCwgMHg2YTI2MjY0YyxcbjB4NWEzNjM2NmMsIDB4NDEzZjNmN2UsIDB4MDJmN2Y3ZjUsIDB4NGZjY2NjODMsXG4weDVjMzQzNDY4LCAweGY0YTVhNTUxLCAweDM0ZTVlNWQxLCAweDA4ZjFmMWY5LFxuMHg5MzcxNzFlMiwgMHg3M2Q4ZDhhYiwgMHg1MzMxMzE2MiwgMHgzZjE1MTUyYSxcbjB4MGMwNDA0MDgsIDB4NTJjN2M3OTUsIDB4NjUyMzIzNDYsIDB4NWVjM2MzOWQsXG4weDI4MTgxODMwLCAweGExOTY5NjM3LCAweDBmMDUwNTBhLCAweGI1OWE5YTJmLFxuMHgwOTA3MDcwZSwgMHgzNjEyMTIyNCwgMHg5YjgwODAxYiwgMHgzZGUyZTJkZixcbjB4MjZlYmViY2QsIDB4NjkyNzI3NGUsIDB4Y2RiMmIyN2YsIDB4OWY3NTc1ZWEsXG4weDFiMDkwOTEyLCAweDllODM4MzFkLCAweDc0MmMyYzU4LCAweDJlMWExYTM0LFxuMHgyZDFiMWIzNiwgMHhiMjZlNmVkYywgMHhlZTVhNWFiNCwgMHhmYmEwYTA1YixcbjB4ZjY1MjUyYTQsIDB4NGQzYjNiNzYsIDB4NjFkNmQ2YjcsIDB4Y2ViM2IzN2QsXG4weDdiMjkyOTUyLCAweDNlZTNlM2RkLCAweDcxMmYyZjVlLCAweDk3ODQ4NDEzLFxuMHhmNTUzNTNhNiwgMHg2OGQxZDFiOSwgMHgwMDAwMDAwMCwgMHgyY2VkZWRjMSxcbjB4NjAyMDIwNDAsIDB4MWZmY2ZjZTMsIDB4YzhiMWIxNzksIDB4ZWQ1YjViYjYsXG4weGJlNmE2YWQ0LCAweDQ2Y2JjYjhkLCAweGQ5YmViZTY3LCAweDRiMzkzOTcyLFxuMHhkZTRhNGE5NCwgMHhkNDRjNGM5OCwgMHhlODU4NThiMCwgMHg0YWNmY2Y4NSxcbjB4NmJkMGQwYmIsIDB4MmFlZmVmYzUsIDB4ZTVhYWFhNGYsIDB4MTZmYmZiZWQsXG4weGM1NDM0Mzg2LCAweGQ3NGQ0ZDlhLCAweDU1MzMzMzY2LCAweDk0ODU4NTExLFxuMHhjZjQ1NDU4YSwgMHgxMGY5ZjllOSwgMHgwNjAyMDIwNCwgMHg4MTdmN2ZmZSxcbjB4ZjA1MDUwYTAsIDB4NDQzYzNjNzgsIDB4YmE5ZjlmMjUsIDB4ZTNhOGE4NGIsXG4weGYzNTE1MWEyLCAweGZlYTNhMzVkLCAweGMwNDA0MDgwLCAweDhhOGY4ZjA1LFxuMHhhZDkyOTIzZiwgMHhiYzlkOWQyMSwgMHg0ODM4Mzg3MCwgMHgwNGY1ZjVmMSxcbjB4ZGZiY2JjNjMsIDB4YzFiNmI2NzcsIDB4NzVkYWRhYWYsIDB4NjMyMTIxNDIsXG4weDMwMTAxMDIwLCAweDFhZmZmZmU1LCAweDBlZjNmM2ZkLCAweDZkZDJkMmJmLFxuMHg0Y2NkY2Q4MSwgMHgxNDBjMGMxOCwgMHgzNTEzMTMyNiwgMHgyZmVjZWNjMyxcbjB4ZTE1ZjVmYmUsIDB4YTI5Nzk3MzUsIDB4Y2M0NDQ0ODgsIDB4MzkxNzE3MmUsXG4weDU3YzRjNDkzLCAweGYyYTdhNzU1LCAweDgyN2U3ZWZjLCAweDQ3M2QzZDdhLFxuMHhhYzY0NjRjOCwgMHhlNzVkNWRiYSwgMHgyYjE5MTkzMiwgMHg5NTczNzNlNixcbjB4YTA2MDYwYzAsIDB4OTg4MTgxMTksIDB4ZDE0ZjRmOWUsIDB4N2ZkY2RjYTMsXG4weDY2MjIyMjQ0LCAweDdlMmEyYTU0LCAweGFiOTA5MDNiLCAweDgzODg4ODBiLFxuMHhjYTQ2NDY4YywgMHgyOWVlZWVjNywgMHhkM2I4Yjg2YiwgMHgzYzE0MTQyOCxcbjB4NzlkZWRlYTcsIDB4ZTI1ZTVlYmMsIDB4MWQwYjBiMTYsIDB4NzZkYmRiYWQsXG4weDNiZTBlMGRiLCAweDU2MzIzMjY0LCAweDRlM2EzYTc0LCAweDFlMGEwYTE0LFxuMHhkYjQ5NDk5MiwgMHgwYTA2MDYwYywgMHg2YzI0MjQ0OCwgMHhlNDVjNWNiOCxcbjB4NWRjMmMyOWYsIDB4NmVkM2QzYmQsIDB4ZWZhY2FjNDMsIDB4YTY2MjYyYzQsXG4weGE4OTE5MTM5LCAweGE0OTU5NTMxLCAweDM3ZTRlNGQzLCAweDhiNzk3OWYyLFxuMHgzMmU3ZTdkNSwgMHg0M2M4Yzg4YiwgMHg1OTM3Mzc2ZSwgMHhiNzZkNmRkYSxcbjB4OGM4ZDhkMDEsIDB4NjRkNWQ1YjEsIDB4ZDI0ZTRlOWMsIDB4ZTBhOWE5NDksXG4weGI0NmM2Y2Q4LCAweGZhNTY1NmFjLCAweDA3ZjRmNGYzLCAweDI1ZWFlYWNmLFxuMHhhZjY1NjVjYSwgMHg4ZTdhN2FmNCwgMHhlOWFlYWU0NywgMHgxODA4MDgxMCxcbjB4ZDViYWJhNmYsIDB4ODg3ODc4ZjAsIDB4NmYyNTI1NGEsIDB4NzIyZTJlNWMsXG4weDI0MWMxYzM4LCAweGYxYTZhNjU3LCAweGM3YjRiNDczLCAweDUxYzZjNjk3LFxuMHgyM2U4ZThjYiwgMHg3Y2RkZGRhMSwgMHg5Yzc0NzRlOCwgMHgyMTFmMWYzZSxcbjB4ZGQ0YjRiOTYsIDB4ZGNiZGJkNjEsIDB4ODY4YjhiMGQsIDB4ODU4YThhMGYsXG4weDkwNzA3MGUwLCAweDQyM2UzZTdjLCAweGM0YjViNTcxLCAweGFhNjY2NmNjLFxuMHhkODQ4NDg5MCwgMHgwNTAzMDMwNiwgMHgwMWY2ZjZmNywgMHgxMjBlMGUxYyxcbjB4YTM2MTYxYzIsIDB4NWYzNTM1NmEsIDB4Zjk1NzU3YWUsIDB4ZDBiOWI5NjksXG4weDkxODY4NjE3LCAweDU4YzFjMTk5LCAweDI3MWQxZDNhLCAweGI5OWU5ZTI3LFxuMHgzOGUxZTFkOSwgMHgxM2Y4ZjhlYiwgMHhiMzk4OTgyYiwgMHgzMzExMTEyMixcbjB4YmI2OTY5ZDIsIDB4NzBkOWQ5YTksIDB4ODk4ZThlMDcsIDB4YTc5NDk0MzMsXG4weGI2OWI5YjJkLCAweDIyMWUxZTNjLCAweDkyODc4NzE1LCAweDIwZTllOWM5LFxuMHg0OWNlY2U4NywgMHhmZjU1NTVhYSwgMHg3ODI4Mjg1MCwgMHg3YWRmZGZhNSxcbjB4OGY4YzhjMDMsIDB4ZjhhMWExNTksIDB4ODA4OTg5MDksIDB4MTcwZDBkMWEsXG4weGRhYmZiZjY1LCAweDMxZTZlNmQ3LCAweGM2NDI0Mjg0LCAweGI4Njg2OGQwLFxuMHhjMzQxNDE4MiwgMHhiMDk5OTkyOSwgMHg3NzJkMmQ1YSwgMHgxMTBmMGYxZSxcbjB4Y2JiMGIwN2IsIDB4ZmM1NDU0YTgsIDB4ZDZiYmJiNmQsIDB4M2ExNjE2MmMgXTtcblxudmFyIFQyID0gW1xuMHg2MzYzYzZhNSwgMHg3YzdjZjg4NCwgMHg3Nzc3ZWU5OSwgMHg3YjdiZjY4ZCxcbjB4ZjJmMmZmMGQsIDB4NmI2YmQ2YmQsIDB4NmY2ZmRlYjEsIDB4YzVjNTkxNTQsXG4weDMwMzA2MDUwLCAweDAxMDEwMjAzLCAweDY3NjdjZWE5LCAweDJiMmI1NjdkLFxuMHhmZWZlZTcxOSwgMHhkN2Q3YjU2MiwgMHhhYmFiNGRlNiwgMHg3Njc2ZWM5YSxcbjB4Y2FjYThmNDUsIDB4ODI4MjFmOWQsIDB4YzljOTg5NDAsIDB4N2Q3ZGZhODcsXG4weGZhZmFlZjE1LCAweDU5NTliMmViLCAweDQ3NDc4ZWM5LCAweGYwZjBmYjBiLFxuMHhhZGFkNDFlYywgMHhkNGQ0YjM2NywgMHhhMmEyNWZmZCwgMHhhZmFmNDVlYSxcbjB4OWM5YzIzYmYsIDB4YTRhNDUzZjcsIDB4NzI3MmU0OTYsIDB4YzBjMDliNWIsXG4weGI3Yjc3NWMyLCAweGZkZmRlMTFjLCAweDkzOTMzZGFlLCAweDI2MjY0YzZhLFxuMHgzNjM2NmM1YSwgMHgzZjNmN2U0MSwgMHhmN2Y3ZjUwMiwgMHhjY2NjODM0ZixcbjB4MzQzNDY4NWMsIDB4YTVhNTUxZjQsIDB4ZTVlNWQxMzQsIDB4ZjFmMWY5MDgsXG4weDcxNzFlMjkzLCAweGQ4ZDhhYjczLCAweDMxMzE2MjUzLCAweDE1MTUyYTNmLFxuMHgwNDA0MDgwYywgMHhjN2M3OTU1MiwgMHgyMzIzNDY2NSwgMHhjM2MzOWQ1ZSxcbjB4MTgxODMwMjgsIDB4OTY5NjM3YTEsIDB4MDUwNTBhMGYsIDB4OWE5YTJmYjUsXG4weDA3MDcwZTA5LCAweDEyMTIyNDM2LCAweDgwODAxYjliLCAweGUyZTJkZjNkLFxuMHhlYmViY2QyNiwgMHgyNzI3NGU2OSwgMHhiMmIyN2ZjZCwgMHg3NTc1ZWE5ZixcbjB4MDkwOTEyMWIsIDB4ODM4MzFkOWUsIDB4MmMyYzU4NzQsIDB4MWExYTM0MmUsXG4weDFiMWIzNjJkLCAweDZlNmVkY2IyLCAweDVhNWFiNGVlLCAweGEwYTA1YmZiLFxuMHg1MjUyYTRmNiwgMHgzYjNiNzY0ZCwgMHhkNmQ2Yjc2MSwgMHhiM2IzN2RjZSxcbjB4MjkyOTUyN2IsIDB4ZTNlM2RkM2UsIDB4MmYyZjVlNzEsIDB4ODQ4NDEzOTcsXG4weDUzNTNhNmY1LCAweGQxZDFiOTY4LCAweDAwMDAwMDAwLCAweGVkZWRjMTJjLFxuMHgyMDIwNDA2MCwgMHhmY2ZjZTMxZiwgMHhiMWIxNzljOCwgMHg1YjViYjZlZCxcbjB4NmE2YWQ0YmUsIDB4Y2JjYjhkNDYsIDB4YmViZTY3ZDksIDB4MzkzOTcyNGIsXG4weDRhNGE5NGRlLCAweDRjNGM5OGQ0LCAweDU4NThiMGU4LCAweGNmY2Y4NTRhLFxuMHhkMGQwYmI2YiwgMHhlZmVmYzUyYSwgMHhhYWFhNGZlNSwgMHhmYmZiZWQxNixcbjB4NDM0Mzg2YzUsIDB4NGQ0ZDlhZDcsIDB4MzMzMzY2NTUsIDB4ODU4NTExOTQsXG4weDQ1NDU4YWNmLCAweGY5ZjllOTEwLCAweDAyMDIwNDA2LCAweDdmN2ZmZTgxLFxuMHg1MDUwYTBmMCwgMHgzYzNjNzg0NCwgMHg5ZjlmMjViYSwgMHhhOGE4NGJlMyxcbjB4NTE1MWEyZjMsIDB4YTNhMzVkZmUsIDB4NDA0MDgwYzAsIDB4OGY4ZjA1OGEsXG4weDkyOTIzZmFkLCAweDlkOWQyMWJjLCAweDM4Mzg3MDQ4LCAweGY1ZjVmMTA0LFxuMHhiY2JjNjNkZiwgMHhiNmI2NzdjMSwgMHhkYWRhYWY3NSwgMHgyMTIxNDI2MyxcbjB4MTAxMDIwMzAsIDB4ZmZmZmU1MWEsIDB4ZjNmM2ZkMGUsIDB4ZDJkMmJmNmQsXG4weGNkY2Q4MTRjLCAweDBjMGMxODE0LCAweDEzMTMyNjM1LCAweGVjZWNjMzJmLFxuMHg1ZjVmYmVlMSwgMHg5Nzk3MzVhMiwgMHg0NDQ0ODhjYywgMHgxNzE3MmUzOSxcbjB4YzRjNDkzNTcsIDB4YTdhNzU1ZjIsIDB4N2U3ZWZjODIsIDB4M2QzZDdhNDcsXG4weDY0NjRjOGFjLCAweDVkNWRiYWU3LCAweDE5MTkzMjJiLCAweDczNzNlNjk1LFxuMHg2MDYwYzBhMCwgMHg4MTgxMTk5OCwgMHg0ZjRmOWVkMSwgMHhkY2RjYTM3ZixcbjB4MjIyMjQ0NjYsIDB4MmEyYTU0N2UsIDB4OTA5MDNiYWIsIDB4ODg4ODBiODMsXG4weDQ2NDY4Y2NhLCAweGVlZWVjNzI5LCAweGI4Yjg2YmQzLCAweDE0MTQyODNjLFxuMHhkZWRlYTc3OSwgMHg1ZTVlYmNlMiwgMHgwYjBiMTYxZCwgMHhkYmRiYWQ3NixcbjB4ZTBlMGRiM2IsIDB4MzIzMjY0NTYsIDB4M2EzYTc0NGUsIDB4MGEwYTE0MWUsXG4weDQ5NDk5MmRiLCAweDA2MDYwYzBhLCAweDI0MjQ0ODZjLCAweDVjNWNiOGU0LFxuMHhjMmMyOWY1ZCwgMHhkM2QzYmQ2ZSwgMHhhY2FjNDNlZiwgMHg2MjYyYzRhNixcbjB4OTE5MTM5YTgsIDB4OTU5NTMxYTQsIDB4ZTRlNGQzMzcsIDB4Nzk3OWYyOGIsXG4weGU3ZTdkNTMyLCAweGM4Yzg4YjQzLCAweDM3Mzc2ZTU5LCAweDZkNmRkYWI3LFxuMHg4ZDhkMDE4YywgMHhkNWQ1YjE2NCwgMHg0ZTRlOWNkMiwgMHhhOWE5NDllMCxcbjB4NmM2Y2Q4YjQsIDB4NTY1NmFjZmEsIDB4ZjRmNGYzMDcsIDB4ZWFlYWNmMjUsXG4weDY1NjVjYWFmLCAweDdhN2FmNDhlLCAweGFlYWU0N2U5LCAweDA4MDgxMDE4LFxuMHhiYWJhNmZkNSwgMHg3ODc4ZjA4OCwgMHgyNTI1NGE2ZiwgMHgyZTJlNWM3MixcbjB4MWMxYzM4MjQsIDB4YTZhNjU3ZjEsIDB4YjRiNDczYzcsIDB4YzZjNjk3NTEsXG4weGU4ZThjYjIzLCAweGRkZGRhMTdjLCAweDc0NzRlODljLCAweDFmMWYzZTIxLFxuMHg0YjRiOTZkZCwgMHhiZGJkNjFkYywgMHg4YjhiMGQ4NiwgMHg4YThhMGY4NSxcbjB4NzA3MGUwOTAsIDB4M2UzZTdjNDIsIDB4YjViNTcxYzQsIDB4NjY2NmNjYWEsXG4weDQ4NDg5MGQ4LCAweDAzMDMwNjA1LCAweGY2ZjZmNzAxLCAweDBlMGUxYzEyLFxuMHg2MTYxYzJhMywgMHgzNTM1NmE1ZiwgMHg1NzU3YWVmOSwgMHhiOWI5NjlkMCxcbjB4ODY4NjE3OTEsIDB4YzFjMTk5NTgsIDB4MWQxZDNhMjcsIDB4OWU5ZTI3YjksXG4weGUxZTFkOTM4LCAweGY4ZjhlYjEzLCAweDk4OTgyYmIzLCAweDExMTEyMjMzLFxuMHg2OTY5ZDJiYiwgMHhkOWQ5YTk3MCwgMHg4ZThlMDc4OSwgMHg5NDk0MzNhNyxcbjB4OWI5YjJkYjYsIDB4MWUxZTNjMjIsIDB4ODc4NzE1OTIsIDB4ZTllOWM5MjAsXG4weGNlY2U4NzQ5LCAweDU1NTVhYWZmLCAweDI4Mjg1MDc4LCAweGRmZGZhNTdhLFxuMHg4YzhjMDM4ZiwgMHhhMWExNTlmOCwgMHg4OTg5MDk4MCwgMHgwZDBkMWExNyxcbjB4YmZiZjY1ZGEsIDB4ZTZlNmQ3MzEsIDB4NDI0Mjg0YzYsIDB4Njg2OGQwYjgsXG4weDQxNDE4MmMzLCAweDk5OTkyOWIwLCAweDJkMmQ1YTc3LCAweDBmMGYxZTExLFxuMHhiMGIwN2JjYiwgMHg1NDU0YThmYywgMHhiYmJiNmRkNiwgMHgxNjE2MmMzYSBdO1xuXG52YXIgVDMgPSBbXG4weDYzYzZhNTYzLCAweDdjZjg4NDdjLCAweDc3ZWU5OTc3LCAweDdiZjY4ZDdiLFxuMHhmMmZmMGRmMiwgMHg2YmQ2YmQ2YiwgMHg2ZmRlYjE2ZiwgMHhjNTkxNTRjNSxcbjB4MzA2MDUwMzAsIDB4MDEwMjAzMDEsIDB4NjdjZWE5NjcsIDB4MmI1NjdkMmIsXG4weGZlZTcxOWZlLCAweGQ3YjU2MmQ3LCAweGFiNGRlNmFiLCAweDc2ZWM5YTc2LFxuMHhjYThmNDVjYSwgMHg4MjFmOWQ4MiwgMHhjOTg5NDBjOSwgMHg3ZGZhODc3ZCxcbjB4ZmFlZjE1ZmEsIDB4NTliMmViNTksIDB4NDc4ZWM5NDcsIDB4ZjBmYjBiZjAsXG4weGFkNDFlY2FkLCAweGQ0YjM2N2Q0LCAweGEyNWZmZGEyLCAweGFmNDVlYWFmLFxuMHg5YzIzYmY5YywgMHhhNDUzZjdhNCwgMHg3MmU0OTY3MiwgMHhjMDliNWJjMCxcbjB4Yjc3NWMyYjcsIDB4ZmRlMTFjZmQsIDB4OTMzZGFlOTMsIDB4MjY0YzZhMjYsXG4weDM2NmM1YTM2LCAweDNmN2U0MTNmLCAweGY3ZjUwMmY3LCAweGNjODM0ZmNjLFxuMHgzNDY4NWMzNCwgMHhhNTUxZjRhNSwgMHhlNWQxMzRlNSwgMHhmMWY5MDhmMSxcbjB4NzFlMjkzNzEsIDB4ZDhhYjczZDgsIDB4MzE2MjUzMzEsIDB4MTUyYTNmMTUsXG4weDA0MDgwYzA0LCAweGM3OTU1MmM3LCAweDIzNDY2NTIzLCAweGMzOWQ1ZWMzLFxuMHgxODMwMjgxOCwgMHg5NjM3YTE5NiwgMHgwNTBhMGYwNSwgMHg5YTJmYjU5YSxcbjB4MDcwZTA5MDcsIDB4MTIyNDM2MTIsIDB4ODAxYjliODAsIDB4ZTJkZjNkZTIsXG4weGViY2QyNmViLCAweDI3NGU2OTI3LCAweGIyN2ZjZGIyLCAweDc1ZWE5Zjc1LFxuMHgwOTEyMWIwOSwgMHg4MzFkOWU4MywgMHgyYzU4NzQyYywgMHgxYTM0MmUxYSxcbjB4MWIzNjJkMWIsIDB4NmVkY2IyNmUsIDB4NWFiNGVlNWEsIDB4YTA1YmZiYTAsXG4weDUyYTRmNjUyLCAweDNiNzY0ZDNiLCAweGQ2Yjc2MWQ2LCAweGIzN2RjZWIzLFxuMHgyOTUyN2IyOSwgMHhlM2RkM2VlMywgMHgyZjVlNzEyZiwgMHg4NDEzOTc4NCxcbjB4NTNhNmY1NTMsIDB4ZDFiOTY4ZDEsIDB4MDAwMDAwMDAsIDB4ZWRjMTJjZWQsXG4weDIwNDA2MDIwLCAweGZjZTMxZmZjLCAweGIxNzljOGIxLCAweDViYjZlZDViLFxuMHg2YWQ0YmU2YSwgMHhjYjhkNDZjYiwgMHhiZTY3ZDliZSwgMHgzOTcyNGIzOSxcbjB4NGE5NGRlNGEsIDB4NGM5OGQ0NGMsIDB4NThiMGU4NTgsIDB4Y2Y4NTRhY2YsXG4weGQwYmI2YmQwLCAweGVmYzUyYWVmLCAweGFhNGZlNWFhLCAweGZiZWQxNmZiLFxuMHg0Mzg2YzU0MywgMHg0ZDlhZDc0ZCwgMHgzMzY2NTUzMywgMHg4NTExOTQ4NSxcbjB4NDU4YWNmNDUsIDB4ZjllOTEwZjksIDB4MDIwNDA2MDIsIDB4N2ZmZTgxN2YsXG4weDUwYTBmMDUwLCAweDNjNzg0NDNjLCAweDlmMjViYTlmLCAweGE4NGJlM2E4LFxuMHg1MWEyZjM1MSwgMHhhMzVkZmVhMywgMHg0MDgwYzA0MCwgMHg4ZjA1OGE4ZixcbjB4OTIzZmFkOTIsIDB4OWQyMWJjOWQsIDB4Mzg3MDQ4MzgsIDB4ZjVmMTA0ZjUsXG4weGJjNjNkZmJjLCAweGI2NzdjMWI2LCAweGRhYWY3NWRhLCAweDIxNDI2MzIxLFxuMHgxMDIwMzAxMCwgMHhmZmU1MWFmZiwgMHhmM2ZkMGVmMywgMHhkMmJmNmRkMixcbjB4Y2Q4MTRjY2QsIDB4MGMxODE0MGMsIDB4MTMyNjM1MTMsIDB4ZWNjMzJmZWMsXG4weDVmYmVlMTVmLCAweDk3MzVhMjk3LCAweDQ0ODhjYzQ0LCAweDE3MmUzOTE3LFxuMHhjNDkzNTdjNCwgMHhhNzU1ZjJhNywgMHg3ZWZjODI3ZSwgMHgzZDdhNDczZCxcbjB4NjRjOGFjNjQsIDB4NWRiYWU3NWQsIDB4MTkzMjJiMTksIDB4NzNlNjk1NzMsXG4weDYwYzBhMDYwLCAweDgxMTk5ODgxLCAweDRmOWVkMTRmLCAweGRjYTM3ZmRjLFxuMHgyMjQ0NjYyMiwgMHgyYTU0N2UyYSwgMHg5MDNiYWI5MCwgMHg4ODBiODM4OCxcbjB4NDY4Y2NhNDYsIDB4ZWVjNzI5ZWUsIDB4Yjg2YmQzYjgsIDB4MTQyODNjMTQsXG4weGRlYTc3OWRlLCAweDVlYmNlMjVlLCAweDBiMTYxZDBiLCAweGRiYWQ3NmRiLFxuMHhlMGRiM2JlMCwgMHgzMjY0NTYzMiwgMHgzYTc0NGUzYSwgMHgwYTE0MWUwYSxcbjB4NDk5MmRiNDksIDB4MDYwYzBhMDYsIDB4MjQ0ODZjMjQsIDB4NWNiOGU0NWMsXG4weGMyOWY1ZGMyLCAweGQzYmQ2ZWQzLCAweGFjNDNlZmFjLCAweDYyYzRhNjYyLFxuMHg5MTM5YTg5MSwgMHg5NTMxYTQ5NSwgMHhlNGQzMzdlNCwgMHg3OWYyOGI3OSxcbjB4ZTdkNTMyZTcsIDB4Yzg4YjQzYzgsIDB4Mzc2ZTU5MzcsIDB4NmRkYWI3NmQsXG4weDhkMDE4YzhkLCAweGQ1YjE2NGQ1LCAweDRlOWNkMjRlLCAweGE5NDllMGE5LFxuMHg2Y2Q4YjQ2YywgMHg1NmFjZmE1NiwgMHhmNGYzMDdmNCwgMHhlYWNmMjVlYSxcbjB4NjVjYWFmNjUsIDB4N2FmNDhlN2EsIDB4YWU0N2U5YWUsIDB4MDgxMDE4MDgsXG4weGJhNmZkNWJhLCAweDc4ZjA4ODc4LCAweDI1NGE2ZjI1LCAweDJlNWM3MjJlLFxuMHgxYzM4MjQxYywgMHhhNjU3ZjFhNiwgMHhiNDczYzdiNCwgMHhjNjk3NTFjNixcbjB4ZThjYjIzZTgsIDB4ZGRhMTdjZGQsIDB4NzRlODljNzQsIDB4MWYzZTIxMWYsXG4weDRiOTZkZDRiLCAweGJkNjFkY2JkLCAweDhiMGQ4NjhiLCAweDhhMGY4NThhLFxuMHg3MGUwOTA3MCwgMHgzZTdjNDIzZSwgMHhiNTcxYzRiNSwgMHg2NmNjYWE2NixcbjB4NDg5MGQ4NDgsIDB4MDMwNjA1MDMsIDB4ZjZmNzAxZjYsIDB4MGUxYzEyMGUsXG4weDYxYzJhMzYxLCAweDM1NmE1ZjM1LCAweDU3YWVmOTU3LCAweGI5NjlkMGI5LFxuMHg4NjE3OTE4NiwgMHhjMTk5NThjMSwgMHgxZDNhMjcxZCwgMHg5ZTI3Yjk5ZSxcbjB4ZTFkOTM4ZTEsIDB4ZjhlYjEzZjgsIDB4OTgyYmIzOTgsIDB4MTEyMjMzMTEsXG4weDY5ZDJiYjY5LCAweGQ5YTk3MGQ5LCAweDhlMDc4OThlLCAweDk0MzNhNzk0LFxuMHg5YjJkYjY5YiwgMHgxZTNjMjIxZSwgMHg4NzE1OTI4NywgMHhlOWM5MjBlOSxcbjB4Y2U4NzQ5Y2UsIDB4NTVhYWZmNTUsIDB4Mjg1MDc4MjgsIDB4ZGZhNTdhZGYsXG4weDhjMDM4ZjhjLCAweGExNTlmOGExLCAweDg5MDk4MDg5LCAweDBkMWExNzBkLFxuMHhiZjY1ZGFiZiwgMHhlNmQ3MzFlNiwgMHg0Mjg0YzY0MiwgMHg2OGQwYjg2OCxcbjB4NDE4MmMzNDEsIDB4OTkyOWIwOTksIDB4MmQ1YTc3MmQsIDB4MGYxZTExMGYsXG4weGIwN2JjYmIwLCAweDU0YThmYzU0LCAweGJiNmRkNmJiLCAweDE2MmMzYTE2IF07XG5cbnZhciBUNCA9IFtcbjB4YzZhNTYzNjMsIDB4Zjg4NDdjN2MsIDB4ZWU5OTc3NzcsIDB4ZjY4ZDdiN2IsXG4weGZmMGRmMmYyLCAweGQ2YmQ2YjZiLCAweGRlYjE2ZjZmLCAweDkxNTRjNWM1LFxuMHg2MDUwMzAzMCwgMHgwMjAzMDEwMSwgMHhjZWE5Njc2NywgMHg1NjdkMmIyYixcbjB4ZTcxOWZlZmUsIDB4YjU2MmQ3ZDcsIDB4NGRlNmFiYWIsIDB4ZWM5YTc2NzYsXG4weDhmNDVjYWNhLCAweDFmOWQ4MjgyLCAweDg5NDBjOWM5LCAweGZhODc3ZDdkLFxuMHhlZjE1ZmFmYSwgMHhiMmViNTk1OSwgMHg4ZWM5NDc0NywgMHhmYjBiZjBmMCxcbjB4NDFlY2FkYWQsIDB4YjM2N2Q0ZDQsIDB4NWZmZGEyYTIsIDB4NDVlYWFmYWYsXG4weDIzYmY5YzljLCAweDUzZjdhNGE0LCAweGU0OTY3MjcyLCAweDliNWJjMGMwLFxuMHg3NWMyYjdiNywgMHhlMTFjZmRmZCwgMHgzZGFlOTM5MywgMHg0YzZhMjYyNixcbjB4NmM1YTM2MzYsIDB4N2U0MTNmM2YsIDB4ZjUwMmY3ZjcsIDB4ODM0ZmNjY2MsXG4weDY4NWMzNDM0LCAweDUxZjRhNWE1LCAweGQxMzRlNWU1LCAweGY5MDhmMWYxLFxuMHhlMjkzNzE3MSwgMHhhYjczZDhkOCwgMHg2MjUzMzEzMSwgMHgyYTNmMTUxNSxcbjB4MDgwYzA0MDQsIDB4OTU1MmM3YzcsIDB4NDY2NTIzMjMsIDB4OWQ1ZWMzYzMsXG4weDMwMjgxODE4LCAweDM3YTE5Njk2LCAweDBhMGYwNTA1LCAweDJmYjU5YTlhLFxuMHgwZTA5MDcwNywgMHgyNDM2MTIxMiwgMHgxYjliODA4MCwgMHhkZjNkZTJlMixcbjB4Y2QyNmViZWIsIDB4NGU2OTI3MjcsIDB4N2ZjZGIyYjIsIDB4ZWE5Zjc1NzUsXG4weDEyMWIwOTA5LCAweDFkOWU4MzgzLCAweDU4NzQyYzJjLCAweDM0MmUxYTFhLFxuMHgzNjJkMWIxYiwgMHhkY2IyNmU2ZSwgMHhiNGVlNWE1YSwgMHg1YmZiYTBhMCxcbjB4YTRmNjUyNTIsIDB4NzY0ZDNiM2IsIDB4Yjc2MWQ2ZDYsIDB4N2RjZWIzYjMsXG4weDUyN2IyOTI5LCAweGRkM2VlM2UzLCAweDVlNzEyZjJmLCAweDEzOTc4NDg0LFxuMHhhNmY1NTM1MywgMHhiOTY4ZDFkMSwgMHgwMDAwMDAwMCwgMHhjMTJjZWRlZCxcbjB4NDA2MDIwMjAsIDB4ZTMxZmZjZmMsIDB4NzljOGIxYjEsIDB4YjZlZDViNWIsXG4weGQ0YmU2YTZhLCAweDhkNDZjYmNiLCAweDY3ZDliZWJlLCAweDcyNGIzOTM5LFxuMHg5NGRlNGE0YSwgMHg5OGQ0NGM0YywgMHhiMGU4NTg1OCwgMHg4NTRhY2ZjZixcbjB4YmI2YmQwZDAsIDB4YzUyYWVmZWYsIDB4NGZlNWFhYWEsIDB4ZWQxNmZiZmIsXG4weDg2YzU0MzQzLCAweDlhZDc0ZDRkLCAweDY2NTUzMzMzLCAweDExOTQ4NTg1LFxuMHg4YWNmNDU0NSwgMHhlOTEwZjlmOSwgMHgwNDA2MDIwMiwgMHhmZTgxN2Y3ZixcbjB4YTBmMDUwNTAsIDB4Nzg0NDNjM2MsIDB4MjViYTlmOWYsIDB4NGJlM2E4YTgsXG4weGEyZjM1MTUxLCAweDVkZmVhM2EzLCAweDgwYzA0MDQwLCAweDA1OGE4ZjhmLFxuMHgzZmFkOTI5MiwgMHgyMWJjOWQ5ZCwgMHg3MDQ4MzgzOCwgMHhmMTA0ZjVmNSxcbjB4NjNkZmJjYmMsIDB4NzdjMWI2YjYsIDB4YWY3NWRhZGEsIDB4NDI2MzIxMjEsXG4weDIwMzAxMDEwLCAweGU1MWFmZmZmLCAweGZkMGVmM2YzLCAweGJmNmRkMmQyLFxuMHg4MTRjY2RjZCwgMHgxODE0MGMwYywgMHgyNjM1MTMxMywgMHhjMzJmZWNlYyxcbjB4YmVlMTVmNWYsIDB4MzVhMjk3OTcsIDB4ODhjYzQ0NDQsIDB4MmUzOTE3MTcsXG4weDkzNTdjNGM0LCAweDU1ZjJhN2E3LCAweGZjODI3ZTdlLCAweDdhNDczZDNkLFxuMHhjOGFjNjQ2NCwgMHhiYWU3NWQ1ZCwgMHgzMjJiMTkxOSwgMHhlNjk1NzM3MyxcbjB4YzBhMDYwNjAsIDB4MTk5ODgxODEsIDB4OWVkMTRmNGYsIDB4YTM3ZmRjZGMsXG4weDQ0NjYyMjIyLCAweDU0N2UyYTJhLCAweDNiYWI5MDkwLCAweDBiODM4ODg4LFxuMHg4Y2NhNDY0NiwgMHhjNzI5ZWVlZSwgMHg2YmQzYjhiOCwgMHgyODNjMTQxNCxcbjB4YTc3OWRlZGUsIDB4YmNlMjVlNWUsIDB4MTYxZDBiMGIsIDB4YWQ3NmRiZGIsXG4weGRiM2JlMGUwLCAweDY0NTYzMjMyLCAweDc0NGUzYTNhLCAweDE0MWUwYTBhLFxuMHg5MmRiNDk0OSwgMHgwYzBhMDYwNiwgMHg0ODZjMjQyNCwgMHhiOGU0NWM1YyxcbjB4OWY1ZGMyYzIsIDB4YmQ2ZWQzZDMsIDB4NDNlZmFjYWMsIDB4YzRhNjYyNjIsXG4weDM5YTg5MTkxLCAweDMxYTQ5NTk1LCAweGQzMzdlNGU0LCAweGYyOGI3OTc5LFxuMHhkNTMyZTdlNywgMHg4YjQzYzhjOCwgMHg2ZTU5MzczNywgMHhkYWI3NmQ2ZCxcbjB4MDE4YzhkOGQsIDB4YjE2NGQ1ZDUsIDB4OWNkMjRlNGUsIDB4NDllMGE5YTksXG4weGQ4YjQ2YzZjLCAweGFjZmE1NjU2LCAweGYzMDdmNGY0LCAweGNmMjVlYWVhLFxuMHhjYWFmNjU2NSwgMHhmNDhlN2E3YSwgMHg0N2U5YWVhZSwgMHgxMDE4MDgwOCxcbjB4NmZkNWJhYmEsIDB4ZjA4ODc4NzgsIDB4NGE2ZjI1MjUsIDB4NWM3MjJlMmUsXG4weDM4MjQxYzFjLCAweDU3ZjFhNmE2LCAweDczYzdiNGI0LCAweDk3NTFjNmM2LFxuMHhjYjIzZThlOCwgMHhhMTdjZGRkZCwgMHhlODljNzQ3NCwgMHgzZTIxMWYxZixcbjB4OTZkZDRiNGIsIDB4NjFkY2JkYmQsIDB4MGQ4NjhiOGIsIDB4MGY4NThhOGEsXG4weGUwOTA3MDcwLCAweDdjNDIzZTNlLCAweDcxYzRiNWI1LCAweGNjYWE2NjY2LFxuMHg5MGQ4NDg0OCwgMHgwNjA1MDMwMywgMHhmNzAxZjZmNiwgMHgxYzEyMGUwZSxcbjB4YzJhMzYxNjEsIDB4NmE1ZjM1MzUsIDB4YWVmOTU3NTcsIDB4NjlkMGI5YjksXG4weDE3OTE4Njg2LCAweDk5NThjMWMxLCAweDNhMjcxZDFkLCAweDI3Yjk5ZTllLFxuMHhkOTM4ZTFlMSwgMHhlYjEzZjhmOCwgMHgyYmIzOTg5OCwgMHgyMjMzMTExMSxcbjB4ZDJiYjY5NjksIDB4YTk3MGQ5ZDksIDB4MDc4OThlOGUsIDB4MzNhNzk0OTQsXG4weDJkYjY5YjliLCAweDNjMjIxZTFlLCAweDE1OTI4Nzg3LCAweGM5MjBlOWU5LFxuMHg4NzQ5Y2VjZSwgMHhhYWZmNTU1NSwgMHg1MDc4MjgyOCwgMHhhNTdhZGZkZixcbjB4MDM4ZjhjOGMsIDB4NTlmOGExYTEsIDB4MDk4MDg5ODksIDB4MWExNzBkMGQsXG4weDY1ZGFiZmJmLCAweGQ3MzFlNmU2LCAweDg0YzY0MjQyLCAweGQwYjg2ODY4LFxuMHg4MmMzNDE0MSwgMHgyOWIwOTk5OSwgMHg1YTc3MmQyZCwgMHgxZTExMGYwZixcbjB4N2JjYmIwYjAsIDB4YThmYzU0NTQsIDB4NmRkNmJiYmIsIDB4MmMzYTE2MTYgXTtcblxuZnVuY3Rpb24gQjAoeCkgeyByZXR1cm4gKHgmMjU1KTsgfVxuZnVuY3Rpb24gQjEoeCkgeyByZXR1cm4gKCh4Pj44KSYyNTUpOyB9XG5mdW5jdGlvbiBCMih4KSB7IHJldHVybiAoKHg+PjE2KSYyNTUpOyB9XG5mdW5jdGlvbiBCMyh4KSB7IHJldHVybiAoKHg+PjI0KSYyNTUpOyB9XG5cbmZ1bmN0aW9uIEYxKHgwLCB4MSwgeDIsIHgzKVxue1xuICByZXR1cm4gQjEoVDFbeDAmMjU1XSkgfCAoQjEoVDFbKHgxPj44KSYyNTVdKTw8OClcbiAgICAgIHwgKEIxKFQxWyh4Mj4+MTYpJjI1NV0pPDwxNikgfCAoQjEoVDFbeDM+Pj4yNF0pPDwyNCk7XG59XG5cbmZ1bmN0aW9uIHBhY2tCeXRlcyhvY3RldHMpXG57XG4gIHZhciBpLCBqO1xuICB2YXIgbGVuPW9jdGV0cy5sZW5ndGg7XG4gIHZhciBiPW5ldyBBcnJheShsZW4vNCk7XG5cbiAgaWYgKCFvY3RldHMgfHwgbGVuICUgNCkgcmV0dXJuO1xuXG4gIGZvciAoaT0wLCBqPTA7IGo8bGVuOyBqKz0gNClcbiAgICAgYltpKytdID0gb2N0ZXRzW2pdIHwgKG9jdGV0c1tqKzFdPDw4KSB8IChvY3RldHNbaisyXTw8MTYpIHwgKG9jdGV0c1tqKzNdPDwyNCk7XG5cbiAgcmV0dXJuIGI7ICBcbn1cblxuZnVuY3Rpb24gdW5wYWNrQnl0ZXMocGFja2VkKVxue1xuICB2YXIgajtcbiAgdmFyIGk9MCwgbCA9IHBhY2tlZC5sZW5ndGg7XG4gIHZhciByID0gbmV3IEFycmF5KGwqNCk7XG5cbiAgZm9yIChqPTA7IGo8bDsgaisrKVxuICB7XG4gICAgcltpKytdID0gQjAocGFja2VkW2pdKTtcbiAgICByW2krK10gPSBCMShwYWNrZWRbal0pO1xuICAgIHJbaSsrXSA9IEIyKHBhY2tlZFtqXSk7XG4gICAgcltpKytdID0gQjMocGFja2VkW2pdKTtcbiAgfVxuICByZXR1cm4gcjtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBtYXhrYz04O1xudmFyIG1heHJrPTE0O1xuXG5mdW5jdGlvbiBrZXlFeHBhbnNpb24oa2V5KVxue1xuICB2YXIga2MsIGksIGosIHIsIHQ7XG4gIHZhciByb3VuZHM7XG4gIHZhciBrZXlTY2hlZD1uZXcgQXJyYXkobWF4cmsrMSk7XG4gIHZhciBrZXlsZW49a2V5Lmxlbmd0aDtcbiAgdmFyIGs9bmV3IEFycmF5KG1heGtjKTtcbiAgdmFyIHRrPW5ldyBBcnJheShtYXhrYyk7XG4gIHZhciByY29ucG9pbnRlcj0wO1xuXG4gIGlmKGtleWxlbj09MTYpXG4gIHtcbiAgIHJvdW5kcz0xMDtcbiAgIGtjPTQ7XG4gIH1cbiAgZWxzZSBpZihrZXlsZW49PTI0KVxuICB7XG4gICByb3VuZHM9MTI7XG4gICBrYz02O1xuICB9XG4gIGVsc2UgaWYoa2V5bGVuPT0zMilcbiAge1xuICAgcm91bmRzPTE0O1xuICAga2M9ODtcbiAgfVxuICBlbHNlXG4gIHtcblx0dXRpbC5wcmludF9lcnJvcignYWVzLmpzOiBJbnZhbGlkIGtleS1sZW5ndGggZm9yIEFFUyBrZXk6JytrZXlsZW4pO1xuICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yKGk9MDsgaTxtYXhyaysxOyBpKyspIGtleVNjaGVkW2ldPW5ldyBBcnJheSg0KTtcblxuICBmb3IoaT0wLGo9MDsgajxrZXlsZW47IGorKyxpKz00KVxuICAgIGtbal0gPSBrZXkuY2hhckNvZGVBdChpKSB8IChrZXkuY2hhckNvZGVBdChpKzEpPDw4KVxuICAgICAgICAgICAgICAgICAgICAgfCAoa2V5LmNoYXJDb2RlQXQoaSsyKTw8MTYpIHwgKGtleS5jaGFyQ29kZUF0KGkrMyk8PDI0KTtcblxuICBmb3Ioaj1rYy0xOyBqPj0wOyBqLS0pIHRrW2pdID0ga1tqXTtcblxuICByPTA7XG4gIHQ9MDtcbiAgZm9yKGo9MDsgKGo8a2MpJiYocjxyb3VuZHMrMSk7IClcbiAge1xuICAgIGZvcig7IChqPGtjKSYmKHQ8NCk7IGorKyx0KyspXG4gICAge1xuICAgICAga2V5U2NoZWRbcl1bdF09dGtbal07XG4gICAgfVxuICAgIGlmKHQ9PTQpXG4gICAge1xuICAgICAgcisrO1xuICAgICAgdD0wO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlKHI8cm91bmRzKzEpXG4gIHtcbiAgICB2YXIgdGVtcCA9IHRrW2tjLTFdO1xuXG4gICAgdGtbMF0gXj0gU1tCMSh0ZW1wKV0gfCAoU1tCMih0ZW1wKV08PDgpIHwgKFNbQjModGVtcCldPDwxNikgfCAoU1tCMCh0ZW1wKV08PDI0KTtcbiAgICB0a1swXSBePSBSY29uW3Jjb25wb2ludGVyKytdO1xuXG4gICAgaWYoa2MgIT0gOClcbiAgICB7XG4gICAgICBmb3Ioaj0xOyBqPGtjOyBqKyspIHRrW2pdIF49IHRrW2otMV07XG4gICAgfVxuICAgIGVsc2VcbiAgICB7XG4gICAgICBmb3Ioaj0xOyBqPGtjLzI7IGorKykgdGtbal0gXj0gdGtbai0xXTtcbiBcbiAgICAgIHRlbXAgPSB0a1trYy8yLTFdO1xuICAgICAgdGtba2MvMl0gXj0gU1tCMCh0ZW1wKV0gfCAoU1tCMSh0ZW1wKV08PDgpIHwgKFNbQjIodGVtcCldPDwxNikgfCAoU1tCMyh0ZW1wKV08PDI0KTtcblxuICAgICAgZm9yKGo9a2MvMisxOyBqPGtjOyBqKyspIHRrW2pdIF49IHRrW2otMV07XG4gICAgfVxuXG4gICAgZm9yKGo9MDsgKGo8a2MpJiYocjxyb3VuZHMrMSk7IClcbiAgICB7XG4gICAgICBmb3IoOyAoajxrYykmJih0PDQpOyBqKyssdCsrKVxuICAgICAge1xuICAgICAgICBrZXlTY2hlZFtyXVt0XT10a1tqXTtcbiAgICAgIH1cbiAgICAgIGlmKHQ9PTQpXG4gICAgICB7XG4gICAgICAgIHIrKztcbiAgICAgICAgdD0wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB0aGlzLnJvdW5kcyA9IHJvdW5kcztcbiAgdGhpcy5yayA9IGtleVNjaGVkO1xuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gQUVTZW5jcnlwdChibG9jaywgY3R4KVxue1xuICB2YXIgcjtcbiAgdmFyIHQwLHQxLHQyLHQzO1xuXG4gIHZhciBiID0gcGFja0J5dGVzKGJsb2NrKTtcbiAgdmFyIHJvdW5kcyA9IGN0eC5yb3VuZHM7XG4gIHZhciBiMCA9IGJbMF07XG4gIHZhciBiMSA9IGJbMV07XG4gIHZhciBiMiA9IGJbMl07XG4gIHZhciBiMyA9IGJbM107XG5cbiAgZm9yKHI9MDsgcjxyb3VuZHMtMTsgcisrKVxuICB7XG4gICAgdDAgPSBiMCBeIGN0eC5ya1tyXVswXTtcbiAgICB0MSA9IGIxIF4gY3R4LnJrW3JdWzFdO1xuICAgIHQyID0gYjIgXiBjdHgucmtbcl1bMl07XG4gICAgdDMgPSBiMyBeIGN0eC5ya1tyXVszXTtcblxuICAgIGIwID0gVDFbdDAmMjU1XSBeIFQyWyh0MT4+OCkmMjU1XSBeIFQzWyh0Mj4+MTYpJjI1NV0gXiBUNFt0Mz4+PjI0XTtcbiAgICBiMSA9IFQxW3QxJjI1NV0gXiBUMlsodDI+PjgpJjI1NV0gXiBUM1sodDM+PjE2KSYyNTVdIF4gVDRbdDA+Pj4yNF07XG4gICAgYjIgPSBUMVt0MiYyNTVdIF4gVDJbKHQzPj44KSYyNTVdIF4gVDNbKHQwPj4xNikmMjU1XSBeIFQ0W3QxPj4+MjRdO1xuICAgIGIzID0gVDFbdDMmMjU1XSBeIFQyWyh0MD4+OCkmMjU1XSBeIFQzWyh0MT4+MTYpJjI1NV0gXiBUNFt0Mj4+PjI0XTtcbiAgfVxuXG4gIC8vIGxhc3Qgcm91bmQgaXMgc3BlY2lhbFxuICByID0gcm91bmRzLTE7XG5cbiAgdDAgPSBiMCBeIGN0eC5ya1tyXVswXTtcbiAgdDEgPSBiMSBeIGN0eC5ya1tyXVsxXTtcbiAgdDIgPSBiMiBeIGN0eC5ya1tyXVsyXTtcbiAgdDMgPSBiMyBeIGN0eC5ya1tyXVszXTtcblxuICBiWzBdID0gRjEodDAsIHQxLCB0MiwgdDMpIF4gY3R4LnJrW3JvdW5kc11bMF07XG4gIGJbMV0gPSBGMSh0MSwgdDIsIHQzLCB0MCkgXiBjdHgucmtbcm91bmRzXVsxXTtcbiAgYlsyXSA9IEYxKHQyLCB0MywgdDAsIHQxKSBeIGN0eC5ya1tyb3VuZHNdWzJdO1xuICBiWzNdID0gRjEodDMsIHQwLCB0MSwgdDIpIF4gY3R4LnJrW3JvdW5kc11bM107XG5cbiAgcmV0dXJuIHVucGFja0J5dGVzKGIpO1xufVxuXG5mdW5jdGlvbiBtYWtlQ2xhc3MobGVuZ3RoKSB7XG5cblx0dmFyIGMgPSBmdW5jdGlvbihrZXkpIHtcblx0XHR0aGlzLmtleSA9IGtleUV4cGFuc2lvbihrZXkpO1xuXG5cdFx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oYmxvY2spIHtcblx0XHRcdHJldHVybiBBRVNlbmNyeXB0KGJsb2NrLCB0aGlzLmtleSk7XG5cdFx0fVxuXHR9XG5cblx0Yy5ibG9ja1NpemUgPSBjLnByb3RvdHlwZS5ibG9ja1NpemUgPSAxNjtcblx0Yy5rZXlTaXplID0gYy5wcm90b3R5cGUua2V5U2l6ZSA9IGxlbmd0aCAvIDg7XG5cblx0cmV0dXJuIGM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge31cblxudmFyIHR5cGVzID0gWzEyOCwgMTkyLCAyNTZdO1xuXG5mb3IodmFyIGkgaW4gdHlwZXMgKSB7XG5cdG1vZHVsZS5leHBvcnRzW3R5cGVzW2ldXSA9IG1ha2VDbGFzcyh0eXBlc1tpXSk7XG59XG4iLCIvKiBNb2RpZmllZCBieSBSZWN1cml0eSBMYWJzIEdtYkggXG4gKiBcbiAqIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBua2xlaW4gc29mdHdhcmUgKG5rbGVpbi5jb20pXG4gKi9cblxuLyogXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEJydWNlIFNjaG5laWVyJ3MgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqXG4gKiBUaGUgY29uc3RydWN0b3IgZG9lc24ndCBkbyBtdWNoIG9mIGFueXRoaW5nLiAgSXQncyBqdXN0IGhlcmVcbiAqIHNvIHdlIGNhbiBzdGFydCBkZWZpbmluZyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGFuZCBzdWNoLlxuICovXG5mdW5jdGlvbiBCbG93ZmlzaCgpIHtcbn07XG5cbi8qXG4gKiBEZWNsYXJlIHRoZSBibG9jayBzaXplIHNvIHRoYXQgcHJvdG9jb2xzIGtub3cgd2hhdCBzaXplXG4gKiBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSB0aGV5IHdpbGwgbmVlZC5cbiAqL1xuQmxvd2Zpc2gucHJvdG90eXBlLkJMT0NLU0laRSA9IDg7XG5cbi8qXG4gKiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgU0JPWEVTLlxuICovXG5CbG93ZmlzaC5wcm90b3R5cGUuU0JPWEVTID0gW1xuICAgIFtcblx0MHhkMTMxMGJhNiwgMHg5OGRmYjVhYywgMHgyZmZkNzJkYiwgMHhkMDFhZGZiNywgMHhiOGUxYWZlZCwgMHg2YTI2N2U5Nixcblx0MHhiYTdjOTA0NSwgMHhmMTJjN2Y5OSwgMHgyNGExOTk0NywgMHhiMzkxNmNmNywgMHgwODAxZjJlMiwgMHg4NThlZmMxNixcblx0MHg2MzY5MjBkOCwgMHg3MTU3NGU2OSwgMHhhNDU4ZmVhMywgMHhmNDkzM2Q3ZSwgMHgwZDk1NzQ4ZiwgMHg3MjhlYjY1OCxcblx0MHg3MThiY2Q1OCwgMHg4MjE1NGFlZSwgMHg3YjU0YTQxZCwgMHhjMjVhNTliNSwgMHg5YzMwZDUzOSwgMHgyYWYyNjAxMyxcblx0MHhjNWQxYjAyMywgMHgyODYwODVmMCwgMHhjYTQxNzkxOCwgMHhiOGRiMzhlZiwgMHg4ZTc5ZGNiMCwgMHg2MDNhMTgwZSxcblx0MHg2YzllMGU4YiwgMHhiMDFlOGEzZSwgMHhkNzE1NzdjMSwgMHhiZDMxNGIyNywgMHg3OGFmMmZkYSwgMHg1NTYwNWM2MCxcblx0MHhlNjU1MjVmMywgMHhhYTU1YWI5NCwgMHg1NzQ4OTg2MiwgMHg2M2U4MTQ0MCwgMHg1NWNhMzk2YSwgMHgyYWFiMTBiNixcblx0MHhiNGNjNWMzNCwgMHgxMTQxZThjZSwgMHhhMTU0ODZhZiwgMHg3YzcyZTk5MywgMHhiM2VlMTQxMSwgMHg2MzZmYmMyYSxcblx0MHgyYmE5YzU1ZCwgMHg3NDE4MzFmNiwgMHhjZTVjM2UxNiwgMHg5Yjg3OTMxZSwgMHhhZmQ2YmEzMywgMHg2YzI0Y2Y1Yyxcblx0MHg3YTMyNTM4MSwgMHgyODk1ODY3NywgMHgzYjhmNDg5OCwgMHg2YjRiYjlhZiwgMHhjNGJmZTgxYiwgMHg2NjI4MjE5Myxcblx0MHg2MWQ4MDljYywgMHhmYjIxYTk5MSwgMHg0ODdjYWM2MCwgMHg1ZGVjODAzMiwgMHhlZjg0NWQ1ZCwgMHhlOTg1NzViMSxcblx0MHhkYzI2MjMwMiwgMHhlYjY1MWI4OCwgMHgyMzg5M2U4MSwgMHhkMzk2YWNjNSwgMHgwZjZkNmZmMywgMHg4M2Y0NDIzOSxcblx0MHgyZTBiNDQ4MiwgMHhhNDg0MjAwNCwgMHg2OWM4ZjA0YSwgMHg5ZTFmOWI1ZSwgMHgyMWM2Njg0MiwgMHhmNmU5NmM5YSxcblx0MHg2NzBjOWM2MSwgMHhhYmQzODhmMCwgMHg2YTUxYTBkMiwgMHhkODU0MmY2OCwgMHg5NjBmYTcyOCwgMHhhYjUxMzNhMyxcblx0MHg2ZWVmMGI2YywgMHgxMzdhM2JlNCwgMHhiYTNiZjA1MCwgMHg3ZWZiMmE5OCwgMHhhMWYxNjUxZCwgMHgzOWFmMDE3Nixcblx0MHg2NmNhNTkzZSwgMHg4MjQzMGU4OCwgMHg4Y2VlODYxOSwgMHg0NTZmOWZiNCwgMHg3ZDg0YTVjMywgMHgzYjhiNWViZSxcblx0MHhlMDZmNzVkOCwgMHg4NWMxMjA3MywgMHg0MDFhNDQ5ZiwgMHg1NmMxNmFhNiwgMHg0ZWQzYWE2MiwgMHgzNjNmNzcwNixcblx0MHgxYmZlZGY3MiwgMHg0MjliMDIzZCwgMHgzN2QwZDcyNCwgMHhkMDBhMTI0OCwgMHhkYjBmZWFkMywgMHg0OWYxYzA5Yixcblx0MHgwNzUzNzJjOSwgMHg4MDk5MWI3YiwgMHgyNWQ0NzlkOCwgMHhmNmU4ZGVmNywgMHhlM2ZlNTAxYSwgMHhiNjc5NGMzYixcblx0MHg5NzZjZTBiZCwgMHgwNGMwMDZiYSwgMHhjMWE5NGZiNiwgMHg0MDlmNjBjNCwgMHg1ZTVjOWVjMiwgMHgxOTZhMjQ2Myxcblx0MHg2OGZiNmZhZiwgMHgzZTZjNTNiNSwgMHgxMzM5YjJlYiwgMHgzYjUyZWM2ZiwgMHg2ZGZjNTExZiwgMHg5YjMwOTUyYyxcblx0MHhjYzgxNDU0NCwgMHhhZjVlYmQwOSwgMHhiZWUzZDAwNCwgMHhkZTMzNGFmZCwgMHg2NjBmMjgwNywgMHgxOTJlNGJiMyxcblx0MHhjMGNiYTg1NywgMHg0NWM4NzQwZiwgMHhkMjBiNWYzOSwgMHhiOWQzZmJkYiwgMHg1NTc5YzBiZCwgMHgxYTYwMzIwYSxcblx0MHhkNmExMDBjNiwgMHg0MDJjNzI3OSwgMHg2NzlmMjVmZSwgMHhmYjFmYTNjYywgMHg4ZWE1ZTlmOCwgMHhkYjMyMjJmOCxcblx0MHgzYzc1MTZkZiwgMHhmZDYxNmIxNSwgMHgyZjUwMWVjOCwgMHhhZDA1NTJhYiwgMHgzMjNkYjVmYSwgMHhmZDIzODc2MCxcblx0MHg1MzMxN2I0OCwgMHgzZTAwZGY4MiwgMHg5ZTVjNTdiYiwgMHhjYTZmOGNhMCwgMHgxYTg3NTYyZSwgMHhkZjE3NjlkYixcblx0MHhkNTQyYThmNiwgMHgyODdlZmZjMywgMHhhYzY3MzJjNiwgMHg4YzRmNTU3MywgMHg2OTViMjdiMCwgMHhiYmNhNThjOCxcblx0MHhlMWZmYTM1ZCwgMHhiOGYwMTFhMCwgMHgxMGZhM2Q5OCwgMHhmZDIxODNiOCwgMHg0YWZjYjU2YywgMHgyZGQxZDM1Yixcblx0MHg5YTUzZTQ3OSwgMHhiNmY4NDU2NSwgMHhkMjhlNDliYywgMHg0YmZiOTc5MCwgMHhlMWRkZjJkYSwgMHhhNGNiN2UzMyxcblx0MHg2MmZiMTM0MSwgMHhjZWU0YzZlOCwgMHhlZjIwY2FkYSwgMHgzNjc3NGMwMSwgMHhkMDdlOWVmZSwgMHgyYmYxMWZiNCxcblx0MHg5NWRiZGE0ZCwgMHhhZTkwOTE5OCwgMHhlYWFkOGU3MSwgMHg2YjkzZDVhMCwgMHhkMDhlZDFkMCwgMHhhZmM3MjVlMCxcblx0MHg4ZTNjNWIyZiwgMHg4ZTc1OTRiNywgMHg4ZmY2ZTJmYiwgMHhmMjEyMmI2NCwgMHg4ODg4YjgxMiwgMHg5MDBkZjAxYyxcblx0MHg0ZmFkNWVhMCwgMHg2ODhmYzMxYywgMHhkMWNmZjE5MSwgMHhiM2E4YzFhZCwgMHgyZjJmMjIxOCwgMHhiZTBlMTc3Nyxcblx0MHhlYTc1MmRmZSwgMHg4YjAyMWZhMSwgMHhlNWEwY2MwZiwgMHhiNTZmNzRlOCwgMHgxOGFjZjNkNiwgMHhjZTg5ZTI5OSxcblx0MHhiNGE4NGZlMCwgMHhmZDEzZTBiNywgMHg3Y2M0M2I4MSwgMHhkMmFkYThkOSwgMHgxNjVmYTI2NiwgMHg4MDk1NzcwNSxcblx0MHg5M2NjNzMxNCwgMHgyMTFhMTQ3NywgMHhlNmFkMjA2NSwgMHg3N2I1ZmE4NiwgMHhjNzU0NDJmNSwgMHhmYjlkMzVjZixcblx0MHhlYmNkYWYwYywgMHg3YjNlODlhMCwgMHhkNjQxMWJkMywgMHhhZTFlN2U0OSwgMHgwMDI1MGUyZCwgMHgyMDcxYjM1ZSxcblx0MHgyMjY4MDBiYiwgMHg1N2I4ZTBhZiwgMHgyNDY0MzY5YiwgMHhmMDA5YjkxZSwgMHg1NTYzOTExZCwgMHg1OWRmYTZhYSxcblx0MHg3OGMxNDM4OSwgMHhkOTVhNTM3ZiwgMHgyMDdkNWJhMiwgMHgwMmU1YjljNSwgMHg4MzI2MDM3NiwgMHg2Mjk1Y2ZhOSxcblx0MHgxMWM4MTk2OCwgMHg0ZTczNGE0MSwgMHhiMzQ3MmRjYSwgMHg3YjE0YTk0YSwgMHgxYjUxMDA1MiwgMHg5YTUzMjkxNSxcblx0MHhkNjBmNTczZiwgMHhiYzliYzZlNCwgMHgyYjYwYTQ3NiwgMHg4MWU2NzQwMCwgMHgwOGJhNmZiNSwgMHg1NzFiZTkxZixcblx0MHhmMjk2ZWM2YiwgMHgyYTBkZDkxNSwgMHhiNjYzNjUyMSwgMHhlN2I5ZjliNiwgMHhmZjM0MDUyZSwgMHhjNTg1NTY2NCxcblx0MHg1M2IwMmQ1ZCwgMHhhOTlmOGZhMSwgMHgwOGJhNDc5OSwgMHg2ZTg1MDc2YVxuICAgIF0sIFtcblx0MHg0YjdhNzBlOSwgMHhiNWIzMjk0NCwgMHhkYjc1MDkyZSwgMHhjNDE5MjYyMywgMHhhZDZlYTZiMCwgMHg0OWE3ZGY3ZCxcblx0MHg5Y2VlNjBiOCwgMHg4ZmVkYjI2NiwgMHhlY2FhOGM3MSwgMHg2OTlhMTdmZiwgMHg1NjY0NTI2YywgMHhjMmIxOWVlMSxcblx0MHgxOTM2MDJhNSwgMHg3NTA5NGMyOSwgMHhhMDU5MTM0MCwgMHhlNDE4M2EzZSwgMHgzZjU0OTg5YSwgMHg1YjQyOWQ2NSxcblx0MHg2YjhmZTRkNiwgMHg5OWY3M2ZkNiwgMHhhMWQyOWMwNywgMHhlZmU4MzBmNSwgMHg0ZDJkMzhlNiwgMHhmMDI1NWRjMSxcblx0MHg0Y2RkMjA4NiwgMHg4NDcwZWIyNiwgMHg2MzgyZTljNiwgMHgwMjFlY2M1ZSwgMHgwOTY4NmIzZiwgMHgzZWJhZWZjOSxcblx0MHgzYzk3MTgxNCwgMHg2YjZhNzBhMSwgMHg2ODdmMzU4NCwgMHg1MmEwZTI4NiwgMHhiNzljNTMwNSwgMHhhYTUwMDczNyxcblx0MHgzZTA3ODQxYywgMHg3ZmRlYWU1YywgMHg4ZTdkNDRlYywgMHg1NzE2ZjJiOCwgMHhiMDNhZGEzNywgMHhmMDUwMGMwZCxcblx0MHhmMDFjMWYwNCwgMHgwMjAwYjNmZiwgMHhhZTBjZjUxYSwgMHgzY2I1NzRiMiwgMHgyNTgzN2E1OCwgMHhkYzA5MjFiZCxcblx0MHhkMTkxMTNmOSwgMHg3Y2E5MmZmNiwgMHg5NDMyNDc3MywgMHgyMmY1NDcwMSwgMHgzYWU1ZTU4MSwgMHgzN2MyZGFkYyxcblx0MHhjOGI1NzYzNCwgMHg5YWYzZGRhNywgMHhhOTQ0NjE0NiwgMHgwZmQwMDMwZSwgMHhlY2M4YzczZSwgMHhhNDc1MWU0MSxcblx0MHhlMjM4Y2Q5OSwgMHgzYmVhMGUyZiwgMHgzMjgwYmJhMSwgMHgxODNlYjMzMSwgMHg0ZTU0OGIzOCwgMHg0ZjZkYjkwOCxcblx0MHg2ZjQyMGQwMywgMHhmNjBhMDRiZiwgMHgyY2I4MTI5MCwgMHgyNDk3N2M3OSwgMHg1Njc5YjA3MiwgMHhiY2FmODlhZixcblx0MHhkZTlhNzcxZiwgMHhkOTkzMDgxMCwgMHhiMzhiYWUxMiwgMHhkY2NmM2YyZSwgMHg1NTEyNzIxZiwgMHgyZTZiNzEyNCxcblx0MHg1MDFhZGRlNiwgMHg5Zjg0Y2Q4NywgMHg3YTU4NDcxOCwgMHg3NDA4ZGExNywgMHhiYzlmOWFiYywgMHhlOTRiN2Q4Yyxcblx0MHhlYzdhZWMzYSwgMHhkYjg1MWRmYSwgMHg2MzA5NDM2NiwgMHhjNDY0YzNkMiwgMHhlZjFjMTg0NywgMHgzMjE1ZDkwOCxcblx0MHhkZDQzM2IzNywgMHgyNGMyYmExNiwgMHgxMmExNGQ0MywgMHgyYTY1YzQ1MSwgMHg1MDk0MDAwMiwgMHgxMzNhZTRkZCxcblx0MHg3MWRmZjg5ZSwgMHgxMDMxNGU1NSwgMHg4MWFjNzdkNiwgMHg1ZjExMTk5YiwgMHgwNDM1NTZmMSwgMHhkN2EzYzc2Yixcblx0MHgzYzExMTgzYiwgMHg1OTI0YTUwOSwgMHhmMjhmZTZlZCwgMHg5N2YxZmJmYSwgMHg5ZWJhYmYyYywgMHgxZTE1M2M2ZSxcblx0MHg4NmUzNDU3MCwgMHhlYWU5NmZiMSwgMHg4NjBlNWUwYSwgMHg1YTNlMmFiMywgMHg3NzFmZTcxYywgMHg0ZTNkMDZmYSxcblx0MHgyOTY1ZGNiOSwgMHg5OWU3MWQwZiwgMHg4MDNlODlkNiwgMHg1MjY2YzgyNSwgMHgyZTRjYzk3OCwgMHg5YzEwYjM2YSxcblx0MHhjNjE1MGViYSwgMHg5NGUyZWE3OCwgMHhhNWZjM2M1MywgMHgxZTBhMmRmNCwgMHhmMmY3NGVhNywgMHgzNjFkMmIzZCxcblx0MHgxOTM5MjYwZiwgMHgxOWMyNzk2MCwgMHg1MjIzYTcwOCwgMHhmNzEzMTJiNiwgMHhlYmFkZmU2ZSwgMHhlYWMzMWY2Nixcblx0MHhlM2JjNDU5NSwgMHhhNjdiYzg4MywgMHhiMTdmMzdkMSwgMHgwMThjZmYyOCwgMHhjMzMyZGRlZiwgMHhiZTZjNWFhNSxcblx0MHg2NTU4MjE4NSwgMHg2OGFiOTgwMiwgMHhlZWNlYTUwZiwgMHhkYjJmOTUzYiwgMHgyYWVmN2RhZCwgMHg1YjZlMmY4NCxcblx0MHgxNTIxYjYyOCwgMHgyOTA3NjE3MCwgMHhlY2RkNDc3NSwgMHg2MTlmMTUxMCwgMHgxM2NjYTgzMCwgMHhlYjYxYmQ5Nixcblx0MHgwMzM0ZmUxZSwgMHhhYTAzNjNjZiwgMHhiNTczNWM5MCwgMHg0YzcwYTIzOSwgMHhkNTllOWUwYiwgMHhjYmFhZGUxNCxcblx0MHhlZWNjODZiYywgMHg2MDYyMmNhNywgMHg5Y2FiNWNhYiwgMHhiMmYzODQ2ZSwgMHg2NDhiMWVhZiwgMHgxOWJkZjBjYSxcblx0MHhhMDIzNjliOSwgMHg2NTVhYmI1MCwgMHg0MDY4NWEzMiwgMHgzYzJhYjRiMywgMHgzMTllZTlkNSwgMHhjMDIxYjhmNyxcblx0MHg5YjU0MGIxOSwgMHg4NzVmYTA5OSwgMHg5NWY3OTk3ZSwgMHg2MjNkN2RhOCwgMHhmODM3ODg5YSwgMHg5N2UzMmQ3Nyxcblx0MHgxMWVkOTM1ZiwgMHgxNjY4MTI4MSwgMHgwZTM1ODgyOSwgMHhjN2U2MWZkNiwgMHg5NmRlZGZhMSwgMHg3ODU4YmE5OSxcblx0MHg1N2Y1ODRhNSwgMHgxYjIyNzI2MywgMHg5YjgzYzNmZiwgMHgxYWMyNDY5NiwgMHhjZGIzMGFlYiwgMHg1MzJlMzA1NCxcblx0MHg4ZmQ5NDhlNCwgMHg2ZGJjMzEyOCwgMHg1OGViZjJlZiwgMHgzNGM2ZmZlYSwgMHhmZTI4ZWQ2MSwgMHhlZTdjM2M3Myxcblx0MHg1ZDRhMTRkOSwgMHhlODY0YjdlMywgMHg0MjEwNWQxNCwgMHgyMDNlMTNlMCwgMHg0NWVlZTJiNiwgMHhhM2FhYWJlYSxcblx0MHhkYjZjNGYxNSwgMHhmYWNiNGZkMCwgMHhjNzQyZjQ0MiwgMHhlZjZhYmJiNSwgMHg2NTRmM2IxZCwgMHg0MWNkMjEwNSxcblx0MHhkODFlNzk5ZSwgMHg4Njg1NGRjNywgMHhlNDRiNDc2YSwgMHgzZDgxNjI1MCwgMHhjZjYyYTFmMiwgMHg1YjhkMjY0Nixcblx0MHhmYzg4ODNhMCwgMHhjMWM3YjZhMywgMHg3ZjE1MjRjMywgMHg2OWNiNzQ5MiwgMHg0Nzg0OGEwYiwgMHg1NjkyYjI4NSxcblx0MHgwOTViYmYwMCwgMHhhZDE5NDg5ZCwgMHgxNDYyYjE3NCwgMHgyMzgyMGUwMCwgMHg1ODQyOGQyYSwgMHgwYzU1ZjVlYSxcblx0MHgxZGFkZjQzZSwgMHgyMzNmNzA2MSwgMHgzMzcyZjA5MiwgMHg4ZDkzN2U0MSwgMHhkNjVmZWNmMSwgMHg2YzIyM2JkYixcblx0MHg3Y2RlMzc1OSwgMHhjYmVlNzQ2MCwgMHg0MDg1ZjJhNywgMHhjZTc3MzI2ZSwgMHhhNjA3ODA4NCwgMHgxOWY4NTA5ZSxcblx0MHhlOGVmZDg1NSwgMHg2MWQ5OTczNSwgMHhhOTY5YTdhYSwgMHhjNTBjMDZjMiwgMHg1YTA0YWJmYywgMHg4MDBiY2FkYyxcblx0MHg5ZTQ0N2EyZSwgMHhjMzQ1MzQ4NCwgMHhmZGQ1NjcwNSwgMHgwZTFlOWVjOSwgMHhkYjczZGJkMywgMHgxMDU1ODhjZCxcblx0MHg2NzVmZGE3OSwgMHhlMzY3NDM0MCwgMHhjNWM0MzQ2NSwgMHg3MTNlMzhkOCwgMHgzZDI4Zjg5ZSwgMHhmMTZkZmYyMCxcblx0MHgxNTNlMjFlNywgMHg4ZmIwM2Q0YSwgMHhlNmUzOWYyYiwgMHhkYjgzYWRmN1xuICAgIF0sIFtcblx0MHhlOTNkNWE2OCwgMHg5NDgxNDBmNywgMHhmNjRjMjYxYywgMHg5NDY5MjkzNCwgMHg0MTE1MjBmNywgMHg3NjAyZDRmNyxcblx0MHhiY2Y0NmIyZSwgMHhkNGEyMDA2OCwgMHhkNDA4MjQ3MSwgMHgzMzIwZjQ2YSwgMHg0M2I3ZDRiNywgMHg1MDAwNjFhZixcblx0MHgxZTM5ZjYyZSwgMHg5NzI0NDU0NiwgMHgxNDIxNGY3NCwgMHhiZjhiODg0MCwgMHg0ZDk1ZmMxZCwgMHg5NmI1OTFhZixcblx0MHg3MGY0ZGRkMywgMHg2NmEwMmY0NSwgMHhiZmJjMDllYywgMHgwM2JkOTc4NSwgMHg3ZmFjNmRkMCwgMHgzMWNiODUwNCxcblx0MHg5NmViMjdiMywgMHg1NWZkMzk0MSwgMHhkYTI1NDdlNiwgMHhhYmNhMGE5YSwgMHgyODUwNzgyNSwgMHg1MzA0MjlmNCxcblx0MHgwYTJjODZkYSwgMHhlOWI2NmRmYiwgMHg2OGRjMTQ2MiwgMHhkNzQ4NjkwMCwgMHg2ODBlYzBhNCwgMHgyN2ExOGRlZSxcblx0MHg0ZjNmZmVhMiwgMHhlODg3YWQ4YywgMHhiNThjZTAwNiwgMHg3YWY0ZDZiNiwgMHhhYWNlMWU3YywgMHhkMzM3NWZlYyxcblx0MHhjZTc4YTM5OSwgMHg0MDZiMmE0MiwgMHgyMGZlOWUzNSwgMHhkOWYzODViOSwgMHhlZTM5ZDdhYiwgMHgzYjEyNGU4Yixcblx0MHgxZGM5ZmFmNywgMHg0YjZkMTg1NiwgMHgyNmEzNjYzMSwgMHhlYWUzOTdiMiwgMHgzYTZlZmE3NCwgMHhkZDViNDMzMixcblx0MHg2ODQxZTdmNywgMHhjYTc4MjBmYiwgMHhmYjBhZjU0ZSwgMHhkOGZlYjM5NywgMHg0NTQwNTZhYywgMHhiYTQ4OTUyNyxcblx0MHg1NTUzM2EzYSwgMHgyMDgzOGQ4NywgMHhmZTZiYTliNywgMHhkMDk2OTU0YiwgMHg1NWE4NjdiYywgMHhhMTE1OWE1OCxcblx0MHhjY2E5Mjk2MywgMHg5OWUxZGIzMywgMHhhNjJhNGE1NiwgMHgzZjMxMjVmOSwgMHg1ZWY0N2UxYywgMHg5MDI5MzE3Yyxcblx0MHhmZGY4ZTgwMiwgMHgwNDI3MmY3MCwgMHg4MGJiMTU1YywgMHgwNTI4MmNlMywgMHg5NWMxMTU0OCwgMHhlNGM2NmQyMixcblx0MHg0OGMxMTMzZiwgMHhjNzBmODZkYywgMHgwN2Y5YzllZSwgMHg0MTA0MWYwZiwgMHg0MDQ3NzlhNCwgMHg1ZDg4NmUxNyxcblx0MHgzMjVmNTFlYiwgMHhkNTliYzBkMSwgMHhmMmJjYzE4ZiwgMHg0MTExMzU2NCwgMHgyNTdiNzgzNCwgMHg2MDJhOWM2MCxcblx0MHhkZmY4ZThhMywgMHgxZjYzNmMxYiwgMHgwZTEyYjRjMiwgMHgwMmUxMzI5ZSwgMHhhZjY2NGZkMSwgMHhjYWQxODExNSxcblx0MHg2YjIzOTVlMCwgMHgzMzNlOTJlMSwgMHgzYjI0MGI2MiwgMHhlZWJlYjkyMiwgMHg4NWIyYTIwZSwgMHhlNmJhMGQ5OSxcblx0MHhkZTcyMGM4YywgMHgyZGEyZjcyOCwgMHhkMDEyNzg0NSwgMHg5NWI3OTRmZCwgMHg2NDdkMDg2MiwgMHhlN2NjZjVmMCxcblx0MHg1NDQ5YTM2ZiwgMHg4NzdkNDhmYSwgMHhjMzlkZmQyNywgMHhmMzNlOGQxZSwgMHgwYTQ3NjM0MSwgMHg5OTJlZmY3NCxcblx0MHgzYTZmNmVhYiwgMHhmNGY4ZmQzNywgMHhhODEyZGM2MCwgMHhhMWViZGRmOCwgMHg5OTFiZTE0YywgMHhkYjZlNmIwZCxcblx0MHhjNjdiNTUxMCwgMHg2ZDY3MmMzNywgMHgyNzY1ZDQzYiwgMHhkY2QwZTgwNCwgMHhmMTI5MGRjNywgMHhjYzAwZmZhMyxcblx0MHhiNTM5MGY5MiwgMHg2OTBmZWQwYiwgMHg2NjdiOWZmYiwgMHhjZWRiN2Q5YywgMHhhMDkxY2YwYiwgMHhkOTE1NWVhMyxcblx0MHhiYjEzMmY4OCwgMHg1MTViYWQyNCwgMHg3Yjk0NzliZiwgMHg3NjNiZDZlYiwgMHgzNzM5MmViMywgMHhjYzExNTk3OSxcblx0MHg4MDI2ZTI5NywgMHhmNDJlMzEyZCwgMHg2ODQyYWRhNywgMHhjNjZhMmIzYiwgMHgxMjc1NGNjYywgMHg3ODJlZjExYyxcblx0MHg2YTEyNDIzNywgMHhiNzkyNTFlNywgMHgwNmExYmJlNiwgMHg0YmZiNjM1MCwgMHgxYTZiMTAxOCwgMHgxMWNhZWRmYSxcblx0MHgzZDI1YmRkOCwgMHhlMmUxYzNjOSwgMHg0NDQyMTY1OSwgMHgwYTEyMTM4NiwgMHhkOTBjZWM2ZSwgMHhkNWFiZWEyYSxcblx0MHg2NGFmNjc0ZSwgMHhkYTg2YTg1ZiwgMHhiZWJmZTk4OCwgMHg2NGU0YzNmZSwgMHg5ZGJjODA1NywgMHhmMGY3YzA4Nixcblx0MHg2MDc4N2JmOCwgMHg2MDAzNjA0ZCwgMHhkMWZkODM0NiwgMHhmNjM4MWZiMCwgMHg3NzQ1YWUwNCwgMHhkNzM2ZmNjYyxcblx0MHg4MzQyNmIzMywgMHhmMDFlYWI3MSwgMHhiMDgwNDE4NywgMHgzYzAwNWU1ZiwgMHg3N2EwNTdiZSwgMHhiZGU4YWUyNCxcblx0MHg1NTQ2NDI5OSwgMHhiZjU4MmU2MSwgMHg0ZTU4ZjQ4ZiwgMHhmMmRkZmRhMiwgMHhmNDc0ZWYzOCwgMHg4Nzg5YmRjMixcblx0MHg1MzY2ZjljMywgMHhjOGIzOGU3NCwgMHhiNDc1ZjI1NSwgMHg0NmZjZDliOSwgMHg3YWViMjY2MSwgMHg4YjFkZGY4NCxcblx0MHg4NDZhMGU3OSwgMHg5MTVmOTVlMiwgMHg0NjZlNTk4ZSwgMHgyMGI0NTc3MCwgMHg4Y2Q1NTU5MSwgMHhjOTAyZGU0Yyxcblx0MHhiOTBiYWNlMSwgMHhiYjgyMDVkMCwgMHgxMWE4NjI0OCwgMHg3NTc0YTk5ZSwgMHhiNzdmMTliNiwgMHhlMGE5ZGMwOSxcblx0MHg2NjJkMDlhMSwgMHhjNDMyNDYzMywgMHhlODVhMWYwMiwgMHgwOWYwYmU4YywgMHg0YTk5YTAyNSwgMHgxZDZlZmUxMCxcblx0MHgxYWI5M2QxZCwgMHgwYmE1YTRkZiwgMHhhMTg2ZjIwZiwgMHgyODY4ZjE2OSwgMHhkY2I3ZGE4MywgMHg1NzM5MDZmZSxcblx0MHhhMWUyY2U5YiwgMHg0ZmNkN2Y1MiwgMHg1MDExNWUwMSwgMHhhNzA2ODNmYSwgMHhhMDAyYjVjNCwgMHgwZGU2ZDAyNyxcblx0MHg5YWY4OGMyNywgMHg3NzNmODY0MSwgMHhjMzYwNGMwNiwgMHg2MWE4MDZiNSwgMHhmMDE3N2EyOCwgMHhjMGY1ODZlMCxcblx0MHgwMDYwNThhYSwgMHgzMGRjN2Q2MiwgMHgxMWU2OWVkNywgMHgyMzM4ZWE2MywgMHg1M2MyZGQ5NCwgMHhjMmMyMTYzNCxcblx0MHhiYmNiZWU1NiwgMHg5MGJjYjZkZSwgMHhlYmZjN2RhMSwgMHhjZTU5MWQ3NiwgMHg2ZjA1ZTQwOSwgMHg0YjdjMDE4OCxcblx0MHgzOTcyMGEzZCwgMHg3YzkyN2MyNCwgMHg4NmUzNzI1ZiwgMHg3MjRkOWRiOSwgMHgxYWMxNWJiNCwgMHhkMzllYjhmYyxcblx0MHhlZDU0NTU3OCwgMHgwOGZjYTViNSwgMHhkODNkN2NkMywgMHg0ZGFkMGZjNCwgMHgxZTUwZWY1ZSwgMHhiMTYxZTZmOCxcblx0MHhhMjg1MTRkOSwgMHg2YzUxMTMzYywgMHg2ZmQ1YzdlNywgMHg1NmUxNGVjNCwgMHgzNjJhYmZjZSwgMHhkZGM2YzgzNyxcblx0MHhkNzlhMzIzNCwgMHg5MjYzODIxMiwgMHg2NzBlZmE4ZSwgMHg0MDYwMDBlMFxuICAgIF0sIFtcblx0MHgzYTM5Y2UzNywgMHhkM2ZhZjVjZiwgMHhhYmMyNzczNywgMHg1YWM1MmQxYiwgMHg1Y2IwNjc5ZSwgMHg0ZmEzMzc0Mixcblx0MHhkMzgyMjc0MCwgMHg5OWJjOWJiZSwgMHhkNTExOGU5ZCwgMHhiZjBmNzMxNSwgMHhkNjJkMWM3ZSwgMHhjNzAwYzQ3Yixcblx0MHhiNzhjMWI2YiwgMHgyMWExOTA0NSwgMHhiMjZlYjFiZSwgMHg2YTM2NmViNCwgMHg1NzQ4YWIyZiwgMHhiYzk0NmU3OSxcblx0MHhjNmEzNzZkMiwgMHg2NTQ5YzJjOCwgMHg1MzBmZjhlZSwgMHg0NjhkZGU3ZCwgMHhkNTczMGExZCwgMHg0Y2QwNGRjNixcblx0MHgyOTM5YmJkYiwgMHhhOWJhNDY1MCwgMHhhYzk1MjZlOCwgMHhiZTVlZTMwNCwgMHhhMWZhZDVmMCwgMHg2YTJkNTE5YSxcblx0MHg2M2VmOGNlMiwgMHg5YTg2ZWUyMiwgMHhjMDg5YzJiOCwgMHg0MzI0MmVmNiwgMHhhNTFlMDNhYSwgMHg5Y2YyZDBhNCxcblx0MHg4M2MwNjFiYSwgMHg5YmU5NmE0ZCwgMHg4ZmU1MTU1MCwgMHhiYTY0NWJkNiwgMHgyODI2YTJmOSwgMHhhNzNhM2FlMSxcblx0MHg0YmE5OTU4NiwgMHhlZjU1NjJlOSwgMHhjNzJmZWZkMywgMHhmNzUyZjdkYSwgMHgzZjA0NmY2OSwgMHg3N2ZhMGE1OSxcblx0MHg4MGU0YTkxNSwgMHg4N2IwODYwMSwgMHg5YjA5ZTZhZCwgMHgzYjNlZTU5MywgMHhlOTkwZmQ1YSwgMHg5ZTM0ZDc5Nyxcblx0MHgyY2YwYjdkOSwgMHgwMjJiOGI1MSwgMHg5NmQ1YWMzYSwgMHgwMTdkYTY3ZCwgMHhkMWNmM2VkNiwgMHg3YzdkMmQyOCxcblx0MHgxZjlmMjVjZiwgMHhhZGYyYjg5YiwgMHg1YWQ2YjQ3MiwgMHg1YTg4ZjU0YywgMHhlMDI5YWM3MSwgMHhlMDE5YTVlNixcblx0MHg0N2IwYWNmZCwgMHhlZDkzZmE5YiwgMHhlOGQzYzQ4ZCwgMHgyODNiNTdjYywgMHhmOGQ1NjYyOSwgMHg3OTEzMmUyOCxcblx0MHg3ODVmMDE5MSwgMHhlZDc1NjA1NSwgMHhmNzk2MGU0NCwgMHhlM2QzNWU4YywgMHgxNTA1NmRkNCwgMHg4OGY0NmRiYSxcblx0MHgwM2ExNjEyNSwgMHgwNTY0ZjBiZCwgMHhjM2ViOWUxNSwgMHgzYzkwNTdhMiwgMHg5NzI3MWFlYywgMHhhOTNhMDcyYSxcblx0MHgxYjNmNmQ5YiwgMHgxZTYzMjFmNSwgMHhmNTljNjZmYiwgMHgyNmRjZjMxOSwgMHg3NTMzZDkyOCwgMHhiMTU1ZmRmNSxcblx0MHgwMzU2MzQ4MiwgMHg4YWJhM2NiYiwgMHgyODUxNzcxMSwgMHhjMjBhZDlmOCwgMHhhYmNjNTE2NywgMHhjY2FkOTI1Zixcblx0MHg0ZGU4MTc1MSwgMHgzODMwZGM4ZSwgMHgzNzlkNTg2MiwgMHg5MzIwZjk5MSwgMHhlYTdhOTBjMiwgMHhmYjNlN2JjZSxcblx0MHg1MTIxY2U2NCwgMHg3NzRmYmUzMiwgMHhhOGI2ZTM3ZSwgMHhjMzI5M2Q0NiwgMHg0OGRlNTM2OSwgMHg2NDEzZTY4MCxcblx0MHhhMmFlMDgxMCwgMHhkZDZkYjIyNCwgMHg2OTg1MmRmZCwgMHgwOTA3MjE2NiwgMHhiMzlhNDYwYSwgMHg2NDQ1YzBkZCxcblx0MHg1ODZjZGVjZiwgMHgxYzIwYzhhZSwgMHg1YmJlZjdkZCwgMHgxYjU4OGQ0MCwgMHhjY2QyMDE3ZiwgMHg2YmI0ZTNiYixcblx0MHhkZGEyNmE3ZSwgMHgzYTU5ZmY0NSwgMHgzZTM1MGE0NCwgMHhiY2I0Y2RkNSwgMHg3MmVhY2VhOCwgMHhmYTY0ODRiYixcblx0MHg4ZDY2MTJhZSwgMHhiZjNjNmY0NywgMHhkMjliZTQ2MywgMHg1NDJmNWQ5ZSwgMHhhZWMyNzcxYiwgMHhmNjRlNjM3MCxcblx0MHg3NDBlMGQ4ZCwgMHhlNzViMTM1NywgMHhmODcyMTY3MSwgMHhhZjUzN2Q1ZCwgMHg0MDQwY2IwOCwgMHg0ZWI0ZTJjYyxcblx0MHgzNGQyNDY2YSwgMHgwMTE1YWY4NCwgMHhlMWIwMDQyOCwgMHg5NTk4M2ExZCwgMHgwNmI4OWZiNCwgMHhjZTZlYTA0OCxcblx0MHg2ZjNmM2I4MiwgMHgzNTIwYWI4MiwgMHgwMTFhMWQ0YiwgMHgyNzcyMjdmOCwgMHg2MTE1NjBiMSwgMHhlNzkzM2ZkYyxcblx0MHhiYjNhNzkyYiwgMHgzNDQ1MjViZCwgMHhhMDg4MzllMSwgMHg1MWNlNzk0YiwgMHgyZjMyYzliNywgMHhhMDFmYmFjOSxcblx0MHhlMDFjYzg3ZSwgMHhiY2M3ZDFmNiwgMHhjZjAxMTFjMywgMHhhMWU4YWFjNywgMHgxYTkwODc0OSwgMHhkNDRmYmQ5YSxcblx0MHhkMGRhZGVjYiwgMHhkNTBhZGEzOCwgMHgwMzM5YzMyYSwgMHhjNjkxMzY2NywgMHg4ZGY5MzE3YywgMHhlMGIxMmI0Zixcblx0MHhmNzllNTliNywgMHg0M2Y1YmIzYSwgMHhmMmQ1MTlmZiwgMHgyN2Q5NDU5YywgMHhiZjk3MjIyYywgMHgxNWU2ZmMyYSxcblx0MHgwZjkxZmM3MSwgMHg5Yjk0MTUyNSwgMHhmYWU1OTM2MSwgMHhjZWI2OWNlYiwgMHhjMmE4NjQ1OSwgMHgxMmJhYThkMSxcblx0MHhiNmMxMDc1ZSwgMHhlMzA1NmEwYywgMHgxMGQyNTA2NSwgMHhjYjAzYTQ0MiwgMHhlMGVjNmUwZSwgMHgxNjk4ZGIzYixcblx0MHg0Yzk4YTBiZSwgMHgzMjc4ZTk2NCwgMHg5ZjFmOTUzMiwgMHhlMGQzOTJkZiwgMHhkM2EwMzQyYiwgMHg4OTcxZjIxZSxcblx0MHgxYjBhNzQ0MSwgMHg0YmEzMzQ4YywgMHhjNWJlNzEyMCwgMHhjMzc2MzJkOCwgMHhkZjM1OWY4ZCwgMHg5Yjk5MmYyZSxcblx0MHhlNjBiNmY0NywgMHgwZmUzZjExZCwgMHhlNTRjZGE1NCwgMHgxZWRhZDg5MSwgMHhjZTYyNzljZiwgMHhjZDNlN2U2Zixcblx0MHgxNjE4YjE2NiwgMHhmZDJjMWQwNSwgMHg4NDhmZDJjNSwgMHhmNmZiMjI5OSwgMHhmNTIzZjM1NywgMHhhNjMyNzYyMyxcblx0MHg5M2E4MzUzMSwgMHg1NmNjY2QwMiwgMHhhY2YwODE2MiwgMHg1YTc1ZWJiNSwgMHg2ZTE2MzY5NywgMHg4OGQyNzNjYyxcblx0MHhkZTk2NjI5MiwgMHg4MWI5NDlkMCwgMHg0YzUwOTAxYiwgMHg3MWM2NTYxNCwgMHhlNmM2YzdiZCwgMHgzMjdhMTQwYSxcblx0MHg0NWUxZDAwNiwgMHhjM2YyN2I5YSwgMHhjOWFhNTNmZCwgMHg2MmE4MGYwMCwgMHhiYjI1YmZlMiwgMHgzNWJkZDJmNixcblx0MHg3MTEyNjkwNSwgMHhiMjA0MDIyMiwgMHhiNmNiY2Y3YywgMHhjZDc2OWMyYiwgMHg1MzExM2VjMCwgMHgxNjQwZTNkMyxcblx0MHgzOGFiYmQ2MCwgMHgyNTQ3YWRmMCwgMHhiYTM4MjA5YywgMHhmNzQ2Y2U3NiwgMHg3N2FmYTFjNSwgMHgyMDc1NjA2MCxcblx0MHg4NWNiZmU0ZSwgMHg4YWU4OGRkOCwgMHg3YWFhZjliMCwgMHg0Y2Y5YWE3ZSwgMHgxOTQ4YzI1YywgMHgwMmZiOGE4Yyxcblx0MHgwMWMzNmFlNCwgMHhkNmViZTFmOSwgMHg5MGQ0Zjg2OSwgMHhhNjVjZGVhMCwgMHgzZjA5MjUyZCwgMHhjMjA4ZTY5Zixcblx0MHhiNzRlNjEzMiwgMHhjZTc3ZTI1YiwgMHg1NzhmZGZlMywgMHgzYWMzNzJlNlxuICAgIF1cbl07XG5cbi8vKlxuLy8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgUEFSUkFZXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5QQVJSQVkgPSBbXG4gICAgMHgyNDNmNmE4OCwgMHg4NWEzMDhkMywgMHgxMzE5OGEyZSwgMHgwMzcwNzM0NCwgMHhhNDA5MzgyMiwgMHgyOTlmMzFkMCxcbiAgICAweDA4MmVmYTk4LCAweGVjNGU2Yzg5LCAweDQ1MjgyMWU2LCAweDM4ZDAxMzc3LCAweGJlNTQ2NmNmLCAweDM0ZTkwYzZjLFxuICAgIDB4YzBhYzI5YjcsIDB4Yzk3YzUwZGQsIDB4M2Y4NGQ1YjUsIDB4YjU0NzA5MTcsIDB4OTIxNmQ1ZDksIDB4ODk3OWZiMWJcbl07XG5cbi8vKlxuLy8qIFRoaXMgaXMgdGhlIG51bWJlciBvZiByb3VuZHMgdGhlIGNpcGhlciB3aWxsIGdvXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5OTiA9IDE2O1xuXG4vLypcbi8vKiBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCB0byBnZXQgcmlkIG9mIHByb2JsZW1zXG4vLyogd2l0aCB0aGUgaGlnaC1iaXQgZ2V0dGluZyBzZXQuICBJZiB3ZSBkb24ndCBkb1xuLy8qIHRoaXMsIHRoZW4gc29tZXRpbWVzICggYWEgJiAweDAwRkZGRkZGRkYgKSBpcyBub3Rcbi8vKiBlcXVhbCB0byAoIGJiICYgMHgwMEZGRkZGRkZGICkgZXZlbiB3aGVuIHRoZXlcbi8vKiBhZ3JlZSBiaXQtZm9yLWJpdCBmb3IgdGhlIGZpcnN0IDMyIGJpdHMuXG4vLypcbkJsb3dmaXNoLnByb3RvdHlwZS5fY2xlYW4gPSBmdW5jdGlvbiggeHggKSB7XG4gICAgaWYgKCB4eCA8IDAgKSB7XG5cdHZhciB5eSA9IHh4ICYgMHg3RkZGRkZGRjtcblx0eHggPSB5eSArIDB4ODAwMDAwMDA7XG4gICAgfVxuICAgIHJldHVybiB4eDtcbn07XG5cbi8vKlxuLy8qIFRoaXMgaXMgdGhlIG1peGluZyBmdW5jdGlvbiB0aGF0IHVzZXMgdGhlIHNib3hlc1xuLy8qXG5CbG93ZmlzaC5wcm90b3R5cGUuX0YgPSBmdW5jdGlvbiAoIHh4ICkge1xuICAgIHZhciBhYTtcbiAgICB2YXIgYmI7XG4gICAgdmFyIGNjO1xuICAgIHZhciBkZDtcbiAgICB2YXIgeXk7XG5cbiAgICBkZCA9IHh4ICYgMHgwMEZGO1xuICAgIHh4ID4+Pj0gODtcbiAgICBjYyA9IHh4ICYgMHgwMEZGO1xuICAgIHh4ID4+Pj0gODtcbiAgICBiYiA9IHh4ICYgMHgwMEZGO1xuICAgIHh4ID4+Pj0gODtcbiAgICBhYSA9IHh4ICYgMHgwMEZGO1xuXG4gICAgeXkgPSB0aGlzLnNib3hlc1sgMCBdWyBhYSBdICsgdGhpcy5zYm94ZXNbIDEgXVsgYmIgXTtcbiAgICB5eSA9IHl5IF4gdGhpcy5zYm94ZXNbIDIgXVsgY2MgXTtcbiAgICB5eSA9IHl5ICsgdGhpcy5zYm94ZXNbIDMgXVsgZGQgXTtcblxuICAgIHJldHVybiB5eTtcbn07XG5cbi8vKlxuLy8qIFRoaXMgbWV0aG9kIHRha2VzIGFuIGFycmF5IHdpdGggdHdvIHZhbHVlcywgbGVmdCBhbmQgcmlnaHRcbi8vKiBhbmQgZG9lcyBOTiByb3VuZHMgb2YgQmxvd2Zpc2ggb24gdGhlbS5cbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLl9lbmNyeXB0X2Jsb2NrID0gZnVuY3Rpb24gKCB2YWxzICkge1xuICAgIHZhciBkYXRhTCA9IHZhbHNbIDAgXTtcbiAgICB2YXIgZGF0YVIgPSB2YWxzWyAxIF07XG5cbiAgICB2YXIgaWk7XG5cbiAgICBmb3IgKCBpaT0wOyBpaSA8IHRoaXMuTk47ICsraWkgKSB7XG5cdGRhdGFMID0gZGF0YUwgXiB0aGlzLnBhcnJheVsgaWkgXTtcblx0ZGF0YVIgPSB0aGlzLl9GKCBkYXRhTCApIF4gZGF0YVI7XG5cblx0dmFyIHRtcCA9IGRhdGFMO1xuXHRkYXRhTCA9IGRhdGFSO1xuXHRkYXRhUiA9IHRtcDtcbiAgICB9XG5cbiAgICBkYXRhTCA9IGRhdGFMIF4gdGhpcy5wYXJyYXlbIHRoaXMuTk4gKyAwIF07XG4gICAgZGF0YVIgPSBkYXRhUiBeIHRoaXMucGFycmF5WyB0aGlzLk5OICsgMSBdO1xuXG4gICAgdmFsc1sgMCBdID0gdGhpcy5fY2xlYW4oIGRhdGFSICk7XG4gICAgdmFsc1sgMSBdID0gdGhpcy5fY2xlYW4oIGRhdGFMICk7XG59O1xuXG4vLypcbi8vKiBUaGlzIG1ldGhvZCB0YWtlcyBhIHZlY3RvciBvZiBudW1iZXJzIGFuZCB0dXJucyB0aGVtXG4vLyogaW50byBsb25nIHdvcmRzIHNvIHRoYXQgdGhleSBjYW4gYmUgcHJvY2Vzc2VkIGJ5IHRoZVxuLy8qIHJlYWwgYWxnb3JpdGhtLlxuLy8qXG4vLyogTWF5YmUgSSBzaG91bGQgbWFrZSB0aGUgcmVhbCBhbGdvcml0aG0gYWJvdmUgdGFrZSBhIHZlY3RvclxuLy8qIGluc3RlYWQuICBUaGF0IHdpbGwgaW52b2x2ZSBtb3JlIGxvb3BpbmcsIGJ1dCBpdCB3b24ndCByZXF1aXJlXG4vLyogdGhlIEYoKSBtZXRob2QgdG8gZGVjb25zdHJ1Y3QgdGhlIHZlY3Rvci5cbi8vKlxuQmxvd2Zpc2gucHJvdG90eXBlLmVuY3J5cHRfYmxvY2sgPSBmdW5jdGlvbiAoIHZlY3RvciApIHtcbiAgICB2YXIgaWk7XG4gICAgdmFyIHZhbHMgPSBbIDAsIDAgXTtcbiAgICB2YXIgb2ZmICA9IHRoaXMuQkxPQ0tTSVpFLzI7XG4gICAgZm9yICggaWkgPSAwOyBpaSA8IHRoaXMuQkxPQ0tTSVpFLzI7ICsraWkgKSB7XG5cdHZhbHNbMF0gPSAoIHZhbHNbMF0gPDwgOCApIHwgKCB2ZWN0b3JbIGlpICsgMCAgIF0gJiAweDAwRkYgKTtcblx0dmFsc1sxXSA9ICggdmFsc1sxXSA8PCA4ICkgfCAoIHZlY3RvclsgaWkgKyBvZmYgXSAmIDB4MDBGRiApO1xuICAgIH1cblxuICAgIHRoaXMuX2VuY3J5cHRfYmxvY2soIHZhbHMgKTtcblxuICAgIHZhciByZXQgPSBbIF07XG4gICAgZm9yICggaWkgPSAwOyBpaSA8IHRoaXMuQkxPQ0tTSVpFLzI7ICsraWkgKSB7XG5cdHJldFsgaWkgKyAwICAgXSA9ICggdmFsc1sgMCBdID4+PiAoMjQgLSA4KihpaSkpICYgMHgwMEZGICk7XG5cdHJldFsgaWkgKyBvZmYgXSA9ICggdmFsc1sgMSBdID4+PiAoMjQgLSA4KihpaSkpICYgMHgwMEZGICk7XG5cdC8vIHZhbHNbIDAgXSA9ICggdmFsc1sgMCBdID4+PiA4ICk7XG5cdC8vIHZhbHNbIDEgXSA9ICggdmFsc1sgMSBdID4+PiA4ICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbn07XG5cbi8vKlxuLy8qIFRoaXMgbWV0aG9kIHRha2VzIGFuIGFycmF5IHdpdGggdHdvIHZhbHVlcywgbGVmdCBhbmQgcmlnaHRcbi8vKiBhbmQgdW5kb2VzIE5OIHJvdW5kcyBvZiBCbG93ZmlzaCBvbiB0aGVtLlxuLy8qXG5CbG93ZmlzaC5wcm90b3R5cGUuX2RlY3J5cHRfYmxvY2sgPSBmdW5jdGlvbiAoIHZhbHMgKSB7XG4gICAgdmFyIGRhdGFMID0gdmFsc1sgMCBdO1xuICAgIHZhciBkYXRhUiA9IHZhbHNbIDEgXTtcblxuICAgIHZhciBpaTtcblxuICAgIGZvciAoIGlpPXRoaXMuTk4rMTsgaWkgPiAxOyAtLWlpICkge1xuXHRkYXRhTCA9IGRhdGFMIF4gdGhpcy5wYXJyYXlbIGlpIF07XG5cdGRhdGFSID0gdGhpcy5fRiggZGF0YUwgKSBeIGRhdGFSO1xuXG5cdHZhciB0bXAgPSBkYXRhTDtcblx0ZGF0YUwgPSBkYXRhUjtcblx0ZGF0YVIgPSB0bXA7XG4gICAgfVxuXG4gICAgZGF0YUwgPSBkYXRhTCBeIHRoaXMucGFycmF5WyAxIF07XG4gICAgZGF0YVIgPSBkYXRhUiBeIHRoaXMucGFycmF5WyAwIF07XG5cbiAgICB2YWxzWyAwIF0gPSB0aGlzLl9jbGVhbiggZGF0YVIgKTtcbiAgICB2YWxzWyAxIF0gPSB0aGlzLl9jbGVhbiggZGF0YUwgKTtcbn07XG5cbi8vKlxuLy8qIFRoaXMgbWV0aG9kIHRha2VzIGEga2V5IGFycmF5IGFuZCBpbml0aWFsaXplcyB0aGVcbi8vKiBzYm94ZXMgYW5kIHBhcnJheSBmb3IgdGhpcyBlbmNyeXB0aW9uLlxuLy8qXG5CbG93ZmlzaC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgIHZhciBpaTtcbiAgICB2YXIgamogPSAwO1xuXG4gICAgdGhpcy5wYXJyYXkgPSBbXTtcbiAgICBmb3IgKCBpaT0wOyBpaSA8IHRoaXMuTk4gKyAyOyArK2lpICkge1xuXHR2YXIgZGF0YSA9IDB4MDAwMDAwMDA7XG5cdHZhciBraztcblx0Zm9yICgga2s9MDsga2sgPCA0OyArK2trICkge1xuXHQgICAgZGF0YSA9ICggZGF0YSA8PCA4ICkgfCAoIGtleVsgamogXSAmIDB4MDBGRiApO1xuXHQgICAgaWYgKCArK2pqID49IGtleS5sZW5ndGggKSB7XG5cdFx0amogPSAwO1xuXHQgICAgfVxuXHR9XG5cdHRoaXMucGFycmF5WyBpaSBdID0gdGhpcy5QQVJSQVlbIGlpIF0gXiBkYXRhO1xuICAgIH1cblxuICAgIHRoaXMuc2JveGVzID0gW107XG4gICAgZm9yICggaWk9MDsgaWkgPCA0OyArK2lpICkge1xuXHR0aGlzLnNib3hlc1sgaWkgXSA9IFtdO1xuXHRmb3IgKCBqaj0wOyBqaiA8IDI1NjsgKytqaiApIHtcblx0ICAgIHRoaXMuc2JveGVzWyBpaSBdWyBqaiBdID0gdGhpcy5TQk9YRVNbIGlpIF1bIGpqIF07XG5cdH1cbiAgICB9XG5cbiAgICB2YXIgdmFscyA9IFsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCBdO1xuXG4gICAgZm9yICggaWk9MDsgaWkgPCB0aGlzLk5OKzI7IGlpICs9IDIgKSB7XG5cdHRoaXMuX2VuY3J5cHRfYmxvY2soIHZhbHMgKTtcblx0dGhpcy5wYXJyYXlbIGlpICsgMCBdID0gdmFsc1sgMCBdO1xuXHR0aGlzLnBhcnJheVsgaWkgKyAxIF0gPSB2YWxzWyAxIF07XG4gICAgfVxuXG4gICAgZm9yICggaWk9MDsgaWkgPCA0OyArK2lpICkge1xuXHRmb3IgKCBqaj0wOyBqaiA8IDI1NjsgamogKz0gMiApIHtcblx0ICAgIHRoaXMuX2VuY3J5cHRfYmxvY2soIHZhbHMgKTtcblx0ICAgIHRoaXMuc2JveGVzWyBpaSBdWyBqaiArIDAgXSA9IHZhbHNbIDAgXTtcblx0ICAgIHRoaXMuc2JveGVzWyBpaSBdWyBqaiArIDEgXSA9IHZhbHNbIDEgXTtcblx0fVxuICAgIH1cbn07XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbCcpO1xuXG4vLyBhZGRlZCBieSBSZWN1cml0eSBMYWJzXG5mdW5jdGlvbiBCRmVuY3J5cHQoYmxvY2ssa2V5KSB7XG5cdHZhciBiZiA9IG5ldyBCbG93ZmlzaCgpO1xuXHRiZi5pbml0KHV0aWwuc3RyMmJpbihrZXkpKTtcblx0cmV0dXJuIGJmLmVuY3J5cHRfYmxvY2soYmxvY2spO1xufVxuXG5mdW5jdGlvbiBCRihrZXkpIHtcblx0dGhpcy5iZiA9IG5ldyBCbG93ZmlzaCgpO1xuXHR0aGlzLmJmLmluaXQodXRpbC5zdHIyYmluKGtleSkpO1xuXG5cdHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uKGJsb2NrKSB7XG5cdFx0cmV0dXJuIHRoaXMuYmYuZW5jcnlwdF9ibG9jayhibG9jayk7XG5cdH1cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJGO1xubW9kdWxlLmV4cG9ydHMua2V5U2l6ZSA9IEJGLnByb3RvdHlwZS5rZXlTaXplID0gMTY7XG5tb2R1bGUuZXhwb3J0cy5ibG9ja1NpemUgPSBCRi5wcm90b3R5cGUuYmxvY2tTaXplID0gMTY7XG5cblxuIiwiXHJcbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlXHJcbi8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cclxuXHJcbi8vIENvcHlyaWdodCAyMDEwIHBqYWNvYnNAeGVla3IuY29tIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuXHJcbi8vIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSFxyXG5cclxuLy8gZml4ZWQvbW9kaWZpZWQgYnkgSGVyYmVydCBIYW5ld2lua2VsLCB3d3cuaGFuZVdJTi5kZVxyXG4vLyBjaGVjayB3d3cuaGFuZVdJTi5kZSBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uXHJcblxyXG4vLyBjYXN0NS5qcyBpcyBhIEphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgQ0FTVC0xMjgsIGFzIGRlZmluZWQgaW4gUkZDIDIxNDQuXHJcbi8vIENBU1QtMTI4IGlzIGEgY29tbW9uIE9wZW5QR1AgY2lwaGVyLlxyXG5cclxuXHJcbi8vIENBU1Q1IGNvbnN0cnVjdG9yXHJcblxyXG5cclxuXHJcbmZ1bmN0aW9uIG9wZW5wZ3Bfc3ltZW5jX2Nhc3Q1KCkge1xyXG5cdHRoaXMuQmxvY2tTaXplPSA4O1xyXG5cdHRoaXMuS2V5U2l6ZSA9IDE2O1xyXG5cclxuXHR0aGlzLnNldEtleSA9IGZ1bmN0aW9uIChrZXkpIHtcclxuXHRcdCB0aGlzLm1hc2tpbmcgPSBuZXcgQXJyYXkoMTYpO1xyXG5cdFx0IHRoaXMucm90YXRlID0gbmV3IEFycmF5KDE2KTtcclxuXHJcblx0XHQgdGhpcy5yZXNldCgpO1xyXG5cclxuXHRcdCBpZiAoa2V5Lmxlbmd0aCA9PSB0aGlzLktleVNpemUpXHJcblx0XHQge1xyXG5cdFx0ICAgdGhpcy5rZXlTY2hlZHVsZShrZXkpO1xyXG5cdFx0IH1cclxuXHRcdCBlbHNlXHJcblx0XHQge1xyXG5cdFx0ICAgdXRpbC5wcmludF9lcnJvcignY2FzdDUuanM6IENBU1QtMTI4OiBrZXlzIG11c3QgYmUgMTYgYnl0ZXMnKTtcclxuXHRcdCAgIHJldHVybiBmYWxzZTtcclxuXHRcdCB9XHJcblx0XHQgcmV0dXJuIHRydWU7XHJcblx0fTtcclxuXHRcclxuXHR0aGlzLnJlc2V0ID0gZnVuY3Rpb24oKSB7XHJcblx0XHQgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxyXG5cdFx0IHtcclxuXHRcdCAgdGhpcy5tYXNraW5nW2ldID0gMDtcclxuXHRcdCAgdGhpcy5yb3RhdGVbaV0gPSAwO1xyXG5cdFx0IH1cclxuXHR9O1xyXG5cclxuXHR0aGlzLmdldEJsb2NrU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0IHJldHVybiBCbG9ja1NpemU7XHJcblx0fTtcclxuXHJcblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oc3JjKSB7XHJcblx0XHQgdmFyIGRzdCA9IG5ldyBBcnJheShzcmMubGVuZ3RoKTtcclxuXHJcblx0XHQgZm9yKHZhciBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrPTgpXHJcblx0XHQge1xyXG5cdFx0ICB2YXIgbCA9IHNyY1tpXTw8MjQgfCBzcmNbaSsxXTw8MTYgfCBzcmNbaSsyXTw8OCB8IHNyY1tpKzNdO1xyXG5cdFx0ICB2YXIgciA9IHNyY1tpKzRdPDwyNCB8IHNyY1tpKzVdPDwxNiB8IHNyY1tpKzZdPDw4IHwgc3JjW2krN107XHJcblx0XHQgIHZhciB0O1xyXG5cclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1swXSwgdGhpcy5yb3RhdGVbMF0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1sxXSwgdGhpcy5yb3RhdGVbMV0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYzKHIsIHRoaXMubWFza2luZ1syXSwgdGhpcy5yb3RhdGVbMl0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1szXSwgdGhpcy5yb3RhdGVbM10pOyBsID0gdDtcclxuXHJcblx0XHQgIHQgPSByOyByID0gbF5mMihyLCB0aGlzLm1hc2tpbmdbNF0sIHRoaXMucm90YXRlWzRdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMyhyLCB0aGlzLm1hc2tpbmdbNV0sIHRoaXMucm90YXRlWzVdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbNl0sIHRoaXMucm90YXRlWzZdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMihyLCB0aGlzLm1hc2tpbmdbN10sIHRoaXMucm90YXRlWzddKTsgbCA9IHQ7XHJcblxyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjMociwgdGhpcy5tYXNraW5nWzhdLCB0aGlzLnJvdGF0ZVs4XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjEociwgdGhpcy5tYXNraW5nWzldLCB0aGlzLnJvdGF0ZVs5XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjIociwgdGhpcy5tYXNraW5nWzEwXSwgdGhpcy5yb3RhdGVbMTBdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMyhyLCB0aGlzLm1hc2tpbmdbMTFdLCB0aGlzLnJvdGF0ZVsxMV0pOyBsID0gdDtcclxuXHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbMTJdLCB0aGlzLnJvdGF0ZVsxMl0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1sxM10sIHRoaXMucm90YXRlWzEzXSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjMociwgdGhpcy5tYXNraW5nWzE0XSwgdGhpcy5yb3RhdGVbMTRdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbMTVdLCB0aGlzLnJvdGF0ZVsxNV0pOyBsID0gdDtcclxuXHJcblx0XHQgIGRzdFtpXSAgID0gKHIgPj4+IDI0KSYyNTU7XHJcblx0XHQgIGRzdFtpKzFdID0gKHIgPj4+IDE2KSYyNTU7XHJcblx0XHQgIGRzdFtpKzJdID0gKHIgPj4+IDgpJjI1NTtcclxuXHRcdCAgZHN0W2krM10gPSByJjI1NTtcclxuXHRcdCAgZHN0W2krNF0gPSAobCA+Pj4gMjQpJjI1NTtcclxuXHRcdCAgZHN0W2krNV0gPSAobCA+Pj4gMTYpJjI1NTtcclxuXHRcdCAgZHN0W2krNl0gPSAobCA+Pj4gOCkmMjU1O1xyXG5cdFx0ICBkc3RbaSs3XSA9IGwmMjU1O1xyXG5cdFx0IH1cclxuXHJcblx0XHQgcmV0dXJuIGRzdDtcclxuXHR9O1xyXG5cdFxyXG5cdHRoaXMuZGVjcnlwdCA9IGZ1bmN0aW9uKHNyYykge1xyXG5cdFx0IHZhciBkc3QgPSBuZXcgQXJyYXkoc3JjLmxlbmd0aCk7XHJcblxyXG5cdFx0IGZvcih2YXIgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKz04KVxyXG5cdFx0IHtcclxuXHRcdCAgdmFyIGwgPSBzcmNbaV08PDI0IHwgc3JjW2krMV08PDE2IHwgc3JjW2krMl08PDggfCBzcmNbaSszXTtcclxuXHRcdCAgdmFyIHIgPSBzcmNbaSs0XTw8MjQgfCBzcmNbaSs1XTw8MTYgfCBzcmNbaSs2XTw8OCB8IHNyY1tpKzddO1xyXG5cdFx0ICB2YXIgdDtcclxuXHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbMTVdLCB0aGlzLnJvdGF0ZVsxNV0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYzKHIsIHRoaXMubWFza2luZ1sxNF0sIHRoaXMucm90YXRlWzE0XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjIociwgdGhpcy5tYXNraW5nWzEzXSwgdGhpcy5yb3RhdGVbMTNdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbMTJdLCB0aGlzLnJvdGF0ZVsxMl0pOyBsID0gdDtcclxuXHJcblx0XHQgIHQgPSByOyByID0gbF5mMyhyLCB0aGlzLm1hc2tpbmdbMTFdLCB0aGlzLnJvdGF0ZVsxMV0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1sxMF0sIHRoaXMucm90YXRlWzEwXSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjEociwgdGhpcy5tYXNraW5nWzldLCB0aGlzLnJvdGF0ZVs5XSk7IGwgPSB0O1xyXG5cdFx0ICB0ID0gcjsgciA9IGxeZjMociwgdGhpcy5tYXNraW5nWzhdLCB0aGlzLnJvdGF0ZVs4XSk7IGwgPSB0O1xyXG5cclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1s3XSwgdGhpcy5yb3RhdGVbN10pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYxKHIsIHRoaXMubWFza2luZ1s2XSwgdGhpcy5yb3RhdGVbNl0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYzKHIsIHRoaXMubWFza2luZ1s1XSwgdGhpcy5yb3RhdGVbNV0pOyBsID0gdDtcclxuXHRcdCAgdCA9IHI7IHIgPSBsXmYyKHIsIHRoaXMubWFza2luZ1s0XSwgdGhpcy5yb3RhdGVbNF0pOyBsID0gdDtcclxuXHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbM10sIHRoaXMucm90YXRlWzNdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMyhyLCB0aGlzLm1hc2tpbmdbMl0sIHRoaXMucm90YXRlWzJdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMihyLCB0aGlzLm1hc2tpbmdbMV0sIHRoaXMucm90YXRlWzFdKTsgbCA9IHQ7XHJcblx0XHQgIHQgPSByOyByID0gbF5mMShyLCB0aGlzLm1hc2tpbmdbMF0sIHRoaXMucm90YXRlWzBdKTsgbCA9IHQ7XHJcblxyXG5cdFx0ICBkc3RbaV0gICA9IChyID4+PiAyNCkmMjU1O1xyXG5cdFx0ICBkc3RbaSsxXSA9IChyID4+PiAxNikmMjU1O1xyXG5cdFx0ICBkc3RbaSsyXSA9IChyID4+PiA4KSYyNTU7XHJcblx0XHQgIGRzdFtpKzNdID0gciYyNTU7XHJcblx0XHQgIGRzdFtpKzRdID0gKGwgPj4+IDI0KSYyNTU7XHJcblx0XHQgIGRzdFtpKzVdID0gKGwgPj4gMTYpJjI1NTtcclxuXHRcdCAgZHN0W2krNl0gPSAobCA+PiA4KSYyNTU7XHJcblx0XHQgIGRzdFtpKzddID0gbCYyNTU7XHJcblx0XHQgfVxyXG5cclxuXHRcdCByZXR1cm4gZHN0O1xyXG5cdFx0fTtcclxuXHRcdHZhciBzY2hlZHVsZUEgPSBuZXcgQXJyYXkoNCk7XHJcblxyXG5cdFx0c2NoZWR1bGVBWzBdID0gbmV3IEFycmF5KDQpO1xyXG5cdFx0c2NoZWR1bGVBWzBdWzBdID0gbmV3IEFycmF5KDQsIDAsIDB4ZCwgMHhmLCAweGMsIDB4ZSwgMHg4KTtcclxuXHRcdHNjaGVkdWxlQVswXVsxXSA9IG5ldyBBcnJheSg1LCAyLCAxNiArIDAsIDE2ICsgMiwgMTYgKyAxLCAxNiArIDMsIDB4YSk7XHJcblx0XHRzY2hlZHVsZUFbMF1bMl0gPSBuZXcgQXJyYXkoNiwgMywgMTYgKyA3LCAxNiArIDYsIDE2ICsgNSwgMTYgKyA0LCA5KTtcclxuXHRcdHNjaGVkdWxlQVswXVszXSA9IG5ldyBBcnJheSg3LCAxLCAxNiArIDB4YSwgMTYgKyA5LCAxNiArIDB4YiwgMTYgKyA4LCAweGIpO1xyXG5cclxuXHRcdHNjaGVkdWxlQVsxXSA9IG5ldyBBcnJheSg0KTtcclxuXHRcdHNjaGVkdWxlQVsxXVswXSA9IG5ldyBBcnJheSgwLCA2LCAxNiArIDUsIDE2ICsgNywgMTYgKyA0LCAxNiArIDYsIDE2ICsgMCk7XHJcblx0XHRzY2hlZHVsZUFbMV1bMV0gPSBuZXcgQXJyYXkoMSwgNCwgMCwgMiwgMSwgMywgMTYgKyAyKTtcclxuXHRcdHNjaGVkdWxlQVsxXVsyXSA9IG5ldyBBcnJheSgyLCA1LCA3LCA2LCA1LCA0LCAxNiArIDEpO1xyXG5cdFx0c2NoZWR1bGVBWzFdWzNdID0gbmV3IEFycmF5KDMsIDcsIDB4YSwgOSwgMHhiLCA4LCAxNiArIDMpO1xyXG5cclxuXHRcdHNjaGVkdWxlQVsyXSA9IG5ldyBBcnJheSg0KTtcclxuXHRcdHNjaGVkdWxlQVsyXVswXSA9IG5ldyBBcnJheSg0LCAwLCAweGQsIDB4ZiwgMHhjLCAweGUsIDgpO1xyXG5cdFx0c2NoZWR1bGVBWzJdWzFdID0gbmV3IEFycmF5KDUsIDIsIDE2ICsgMCwgMTYgKyAyLCAxNiArIDEsIDE2ICsgMywgMHhhKTtcclxuXHRcdHNjaGVkdWxlQVsyXVsyXSA9IG5ldyBBcnJheSg2LCAzLCAxNiArIDcsIDE2ICsgNiwgMTYgKyA1LCAxNiArIDQsIDkpO1xyXG5cdFx0c2NoZWR1bGVBWzJdWzNdID0gbmV3IEFycmF5KDcsIDEsIDE2ICsgMHhhLCAxNiArIDksIDE2ICsgMHhiLCAxNiArIDgsIDB4Yik7XHJcblxyXG5cclxuXHRcdHNjaGVkdWxlQVszXSA9IG5ldyBBcnJheSg0KTtcclxuXHRcdHNjaGVkdWxlQVszXVswXSA9IG5ldyBBcnJheSgwLCA2LCAxNiArIDUsIDE2ICsgNywgMTYgKyA0LCAxNiArIDYsIDE2ICsgMCk7XHJcblx0XHRzY2hlZHVsZUFbM11bMV0gPSBuZXcgQXJyYXkoMSwgNCwgMCwgMiwgMSwgMywgMTYgKyAyKTtcclxuXHRcdHNjaGVkdWxlQVszXVsyXSA9IG5ldyBBcnJheSgyLCA1LCA3LCA2LCA1LCA0LCAxNiArIDEpO1xyXG5cdFx0c2NoZWR1bGVBWzNdWzNdID0gbmV3IEFycmF5KDMsIDcsIDB4YSwgOSwgMHhiLCA4LCAxNiArIDMpO1xyXG5cclxuXHRcdHZhciBzY2hlZHVsZUIgPSBuZXcgQXJyYXkoNCk7XHJcblxyXG5cdFx0c2NoZWR1bGVCWzBdID0gbmV3IEFycmF5KDQpO1xyXG5cdFx0c2NoZWR1bGVCWzBdWzBdID0gbmV3IEFycmF5KDE2ICsgOCwgMTYgKyA5LCAxNiArIDcsIDE2ICsgNiwgMTYgKyAyKTtcclxuXHRcdHNjaGVkdWxlQlswXVsxXSA9IG5ldyBBcnJheSgxNiArIDB4YSwgMTYgKyAweGIsIDE2ICsgNSwgMTYgKyA0LCAxNiArIDYpO1xyXG5cdFx0c2NoZWR1bGVCWzBdWzJdID0gbmV3IEFycmF5KDE2ICsgMHhjLCAxNiArIDB4ZCwgMTYgKyAzLCAxNiArIDIsIDE2ICsgOSk7XHJcblx0XHRzY2hlZHVsZUJbMF1bM10gPSBuZXcgQXJyYXkoMTYgKyAweGUsIDE2ICsgMHhmLCAxNiArIDEsIDE2ICsgMCwgMTYgKyAweGMpO1xyXG5cclxuXHRcdHNjaGVkdWxlQlsxXSA9IG5ldyBBcnJheSg0KTtcclxuXHRcdHNjaGVkdWxlQlsxXVswXSA9IG5ldyBBcnJheSgzLCAyLCAweGMsIDB4ZCwgOCk7XHJcblx0XHRzY2hlZHVsZUJbMV1bMV0gPSBuZXcgQXJyYXkoMSwgMCwgMHhlLCAweGYsIDB4ZCk7XHJcblx0XHRzY2hlZHVsZUJbMV1bMl0gPSBuZXcgQXJyYXkoNywgNiwgOCwgOSwgMyk7XHJcblx0XHRzY2hlZHVsZUJbMV1bM10gPSBuZXcgQXJyYXkoNSwgNCwgMHhhLCAweGIsIDcpO1xyXG5cclxuXHJcblx0XHRzY2hlZHVsZUJbMl0gPSBuZXcgQXJyYXkoNCk7XHJcblx0XHRzY2hlZHVsZUJbMl1bMF0gPSBuZXcgQXJyYXkoMTYgKyAzLCAxNiArIDIsIDE2ICsgMHhjLCAxNiArIDB4ZCwgMTYgKyA5KTtcclxuXHRcdHNjaGVkdWxlQlsyXVsxXSA9IG5ldyBBcnJheSgxNiArIDEsIDE2ICsgMCwgMTYgKyAweGUsIDE2ICsgMHhmLCAxNiArIDB4Yyk7XHJcblx0XHRzY2hlZHVsZUJbMl1bMl0gPSBuZXcgQXJyYXkoMTYgKyA3LCAxNiArIDYsIDE2ICsgOCwgMTYgKyA5LCAxNiArIDIpO1xyXG5cdFx0c2NoZWR1bGVCWzJdWzNdID0gbmV3IEFycmF5KDE2ICsgNSwgMTYgKyA0LCAxNiArIDB4YSwgMTYgKyAweGIsIDE2ICsgNik7XHJcblxyXG5cclxuXHRcdHNjaGVkdWxlQlszXSA9IG5ldyBBcnJheSg0KTtcclxuXHRcdHNjaGVkdWxlQlszXVswXSA9IG5ldyBBcnJheSg4LCA5LCA3LCA2LCAzKTtcclxuXHRcdHNjaGVkdWxlQlszXVsxXSA9IG5ldyBBcnJheSgweGEsIDB4YiwgNSwgNCwgNyk7XHJcblx0XHRzY2hlZHVsZUJbM11bMl0gPSBuZXcgQXJyYXkoMHhjLCAweGQsIDMsIDIsIDgpO1xyXG5cdFx0c2NoZWR1bGVCWzNdWzNdID0gbmV3IEFycmF5KDB4ZSwgMHhmLCAxLCAwLCAweGQpO1xyXG5cclxuXHRcdC8vIGNoYW5nZWQgJ2luJyB0byAnaW5uJyAoaW4gamF2YXNjcmlwdCAnaW4nIGlzIGEgcmVzZXJ2ZWQgd29yZClcclxuXHRcdHRoaXMua2V5U2NoZWR1bGUgPSBmdW5jdGlvbihpbm4pXHJcblx0XHR7XHJcblx0XHQgdmFyIHQgPSBuZXcgQXJyYXkoOCk7XHJcblx0XHQgdmFyIGsgPSBuZXcgQXJyYXkoMzIpO1xyXG5cclxuXHRcdCBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKylcclxuXHRcdCB7XHJcblx0XHQgIHZhciBqID0gaSAqIDQ7XHJcblx0XHQgIHRbaV0gPSBpbm5bal08PDI0IHwgaW5uW2orMV08PDE2IHwgaW5uW2orMl08PDggfCBpbm5baiszXTtcclxuXHRcdCB9XHJcblxyXG5cdFx0IHZhciB4ID0gWzYsIDcsIDQsIDVdO1xyXG5cdFx0IHZhciBraSA9IDA7XHJcblxyXG5cdFx0IGZvciAodmFyIGhhbGYgPSAwOyBoYWxmIDwgMjsgaGFsZisrKVxyXG5cdFx0IHtcclxuXHRcdCAgZm9yICh2YXIgcm91bmQgPSAwOyByb3VuZCA8IDQ7IHJvdW5kKyspXHJcblx0XHQgIHtcclxuXHRcdCAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKVxyXG5cdFx0ICAge1xyXG5cdFx0ICAgIHZhciBhID0gc2NoZWR1bGVBW3JvdW5kXVtqXTtcclxuXHRcdCAgICB2YXIgdyA9IHRbYVsxXV07XHJcblxyXG5cdFx0ICAgIHcgXj0gc0JveFs0XVsodFthWzJdPj4+Ml0+Pj4oMjQtOCooYVsyXSYzKSkpJjB4ZmZdO1xyXG5cdFx0ICAgIHcgXj0gc0JveFs1XVsodFthWzNdPj4+Ml0+Pj4oMjQtOCooYVszXSYzKSkpJjB4ZmZdO1xyXG5cdFx0ICAgIHcgXj0gc0JveFs2XVsodFthWzRdPj4+Ml0+Pj4oMjQtOCooYVs0XSYzKSkpJjB4ZmZdO1xyXG5cdFx0ICAgIHcgXj0gc0JveFs3XVsodFthWzVdPj4+Ml0+Pj4oMjQtOCooYVs1XSYzKSkpJjB4ZmZdO1xyXG5cdFx0ICAgIHcgXj0gc0JveFt4W2pdXVsodFthWzZdPj4+Ml0+Pj4oMjQtOCooYVs2XSYzKSkpJjB4ZmZdO1xyXG5cdFx0ICAgIHRbYVswXV0gPSB3O1xyXG5cdFx0ICAgfVxyXG5cclxuXHRcdCAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKVxyXG5cdFx0ICAge1xyXG5cdFx0ICAgIHZhciBiID0gc2NoZWR1bGVCW3JvdW5kXVtqXTtcclxuXHRcdCAgICB2YXIgdyA9IHNCb3hbNF1bKHRbYlswXT4+PjJdPj4+KDI0LTgqKGJbMF0mMykpKSYweGZmXTtcclxuXHJcblx0XHQgICAgdyBePSBzQm94WzVdWyh0W2JbMV0+Pj4yXT4+PigyNC04KihiWzFdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdyBePSBzQm94WzZdWyh0W2JbMl0+Pj4yXT4+PigyNC04KihiWzJdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdyBePSBzQm94WzddWyh0W2JbM10+Pj4yXT4+PigyNC04KihiWzNdJjMpKSkmMHhmZl07XHJcblx0XHQgICAgdyBePSBzQm94WzQral1bKHRbYls0XT4+PjJdPj4+KDI0LTgqKGJbNF0mMykpKSYweGZmXTtcclxuXHRcdCAgICBrW2tpXSA9IHc7XHJcblx0XHQgICAga2krKztcclxuXHRcdCAgIH1cclxuXHRcdCAgfVxyXG5cdFx0IH1cclxuXHJcblx0XHQgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxyXG5cdFx0IHtcclxuXHRcdCAgdGhpcy5tYXNraW5nW2ldID0ga1tpXTtcclxuXHRcdCAgdGhpcy5yb3RhdGVbaV0gID0ga1sxNitpXSAmIDB4MWY7XHJcblx0XHQgfVxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBUaGVzZSBhcmUgdGhlIHRocmVlICdmJyBmdW5jdGlvbnMuIFNlZSBSRkMgMjE0NCwgc2VjdGlvbiAyLjIuXHJcblxyXG5cdFx0ZnVuY3Rpb24gZjEoZCwgbSwgcilcclxuXHRcdHtcclxuXHRcdCB2YXIgdCA9IG0gKyBkO1xyXG5cdFx0IHZhciBJID0gKHQgPDwgcikgfCAodCA+Pj4gKDMyIC0gcikpO1xyXG5cdFx0IHJldHVybiAoKHNCb3hbMF1bST4+PjI0XSBeIHNCb3hbMV1bKEk+Pj4xNikmMjU1XSkgLSBzQm94WzJdWyhJPj4+OCkmMjU1XSkgKyBzQm94WzNdW0kmMjU1XTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBmMihkLCBtLCByKVxyXG5cdFx0e1xyXG5cdFx0IHZhciB0ID0gbSBeIGQ7XHJcblx0XHQgdmFyIEkgPSAodCA8PCByKSB8ICh0ID4+PiAoMzIgLSByKSk7XHJcblx0XHQgcmV0dXJuICgoc0JveFswXVtJPj4+MjRdIC0gc0JveFsxXVsoST4+PjE2KSYyNTVdKSArIHNCb3hbMl1bKEk+Pj44KSYyNTVdKSBeIHNCb3hbM11bSSYyNTVdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGYzKGQsIG0sIHIpXHJcblx0XHR7XHJcblx0XHQgdmFyIHQgPSBtIC0gZDtcclxuXHRcdCB2YXIgSSA9ICh0IDw8IHIpIHwgKHQgPj4+ICgzMiAtIHIpKTtcclxuXHRcdCByZXR1cm4gKChzQm94WzBdW0k+Pj4yNF0gKyBzQm94WzFdWyhJPj4+MTYpJjI1NV0pIF4gc0JveFsyXVsoST4+PjgpJjI1NV0pIC0gc0JveFszXVtJJjI1NV07XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIHNCb3ggPSBuZXcgQXJyYXkoOCk7XHJcblx0XHRzQm94WzBdID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweDMwZmI0MGQ0LCAweDlmYTBmZjBiLCAweDZiZWNjZDJmLCAweDNmMjU4YzdhLCAweDFlMjEzZjJmLCAweDljMDA0ZGQzLCAweDYwMDNlNTQwLCAweGNmOWZjOTQ5LFxyXG5cdFx0ICAweGJmZDRhZjI3LCAweDg4YmJiZGI1LCAweGUyMDM0MDkwLCAweDk4ZDA5Njc1LCAweDZlNjNhMGUwLCAweDE1YzM2MWQyLCAweGMyZTc2NjFkLCAweDIyZDRmZjhlLFxyXG5cdFx0ICAweDI4NjgzYjZmLCAweGMwN2ZkMDU5LCAweGZmMjM3OWM4LCAweDc3NWY1MGUyLCAweDQzYzM0MGQzLCAweGRmMmY4NjU2LCAweDg4N2NhNDFhLCAweGEyZDJiZDJkLFxyXG5cdFx0ICAweGExYzllMGQ2LCAweDM0NmM0ODE5LCAweDYxYjc2ZDg3LCAweDIyNTQwZjJmLCAweDJhYmUzMmUxLCAweGFhNTQxNjZiLCAweDIyNTY4ZTNhLCAweGEyZDM0MWQwLFxyXG5cdFx0ICAweDY2ZGI0MGM4LCAweGE3ODQzOTJmLCAweDAwNGRmZjJmLCAweDJkYjlkMmRlLCAweDk3OTQzZmFjLCAweDRhOTdjMWQ4LCAweDUyNzY0NGI3LCAweGI1ZjQzN2E3LFxyXG5cdFx0ICAweGI4MmNiYWVmLCAweGQ3NTFkMTU5LCAweDZmZjdmMGVkLCAweDVhMDk3YTFmLCAweDgyN2I2OGQwLCAweDkwZWNmNTJlLCAweDIyYjBjMDU0LCAweGJjOGU1OTM1LFxyXG5cdFx0ICAweDRiNmQyZjdmLCAweDUwYmI2NGEyLCAweGQyNjY0OTEwLCAweGJlZTU4MTJkLCAweGI3MzMyMjkwLCAweGU5M2IxNTlmLCAweGI0OGVlNDExLCAweDRiZmYzNDVkLFxyXG5cdFx0ICAweGZkNDVjMjQwLCAweGFkMzE5NzNmLCAweGM0ZjZkMDJlLCAweDU1ZmM4MTY1LCAweGQ1YjFjYWFkLCAweGExYWMyZGFlLCAweGEyZDRiNzZkLCAweGMxOWIwYzUwLFxyXG5cdFx0ICAweDg4MjI0MGYyLCAweDBjNmU0ZjM4LCAweGE0ZTRiZmQ3LCAweDRmNWJhMjcyLCAweDU2NGMxZDJmLCAweGM1OWM1MzE5LCAweGI5NDllMzU0LCAweGIwNDY2OWZlLFxyXG5cdFx0ICAweGIxYjZhYjhhLCAweGM3MTM1OGRkLCAweDYzODVjNTQ1LCAweDExMGY5MzVkLCAweDU3NTM4YWQ1LCAweDZhMzkwNDkzLCAweGU2M2QzN2UwLCAweDJhNTRmNmIzLFxyXG5cdFx0ICAweDNhNzg3ZDVmLCAweDYyNzZhMGI1LCAweDE5YTZmY2RmLCAweDdhNDIyMDZhLCAweDI5ZjlkNGQ1LCAweGY2MWIxODkxLCAweGJiNzIyNzVlLCAweGFhNTA4MTY3LFxyXG5cdFx0ICAweDM4OTAxMDkxLCAweGM2YjUwNWViLCAweDg0YzdjYjhjLCAweDJhZDc1YTBmLCAweDg3NGExNDI3LCAweGEyZDE5MzZiLCAweDJhZDI4NmFmLCAweGFhNTZkMjkxLFxyXG5cdFx0ICAweGQ3ODk0MzYwLCAweDQyNWM3NTBkLCAweDkzYjM5ZTI2LCAweDE4NzE4NGM5LCAweDZjMDBiMzJkLCAweDczZTJiYjE0LCAweGEwYmViYzNjLCAweDU0NjIzNzc5LFxyXG5cdFx0ICAweDY0NDU5ZWFiLCAweDNmMzI4YjgyLCAweDc3MThjZjgyLCAweDU5YTJjZWE2LCAweDA0ZWUwMDJlLCAweDg5ZmU3OGU2LCAweDNmYWIwOTUwLCAweDMyNWZmNmMyLFxyXG5cdFx0ICAweDgxMzgzZjA1LCAweDY5NjNjNWM4LCAweDc2Y2I1YWQ2LCAweGQ0OTk3NGM5LCAweGNhMTgwZGNmLCAweDM4MDc4MmQ1LCAweGM3ZmE1Y2Y2LCAweDhhYzMxNTExLFxyXG5cdFx0ICAweDM1ZTc5ZTEzLCAweDQ3ZGE5MWQwLCAweGY0MGY5MDg2LCAweGE3ZTI0MTllLCAweDMxMzY2MjQxLCAweDA1MWVmNDk1LCAweGFhNTczYjA0LCAweDRhODA1ZDhkLFxyXG5cdFx0ICAweDU0ODMwMGQwLCAweDAwMzIyYTNjLCAweGJmNjRjZGRmLCAweGJhNTdhNjhlLCAweDc1YzYzNzJiLCAweDUwYWZkMzQxLCAweGE3YzEzMjc1LCAweDkxNWEwYmY1LFxyXG5cdFx0ICAweDZiNTRiZmFiLCAweDJiMGIxNDI2LCAweGFiNGNjOWQ3LCAweDQ0OWNjZDgyLCAweGY3ZmJmMjY1LCAweGFiODVjNWYzLCAweDFiNTVkYjk0LCAweGFhZDRlMzI0LFxyXG5cdFx0ICAweGNmYTRiZDNmLCAweDJkZWFhM2UyLCAweDllMjA0ZDAyLCAweGM4YmQyNWFjLCAweGVhZGY1NWIzLCAweGQ1YmQ5ZTk4LCAweGUzMTIzMWIyLCAweDJhZDVhZDZjLFxyXG5cdFx0ICAweDk1NDMyOWRlLCAweGFkYmU0NTI4LCAweGQ4NzEwZjY5LCAweGFhNTFjOTBmLCAweGFhNzg2YmY2LCAweDIyNTEzZjFlLCAweGFhNTFhNzliLCAweDJhZDM0NGNjLFxyXG5cdFx0ICAweDdiNWE0MWYwLCAweGQzN2NmYmFkLCAweDFiMDY5NTA1LCAweDQxZWNlNDkxLCAweGI0YzMzMmU2LCAweDAzMjI2OGQ0LCAweGM5NjAwYWNjLCAweGNlMzg3ZTZkLFxyXG5cdFx0ICAweGJmNmJiMTZjLCAweDZhNzBmYjc4LCAweDBkMDNkOWM5LCAweGQ0ZGYzOWRlLCAweGUwMTA2M2RhLCAweDQ3MzZmNDY0LCAweDVhZDMyOGQ4LCAweGIzNDdjYzk2LFxyXG5cdFx0ICAweDc1YmIwZmMzLCAweDk4NTExYmZiLCAweDRmZmJjYzM1LCAweGI1OGJjZjZhLCAweGUxMWYwYWJjLCAweGJmYzVmZTRhLCAweGE3MGFlYzEwLCAweGFjMzk1NzBhLFxyXG5cdFx0ICAweDNmMDQ0NDJmLCAweDYxODhiMTUzLCAweGUwMzk3YTJlLCAweDU3MjdjYjc5LCAweDljZWI0MThmLCAweDFjYWNkNjhkLCAweDJhZDM3Yzk2LCAweDAxNzVjYjlkLFxyXG5cdFx0ICAweGM2OWRmZjA5LCAweGM3NWI2NWYwLCAweGQ5ZGI0MGQ4LCAweGVjMGU3Nzc5LCAweDQ3NDRlYWQ0LCAweGIxMWMzMjc0LCAweGRkMjRjYjllLCAweDdlMWM1NGJkLFxyXG5cdFx0ICAweGYwMTE0NGY5LCAweGQyMjQwZWIxLCAweDk2NzViM2ZkLCAweGEzYWMzNzU1LCAweGQ0N2MyN2FmLCAweDUxYzg1ZjRkLCAweDU2OTA3NTk2LCAweGE1YmIxNWU2LFxyXG5cdFx0ICAweDU4MDMwNGYwLCAweGNhMDQyY2YxLCAweDAxMWEzN2VhLCAweDhkYmZhYWRiLCAweDM1YmEzZTRhLCAweDM1MjZmZmEwLCAweGMzN2I0ZDA5LCAweGJjMzA2ZWQ5LFxyXG5cdFx0ICAweDk4YTUyNjY2LCAweDU2NDhmNzI1LCAweGZmNWU1NjlkLCAweDBjZWQ2M2QwLCAweDdjNjNiMmNmLCAweDcwMGI0NWUxLCAweGQ1ZWE1MGYxLCAweDg1YTkyODcyLFxyXG5cdFx0ICAweGFmMWZiZGE3LCAweGQ0MjM0ODcwLCAweGE3ODcwYmYzLCAweDJkM2I0ZDc5LCAweDQyZTA0MTk4LCAweDBjZDBlZGU3LCAweDI2NDcwZGI4LCAweGY4ODE4MTRjLFxyXG5cdFx0ICAweDQ3NGQ2YWQ3LCAweDdjMGM1ZTVjLCAweGQxMjMxOTU5LCAweDM4MWI3Mjk4LCAweGY1ZDJmNGRiLCAweGFiODM4NjUzLCAweDZlMmYxZTIzLCAweDgzNzE5YzllLFxyXG5cdFx0ICAweGJkOTFlMDQ2LCAweDlhNTY0NTZlLCAweGRjMzkyMDBjLCAweDIwYzhjNTcxLCAweDk2MmJkYTFjLCAweGUxZTY5NmZmLCAweGIxNDFhYjA4LCAweDdjY2E4OWI5LFxyXG5cdFx0ICAweDFhNjllNzgzLCAweDAyY2M0ODQzLCAweGEyZjdjNTc5LCAweDQyOWVmNDdkLCAweDQyN2IxNjljLCAweDVhYzlmMDQ5LCAweGRkOGYwZjAwLCAweDVjODE2NWJmKTtcclxuXHJcblx0XHRzQm94WzFdID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweDFmMjAxMDk0LCAweGVmMGJhNzViLCAweDY5ZTNjZjdlLCAweDM5M2Y0MzgwLCAweGZlNjFjZjdhLCAweGVlYzUyMDdhLCAweDU1ODg5Yzk0LCAweDcyZmMwNjUxLFxyXG5cdFx0ICAweGFkYTdlZjc5LCAweDRlMWQ3MjM1LCAweGQ1NWE2M2NlLCAweGRlMDQzNmJhLCAweDk5YzQzMGVmLCAweDVmMGMwNzk0LCAweDE4ZGNkYjdkLCAweGExZDZlZmYzLFxyXG5cdFx0ICAweGEwYjUyZjdiLCAweDU5ZTgzNjA1LCAweGVlMTViMDk0LCAweGU5ZmZkOTA5LCAweGRjNDQwMDg2LCAweGVmOTQ0NDU5LCAweGJhODNjY2IzLCAweGUwYzNjZGZiLFxyXG5cdFx0ICAweGQxZGE0MTgxLCAweDNiMDkyYWIxLCAweGY5OTdmMWMxLCAweGE1ZTZjZjdiLCAweDAxNDIwZGRiLCAweGU0ZTdlZjViLCAweDI1YTFmZjQxLCAweGUxODBmODA2LFxyXG5cdFx0ICAweDFmYzQxMDgwLCAweDE3OWJlZTdhLCAweGQzN2FjNmE5LCAweGZlNTgzMGE0LCAweDk4ZGU4YjdmLCAweDc3ZTgzZjRlLCAweDc5OTI5MjY5LCAweDI0ZmE5ZjdiLFxyXG5cdFx0ICAweGUxMTNjODViLCAweGFjYzQwMDgzLCAweGQ3NTAzNTI1LCAweGY3ZWE2MTVmLCAweDYyMTQzMTU0LCAweDBkNTU0YjYzLCAweDVkNjgxMTIxLCAweGM4NjZjMzU5LFxyXG5cdFx0ICAweDNkNjNjZjczLCAweGNlZTIzNGMwLCAweGQ0ZDg3ZTg3LCAweDVjNjcyYjIxLCAweDA3MWY2MTgxLCAweDM5Zjc2MjdmLCAweDM2MWUzMDg0LCAweGU0ZWI1NzNiLFxyXG5cdFx0ICAweDYwMmY2NGE0LCAweGQ2M2FjZDljLCAweDFiYmM0NjM1LCAweDllODEwMzJkLCAweDI3MDFmNTBjLCAweDk5ODQ3YWI0LCAweGEwZTNkZjc5LCAweGJhNmNmMzhjLFxyXG5cdFx0ICAweDEwODQzMDk0LCAweDI1MzdhOTVlLCAweGY0NmY2ZmZlLCAweGExZmYzYjFmLCAweDIwOGNmYjZhLCAweDhmNDU4Yzc0LCAweGQ5ZTBhMjI3LCAweDRlYzczYTM0LFxyXG5cdFx0ICAweGZjODg0ZjY5LCAweDNlNGRlOGRmLCAweGVmMGUwMDg4LCAweDM1NTk2NDhkLCAweDhhNDUzODhjLCAweDFkODA0MzY2LCAweDcyMWQ5YmZkLCAweGE1ODY4NGJiLFxyXG5cdFx0ICAweGU4MjU2MzMzLCAweDg0NGU4MjEyLCAweDEyOGQ4MDk4LCAweGZlZDMzZmI0LCAweGNlMjgwYWUxLCAweDI3ZTE5YmE1LCAweGQ1YTZjMjUyLCAweGU0OTc1NGJkLFxyXG5cdFx0ICAweGM1ZDY1NWRkLCAweGViNjY3MDY0LCAweDc3ODQwYjRkLCAweGExYjZhODAxLCAweDg0ZGIyNmE5LCAweGUwYjU2NzE0LCAweDIxZjA0M2I3LCAweGU1ZDA1ODYwLFxyXG5cdFx0ICAweDU0ZjAzMDg0LCAweDA2NmZmNDcyLCAweGEzMWFhMTUzLCAweGRhZGM0NzU1LCAweGI1NjI1ZGJmLCAweDY4NTYxYmU2LCAweDgzY2E2Yjk0LCAweDJkNmVkMjNiLFxyXG5cdFx0ICAweGVjY2YwMWRiLCAweGE2ZDNkMGJhLCAweGI2ODAzZDVjLCAweGFmNzdhNzA5LCAweDMzYjRhMzRjLCAweDM5N2JjOGQ2LCAweDVlZTIyYjk1LCAweDVmMGU1MzA0LFxyXG5cdFx0ICAweDgxZWQ2ZjYxLCAweDIwZTc0MzY0LCAweGI0NWUxMzc4LCAweGRlMTg2MzliLCAweDg4MWNhMTIyLCAweGI5NjcyNmQxLCAweDgwNDlhN2U4LCAweDIyYjdkYTdiLFxyXG5cdFx0ICAweDVlNTUyZDI1LCAweDUyNzJkMjM3LCAweDc5ZDI5NTFjLCAweGM2MGQ4OTRjLCAweDQ4OGNiNDAyLCAweDFiYTRmZTViLCAweGE0YjA5ZjZiLCAweDFjYTgxNWNmLFxyXG5cdFx0ICAweGEyMGMzMDA1LCAweDg4NzFkZjYzLCAweGI5ZGUyZmNiLCAweDBjYzZjOWU5LCAweDBiZWVmZjUzLCAweGUzMjE0NTE3LCAweGI0NTQyODM1LCAweDlmNjMyOTNjLFxyXG5cdFx0ICAweGVlNDFlNzI5LCAweDZlMWQyZDdjLCAweDUwMDQ1Mjg2LCAweDFlNjY4NWYzLCAweGYzMzQwMWM2LCAweDMwYTIyYzk1LCAweDMxYTcwODUwLCAweDYwOTMwZjEzLFxyXG5cdFx0ICAweDczZjk4NDE3LCAweGExMjY5ODU5LCAweGVjNjQ1YzQ0LCAweDUyYzg3N2E5LCAweGNkZmYzM2E2LCAweGEwMmIxNzQxLCAweDdjYmFkOWEyLCAweDIxODAwMzZmLFxyXG5cdFx0ICAweDUwZDk5YzA4LCAweGNiM2Y0ODYxLCAweGMyNmJkNzY1LCAweDY0YTNmNmFiLCAweDgwMzQyNjc2LCAweDI1YTc1ZTdiLCAweGU0ZTZkMWZjLCAweDIwYzcxMGU2LFxyXG5cdFx0ICAweGNkZjBiNjgwLCAweDE3ODQ0ZDNiLCAweDMxZWVmODRkLCAweDdlMDgyNGU0LCAweDJjY2I0OWViLCAweDg0NmEzYmFlLCAweDhmZjc3ODg4LCAweGVlNWQ2MGY2LFxyXG5cdFx0ICAweDdhZjc1NjczLCAweDJmZGQ1Y2RiLCAweGExMTYzMWMxLCAweDMwZjY2ZjQzLCAweGIzZmFlYzU0LCAweDE1N2ZkN2ZhLCAweGVmODU3OWNjLCAweGQxNTJkZTU4LFxyXG5cdFx0ICAweGRiMmZmZDVlLCAweDhmMzJjZTE5LCAweDMwNmFmOTdhLCAweDAyZjAzZWY4LCAweDk5MzE5YWQ1LCAweGMyNDJmYTBmLCAweGE3ZTNlYmIwLCAweGM2OGU0OTA2LFxyXG5cdFx0ICAweGI4ZGEyMzBjLCAweDgwODIzMDI4LCAweGRjZGVmM2M4LCAweGQzNWZiMTcxLCAweDA4OGExYmM4LCAweGJlYzBjNTYwLCAweDYxYTNjOWU4LCAweGJjYThmNTRkLFxyXG5cdFx0ICAweGM3MmZlZmZhLCAweDIyODIyZTk5LCAweDgyYzU3MGI0LCAweGQ4ZDk0ZTg5LCAweDhiMWMzNGJjLCAweDMwMWUxNmU2LCAweDI3M2JlOTc5LCAweGIwZmZlYWE2LFxyXG5cdFx0ICAweDYxZDliOGM2LCAweDAwYjI0ODY5LCAweGI3ZmZjZTNmLCAweDA4ZGMyODNiLCAweDQzZGFmNjVhLCAweGY3ZTE5Nzk4LCAweDc2MTliNzJmLCAweDhmMWM5YmE0LFxyXG5cdFx0ICAweGRjODYzN2EwLCAweDE2YTdkM2IxLCAweDlmYzM5M2I3LCAweGE3MTM2ZWViLCAweGM2YmNjNjNlLCAweDFhNTEzNzQyLCAweGVmNjgyOGJjLCAweDUyMDM2NWQ2LFxyXG5cdFx0ICAweDJkNmE3N2FiLCAweDM1MjdlZDRiLCAweDgyMWZkMjE2LCAweDA5NWM2ZTJlLCAweGRiOTJmMmZiLCAweDVlZWEyOWNiLCAweDE0NTg5MmY1LCAweDkxNTg0ZjdmLFxyXG5cdFx0ICAweDU0ODM2OTdiLCAweDI2NjdhOGNjLCAweDg1MTk2MDQ4LCAweDhjNGJhY2VhLCAweDgzMzg2MGQ0LCAweDBkMjNlMGY5LCAweDZjMzg3ZThhLCAweDBhZTZkMjQ5LFxyXG5cdFx0ICAweGIyODQ2MDBjLCAweGQ4MzU3MzFkLCAweGRjYjFjNjQ3LCAweGFjNGM1NmVhLCAweDNlYmQ4MWIzLCAweDIzMGVhYmIwLCAweDY0MzhiYzg3LCAweGYwYjViMWZhLFxyXG5cdFx0ICAweDhmNWVhMmIzLCAweGZjMTg0NjQyLCAweDBhMDM2YjdhLCAweDRmYjA4OWJkLCAweDY0OWRhNTg5LCAweGEzNDU0MTVlLCAweDVjMDM4MzIzLCAweDNlNWQzYmI5LFxyXG5cdFx0ICAweDQzZDc5NTcyLCAweDdlNmRkMDdjLCAweDA2ZGZkZjFlLCAweDZjNmNjNGVmLCAweDcxNjBhNTM5LCAweDczYmZiZTcwLCAweDgzODc3NjA1LCAweDQ1MjNlY2YxKTtcclxuXHJcblx0XHRzQm94WzJdID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweDhkZWZjMjQwLCAweDI1ZmE1ZDlmLCAweGViOTAzZGJmLCAweGU4MTBjOTA3LCAweDQ3NjA3ZmZmLCAweDM2OWZlNDRiLCAweDhjMWZjNjQ0LCAweGFlY2VjYTkwLFxyXG5cdFx0ICAweGJlYjFmOWJmLCAweGVlZmJjYWVhLCAweGU4Y2YxOTUwLCAweDUxZGYwN2FlLCAweDkyMGU4ODA2LCAweGYwYWQwNTQ4LCAweGUxM2M4ZDgzLCAweDkyNzAxMGQ1LFxyXG5cdFx0ICAweDExMTA3ZDlmLCAweDA3NjQ3ZGI5LCAweGIyZTNlNGQ0LCAweDNkNGYyODVlLCAweGI5YWZhODIwLCAweGZhZGU4MmUwLCAweGEwNjcyNjhiLCAweDgyNzI3OTJlLFxyXG5cdFx0ICAweDU1M2ZiMmMwLCAweDQ4OWFlMjJiLCAweGQ0ZWY5Nzk0LCAweDEyNWUzZmJjLCAweDIxZmZmY2VlLCAweDgyNWIxYmZkLCAweDkyNTVjNWVkLCAweDEyNTdhMjQwLFxyXG5cdFx0ICAweDRlMWE4MzAyLCAweGJhZTA3ZmZmLCAweDUyODI0NmU3LCAweDhlNTcxNDBlLCAweDMzNzNmN2JmLCAweDhjOWY4MTg4LCAweGE2ZmM0ZWU4LCAweGM5ODJiNWE1LFxyXG5cdFx0ICAweGE4YzAxZGI3LCAweDU3OWZjMjY0LCAweDY3MDk0ZjMxLCAweGYyYmQzZjVmLCAweDQwZmZmN2MxLCAweDFmYjc4ZGZjLCAweDhlNmJkMmMxLCAweDQzN2JlNTliLFxyXG5cdFx0ICAweDk5YjAzZGJmLCAweGI1ZGJjNjRiLCAweDYzOGRjMGU2LCAweDU1ODE5ZDk5LCAweGExOTdjODFjLCAweDRhMDEyZDZlLCAweGM1ODg0YTI4LCAweGNjYzM2ZjcxLFxyXG5cdFx0ICAweGI4NDNjMjEzLCAweDZjMDc0M2YxLCAweDgzMDk4OTNjLCAweDBmZWRkZDVmLCAweDJmN2ZlODUwLCAweGQ3YzA3ZjdlLCAweDAyNTA3ZmJmLCAweDVhZmI5YTA0LFxyXG5cdFx0ICAweGE3NDdkMmQwLCAweDE2NTExOTJlLCAweGFmNzBiZjNlLCAweDU4YzMxMzgwLCAweDVmOTgzMDJlLCAweDcyN2NjM2M0LCAweDBhMGZiNDAyLCAweDBmN2ZlZjgyLFxyXG5cdFx0ICAweDhjOTZmZGFkLCAweDVkMmMyYWFlLCAweDhlZTk5YTQ5LCAweDUwZGE4OGI4LCAweDg0MjdmNGEwLCAweDFlYWM1NzkwLCAweDc5NmZiNDQ5LCAweDgyNTJkYzE1LFxyXG5cdFx0ICAweGVmYmQ3ZDliLCAweGE2NzI1OTdkLCAweGFkYTg0MGQ4LCAweDQ1ZjU0NTA0LCAweGZhNWQ3NDAzLCAweGU4M2VjMzA1LCAweDRmOTE3NTFhLCAweDkyNTY2OWMyLFxyXG5cdFx0ICAweDIzZWZlOTQxLCAweGE5MDNmMTJlLCAweDYwMjcwZGYyLCAweDAyNzZlNGI2LCAweDk0ZmQ2NTc0LCAweDkyNzk4NWIyLCAweDgyNzZkYmNiLCAweDAyNzc4MTc2LFxyXG5cdFx0ICAweGY4YWY5MThkLCAweDRlNDhmNzllLCAweDhmNjE2ZGRmLCAweGUyOWQ4NDBlLCAweDg0MmY3ZDgzLCAweDM0MGNlNWM4LCAweDk2YmJiNjgyLCAweDkzYjRiMTQ4LFxyXG5cdFx0ICAweGVmMzAzY2FiLCAweDk4NGZhZjI4LCAweDc3OWZhZjliLCAweDkyZGM1NjBkLCAweDIyNGQxZTIwLCAweDg0MzdhYTg4LCAweDdkMjlkYzk2LCAweDI3NTZkM2RjLFxyXG5cdFx0ICAweDhiOTA3Y2VlLCAweGI1MWZkMjQwLCAweGU3YzA3Y2UzLCAweGU1NjZiNGExLCAweGMzZTk2MTVlLCAweDNjZjgyMDlkLCAweDYwOTRkMWUzLCAweGNkOWNhMzQxLFxyXG5cdFx0ICAweDVjNzY0NjBlLCAweDAwZWE5ODNiLCAweGQ0ZDY3ODgxLCAweGZkNDc1NzJjLCAweGY3NmNlZGQ5LCAweGJkYTgyMjljLCAweDEyN2RhZGFhLCAweDQzOGEwNzRlLFxyXG5cdFx0ICAweDFmOTdjMDkwLCAweDA4MWJkYjhhLCAweDkzYTA3ZWJlLCAweGI5MzhjYTE1LCAweDk3YjAzY2ZmLCAweDNkYzJjMGY4LCAweDhkMWFiMmVjLCAweDY0MzgwZTUxLFxyXG5cdFx0ICAweDY4Y2M3YmZiLCAweGQ5MGYyNzg4LCAweDEyNDkwMTgxLCAweDVkZTVmZmQ0LCAweGRkN2VmODZhLCAweDc2YTJlMjE0LCAweGI5YTQwMzY4LCAweDkyNWQ5NThmLFxyXG5cdFx0ICAweDRiMzlmZmZhLCAweGJhMzlhZWU5LCAweGE0ZmZkMzBiLCAweGZhZjc5MzNiLCAweDZkNDk4NjIzLCAweDE5M2NiY2ZhLCAweDI3NjI3NTQ1LCAweDgyNWNmNDdhLFxyXG5cdFx0ICAweDYxYmQ4YmEwLCAweGQxMWU0MmQxLCAweGNlYWQwNGY0LCAweDEyN2VhMzkyLCAweDEwNDI4ZGI3LCAweDgyNzJhOTcyLCAweDkyNzBjNGE4LCAweDEyN2RlNTBiLFxyXG5cdFx0ICAweDI4NWJhMWM4LCAweDNjNjJmNDRmLCAweDM1YzBlYWE1LCAweGU4MDVkMjMxLCAweDQyODkyOWZiLCAweGI0ZmNkZjgyLCAweDRmYjY2YTUzLCAweDBlN2RjMTViLFxyXG5cdFx0ICAweDFmMDgxZmFiLCAweDEwODYxOGFlLCAweGZjZmQwODZkLCAweGY5ZmYyODg5LCAweDY5NGJjYzExLCAweDIzNmE1Y2FlLCAweDEyZGVjYTRkLCAweDJjM2Y4Y2M1LFxyXG5cdFx0ICAweGQyZDAyZGZlLCAweGY4ZWY1ODk2LCAweGU0Y2Y1MmRhLCAweDk1MTU1YjY3LCAweDQ5NGE0ODhjLCAweGI5YjZhODBjLCAweDVjOGY4MmJjLCAweDg5ZDM2YjQ1LFxyXG5cdFx0ICAweDNhNjA5NDM3LCAweGVjMDBjOWE5LCAweDQ0NzE1MjUzLCAweDBhODc0YjQ5LCAweGQ3NzNiYzQwLCAweDdjMzQ2NzFjLCAweDAyNzE3ZWY2LCAweDRmZWI1NTM2LFxyXG5cdFx0ICAweGEyZDAyZmZmLCAweGQyYmY2MGM0LCAweGQ0M2YwM2MwLCAweDUwYjRlZjZkLCAweDA3NDc4Y2QxLCAweDAwNmUxODg4LCAweGEyZTUzZjU1LCAweGI5ZTZkNGJjLFxyXG5cdFx0ICAweGEyMDQ4MDE2LCAweDk3NTczODMzLCAweGQ3MjA3ZDY3LCAweGRlMGY4ZjNkLCAweDcyZjg3YjMzLCAweGFiY2M0ZjMzLCAweDc2ODhjNTVkLCAweDdiMDBhNmIwLFxyXG5cdFx0ICAweDk0N2IwMDAxLCAweDU3MDA3NWQyLCAweGY5YmI4OGY4LCAweDg5NDIwMTllLCAweDQyNjRhNWZmLCAweDg1NjMwMmUwLCAweDcyZGJkOTJiLCAweGVlOTcxYjY5LFxyXG5cdFx0ICAweDZlYTIyZmRlLCAweDVmMDhhZTJiLCAweGFmN2E2MTZkLCAweGU1Yzk4NzY3LCAweGNmMWZlYmQyLCAweDYxZWZjOGMyLCAweGYxYWMyNTcxLCAweGNjODIzOWMyLFxyXG5cdFx0ICAweDY3MjE0Y2I4LCAweGIxZTU4M2QxLCAweGI3ZGMzZTYyLCAweDdmMTBiZGNlLCAweGY5MGE1YzM4LCAweDBmZjA0NDNkLCAweDYwNmU2ZGM2LCAweDYwNTQzYTQ5LFxyXG5cdFx0ICAweDU3MjdjMTQ4LCAweDJiZTk4YTFkLCAweDhhYjQxNzM4LCAweDIwZTFiZTI0LCAweGFmOTZkYTBmLCAweDY4NDU4NDI1LCAweDk5ODMzYmU1LCAweDYwMGQ0NTdkLFxyXG5cdFx0ICAweDI4MmY5MzUwLCAweDgzMzRiMzYyLCAweGQ5MWQxMTIwLCAweDJiNmQ4ZGEwLCAweDY0MmIxZTMxLCAweDljMzA1YTAwLCAweDUyYmNlNjg4LCAweDFiMDM1ODhhLFxyXG5cdFx0ICAweGY3YmFlZmQ1LCAweDQxNDJlZDljLCAweGE0MzE1YzExLCAweDgzMzIzZWM1LCAweGRmZWY0NjM2LCAweGExMzNjNTAxLCAweGU5ZDM1MzFjLCAweGVlMzUzNzgzKTtcclxuXHJcblx0XHRzQm94WzNdID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweDlkYjMwNDIwLCAweDFmYjZlOWRlLCAweGE3YmU3YmVmLCAweGQyNzNhMjk4LCAweDRhNGY3YmRiLCAweDY0YWQ4YzU3LCAweDg1NTEwNDQzLCAweGZhMDIwZWQxLFxyXG5cdFx0ICAweDdlMjg3YWZmLCAweGU2MGZiNjYzLCAweDA5NWYzNWExLCAweDc5ZWJmMTIwLCAweGZkMDU5ZDQzLCAweDY0OTdiN2IxLCAweGYzNjQxZjYzLCAweDI0MWU0YWRmLFxyXG5cdFx0ICAweDI4MTQ3ZjVmLCAweDRmYTJiOGNkLCAweGM5NDMwMDQwLCAweDBjYzMyMjIwLCAweGZkZDMwYjMwLCAweGMwYTUzNzRmLCAweDFkMmQwMGQ5LCAweDI0MTQ3YjE1LFxyXG5cdFx0ICAweGVlNGQxMTFhLCAweDBmY2E1MTY3LCAweDcxZmY5MDRjLCAweDJkMTk1ZmZlLCAweDFhMDU2NDVmLCAweDBjMTNmZWZlLCAweDA4MWIwOGNhLCAweDA1MTcwMTIxLFxyXG5cdFx0ICAweDgwNTMwMTAwLCAweGU4M2U1ZWZlLCAweGFjOWFmNGY4LCAweDdmZTcyNzAxLCAweGQyYjhlZTVmLCAweDA2ZGY0MjYxLCAweGJiOWU5YjhhLCAweDcyOTNlYTI1LFxyXG5cdFx0ICAweGNlODRmZmRmLCAweGY1NzE4ODAxLCAweDNkZDY0YjA0LCAweGEyNmYyNjNiLCAweDdlZDQ4NDAwLCAweDU0N2VlYmU2LCAweDQ0NmQ0Y2EwLCAweDZjZjNkNmY1LFxyXG5cdFx0ICAweDI2NDlhYmRmLCAweGFlYTBjN2Y1LCAweDM2MzM4Y2MxLCAweDUwM2Y3ZTkzLCAweGQzNzcyMDYxLCAweDExYjYzOGUxLCAweDcyNTAwZTAzLCAweGY4MGViMmJiLFxyXG5cdFx0ICAweGFiZTA1MDJlLCAweGVjOGQ3N2RlLCAweDU3OTcxZTgxLCAweGUxNGY2NzQ2LCAweGM5MzM1NDAwLCAweDY5MjAzMThmLCAweDA4MWRiYjk5LCAweGZmYzMwNGE1LFxyXG5cdFx0ICAweDRkMzUxODA1LCAweDdmM2Q1Y2UzLCAweGE2Yzg2NmM2LCAweDVkNWJjY2E5LCAweGRhZWM2ZmVhLCAweDlmOTI2ZjkxLCAweDlmNDYyMjJmLCAweDM5OTE0NjdkLFxyXG5cdFx0ICAweGE1YmY2ZDhlLCAweDExNDNjNDRmLCAweDQzOTU4MzAyLCAweGQwMjE0ZWViLCAweDAyMjA4M2I4LCAweDNmYjYxODBjLCAweDE4Zjg5MzFlLCAweDI4MTY1OGU2LFxyXG5cdFx0ICAweDI2NDg2ZTNlLCAweDhiZDc4YTcwLCAweDc0NzdlNGMxLCAweGI1MDZlMDdjLCAweGYzMmQwYTI1LCAweDc5MDk4YjAyLCAweGU0ZWFiYjgxLCAweDI4MTIzYjIzLFxyXG5cdFx0ICAweDY5ZGVhZDM4LCAweDE1NzRjYTE2LCAweGRmODcxYjYyLCAweDIxMWM0MGI3LCAweGE1MWE5ZWY5LCAweDAwMTQzNzdiLCAweDA0MWU4YWM4LCAweDA5MTE0MDAzLFxyXG5cdFx0ICAweGJkNTllNGQyLCAweGUzZDE1NmQ1LCAweDRmZTg3NmQ1LCAweDJmOTFhMzQwLCAweDU1N2JlOGRlLCAweDAwZWFlNGE3LCAweDBjZTVjMmVjLCAweDRkYjRiYmE2LFxyXG5cdFx0ICAweGU3NTZiZGZmLCAweGRkMzM2OWFjLCAweGVjMTdiMDM1LCAweDA2NTcyMzI3LCAweDk5YWZjOGIwLCAweDU2YzhjMzkxLCAweDZiNjU4MTFjLCAweDVlMTQ2MTE5LFxyXG5cdFx0ICAweDZlODVjYjc1LCAweGJlMDdjMDAyLCAweGMyMzI1NTc3LCAweDg5M2ZmNGVjLCAweDViYmZjOTJkLCAweGQwZWMzYjI1LCAweGI3ODAxYWI3LCAweDhkNmQzYjI0LFxyXG5cdFx0ICAweDIwYzc2M2VmLCAweGMzNjZhNWZjLCAweDljMzgyODgwLCAweDBhY2UzMjA1LCAweGFhYzk1NDhhLCAweGVjYTFkN2M3LCAweDA0MWFmYTMyLCAweDFkMTY2MjVhLFxyXG5cdFx0ICAweDY3MDE5MDJjLCAweDliNzU3YTU0LCAweDMxZDQ3N2Y3LCAweDkxMjZiMDMxLCAweDM2Y2M2ZmRiLCAweGM3MGI4YjQ2LCAweGQ5ZTY2YTQ4LCAweDU2ZTU1YTc5LFxyXG5cdFx0ICAweDAyNmE0Y2ViLCAweDUyNDM3ZWZmLCAweDJmOGY3NmI0LCAweDBkZjk4MGE1LCAweDg2NzRjZGUzLCAweGVkZGEwNGViLCAweDE3YTliZTA0LCAweDJjMThmNGRmLFxyXG5cdFx0ICAweGI3NzQ3ZjlkLCAweGFiMmFmN2I0LCAweGVmYzM0ZDIwLCAweDJlMDk2YjdjLCAweDE3NDFhMjU0LCAweGU1YjZhMDM1LCAweDIxM2Q0MmY2LCAweDJjMWM3YzI2LFxyXG5cdFx0ICAweDYxYzJmNTBmLCAweDY1NTJkYWY5LCAweGQyYzIzMWY4LCAweDI1MTMwZjY5LCAweGQ4MTY3ZmEyLCAweDA0MThmMmM4LCAweDAwMWE5NmE2LCAweDBkMTUyNmFiLFxyXG5cdFx0ICAweDYzMzE1YzIxLCAweDVlMGE3MmVjLCAweDQ5YmFmZWZkLCAweDE4NzkwOGQ5LCAweDhkMGRiZDg2LCAweDMxMTE3MGE3LCAweDNlOWI2NDBjLCAweGNjM2UxMGQ3LFxyXG5cdFx0ICAweGQ1Y2FkM2I2LCAweDBjYWVjMzg4LCAweGY3MzAwMWUxLCAweDZjNzI4YWZmLCAweDcxZWFlMmExLCAweDFmOWFmMzZlLCAweGNmY2JkMTJmLCAweGMxZGU4NDE3LFxyXG5cdFx0ICAweGFjMDdiZTZiLCAweGNiNDRhMWQ4LCAweDhiOWIwZjU2LCAweDAxMzk4OGMzLCAweGIxYzUyZmNhLCAweGI0YmUzMWNkLCAweGQ4NzgyODA2LCAweDEyYTNhNGUyLFxyXG5cdFx0ICAweDZmN2RlNTMyLCAweDU4ZmQ3ZWI2LCAweGQwMWVlOTAwLCAweDI0YWRmZmMyLCAweGY0OTkwZmM1LCAweDk3MTFhYWM1LCAweDAwMWQ3Yjk1LCAweDgyZTVlN2QyLFxyXG5cdFx0ICAweDEwOTg3M2Y2LCAweDAwNjEzMDk2LCAweGMzMmQ5NTIxLCAweGFkYTEyMWZmLCAweDI5OTA4NDE1LCAweDdmYmI5NzdmLCAweGFmOWViM2RiLCAweDI5YzllZDJhLFxyXG5cdFx0ICAweDVjZTJhNDY1LCAweGE3MzBmMzJjLCAweGQwYWEzZmU4LCAweDhhNWNjMDkxLCAweGQ0OWUyY2U3LCAweDBjZTQ1NGE5LCAweGQ2MGFjZDg2LCAweDAxNWYxOTE5LFxyXG5cdFx0ICAweDc3MDc5MTAzLCAweGRlYTAzYWY2LCAweDc4YTg1NjVlLCAweGRlZTM1NmRmLCAweDIxZjA1Y2JlLCAweDhiNzVlMzg3LCAweGIzYzUwNjUxLCAweGI4YTVjM2VmLFxyXG5cdFx0ICAweGQ4ZWViNmQyLCAweGU1MjNiZTc3LCAweGMyMTU0NTI5LCAweDJmNjllZmRmLCAweGFmZTY3YWZiLCAweGY0NzBjNGIyLCAweGYzZTBlYjViLCAweGQ2Y2M5ODc2LFxyXG5cdFx0ICAweDM5ZTQ0NjBjLCAweDFmZGE4NTM4LCAweDE5ODc4MzJmLCAweGNhMDA3MzY3LCAweGE5OTE0NGY4LCAweDI5NmIyOTllLCAweDQ5MmZjMjk1LCAweDkyNjZiZWFiLFxyXG5cdFx0ICAweGI1Njc2ZTY5LCAweDliZDNkZGRhLCAweGRmN2UwNTJmLCAweGRiMjU3MDFjLCAweDFiNWU1MWVlLCAweGY2NTMyNGU2LCAweDZhZmNlMzZjLCAweDAzMTZjYzA0LFxyXG5cdFx0ICAweDg2NDQyMTNlLCAweGI3ZGM1OWQwLCAweDc5NjUyOTFmLCAweGNjZDZmZDQzLCAweDQxODIzOTc5LCAweDkzMmJjZGY2LCAweGI2NTdjMzRkLCAweDRlZGZkMjgyLFxyXG5cdFx0ICAweDdhZTUyOTBjLCAweDNjYjk1MzZiLCAweDg1MWUyMGZlLCAweDk4MzM1NTdlLCAweDEzZWNmMGIwLCAweGQzZmZiMzcyLCAweDNmODVjNWMxLCAweDBhZWY3ZWQyKTtcclxuXHJcblx0XHRzQm94WzRdID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweDdlYzkwYzA0LCAweDJjNmU3NGI5LCAweDliMGU2NmRmLCAweGE2MzM3OTExLCAweGI4NmE3ZmZmLCAweDFkZDM1OGY1LCAweDQ0ZGQ5ZDQ0LCAweDE3MzExNjdmLFxyXG5cdFx0ICAweDA4ZmJmMWZhLCAweGU3ZjUxMWNjLCAweGQyMDUxYjAwLCAweDczNWFiYTAwLCAweDJhYjcyMmQ4LCAweDM4NjM4MWNiLCAweGFjZjYyNDNhLCAweDY5YmVmZDdhLFxyXG5cdFx0ICAweGU2YTJlNzdmLCAweGYwYzcyMGNkLCAweGM0NDk0ODE2LCAweGNjZjVjMTgwLCAweDM4ODUxNjQwLCAweDE1YjBhODQ4LCAweGU2OGIxOGNiLCAweDRjYWFkZWZmLFxyXG5cdFx0ICAweDVmNDgwYTAxLCAweDA0MTJiMmFhLCAweDI1OTgxNGZjLCAweDQxZDBlZmUyLCAweDRlNDBiNDhkLCAweDI0OGViNmZiLCAweDhkYmExY2ZlLCAweDQxYTk5YjAyLFxyXG5cdFx0ICAweDFhNTUwYTA0LCAweGJhOGY2NWNiLCAweDcyNTFmNGU3LCAweDk1YTUxNzI1LCAweGMxMDZlY2Q3LCAweDk3YTU5ODBhLCAweGM1MzliOWFhLCAweDRkNzlmZTZhLFxyXG5cdFx0ICAweGYyZjNmNzYzLCAweDY4YWY4MDQwLCAweGVkMGM5ZTU2LCAweDExYjQ5NThiLCAweGUxZWI1YTg4LCAweDg3MDllNmIwLCAweGQ3ZTA3MTU2LCAweDRlMjlmZWE3LFxyXG5cdFx0ICAweDYzNjZlNTJkLCAweDAyZDFjMDAwLCAweGM0YWM4ZTA1LCAweDkzNzdmNTcxLCAweDBjMDUzNzJhLCAweDU3ODUzNWYyLCAweDIyNjFiZTAyLCAweGQ2NDJhMGM5LFxyXG5cdFx0ICAweGRmMTNhMjgwLCAweDc0YjU1YmQyLCAweDY4MjE5OWMwLCAweGQ0MjFlNWVjLCAweDUzZmIzY2U4LCAweGM4YWRlZGIzLCAweDI4YTg3ZmM5LCAweDNkOTU5OTgxLFxyXG5cdFx0ICAweDVjMWZmOTAwLCAweGZlMzhkMzk5LCAweDBjNGVmZjBiLCAweDA2MjQwN2VhLCAweGFhMmY0ZmIxLCAweDRmYjk2OTc2LCAweDkwYzc5NTA1LCAweGIwYThhNzc0LFxyXG5cdFx0ICAweGVmNTVhMWZmLCAweGU1OWNhMmMyLCAweGE2YjYyZDI3LCAweGU2NmE0MjYzLCAweGRmNjUwMDFmLCAweDBlYzUwOTY2LCAweGRmZGQ1NWJjLCAweDI5ZGUwNjU1LFxyXG5cdFx0ICAweDkxMWU3MzlhLCAweDE3YWY4OTc1LCAweDMyYzc5MTFjLCAweDg5Zjg5NDY4LCAweDBkMDFlOTgwLCAweDUyNDc1NWY0LCAweDAzYjYzY2M5LCAweDBjYzg0NGIyLFxyXG5cdFx0ICAweGJjZjNmMGFhLCAweDg3YWMzNmU5LCAweGU1M2E3NDI2LCAweDAxYjNkODJiLCAweDFhOWU3NDQ5LCAweDY0ZWUyZDdlLCAweGNkZGJiMWRhLCAweDAxYzk0OTEwLFxyXG5cdFx0ICAweGI4NjhiZjgwLCAweDBkMjZmM2ZkLCAweDkzNDJlZGU3LCAweDA0YTVjMjg0LCAweDYzNjczN2I2LCAweDUwZjViNjE2LCAweGYyNDc2NmUzLCAweDhlY2EzNmMxLFxyXG5cdFx0ICAweDEzNmUwNWRiLCAweGZlZjE4MzkxLCAweGZiODg3YTM3LCAweGQ2ZTdmN2Q0LCAweGM3ZmI3ZGM5LCAweDMwNjNmY2RmLCAweGI2ZjU4OWRlLCAweGVjMjk0MWRhLFxyXG5cdFx0ICAweDI2ZTQ2Njk1LCAweGI3NTY2NDE5LCAweGY2NTRlZmM1LCAweGQwOGQ1OGI3LCAweDQ4OTI1NDAxLCAweGMxYmFjYjdmLCAweGU1ZmY1NTBmLCAweGI2MDgzMDQ5LFxyXG5cdFx0ICAweDViYjVkMGU4LCAweDg3ZDcyZTVhLCAweGFiNmE2ZWUxLCAweDIyM2E2NmNlLCAweGM2MmJmM2NkLCAweDllMDg4NWY5LCAweDY4Y2IzZTQ3LCAweDA4NmMwMTBmLFxyXG5cdFx0ICAweGEyMWRlODIwLCAweGQxOGI2OWRlLCAweGYzZjY1Nzc3LCAweGZhMDJjM2Y2LCAweDQwN2VkYWMzLCAweGNiYjNkNTUwLCAweDE3OTMwODRkLCAweGIwZDcwZWJhLFxyXG5cdFx0ICAweDBhYjM3OGQ1LCAweGQ5NTFmYjBjLCAweGRlZDdkYTU2LCAweDQxMjRiYmU0LCAweDk0Y2EwYjU2LCAweDBmNTc1NWQxLCAweGUwZTFlNTZlLCAweDYxODRiNWJlLFxyXG5cdFx0ICAweDU4MGEyNDlmLCAweDk0Zjc0YmMwLCAweGUzMjc4ODhlLCAweDlmN2I1NTYxLCAweGMzZGMwMjgwLCAweDA1Njg3NzE1LCAweDY0NmM2YmQ3LCAweDQ0OTA0ZGIzLFxyXG5cdFx0ICAweDY2YjRmMGEzLCAweGMwZjE2NDhhLCAweDY5N2VkNWFmLCAweDQ5ZTkyZmY2LCAweDMwOWUzNzRmLCAweDJjYjYzNTZhLCAweDg1ODA4NTczLCAweDQ5OTFmODQwLFxyXG5cdFx0ICAweDc2ZjBhZTAyLCAweDA4M2JlODRkLCAweDI4NDIxYzlhLCAweDQ0NDg5NDA2LCAweDczNmU0Y2I4LCAweGMxMDkyOTEwLCAweDhiYzk1ZmM2LCAweDdkODY5Y2Y0LFxyXG5cdFx0ICAweDEzNGY2MTZmLCAweDJlNzcxMThkLCAweGIzMWIyYmUxLCAweGFhOTBiNDcyLCAweDNjYTVkNzE3LCAweDdkMTYxYmJhLCAweDljYWQ5MDEwLCAweGFmNDYyYmEyLFxyXG5cdFx0ICAweDlmZTQ1OWQyLCAweDQ1ZDM0NTU5LCAweGQ5ZjJkYTEzLCAweGRiYzY1NDg3LCAweGYzZTRmOTRlLCAweDE3NmQ0ODZmLCAweDA5N2MxM2VhLCAweDYzMWRhNWM3LFxyXG5cdFx0ICAweDQ0NWY3MzgyLCAweDE3NTY4M2Y0LCAweGNkYzY2YTk3LCAweDcwYmUwMjg4LCAweGIzY2RjZjcyLCAweDZlNWRkMmYzLCAweDIwOTM2MDc5LCAweDQ1OWI4MGE1LFxyXG5cdFx0ICAweGJlNjBlMmRiLCAweGE5YzIzMTAxLCAweGViYTUzMTVjLCAweDIyNGU0MmYyLCAweDFjNWMxNTcyLCAweGY2NzIxYjJjLCAweDFhZDJmZmYzLCAweDhjMjU0MDRlLFxyXG5cdFx0ICAweDMyNGVkNzJmLCAweDQwNjdiN2ZkLCAweDA1MjMxMzhlLCAweDVjYTNiYzc4LCAweGRjMGZkNjZlLCAweDc1OTIyMjgzLCAweDc4NGQ2YjE3LCAweDU4ZWJiMTZlLFxyXG5cdFx0ICAweDQ0MDk0Zjg1LCAweDNmNDgxZDg3LCAweGZjZmVhZTdiLCAweDc3YjVmZjc2LCAweDhjMjMwMmJmLCAweGFhZjQ3NTU2LCAweDVmNDZiMDJhLCAweDJiMDkyODAxLFxyXG5cdFx0ICAweDNkMzhmNWY3LCAweDBjYTgxZjM2LCAweDUyYWY0YThhLCAweDY2ZDVlN2MwLCAweGRmM2IwODc0LCAweDk1MDU1MTEwLCAweDFiNWFkN2E4LCAweGY2MWVkNWFkLFxyXG5cdFx0ICAweDZjZjZlNDc5LCAweDIwNzU4MTg0LCAweGQwY2VmYTY1LCAweDg4ZjdiZTU4LCAweDRhMDQ2ODI2LCAweDBmZjZmOGYzLCAweGEwOWM3ZjcwLCAweDUzNDZhYmEwLFxyXG5cdFx0ICAweDVjZTk2YzI4LCAweGUxNzZlZGEzLCAweDZiYWMzMDdmLCAweDM3NjgyOWQyLCAweDg1MzYwZmE5LCAweDE3ZTNmZTJhLCAweDI0Yjc5NzY3LCAweGY1YTk2YjIwLFxyXG5cdFx0ICAweGQ2Y2QyNTk1LCAweDY4ZmYxZWJmLCAweDc1NTU0NDJjLCAweGYxOWYwNmJlLCAweGY5ZTA2NTlhLCAweGVlYjk0OTFkLCAweDM0MDEwNzE4LCAweGJiMzBjYWI4LFxyXG5cdFx0ICAweGU4MjJmZTE1LCAweDg4NTcwOTgzLCAweDc1MGU2MjQ5LCAweGRhNjI3ZTU1LCAweDVlNzZmZmE4LCAweGIxNTM0NTQ2LCAweDZkNDdkZTA4LCAweGVmZTllN2Q0KTtcclxuXHJcblx0XHRzQm94WzVdID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweGY2ZmE4ZjlkLCAweDJjYWM2Y2UxLCAweDRjYTM0ODY3LCAweGUyMzM3ZjdjLCAweDk1ZGIwOGU3LCAweDAxNjg0M2I0LCAweGVjZWQ1Y2JjLCAweDMyNTU1M2FjLFxyXG5cdFx0ICAweGJmOWYwOTYwLCAweGRmYTFlMmVkLCAweDgzZjA1NzlkLCAweDYzZWQ4NmI5LCAweDFhYjZhNmI4LCAweGRlNWViZTM5LCAweGYzOGZmNzMyLCAweDg5ODliMTM4LFxyXG5cdFx0ICAweDMzZjE0OTYxLCAweGMwMTkzN2JkLCAweGY1MDZjNmRhLCAweGU0NjI1ZTdlLCAweGEzMDhlYTk5LCAweDRlMjNlMzNjLCAweDc5Y2JkN2NjLCAweDQ4YTE0MzY3LFxyXG5cdFx0ICAweGEzMTQ5NjE5LCAweGZlYzk0YmQ1LCAweGExMTQxNzRhLCAweGVhYTAxODY2LCAweGEwODRkYjJkLCAweDA5YTg0ODZmLCAweGE4ODg2MTRhLCAweDI5MDBhZjk4LFxyXG5cdFx0ICAweDAxNjY1OTkxLCAweGUxOTkyODYzLCAweGM4ZjMwYzYwLCAweDJlNzhlZjNjLCAweGQwZDUxOTMyLCAweGNmMGZlYzE0LCAweGY3Y2EwN2QyLCAweGQwYTgyMDcyLFxyXG5cdFx0ICAweGZkNDExOTdlLCAweDkzMDVhNmIwLCAweGU4NmJlM2RhLCAweDc0YmVkM2NkLCAweDM3MmRhNTNjLCAweDRjN2Y0NDQ4LCAweGRhYjVkNDQwLCAweDZkYmEwZWMzLFxyXG5cdFx0ICAweDA4MzkxOWE3LCAweDlmYmFlZWQ5LCAweDQ5ZGJjZmIwLCAweDRlNjcwYzUzLCAweDVjM2Q5YzAxLCAweDY0YmRiOTQxLCAweDJjMGU2MzZhLCAweGJhN2RkOWNkLFxyXG5cdFx0ICAweGVhNmY3Mzg4LCAweGU3MGJjNzYyLCAweDM1ZjI5YWRiLCAweDVjNGNkZDhkLCAweGYwZDQ4ZDhjLCAweGI4ODE1M2UyLCAweDA4YTE5ODY2LCAweDFhZTJlYWM4LFxyXG5cdFx0ICAweDI4NGNhZjg5LCAweGFhOTI4MjIzLCAweDkzMzRiZTUzLCAweDNiM2EyMWJmLCAweDE2NDM0YmUzLCAweDlhZWEzOTA2LCAweGVmZThjMzZlLCAweGY4OTBjZGQ5LFxyXG5cdFx0ICAweDgwMjI2ZGFlLCAweGMzNDBhNGEzLCAweGRmN2U5YzA5LCAweGE2OTRhODA3LCAweDViN2M1ZWNjLCAweDIyMWRiM2E2LCAweDlhNjlhMDJmLCAweDY4ODE4YTU0LFxyXG5cdFx0ICAweGNlYjIyOTZmLCAweDUzYzA4NDNhLCAweGZlODkzNjU1LCAweDI1YmZlNjhhLCAweGI0NjI4YWJjLCAweGNmMjIyZWJmLCAweDI1YWM2ZjQ4LCAweGE5YTk5Mzg3LFxyXG5cdFx0ICAweDUzYmRkYjY1LCAweGU3NmZmYmU3LCAweGU5NjdmZDc4LCAweDBiYTkzNTYzLCAweDhlMzQyYmMxLCAweGU4YTExYmU5LCAweDQ5ODA3NDBkLCAweGM4MDg3ZGZjLFxyXG5cdFx0ICAweDhkZTRiZjk5LCAweGExMTEwMWEwLCAweDdmZDM3OTc1LCAweGRhNWEyNmMwLCAweGU4MWY5OTRmLCAweDk1MjhjZDg5LCAweGZkMzM5ZmVkLCAweGI4NzgzNGJmLFxyXG5cdFx0ICAweDVmMDQ0NTZkLCAweDIyMjU4Njk4LCAweGM5YzRjODNiLCAweDJkYzE1NmJlLCAweDRmNjI4ZGFhLCAweDU3ZjU1ZWM1LCAweGUyMjIwYWJlLCAweGQyOTE2ZWJmLFxyXG5cdFx0ICAweDRlYzc1Yjk1LCAweDI0ZjJjM2MwLCAweDQyZDE1ZDk5LCAweGNkMGQ3ZmEwLCAweDdiNmUyN2ZmLCAweGE4ZGM4YWYwLCAweDczNDVjMTA2LCAweGY0MWUyMzJmLFxyXG5cdFx0ICAweDM1MTYyMzg2LCAweGU2ZWE4OTI2LCAweDMzMzNiMDk0LCAweDE1N2VjNmYyLCAweDM3MmI3NGFmLCAweDY5MjU3M2U0LCAweGU5YTlkODQ4LCAweGYzMTYwMjg5LFxyXG5cdFx0ICAweDNhNjJlZjFkLCAweGE3ODdlMjM4LCAweGYzYTVmNjc2LCAweDc0MzY0ODUzLCAweDIwOTUxMDYzLCAweDQ1NzY2OThkLCAweGI2ZmFkNDA3LCAweDU5MmFmOTUwLFxyXG5cdFx0ICAweDM2ZjczNTIzLCAweDRjZmI2ZTg3LCAweDdkYTRjZWMwLCAweDZjMTUyZGFhLCAweGNiMDM5NmE4LCAweGM1MGRmZTVkLCAweGZjZDcwN2FiLCAweDA5MjFjNDJmLFxyXG5cdFx0ICAweDg5ZGZmMGJiLCAweDVmZTJiZTc4LCAweDQ0OGY0ZjMzLCAweDc1NDYxM2M5LCAweDJiMDVkMDhkLCAweDQ4YjlkNTg1LCAweGRjMDQ5NDQxLCAweGM4MDk4ZjliLFxyXG5cdFx0ICAweDdkZWRlNzg2LCAweGMzOWEzMzczLCAweDQyNDEwMDA1LCAweDZhMDkxNzUxLCAweDBlZjNjOGE2LCAweDg5MDA3MmQ2LCAweDI4MjA3NjgyLCAweGE5YTlmN2JlLFxyXG5cdFx0ICAweGJmMzI2NzlkLCAweGQ0NWI1Yjc1LCAweGIzNTNmZDAwLCAweGNiYjBlMzU4LCAweDgzMGYyMjBhLCAweDFmOGZiMjE0LCAweGQzNzJjZjA4LCAweGNjM2M0YTEzLFxyXG5cdFx0ICAweDhjZjYzMTY2LCAweDA2MWM4N2JlLCAweDg4Yzk4Zjg4LCAweDYwNjJlMzk3LCAweDQ3Y2Y4ZTdhLCAweGI2Yzg1MjgzLCAweDNjYzJhY2ZiLCAweDNmYzA2OTc2LFxyXG5cdFx0ICAweDRlOGYwMjUyLCAweDY0ZDgzMTRkLCAweGRhMzg3MGUzLCAweDFlNjY1NDU5LCAweGMxMDkwOGYwLCAweDUxMzAyMWE1LCAweDZjNWI2OGI3LCAweDgyMmY4YWEwLFxyXG5cdFx0ICAweDMwMDdjZDNlLCAweDc0NzE5ZWVmLCAweGRjODcyNjgxLCAweDA3MzM0MGQ0LCAweDdlNDMyZmQ5LCAweDBjNWVjMjQxLCAweDg4MDkyODZjLCAweGY1OTJkODkxLFxyXG5cdFx0ICAweDA4YTkzMGY2LCAweDk1N2VmMzA1LCAweGI3ZmJmZmJkLCAweGMyNjZlOTZmLCAweDZmZTRhYzk4LCAweGIxNzNlY2MwLCAweGJjNjBiNDJhLCAweDk1MzQ5OGRhLFxyXG5cdFx0ICAweGZiYTFhZTEyLCAweDJkNGJkNzM2LCAweDBmMjVmYWFiLCAweGE0ZjNmY2ViLCAweGUyOTY5MTIzLCAweDI1N2YwYzNkLCAweDkzNDhhZjQ5LCAweDM2MTQwMGJjLFxyXG5cdFx0ICAweGU4ODE2ZjRhLCAweDM4MTRmMjAwLCAweGEzZjk0MDQzLCAweDljN2E1NGMyLCAweGJjNzA0ZjU3LCAweGRhNDFlN2Y5LCAweGMyNWFkMzNhLCAweDU0ZjRhMDg0LFxyXG5cdFx0ICAweGIxN2Y1NTA1LCAweDU5MzU3Y2JlLCAweGVkYmQxNWM4LCAweDdmOTdjNWFiLCAweGJhNWFjN2I1LCAweGI2ZjZkZWFmLCAweDNhNDc5YzNhLCAweDUzMDJkYTI1LFxyXG5cdFx0ICAweDY1M2Q3ZTZhLCAweDU0MjY4ZDQ5LCAweDUxYTQ3N2VhLCAweDUwMTdkNTViLCAweGQ3ZDI1ZDg4LCAweDQ0MTM2Yzc2LCAweDA0MDRhOGM4LCAweGI4ZTVhMTIxLFxyXG5cdFx0ICAweGI4MWE5MjhhLCAweDYwZWQ1ODY5LCAweDk3YzU1Yjk2LCAweGVhZWM5OTFiLCAweDI5OTM1OTEzLCAweDAxZmRiN2YxLCAweDA4OGU4ZGZhLCAweDlhYjZmNmY1LFxyXG5cdFx0ICAweDNiNGNiZjlmLCAweDRhNWRlM2FiLCAweGU2MDUxZDM1LCAweGEwZTFkODU1LCAweGQzNmI0Y2YxLCAweGY1NDRlZGViLCAweGIwZTkzNTI0LCAweGJlYmI4ZmJkLFxyXG5cdFx0ICAweGEyZDc2MmNmLCAweDQ5YzkyZjU0LCAweDM4YjVmMzMxLCAweDcxMjhhNDU0LCAweDQ4MzkyOTA1LCAweGE2NWIxZGI4LCAweDg1MWM5N2JkLCAweGQ2NzVjZjJmKTtcclxuXHJcblx0XHRzQm94WzZdID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweDg1ZTA0MDE5LCAweDMzMmJmNTY3LCAweDY2MmRiZmZmLCAweGNmYzY1NjkzLCAweDJhOGQ3ZjZmLCAweGFiOWJjOTEyLCAweGRlNjAwOGExLCAweDIwMjhkYTFmLFxyXG5cdFx0ICAweDAyMjdiY2U3LCAweDRkNjQyOTE2LCAweDE4ZmFjMzAwLCAweDUwZjE4YjgyLCAweDJjYjJjYjExLCAweGIyMzJlNzVjLCAweDRiMzY5NWYyLCAweGIyODcwN2RlLFxyXG5cdFx0ICAweGEwNWZiY2Y2LCAweGNkNDE4MWU5LCAweGUxNTAyMTBjLCAweGUyNGVmMWJkLCAweGIxNjhjMzgxLCAweGZkZTRlNzg5LCAweDVjNzliMGQ4LCAweDFlOGJmZDQzLFxyXG5cdFx0ICAweDRkNDk1MDAxLCAweDM4YmU0MzQxLCAweDkxM2NlZTFkLCAweDkyYTc5YzNmLCAweDA4OTc2NmJlLCAweGJhZWVhZGY0LCAweDEyODZiZWNmLCAweGI2ZWFjYjE5LFxyXG5cdFx0ICAweDI2NjBjMjAwLCAweDc1NjViZGU0LCAweDY0MjQxZjdhLCAweDgyNDhkY2E5LCAweGMzYjNhZDY2LCAweDI4MTM2MDg2LCAweDBiZDhkZmE4LCAweDM1NmQxY2YyLFxyXG5cdFx0ICAweDEwNzc4OWJlLCAweGIzYjJlOWNlLCAweDA1MDJhYThmLCAweDBiYzAzNTFlLCAweDE2NmJmNTJhLCAweGViMTJmZjgyLCAweGUzNDg2OTExLCAweGQzNGQ3NTE2LFxyXG5cdFx0ICAweDRlN2IzYWZmLCAweDVmNDM2NzFiLCAweDljZjZlMDM3LCAweDQ5ODFhYzgzLCAweDMzNDI2NmNlLCAweDhjOTM0MWI3LCAweGQwZDg1NGMwLCAweGNiM2E2Yzg4LFxyXG5cdFx0ICAweDQ3YmMyODI5LCAweDQ3MjViYTM3LCAweGE2NmFkMjJiLCAweDdhZDYxZjFlLCAweDBjNWNiYWZhLCAweDQ0MzdmMTA3LCAweGI2ZTc5OTYyLCAweDQyZDJkODE2LFxyXG5cdFx0ICAweDBhOTYxMjg4LCAweGUxYTVjMDZlLCAweDEzNzQ5ZTY3LCAweDcyZmMwODFhLCAweGIxZDEzOWY3LCAweGY5NTgzNzQ1LCAweGNmMTlkZjU4LCAweGJlYzNmNzU2LFxyXG5cdFx0ICAweGMwNmViYTMwLCAweDA3MjExYjI0LCAweDQ1YzI4ODI5LCAweGM5NWUzMTdmLCAweGJjOGVjNTExLCAweDM4YmM0NmU5LCAweGM2ZTZmYTE0LCAweGJhZTg1ODRhLFxyXG5cdFx0ICAweGFkNGViYzQ2LCAweDQ2OGY1MDhiLCAweDc4Mjk0MzVmLCAweGYxMjQxODNiLCAweDgyMWRiYTlmLCAweGFmZjYwZmY0LCAweGVhMmM0ZTZkLCAweDE2ZTM5MjY0LFxyXG5cdFx0ICAweDkyNTQ0YThiLCAweDAwOWI0ZmMzLCAweGFiYTY4Y2VkLCAweDlhYzk2Zjc4LCAweDA2YTViNzlhLCAweGIyODU2ZTZlLCAweDFhZWMzY2E5LCAweGJlODM4Njg4LFxyXG5cdFx0ICAweDBlMDgwNGU5LCAweDU1ZjFiZTU2LCAweGU3ZTUzNjNiLCAweGIzYTFmMjVkLCAweGY3ZGViYjg1LCAweDYxZmUwMzNjLCAweDE2NzQ2MjMzLCAweDNjMDM0YzI4LFxyXG5cdFx0ICAweGRhNmQwYzc0LCAweDc5YWFjNTZjLCAweDNjZTRlMWFkLCAweDUxZjBjODAyLCAweDk4ZjhmMzVhLCAweDE2MjZhNDlmLCAweGVlZDgyYjI5LCAweDFkMzgyZmUzLFxyXG5cdFx0ICAweDBjNGZiOTlhLCAweGJiMzI1Nzc4LCAweDNlYzZkOTdiLCAweDZlNzdhNmE5LCAweGNiNjU4YjVjLCAweGQ0NTIzMGM3LCAweDJiZDE0MDhiLCAweDYwYzAzZWI3LFxyXG5cdFx0ICAweGI5MDY4ZDc4LCAweGEzMzc1NGY0LCAweGY0MzBjODdkLCAweGM4YTcxMzAyLCAweGI5NmQ4YzMyLCAweGViZDRlN2JlLCAweGJlOGI5ZDJkLCAweDc5NzlmYjA2LFxyXG5cdFx0ICAweGU3MjI1MzA4LCAweDhiNzVjZjc3LCAweDExZWY4ZGE0LCAweGUwODNjODU4LCAweDhkNmI3ODZmLCAweDVhNjMxN2E2LCAweGZhNWNmN2EwLCAweDVkZGEwMDMzLFxyXG5cdFx0ICAweGYyOGViZmIwLCAweGY1YjljMzEwLCAweGEwZWFjMjgwLCAweDA4Yjk3NjdhLCAweGEzZDlkMmIwLCAweDc5ZDM0MjE3LCAweDAyMWE3MThkLCAweDlhYzYzMzZhLFxyXG5cdFx0ICAweDI3MTFmZDYwLCAweDQzODA1MGUzLCAweDA2OTkwOGE4LCAweDNkN2ZlZGM0LCAweDgyNmQyYmVmLCAweDRlZWI4NDc2LCAweDQ4OGRjZjI1LCAweDM2YzlkNTY2LFxyXG5cdFx0ICAweDI4ZTc0ZTQxLCAweGMyNjEwYWNhLCAweDNkNDlhOWNmLCAweGJhZTNiOWRmLCAweGI2NWY4ZGU2LCAweDkyYWVhZjY0LCAweDNhYzdkNWU2LCAweDllYTgwNTA5LFxyXG5cdFx0ICAweGYyMmIwMTdkLCAweGE0MTczZjcwLCAweGRkMWUxNmMzLCAweDE1ZTBkN2Y5LCAweDUwYjFiODg3LCAweDJiOWY0ZmQ1LCAweDYyNWFiYTgyLCAweDZhMDE3OTYyLFxyXG5cdFx0ICAweDJlYzAxYjljLCAweDE1NDg4YWE5LCAweGQ3MTZlNzQwLCAweDQwMDU1YTJjLCAweDkzZDI5YTIyLCAweGUzMmRiZjlhLCAweDA1ODc0NWI5LCAweDM0NTNkYzFlLFxyXG5cdFx0ICAweGQ2OTkyOTZlLCAweDQ5NmNmZjZmLCAweDFjOWY0OTg2LCAweGRmZTJlZDA3LCAweGI4NzI0MmQxLCAweDE5ZGU3ZWFlLCAweDA1M2U1NjFhLCAweDE1YWQ2ZjhjLFxyXG5cdFx0ICAweDY2NjI2YzFjLCAweDcxNTRjMjRjLCAweGVhMDgyYjJhLCAweDkzZWIyOTM5LCAweDE3ZGNiMGYwLCAweDU4ZDRmMmFlLCAweDllYTI5NGZiLCAweDUyY2Y1NjRjLFxyXG5cdFx0ICAweDk4ODNmZTY2LCAweDJlYzQwNTgxLCAweDc2Mzk1M2MzLCAweDAxZDY2OTJlLCAweGQzYTBjMTA4LCAweGExZTcxNjBlLCAweGU0ZjJkZmE2LCAweDY5M2VkMjg1LFxyXG5cdFx0ICAweDc0OTA0Njk4LCAweDRjMmIwZWRkLCAweDRmNzU3NjU2LCAweDVkMzkzMzc4LCAweGExMzIyMzRmLCAweDNkMzIxYzVkLCAweGMzZjVlMTk0LCAweDRiMjY5MzAxLFxyXG5cdFx0ICAweGM3OWYwMjJmLCAweDNjOTk3ZTdlLCAweDVlNGY5NTA0LCAweDNmZmFmYmJkLCAweDc2ZjdhZDBlLCAweDI5NjY5M2Y0LCAweDNkMWZjZTZmLCAweGM2MWU0NWJlLFxyXG5cdFx0ICAweGQzYjVhYjM0LCAweGY3MmJmOWI3LCAweDFiMDQzNGMwLCAweDRlNzJiNTY3LCAweDU1OTJhMzNkLCAweGI1MjI5MzAxLCAweGNmZDJhODdmLCAweDYwYWViNzY3LFxyXG5cdFx0ICAweDE4MTQzODZiLCAweDMwYmNjMzNkLCAweDM4YTBjMDdkLCAweGZkMTYwNmYyLCAweGMzNjM1MTliLCAweDU4OWRkMzkwLCAweDU0NzlmOGU2LCAweDFjYjhkNjQ3LFxyXG5cdFx0ICAweDk3ZmQ2MWE5LCAweGVhNzc1OWY0LCAweDJkNTc1MzlkLCAweDU2OWE1OGNmLCAweGU4NGU2M2FkLCAweDQ2MmUxYjc4LCAweDY1ODBmODdlLCAweGYzODE3OTE0LFxyXG5cdFx0ICAweDkxZGE1NWY0LCAweDQwYTIzMGYzLCAweGQxOTg4ZjM1LCAweGI2ZTMxOGQyLCAweDNmZmE1MGJjLCAweDNkNDBmMDIxLCAweGMzYzBiZGFlLCAweDQ5NThjMjRjLFxyXG5cdFx0ICAweDUxOGYzNmIyLCAweDg0YjFkMzcwLCAweDBmZWRjZTgzLCAweDg3OGRkYWRhLCAweGYyYTI3OWM3LCAweDk0ZTAxYmU4LCAweDkwNzE2ZjRiLCAweDk1NGI4YWEzKTtcclxuXHJcblx0XHRzQm94WzddID0gbmV3IEFycmF5KFxyXG5cdFx0ICAweGUyMTYzMDBkLCAweGJiZGRmZmZjLCAweGE3ZWJkYWJkLCAweDM1NjQ4MDk1LCAweDc3ODlmOGI3LCAweGU2YzExMjFiLCAweDBlMjQxNjAwLCAweDA1MmNlOGI1LFxyXG5cdFx0ICAweDExYTljZmIwLCAweGU1OTUyZjExLCAweGVjZTc5OTBhLCAweDkzODZkMTc0LCAweDJhNDI5MzFjLCAweDc2ZTM4MTExLCAweGIxMmRlZjNhLCAweDM3ZGRkZGZjLFxyXG5cdFx0ICAweGRlOWFkZWIxLCAweDBhMGNjMzJjLCAweGJlMTk3MDI5LCAweDg0YTAwOTQwLCAweGJiMjQzYTBmLCAweGI0ZDEzN2NmLCAweGI0NGU3OWYwLCAweDA0OWVlZGZkLFxyXG5cdFx0ICAweDBiMTVhMTVkLCAweDQ4MGQzMTY4LCAweDhiYmJkZTVhLCAweDY2OWRlZDQyLCAweGM3ZWNlODMxLCAweDNmOGY5NWU3LCAweDcyZGYxOTFiLCAweDc1ODAzMzBkLFxyXG5cdFx0ICAweDk0MDc0MjUxLCAweDVjN2RjZGZhLCAweGFiYmU2ZDYzLCAweGFhNDAyMTY0LCAweGIzMDFkNDBhLCAweDAyZTdkMWNhLCAweDUzNTcxZGFlLCAweDdhMzE4MmEyLFxyXG5cdFx0ICAweDEyYThkZGVjLCAweGZkYWEzMzVkLCAweDE3NmY0M2U4LCAweDcxZmI0NmQ0LCAweDM4MTI5MDIyLCAweGNlOTQ5YWQ0LCAweGI4NDc2OWFkLCAweDk2NWJkODYyLFxyXG5cdFx0ICAweDgyZjNkMDU1LCAweDY2ZmI5NzY3LCAweDE1YjgwYjRlLCAweDFkNWI0N2EwLCAweDRjZmRlMDZmLCAweGMyOGVjNGI4LCAweDU3ZTg3MjZlLCAweDY0N2E3OGZjLFxyXG5cdFx0ICAweDk5ODY1ZDQ0LCAweDYwOGJkNTkzLCAweDZjMjAwZTAzLCAweDM5ZGM1ZmY2LCAweDVkMGIwMGEzLCAweGFlNjNhZmYyLCAweDdlOGJkNjMyLCAweDcwMTA4YzBjLFxyXG5cdFx0ICAweGJiZDM1MDQ5LCAweDI5OThkZjA0LCAweDk4MGNmNDJhLCAweDliNmRmNDkxLCAweDllN2VkZDUzLCAweDA2OTE4NTQ4LCAweDU4Y2I3ZTA3LCAweDNiNzRlZjJlLFxyXG5cdFx0ICAweDUyMmZmZmIxLCAweGQyNDcwOGNjLCAweDFjN2UyN2NkLCAweGE0ZWIyMTViLCAweDNjZjFkMmUyLCAweDE5YjQ3YTM4LCAweDQyNGY3NjE4LCAweDM1ODU2MDM5LFxyXG5cdFx0ICAweDlkMTdkZWU3LCAweDI3ZWIzNWU2LCAweGM5YWZmNjdiLCAweDM2YmFmNWI4LCAweDA5YzQ2N2NkLCAweGMxODkxMGIxLCAweGUxMWRiZjdiLCAweDA2Y2QxYWY4LFxyXG5cdFx0ICAweDcxNzBjNjA4LCAweDJkNWUzMzU0LCAweGQ0ZGU0OTVhLCAweDY0YzZkMDA2LCAweGJjYzBjNjJjLCAweDNkZDAwZGIzLCAweDcwOGY4ZjM0LCAweDc3ZDUxYjQyLFxyXG5cdFx0ICAweDI2NGY2MjBmLCAweDI0YjhkMmJmLCAweDE1YzFiNzllLCAweDQ2YTUyNTY0LCAweGY4ZDdlNTRlLCAweDNlMzc4MTYwLCAweDc4OTVjZGE1LCAweDg1OWMxNWE1LFxyXG5cdFx0ICAweGU2NDU5Nzg4LCAweGMzN2JjNzVmLCAweGRiMDdiYTBjLCAweDA2NzZhM2FiLCAweDdmMjI5YjFlLCAweDMxODQyZTdiLCAweDI0MjU5ZmQ3LCAweGY4YmVmNDcyLFxyXG5cdFx0ICAweDgzNWZmY2I4LCAweDZkZjRjMWYyLCAweDk2ZjViMTk1LCAweGZkMGFmMGZjLCAweGIwZmUxMzRjLCAweGUyNTA2ZDNkLCAweDRmOWIxMmVhLCAweGYyMTVmMjI1LFxyXG5cdFx0ICAweGEyMjM3MzZmLCAweDlmYjRjNDI4LCAweDI1ZDA0OTc5LCAweDM0YzcxM2Y4LCAweGM0NjE4MTg3LCAweGVhN2E2ZTk4LCAweDdjZDE2ZWZjLCAweDE0MzY4NzZjLFxyXG5cdFx0ICAweGYxNTQ0MTA3LCAweGJlZGVlZTE0LCAweDU2ZTlhZjI3LCAweGEwNGFhNDQxLCAweDNjZjdjODk5LCAweDkyZWNiYWU2LCAweGRkNjcwMTZkLCAweDE1MTY4MmViLFxyXG5cdFx0ICAweGE4NDJlZWRmLCAweGZkYmE2MGI0LCAweGYxOTA3Yjc1LCAweDIwZTMwMzBmLCAweDI0ZDhjMjllLCAweGUxMzk2NzNiLCAweGVmYTYzZmI4LCAweDcxODczMDU0LFxyXG5cdFx0ICAweGI2ZjJjZjNiLCAweDlmMzI2NDQyLCAweGNiMTVhNGNjLCAweGIwMWE0NTA0LCAweGYxZTQ3ZDhkLCAweDg0NGExYmU1LCAweGJhZTdkZmRjLCAweDQyY2JkYTcwLFxyXG5cdFx0ICAweGNkN2RhZTBhLCAweDU3ZTg1YjdhLCAweGQ1M2Y1YWY2LCAweDIwY2Y0ZDhjLCAweGNlYTRkNDI4LCAweDc5ZDEzMGE0LCAweDM0ODZlYmZiLCAweDMzZDNjZGRjLFxyXG5cdFx0ICAweDc3ODUzYjUzLCAweDM3ZWZmY2I1LCAweGM1MDY4Nzc4LCAweGU1ODBiM2U2LCAweDRlNjhiOGY0LCAweGM1YzhiMzdlLCAweDBkODA5ZWEyLCAweDM5OGZlYjdjLFxyXG5cdFx0ICAweDEzMmE0Zjk0LCAweDQzYjc5NTBlLCAweDJmZWU3ZDFjLCAweDIyMzYxM2JkLCAweGRkMDZjYWEyLCAweDM3ZGY5MzJiLCAweGM0MjQ4Mjg5LCAweGFjZjNlYmMzLFxyXG5cdFx0ICAweDU3MTVmNmI3LCAweGVmMzQ3OGRkLCAweGYyNjc2MTZmLCAweGMxNDhjYmU0LCAweDkwNTI4MTVlLCAweDVlNDEwZmFiLCAweGI0OGEyNDY1LCAweDJlZGE3ZmE0LFxyXG5cdFx0ICAweGU4N2I0MGU0LCAweGU5OGVhMDg0LCAweDU4ODllOWUxLCAweGVmZDM5MGZjLCAweGRkMDdkMzViLCAweGRiNDg1Njk0LCAweDM4ZDdlNWIyLCAweDU3NzIwMTAxLFxyXG5cdFx0ICAweDczMGVkZWJjLCAweDViNjQzMTEzLCAweDk0OTE3ZTRmLCAweDUwM2MyZmJhLCAweDY0NmYxMjgyLCAweDc1MjNkMjRhLCAweGUwNzc5Njk1LCAweGY5YzE3YThmLFxyXG5cdFx0ICAweDdhNWIyMTIxLCAweGQxODdiODk2LCAweDI5MjYzYTRkLCAweGJhNTEwY2RmLCAweDgxZjQ3YzlmLCAweGFkMTE2M2VkLCAweGVhN2I1OTY1LCAweDFhMDA3MjZlLFxyXG5cdFx0ICAweDExNDAzMDkyLCAweDAwZGE2ZDc3LCAweDRhMGNkZDYxLCAweGFkMWY0NjAzLCAweDYwNWJkZmIwLCAweDllZWRjMzY0LCAweDIyZWJlNmE4LCAweGNlZTdkMjhhLFxyXG5cdFx0ICAweGEwZTczNmEwLCAweDU1NjRhNmI5LCAweDEwODUzMjA5LCAweGM3ZWI4ZjM3LCAweDJkZTcwNWNhLCAweDg5NTE1NzBmLCAweGRmMDk4MjJiLCAweGJkNjkxYTZjLFxyXG5cdFx0ICAweGFhMTJlNGYyLCAweDg3NDUxYzBmLCAweGUwZjZhMjdhLCAweDNhZGE0ODE5LCAweDRjZjE3NjRmLCAweDBkNzcxYzJiLCAweDY3Y2RiMTU2LCAweDM1MGQ4Mzg0LFxyXG5cdFx0ICAweDU5MzhmYTBmLCAweDQyMzk5ZWYzLCAweDM2OTk3YjA3LCAweDBlODQwOTNkLCAweDRhYTkzZTYxLCAweDgzNjBkODdiLCAweDFmYTk4YjBjLCAweDExNDkzODJjLFxyXG5cdFx0ICAweGU5NzYyNWE1LCAweDA2MTRkMWI3LCAweDBlMjUyNDRiLCAweDBjNzY4MzQ3LCAweDU4OWU4ZDgyLCAweDBkMjA1OWQxLCAweGE0NjZiYjFlLCAweGY4ZGEwYTgyLFxyXG5cdFx0ICAweDA0ZjE5MTMwLCAweGJhNmU0ZWMwLCAweDk5MjY1MTY0LCAweDFlZTcyMzBkLCAweDUwYjJhZDgwLCAweGVhZWU2ODAxLCAweDhkYjJhMjgzLCAweGVhOGJmNTllKTtcclxuXHJcbn07XHJcblxyXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwnKTtcclxuXHJcbmZ1bmN0aW9uIGNhc3Q1KGtleSkge1xyXG5cdHRoaXMuY2FzdDUgPSBuZXcgb3BlbnBncF9zeW1lbmNfY2FzdDUoKTtcclxuXHR0aGlzLmNhc3Q1LnNldEtleSh1dGlsLnN0cjJiaW4oa2V5KSk7XHJcblxyXG5cdHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uKGJsb2NrKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYXN0NS5lbmNyeXB0KGJsb2NrKTtcclxuXHR9XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gY2FzdDU7XHJcbm1vZHVsZS5leHBvcnRzLmJsb2NrU2l6ZSA9IGNhc3Q1LnByb3RvdHlwZS5ibG9ja1NpemUgPSA4O1xyXG5tb2R1bGUuZXhwb3J0cy5rZXlTaXplID0gY2FzdDUucHJvdG90eXBlLmtleVNpemUgPSAxNjtcclxuIiwiLy9QYXVsIFRlcm8sIEp1bHkgMjAwMVxuLy9odHRwOi8vd3d3LnRlcm8uY28udWsvZGVzL1xuLy9cbi8vT3B0aW1pc2VkIGZvciBwZXJmb3JtYW5jZSB3aXRoIGxhcmdlIGJsb2NrcyBieSBNaWNoYWVsIEhheXdvcnRoLCBOb3ZlbWJlciAyMDAxXG4vL2h0dHA6Ly93d3cubmV0ZGVhbGluZy5jb21cbi8vXG4vLyBNb2RpZmllZCBieSBSZWN1cml0eSBMYWJzIEdtYkhcblxuLy9USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkRcbi8vQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4vL0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4vL0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4vL0ZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4vL0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTXG4vL09SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKVxuLy9IT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVFxuLy9MSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZXG4vL09VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Zcbi8vU1VDSCBEQU1BR0UuXG5cbi8vZGVzXG4vL3RoaXMgdGFrZXMgdGhlIGtleSwgdGhlIG1lc3NhZ2UsIGFuZCB3aGV0aGVyIHRvIGVuY3J5cHQgb3IgZGVjcnlwdFxuXG5cblxuXG5mdW5jdGlvbiBkZXMgKGtleXMsIG1lc3NhZ2UsIGVuY3J5cHQsIG1vZGUsIGl2LCBwYWRkaW5nKSB7XG4gIC8vZGVjbGFyaW5nIHRoaXMgbG9jYWxseSBzcGVlZHMgdGhpbmdzIHVwIGEgYml0XG4gIHZhciBzcGZ1bmN0aW9uMSA9IG5ldyBBcnJheSAoMHgxMDEwNDAwLDAsMHgxMDAwMCwweDEwMTA0MDQsMHgxMDEwMDA0LDB4MTA0MDQsMHg0LDB4MTAwMDAsMHg0MDAsMHgxMDEwNDAwLDB4MTAxMDQwNCwweDQwMCwweDEwMDA0MDQsMHgxMDEwMDA0LDB4MTAwMDAwMCwweDQsMHg0MDQsMHgxMDAwNDAwLDB4MTAwMDQwMCwweDEwNDAwLDB4MTA0MDAsMHgxMDEwMDAwLDB4MTAxMDAwMCwweDEwMDA0MDQsMHgxMDAwNCwweDEwMDAwMDQsMHgxMDAwMDA0LDB4MTAwMDQsMCwweDQwNCwweDEwNDA0LDB4MTAwMDAwMCwweDEwMDAwLDB4MTAxMDQwNCwweDQsMHgxMDEwMDAwLDB4MTAxMDQwMCwweDEwMDAwMDAsMHgxMDAwMDAwLDB4NDAwLDB4MTAxMDAwNCwweDEwMDAwLDB4MTA0MDAsMHgxMDAwMDA0LDB4NDAwLDB4NCwweDEwMDA0MDQsMHgxMDQwNCwweDEwMTA0MDQsMHgxMDAwNCwweDEwMTAwMDAsMHgxMDAwNDA0LDB4MTAwMDAwNCwweDQwNCwweDEwNDA0LDB4MTAxMDQwMCwweDQwNCwweDEwMDA0MDAsMHgxMDAwNDAwLDAsMHgxMDAwNCwweDEwNDAwLDAsMHgxMDEwMDA0KTtcbiAgdmFyIHNwZnVuY3Rpb24yID0gbmV3IEFycmF5ICgtMHg3ZmVmN2ZlMCwtMHg3ZmZmODAwMCwweDgwMDAsMHgxMDgwMjAsMHgxMDAwMDAsMHgyMCwtMHg3ZmVmZmZlMCwtMHg3ZmZmN2ZlMCwtMHg3ZmZmZmZlMCwtMHg3ZmVmN2ZlMCwtMHg3ZmVmODAwMCwtMHg4MDAwMDAwMCwtMHg3ZmZmODAwMCwweDEwMDAwMCwweDIwLC0weDdmZWZmZmUwLDB4MTA4MDAwLDB4MTAwMDIwLC0weDdmZmY3ZmUwLDAsLTB4ODAwMDAwMDAsMHg4MDAwLDB4MTA4MDIwLC0weDdmZjAwMDAwLDB4MTAwMDIwLC0weDdmZmZmZmUwLDAsMHgxMDgwMDAsMHg4MDIwLC0weDdmZWY4MDAwLC0weDdmZjAwMDAwLDB4ODAyMCwwLDB4MTA4MDIwLC0weDdmZWZmZmUwLDB4MTAwMDAwLC0weDdmZmY3ZmUwLC0weDdmZjAwMDAwLC0weDdmZWY4MDAwLDB4ODAwMCwtMHg3ZmYwMDAwMCwtMHg3ZmZmODAwMCwweDIwLC0weDdmZWY3ZmUwLDB4MTA4MDIwLDB4MjAsMHg4MDAwLC0weDgwMDAwMDAwLDB4ODAyMCwtMHg3ZmVmODAwMCwweDEwMDAwMCwtMHg3ZmZmZmZlMCwweDEwMDAyMCwtMHg3ZmZmN2ZlMCwtMHg3ZmZmZmZlMCwweDEwMDAyMCwweDEwODAwMCwwLC0weDdmZmY4MDAwLDB4ODAyMCwtMHg4MDAwMDAwMCwtMHg3ZmVmZmZlMCwtMHg3ZmVmN2ZlMCwweDEwODAwMCk7XG4gIHZhciBzcGZ1bmN0aW9uMyA9IG5ldyBBcnJheSAoMHgyMDgsMHg4MDIwMjAwLDAsMHg4MDIwMDA4LDB4ODAwMDIwMCwwLDB4MjAyMDgsMHg4MDAwMjAwLDB4MjAwMDgsMHg4MDAwMDA4LDB4ODAwMDAwOCwweDIwMDAwLDB4ODAyMDIwOCwweDIwMDA4LDB4ODAyMDAwMCwweDIwOCwweDgwMDAwMDAsMHg4LDB4ODAyMDIwMCwweDIwMCwweDIwMjAwLDB4ODAyMDAwMCwweDgwMjAwMDgsMHgyMDIwOCwweDgwMDAyMDgsMHgyMDIwMCwweDIwMDAwLDB4ODAwMDIwOCwweDgsMHg4MDIwMjA4LDB4MjAwLDB4ODAwMDAwMCwweDgwMjAyMDAsMHg4MDAwMDAwLDB4MjAwMDgsMHgyMDgsMHgyMDAwMCwweDgwMjAyMDAsMHg4MDAwMjAwLDAsMHgyMDAsMHgyMDAwOCwweDgwMjAyMDgsMHg4MDAwMjAwLDB4ODAwMDAwOCwweDIwMCwwLDB4ODAyMDAwOCwweDgwMDAyMDgsMHgyMDAwMCwweDgwMDAwMDAsMHg4MDIwMjA4LDB4OCwweDIwMjA4LDB4MjAyMDAsMHg4MDAwMDA4LDB4ODAyMDAwMCwweDgwMDAyMDgsMHgyMDgsMHg4MDIwMDAwLDB4MjAyMDgsMHg4LDB4ODAyMDAwOCwweDIwMjAwKTtcbiAgdmFyIHNwZnVuY3Rpb240ID0gbmV3IEFycmF5ICgweDgwMjAwMSwweDIwODEsMHgyMDgxLDB4ODAsMHg4MDIwODAsMHg4MDAwODEsMHg4MDAwMDEsMHgyMDAxLDAsMHg4MDIwMDAsMHg4MDIwMDAsMHg4MDIwODEsMHg4MSwwLDB4ODAwMDgwLDB4ODAwMDAxLDB4MSwweDIwMDAsMHg4MDAwMDAsMHg4MDIwMDEsMHg4MCwweDgwMDAwMCwweDIwMDEsMHgyMDgwLDB4ODAwMDgxLDB4MSwweDIwODAsMHg4MDAwODAsMHgyMDAwLDB4ODAyMDgwLDB4ODAyMDgxLDB4ODEsMHg4MDAwODAsMHg4MDAwMDEsMHg4MDIwMDAsMHg4MDIwODEsMHg4MSwwLDAsMHg4MDIwMDAsMHgyMDgwLDB4ODAwMDgwLDB4ODAwMDgxLDB4MSwweDgwMjAwMSwweDIwODEsMHgyMDgxLDB4ODAsMHg4MDIwODEsMHg4MSwweDEsMHgyMDAwLDB4ODAwMDAxLDB4MjAwMSwweDgwMjA4MCwweDgwMDA4MSwweDIwMDEsMHgyMDgwLDB4ODAwMDAwLDB4ODAyMDAxLDB4ODAsMHg4MDAwMDAsMHgyMDAwLDB4ODAyMDgwKTtcbiAgdmFyIHNwZnVuY3Rpb241ID0gbmV3IEFycmF5ICgweDEwMCwweDIwODAxMDAsMHgyMDgwMDAwLDB4NDIwMDAxMDAsMHg4MDAwMCwweDEwMCwweDQwMDAwMDAwLDB4MjA4MDAwMCwweDQwMDgwMTAwLDB4ODAwMDAsMHgyMDAwMTAwLDB4NDAwODAxMDAsMHg0MjAwMDEwMCwweDQyMDgwMDAwLDB4ODAxMDAsMHg0MDAwMDAwMCwweDIwMDAwMDAsMHg0MDA4MDAwMCwweDQwMDgwMDAwLDAsMHg0MDAwMDEwMCwweDQyMDgwMTAwLDB4NDIwODAxMDAsMHgyMDAwMTAwLDB4NDIwODAwMDAsMHg0MDAwMDEwMCwwLDB4NDIwMDAwMDAsMHgyMDgwMTAwLDB4MjAwMDAwMCwweDQyMDAwMDAwLDB4ODAxMDAsMHg4MDAwMCwweDQyMDAwMTAwLDB4MTAwLDB4MjAwMDAwMCwweDQwMDAwMDAwLDB4MjA4MDAwMCwweDQyMDAwMTAwLDB4NDAwODAxMDAsMHgyMDAwMTAwLDB4NDAwMDAwMDAsMHg0MjA4MDAwMCwweDIwODAxMDAsMHg0MDA4MDEwMCwweDEwMCwweDIwMDAwMDAsMHg0MjA4MDAwMCwweDQyMDgwMTAwLDB4ODAxMDAsMHg0MjAwMDAwMCwweDQyMDgwMTAwLDB4MjA4MDAwMCwwLDB4NDAwODAwMDAsMHg0MjAwMDAwMCwweDgwMTAwLDB4MjAwMDEwMCwweDQwMDAwMTAwLDB4ODAwMDAsMCwweDQwMDgwMDAwLDB4MjA4MDEwMCwweDQwMDAwMTAwKTtcbiAgdmFyIHNwZnVuY3Rpb242ID0gbmV3IEFycmF5ICgweDIwMDAwMDEwLDB4MjA0MDAwMDAsMHg0MDAwLDB4MjA0MDQwMTAsMHgyMDQwMDAwMCwweDEwLDB4MjA0MDQwMTAsMHg0MDAwMDAsMHgyMDAwNDAwMCwweDQwNDAxMCwweDQwMDAwMCwweDIwMDAwMDEwLDB4NDAwMDEwLDB4MjAwMDQwMDAsMHgyMDAwMDAwMCwweDQwMTAsMCwweDQwMDAxMCwweDIwMDA0MDEwLDB4NDAwMCwweDQwNDAwMCwweDIwMDA0MDEwLDB4MTAsMHgyMDQwMDAxMCwweDIwNDAwMDEwLDAsMHg0MDQwMTAsMHgyMDQwNDAwMCwweDQwMTAsMHg0MDQwMDAsMHgyMDQwNDAwMCwweDIwMDAwMDAwLDB4MjAwMDQwMDAsMHgxMCwweDIwNDAwMDEwLDB4NDA0MDAwLDB4MjA0MDQwMTAsMHg0MDAwMDAsMHg0MDEwLDB4MjAwMDAwMTAsMHg0MDAwMDAsMHgyMDAwNDAwMCwweDIwMDAwMDAwLDB4NDAxMCwweDIwMDAwMDEwLDB4MjA0MDQwMTAsMHg0MDQwMDAsMHgyMDQwMDAwMCwweDQwNDAxMCwweDIwNDA0MDAwLDAsMHgyMDQwMDAxMCwweDEwLDB4NDAwMCwweDIwNDAwMDAwLDB4NDA0MDEwLDB4NDAwMCwweDQwMDAxMCwweDIwMDA0MDEwLDAsMHgyMDQwNDAwMCwweDIwMDAwMDAwLDB4NDAwMDEwLDB4MjAwMDQwMTApO1xuICB2YXIgc3BmdW5jdGlvbjcgPSBuZXcgQXJyYXkgKDB4MjAwMDAwLDB4NDIwMDAwMiwweDQwMDA4MDIsMCwweDgwMCwweDQwMDA4MDIsMHgyMDA4MDIsMHg0MjAwODAwLDB4NDIwMDgwMiwweDIwMDAwMCwwLDB4NDAwMDAwMiwweDIsMHg0MDAwMDAwLDB4NDIwMDAwMiwweDgwMiwweDQwMDA4MDAsMHgyMDA4MDIsMHgyMDAwMDIsMHg0MDAwODAwLDB4NDAwMDAwMiwweDQyMDAwMDAsMHg0MjAwODAwLDB4MjAwMDAyLDB4NDIwMDAwMCwweDgwMCwweDgwMiwweDQyMDA4MDIsMHgyMDA4MDAsMHgyLDB4NDAwMDAwMCwweDIwMDgwMCwweDQwMDAwMDAsMHgyMDA4MDAsMHgyMDAwMDAsMHg0MDAwODAyLDB4NDAwMDgwMiwweDQyMDAwMDIsMHg0MjAwMDAyLDB4MiwweDIwMDAwMiwweDQwMDAwMDAsMHg0MDAwODAwLDB4MjAwMDAwLDB4NDIwMDgwMCwweDgwMiwweDIwMDgwMiwweDQyMDA4MDAsMHg4MDIsMHg0MDAwMDAyLDB4NDIwMDgwMiwweDQyMDAwMDAsMHgyMDA4MDAsMCwweDIsMHg0MjAwODAyLDAsMHgyMDA4MDIsMHg0MjAwMDAwLDB4ODAwLDB4NDAwMDAwMiwweDQwMDA4MDAsMHg4MDAsMHgyMDAwMDIpO1xuICB2YXIgc3BmdW5jdGlvbjggPSBuZXcgQXJyYXkgKDB4MTAwMDEwNDAsMHgxMDAwLDB4NDAwMDAsMHgxMDA0MTA0MCwweDEwMDAwMDAwLDB4MTAwMDEwNDAsMHg0MCwweDEwMDAwMDAwLDB4NDAwNDAsMHgxMDA0MDAwMCwweDEwMDQxMDQwLDB4NDEwMDAsMHgxMDA0MTAwMCwweDQxMDQwLDB4MTAwMCwweDQwLDB4MTAwNDAwMDAsMHgxMDAwMDA0MCwweDEwMDAxMDAwLDB4MTA0MCwweDQxMDAwLDB4NDAwNDAsMHgxMDA0MDA0MCwweDEwMDQxMDAwLDB4MTA0MCwwLDAsMHgxMDA0MDA0MCwweDEwMDAwMDQwLDB4MTAwMDEwMDAsMHg0MTA0MCwweDQwMDAwLDB4NDEwNDAsMHg0MDAwMCwweDEwMDQxMDAwLDB4MTAwMCwweDQwLDB4MTAwNDAwNDAsMHgxMDAwLDB4NDEwNDAsMHgxMDAwMTAwMCwweDQwLDB4MTAwMDAwNDAsMHgxMDA0MDAwMCwweDEwMDQwMDQwLDB4MTAwMDAwMDAsMHg0MDAwMCwweDEwMDAxMDQwLDAsMHgxMDA0MTA0MCwweDQwMDQwLDB4MTAwMDAwNDAsMHgxMDA0MDAwMCwweDEwMDAxMDAwLDB4MTAwMDEwNDAsMCwweDEwMDQxMDQwLDB4NDEwMDAsMHg0MTAwMCwweDEwNDAsMHgxMDQwLDB4NDAwNDAsMHgxMDAwMDAwMCwweDEwMDQxMDAwKTtcblxuICAvL2NyZWF0ZSB0aGUgMTYgb3IgNDggc3Via2V5cyB3ZSB3aWxsIG5lZWRcbiAgdmFyIG09MCwgaSwgaiwgdGVtcCwgdGVtcDIsIHJpZ2h0MSwgcmlnaHQyLCBsZWZ0LCByaWdodCwgbG9vcGluZztcbiAgdmFyIGNiY2xlZnQsIGNiY2xlZnQyLCBjYmNyaWdodCwgY2JjcmlnaHQyXG4gIHZhciBlbmRsb29wLCBsb29waW5jO1xuICB2YXIgbGVuID0gbWVzc2FnZS5sZW5ndGg7XG4gIHZhciBjaHVuayA9IDA7XG4gIC8vc2V0IHVwIHRoZSBsb29wcyBmb3Igc2luZ2xlIGFuZCB0cmlwbGUgZGVzXG4gIHZhciBpdGVyYXRpb25zID0ga2V5cy5sZW5ndGggPT0gMzIgPyAzIDogOTsgLy9zaW5nbGUgb3IgdHJpcGxlIGRlc1xuICBpZiAoaXRlcmF0aW9ucyA9PSAzKSB7bG9vcGluZyA9IGVuY3J5cHQgPyBuZXcgQXJyYXkgKDAsIDMyLCAyKSA6IG5ldyBBcnJheSAoMzAsIC0yLCAtMik7fVxuICBlbHNlIHtsb29waW5nID0gZW5jcnlwdCA/IG5ldyBBcnJheSAoMCwgMzIsIDIsIDYyLCAzMCwgLTIsIDY0LCA5NiwgMikgOiBuZXcgQXJyYXkgKDk0LCA2MiwgLTIsIDMyLCA2NCwgMiwgMzAsIC0yLCAtMik7fVxuXG4gIC8vcGFkIHRoZSBtZXNzYWdlIGRlcGVuZGluZyBvbiB0aGUgcGFkZGluZyBwYXJhbWV0ZXJcbiAgLy9vbmx5IGFkZCBwYWRkaW5nIGlmIGVuY3J5cHRpbmcgLSBub3RlIHRoYXQgeW91IG5lZWQgdG8gdXNlIHRoZSBzYW1lIHBhZGRpbmcgb3B0aW9uIGZvciBib3RoIGVuY3J5cHQgYW5kIGRlY3J5cHRcclxuICBpZiAoZW5jcnlwdCkge1xyXG4gICAgbWVzc2FnZSA9IGRlc19hZGRQYWRkaW5nKG1lc3NhZ2UsIHBhZGRpbmcpO1xyXG4gICAgbGVuID0gbWVzc2FnZS5sZW5ndGg7XHJcbiAgfVxyXG5cbiAgLy9zdG9yZSB0aGUgcmVzdWx0IGhlcmVcbiAgcmVzdWx0ID0gXCJcIjtcbiAgdGVtcHJlc3VsdCA9IFwiXCI7XG5cbiAgaWYgKG1vZGUgPT0gMSkgeyAvL0NCQyBtb2RlXG4gICAgY2JjbGVmdCA9IChpdi5jaGFyQ29kZUF0KG0rKykgPDwgMjQpIHwgKGl2LmNoYXJDb2RlQXQobSsrKSA8PCAxNikgfCAoaXYuY2hhckNvZGVBdChtKyspIDw8IDgpIHwgaXYuY2hhckNvZGVBdChtKyspO1xuICAgIGNiY3JpZ2h0ID0gKGl2LmNoYXJDb2RlQXQobSsrKSA8PCAyNCkgfCAoaXYuY2hhckNvZGVBdChtKyspIDw8IDE2KSB8IChpdi5jaGFyQ29kZUF0KG0rKykgPDwgOCkgfCBpdi5jaGFyQ29kZUF0KG0rKyk7XG4gICAgbT0wO1xuICB9XG5cbiAgLy9sb29wIHRocm91Z2ggZWFjaCA2NCBiaXQgY2h1bmsgb2YgdGhlIG1lc3NhZ2VcbiAgd2hpbGUgKG0gPCBsZW4pIHtcbiAgICBsZWZ0ID0gKG1lc3NhZ2UuY2hhckNvZGVBdChtKyspIDw8IDI0KSB8IChtZXNzYWdlLmNoYXJDb2RlQXQobSsrKSA8PCAxNikgfCAobWVzc2FnZS5jaGFyQ29kZUF0KG0rKykgPDwgOCkgfCBtZXNzYWdlLmNoYXJDb2RlQXQobSsrKTtcbiAgICByaWdodCA9IChtZXNzYWdlLmNoYXJDb2RlQXQobSsrKSA8PCAyNCkgfCAobWVzc2FnZS5jaGFyQ29kZUF0KG0rKykgPDwgMTYpIHwgKG1lc3NhZ2UuY2hhckNvZGVBdChtKyspIDw8IDgpIHwgbWVzc2FnZS5jaGFyQ29kZUF0KG0rKyk7XG5cbiAgICAvL2ZvciBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZSwgeG9yIHRoZSBtZXNzYWdlIHdpdGggdGhlIHByZXZpb3VzIHJlc3VsdFxuICAgIGlmIChtb2RlID09IDEpIHtpZiAoZW5jcnlwdCkge2xlZnQgXj0gY2JjbGVmdDsgcmlnaHQgXj0gY2JjcmlnaHQ7fSBlbHNlIHtjYmNsZWZ0MiA9IGNiY2xlZnQ7IGNiY3JpZ2h0MiA9IGNiY3JpZ2h0OyBjYmNsZWZ0ID0gbGVmdDsgY2JjcmlnaHQgPSByaWdodDt9fVxuXG4gICAgLy9maXJzdCBlYWNoIDY0IGJ1dCBjaHVuayBvZiB0aGUgbWVzc2FnZSBtdXN0IGJlIHBlcm11dGVkIGFjY29yZGluZyB0byBJUFxuICAgIHRlbXAgPSAoKGxlZnQgPj4+IDQpIF4gcmlnaHQpICYgMHgwZjBmMGYwZjsgcmlnaHQgXj0gdGVtcDsgbGVmdCBePSAodGVtcCA8PCA0KTtcbiAgICB0ZW1wID0gKChsZWZ0ID4+PiAxNikgXiByaWdodCkgJiAweDAwMDBmZmZmOyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDE2KTtcbiAgICB0ZW1wID0gKChyaWdodCA+Pj4gMikgXiBsZWZ0KSAmIDB4MzMzMzMzMzM7IGxlZnQgXj0gdGVtcDsgcmlnaHQgXj0gKHRlbXAgPDwgMik7XG4gICAgdGVtcCA9ICgocmlnaHQgPj4+IDgpIF4gbGVmdCkgJiAweDAwZmYwMGZmOyBsZWZ0IF49IHRlbXA7IHJpZ2h0IF49ICh0ZW1wIDw8IDgpO1xuICAgIHRlbXAgPSAoKGxlZnQgPj4+IDEpIF4gcmlnaHQpICYgMHg1NTU1NTU1NTsgcmlnaHQgXj0gdGVtcDsgbGVmdCBePSAodGVtcCA8PCAxKTtcblxuICAgIGxlZnQgPSAoKGxlZnQgPDwgMSkgfCAobGVmdCA+Pj4gMzEpKTsgXG4gICAgcmlnaHQgPSAoKHJpZ2h0IDw8IDEpIHwgKHJpZ2h0ID4+PiAzMSkpOyBcblxuICAgIC8vZG8gdGhpcyBlaXRoZXIgMSBvciAzIHRpbWVzIGZvciBlYWNoIGNodW5rIG9mIHRoZSBtZXNzYWdlXG4gICAgZm9yIChqPTA7IGo8aXRlcmF0aW9uczsgais9Mykge1xuICAgICAgZW5kbG9vcCA9IGxvb3BpbmdbaisxXTtcbiAgICAgIGxvb3BpbmMgPSBsb29waW5nW2orMl07XG4gICAgICAvL25vdyBnbyB0aHJvdWdoIGFuZCBwZXJmb3JtIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gIFxuICAgICAgZm9yIChpPWxvb3Bpbmdbal07IGkhPWVuZGxvb3A7IGkrPWxvb3BpbmMpIHsgLy9mb3IgZWZmaWNpZW5jeVxuICAgICAgICByaWdodDEgPSByaWdodCBeIGtleXNbaV07IFxuICAgICAgICByaWdodDIgPSAoKHJpZ2h0ID4+PiA0KSB8IChyaWdodCA8PCAyOCkpIF4ga2V5c1tpKzFdO1xuICAgICAgICAvL3RoZSByZXN1bHQgaXMgYXR0YWluZWQgYnkgcGFzc2luZyB0aGVzZSBieXRlcyB0aHJvdWdoIHRoZSBTIHNlbGVjdGlvbiBmdW5jdGlvbnNcbiAgICAgICAgdGVtcCA9IGxlZnQ7XG4gICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgcmlnaHQgPSB0ZW1wIF4gKHNwZnVuY3Rpb24yWyhyaWdodDEgPj4+IDI0KSAmIDB4M2ZdIHwgc3BmdW5jdGlvbjRbKHJpZ2h0MSA+Pj4gMTYpICYgMHgzZl1cbiAgICAgICAgICAgICAgfCBzcGZ1bmN0aW9uNlsocmlnaHQxID4+PiAgOCkgJiAweDNmXSB8IHNwZnVuY3Rpb244W3JpZ2h0MSAmIDB4M2ZdXG4gICAgICAgICAgICAgIHwgc3BmdW5jdGlvbjFbKHJpZ2h0MiA+Pj4gMjQpICYgMHgzZl0gfCBzcGZ1bmN0aW9uM1socmlnaHQyID4+PiAxNikgJiAweDNmXVxuICAgICAgICAgICAgICB8IHNwZnVuY3Rpb241WyhyaWdodDIgPj4+ICA4KSAmIDB4M2ZdIHwgc3BmdW5jdGlvbjdbcmlnaHQyICYgMHgzZl0pO1xuICAgICAgfVxuICAgICAgdGVtcCA9IGxlZnQ7IGxlZnQgPSByaWdodDsgcmlnaHQgPSB0ZW1wOyAvL3VucmV2ZXJzZSBsZWZ0IGFuZCByaWdodFxuICAgIH0gLy9mb3IgZWl0aGVyIDEgb3IgMyBpdGVyYXRpb25zXG5cbiAgICAvL21vdmUgdGhlbiBlYWNoIG9uZSBiaXQgdG8gdGhlIHJpZ2h0XG4gICAgbGVmdCA9ICgobGVmdCA+Pj4gMSkgfCAobGVmdCA8PCAzMSkpOyBcbiAgICByaWdodCA9ICgocmlnaHQgPj4+IDEpIHwgKHJpZ2h0IDw8IDMxKSk7IFxuXG4gICAgLy9ub3cgcGVyZm9ybSBJUC0xLCB3aGljaCBpcyBJUCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uXG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gMSkgXiByaWdodCkgJiAweDU1NTU1NTU1OyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDEpO1xuICAgIHRlbXAgPSAoKHJpZ2h0ID4+PiA4KSBeIGxlZnQpICYgMHgwMGZmMDBmZjsgbGVmdCBePSB0ZW1wOyByaWdodCBePSAodGVtcCA8PCA4KTtcbiAgICB0ZW1wID0gKChyaWdodCA+Pj4gMikgXiBsZWZ0KSAmIDB4MzMzMzMzMzM7IGxlZnQgXj0gdGVtcDsgcmlnaHQgXj0gKHRlbXAgPDwgMik7XG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gMTYpIF4gcmlnaHQpICYgMHgwMDAwZmZmZjsgcmlnaHQgXj0gdGVtcDsgbGVmdCBePSAodGVtcCA8PCAxNik7XG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gNCkgXiByaWdodCkgJiAweDBmMGYwZjBmOyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDQpO1xuXG4gICAgLy9mb3IgQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUsIHhvciB0aGUgbWVzc2FnZSB3aXRoIHRoZSBwcmV2aW91cyByZXN1bHRcbiAgICBpZiAobW9kZSA9PSAxKSB7aWYgKGVuY3J5cHQpIHtjYmNsZWZ0ID0gbGVmdDsgY2JjcmlnaHQgPSByaWdodDt9IGVsc2Uge2xlZnQgXj0gY2JjbGVmdDI7IHJpZ2h0IF49IGNiY3JpZ2h0Mjt9fVxuICAgIHRlbXByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSAoKGxlZnQ+Pj4yNCksICgobGVmdD4+PjE2KSAmIDB4ZmYpLCAoKGxlZnQ+Pj44KSAmIDB4ZmYpLCAobGVmdCAmIDB4ZmYpLCAocmlnaHQ+Pj4yNCksICgocmlnaHQ+Pj4xNikgJiAweGZmKSwgKChyaWdodD4+PjgpICYgMHhmZiksIChyaWdodCAmIDB4ZmYpKTtcblxuICAgIGNodW5rICs9IDg7XG4gICAgaWYgKGNodW5rID09IDUxMikge3Jlc3VsdCArPSB0ZW1wcmVzdWx0OyB0ZW1wcmVzdWx0ID0gXCJcIjsgY2h1bmsgPSAwO31cbiAgfSAvL2ZvciBldmVyeSA4IGNoYXJhY3RlcnMsIG9yIDY0IGJpdHMgaW4gdGhlIG1lc3NhZ2VcblxuICAvL3JldHVybiB0aGUgcmVzdWx0IGFzIGFuIGFycmF5XG4gIHJlc3VsdCArPSB0ZW1wcmVzdWx0O1xuICAgIFxyXG4gIC8vb25seSByZW1vdmUgcGFkZGluZyBpZiBkZWNyeXB0aW5nIC0gbm90ZSB0aGF0IHlvdSBuZWVkIHRvIHVzZSB0aGUgc2FtZSBwYWRkaW5nIG9wdGlvbiBmb3IgYm90aCBlbmNyeXB0IGFuZCBkZWNyeXB0XHJcbiAgaWYgKCFlbmNyeXB0KSB7XHJcbiAgICByZXN1bHQgPSBkZXNfcmVtb3ZlUGFkZGluZyhyZXN1bHQsIHBhZGRpbmcpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcbn0gLy9lbmQgb2YgZGVzXG5cblxuXG4vL2Rlc19jcmVhdGVLZXlzXG4vL3RoaXMgdGFrZXMgYXMgaW5wdXQgYSA2NCBiaXQga2V5IChldmVuIHRob3VnaCBvbmx5IDU2IGJpdHMgYXJlIHVzZWQpXG4vL2FzIGFuIGFycmF5IG9mIDIgaW50ZWdlcnMsIGFuZCByZXR1cm5zIDE2IDQ4IGJpdCBrZXlzXG5mdW5jdGlvbiBkZXNfY3JlYXRlS2V5cyAoa2V5KSB7XG4gIC8vZGVjbGFyaW5nIHRoaXMgbG9jYWxseSBzcGVlZHMgdGhpbmdzIHVwIGEgYml0XG4gIHBjMmJ5dGVzMCAgPSBuZXcgQXJyYXkgKDAsMHg0LDB4MjAwMDAwMDAsMHgyMDAwMDAwNCwweDEwMDAwLDB4MTAwMDQsMHgyMDAxMDAwMCwweDIwMDEwMDA0LDB4MjAwLDB4MjA0LDB4MjAwMDAyMDAsMHgyMDAwMDIwNCwweDEwMjAwLDB4MTAyMDQsMHgyMDAxMDIwMCwweDIwMDEwMjA0KTtcbiAgcGMyYnl0ZXMxICA9IG5ldyBBcnJheSAoMCwweDEsMHgxMDAwMDAsMHgxMDAwMDEsMHg0MDAwMDAwLDB4NDAwMDAwMSwweDQxMDAwMDAsMHg0MTAwMDAxLDB4MTAwLDB4MTAxLDB4MTAwMTAwLDB4MTAwMTAxLDB4NDAwMDEwMCwweDQwMDAxMDEsMHg0MTAwMTAwLDB4NDEwMDEwMSk7XG4gIHBjMmJ5dGVzMiAgPSBuZXcgQXJyYXkgKDAsMHg4LDB4ODAwLDB4ODA4LDB4MTAwMDAwMCwweDEwMDAwMDgsMHgxMDAwODAwLDB4MTAwMDgwOCwwLDB4OCwweDgwMCwweDgwOCwweDEwMDAwMDAsMHgxMDAwMDA4LDB4MTAwMDgwMCwweDEwMDA4MDgpO1xuICBwYzJieXRlczMgID0gbmV3IEFycmF5ICgwLDB4MjAwMDAwLDB4ODAwMDAwMCwweDgyMDAwMDAsMHgyMDAwLDB4MjAyMDAwLDB4ODAwMjAwMCwweDgyMDIwMDAsMHgyMDAwMCwweDIyMDAwMCwweDgwMjAwMDAsMHg4MjIwMDAwLDB4MjIwMDAsMHgyMjIwMDAsMHg4MDIyMDAwLDB4ODIyMjAwMCk7XG4gIHBjMmJ5dGVzNCAgPSBuZXcgQXJyYXkgKDAsMHg0MDAwMCwweDEwLDB4NDAwMTAsMCwweDQwMDAwLDB4MTAsMHg0MDAxMCwweDEwMDAsMHg0MTAwMCwweDEwMTAsMHg0MTAxMCwweDEwMDAsMHg0MTAwMCwweDEwMTAsMHg0MTAxMCk7XG4gIHBjMmJ5dGVzNSAgPSBuZXcgQXJyYXkgKDAsMHg0MDAsMHgyMCwweDQyMCwwLDB4NDAwLDB4MjAsMHg0MjAsMHgyMDAwMDAwLDB4MjAwMDQwMCwweDIwMDAwMjAsMHgyMDAwNDIwLDB4MjAwMDAwMCwweDIwMDA0MDAsMHgyMDAwMDIwLDB4MjAwMDQyMCk7XG4gIHBjMmJ5dGVzNiAgPSBuZXcgQXJyYXkgKDAsMHgxMDAwMDAwMCwweDgwMDAwLDB4MTAwODAwMDAsMHgyLDB4MTAwMDAwMDIsMHg4MDAwMiwweDEwMDgwMDAyLDAsMHgxMDAwMDAwMCwweDgwMDAwLDB4MTAwODAwMDAsMHgyLDB4MTAwMDAwMDIsMHg4MDAwMiwweDEwMDgwMDAyKTtcbiAgcGMyYnl0ZXM3ICA9IG5ldyBBcnJheSAoMCwweDEwMDAwLDB4ODAwLDB4MTA4MDAsMHgyMDAwMDAwMCwweDIwMDEwMDAwLDB4MjAwMDA4MDAsMHgyMDAxMDgwMCwweDIwMDAwLDB4MzAwMDAsMHgyMDgwMCwweDMwODAwLDB4MjAwMjAwMDAsMHgyMDAzMDAwMCwweDIwMDIwODAwLDB4MjAwMzA4MDApO1xuICBwYzJieXRlczggID0gbmV3IEFycmF5ICgwLDB4NDAwMDAsMCwweDQwMDAwLDB4MiwweDQwMDAyLDB4MiwweDQwMDAyLDB4MjAwMDAwMCwweDIwNDAwMDAsMHgyMDAwMDAwLDB4MjA0MDAwMCwweDIwMDAwMDIsMHgyMDQwMDAyLDB4MjAwMDAwMiwweDIwNDAwMDIpO1xuICBwYzJieXRlczkgID0gbmV3IEFycmF5ICgwLDB4MTAwMDAwMDAsMHg4LDB4MTAwMDAwMDgsMCwweDEwMDAwMDAwLDB4OCwweDEwMDAwMDA4LDB4NDAwLDB4MTAwMDA0MDAsMHg0MDgsMHgxMDAwMDQwOCwweDQwMCwweDEwMDAwNDAwLDB4NDA4LDB4MTAwMDA0MDgpO1xuICBwYzJieXRlczEwID0gbmV3IEFycmF5ICgwLDB4MjAsMCwweDIwLDB4MTAwMDAwLDB4MTAwMDIwLDB4MTAwMDAwLDB4MTAwMDIwLDB4MjAwMCwweDIwMjAsMHgyMDAwLDB4MjAyMCwweDEwMjAwMCwweDEwMjAyMCwweDEwMjAwMCwweDEwMjAyMCk7XG4gIHBjMmJ5dGVzMTEgPSBuZXcgQXJyYXkgKDAsMHgxMDAwMDAwLDB4MjAwLDB4MTAwMDIwMCwweDIwMDAwMCwweDEyMDAwMDAsMHgyMDAyMDAsMHgxMjAwMjAwLDB4NDAwMDAwMCwweDUwMDAwMDAsMHg0MDAwMjAwLDB4NTAwMDIwMCwweDQyMDAwMDAsMHg1MjAwMDAwLDB4NDIwMDIwMCwweDUyMDAyMDApO1xuICBwYzJieXRlczEyID0gbmV3IEFycmF5ICgwLDB4MTAwMCwweDgwMDAwMDAsMHg4MDAxMDAwLDB4ODAwMDAsMHg4MTAwMCwweDgwODAwMDAsMHg4MDgxMDAwLDB4MTAsMHgxMDEwLDB4ODAwMDAxMCwweDgwMDEwMTAsMHg4MDAxMCwweDgxMDEwLDB4ODA4MDAxMCwweDgwODEwMTApO1xuICBwYzJieXRlczEzID0gbmV3IEFycmF5ICgwLDB4NCwweDEwMCwweDEwNCwwLDB4NCwweDEwMCwweDEwNCwweDEsMHg1LDB4MTAxLDB4MTA1LDB4MSwweDUsMHgxMDEsMHgxMDUpO1xuXG4gIC8vaG93IG1hbnkgaXRlcmF0aW9ucyAoMSBmb3IgZGVzLCAzIGZvciB0cmlwbGUgZGVzKVxuICB2YXIgaXRlcmF0aW9ucyA9IGtleS5sZW5ndGggPiA4ID8gMyA6IDE7IC8vY2hhbmdlZCBieSBQYXVsIDE2LzYvMjAwNyB0byB1c2UgVHJpcGxlIERFUyBmb3IgOSsgYnl0ZSBrZXlzXG4gIC8vc3RvcmVzIHRoZSByZXR1cm4ga2V5c1xuICB2YXIga2V5cyA9IG5ldyBBcnJheSAoMzIgKiBpdGVyYXRpb25zKTtcbiAgLy9ub3cgZGVmaW5lIHRoZSBsZWZ0IHNoaWZ0cyB3aGljaCBuZWVkIHRvIGJlIGRvbmVcbiAgdmFyIHNoaWZ0cyA9IG5ldyBBcnJheSAoMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCk7XG4gIC8vb3RoZXIgdmFyaWFibGVzXG4gIHZhciBsZWZ0dGVtcCwgcmlnaHR0ZW1wLCBtPTAsIG49MCwgdGVtcDtcblxuICBmb3IgKHZhciBqPTA7IGo8aXRlcmF0aW9uczsgaisrKSB7IC8vZWl0aGVyIDEgb3IgMyBpdGVyYXRpb25zXG4gICAgbGVmdCA9IChrZXkuY2hhckNvZGVBdChtKyspIDw8IDI0KSB8IChrZXkuY2hhckNvZGVBdChtKyspIDw8IDE2KSB8IChrZXkuY2hhckNvZGVBdChtKyspIDw8IDgpIHwga2V5LmNoYXJDb2RlQXQobSsrKTtcbiAgICByaWdodCA9IChrZXkuY2hhckNvZGVBdChtKyspIDw8IDI0KSB8IChrZXkuY2hhckNvZGVBdChtKyspIDw8IDE2KSB8IChrZXkuY2hhckNvZGVBdChtKyspIDw8IDgpIHwga2V5LmNoYXJDb2RlQXQobSsrKTtcblxuICAgIHRlbXAgPSAoKGxlZnQgPj4+IDQpIF4gcmlnaHQpICYgMHgwZjBmMGYwZjsgcmlnaHQgXj0gdGVtcDsgbGVmdCBePSAodGVtcCA8PCA0KTtcbiAgICB0ZW1wID0gKChyaWdodCA+Pj4gLTE2KSBeIGxlZnQpICYgMHgwMDAwZmZmZjsgbGVmdCBePSB0ZW1wOyByaWdodCBePSAodGVtcCA8PCAtMTYpO1xuICAgIHRlbXAgPSAoKGxlZnQgPj4+IDIpIF4gcmlnaHQpICYgMHgzMzMzMzMzMzsgcmlnaHQgXj0gdGVtcDsgbGVmdCBePSAodGVtcCA8PCAyKTtcbiAgICB0ZW1wID0gKChyaWdodCA+Pj4gLTE2KSBeIGxlZnQpICYgMHgwMDAwZmZmZjsgbGVmdCBePSB0ZW1wOyByaWdodCBePSAodGVtcCA8PCAtMTYpO1xuICAgIHRlbXAgPSAoKGxlZnQgPj4+IDEpIF4gcmlnaHQpICYgMHg1NTU1NTU1NTsgcmlnaHQgXj0gdGVtcDsgbGVmdCBePSAodGVtcCA8PCAxKTtcbiAgICB0ZW1wID0gKChyaWdodCA+Pj4gOCkgXiBsZWZ0KSAmIDB4MDBmZjAwZmY7IGxlZnQgXj0gdGVtcDsgcmlnaHQgXj0gKHRlbXAgPDwgOCk7XG4gICAgdGVtcCA9ICgobGVmdCA+Pj4gMSkgXiByaWdodCkgJiAweDU1NTU1NTU1OyByaWdodCBePSB0ZW1wOyBsZWZ0IF49ICh0ZW1wIDw8IDEpO1xuXG4gICAgLy90aGUgcmlnaHQgc2lkZSBuZWVkcyB0byBiZSBzaGlmdGVkIGFuZCB0byBnZXQgdGhlIGxhc3QgZm91ciBiaXRzIG9mIHRoZSBsZWZ0IHNpZGVcbiAgICB0ZW1wID0gKGxlZnQgPDwgOCkgfCAoKHJpZ2h0ID4+PiAyMCkgJiAweDAwMDAwMGYwKTtcbiAgICAvL2xlZnQgbmVlZHMgdG8gYmUgcHV0IHVwc2lkZSBkb3duXG4gICAgbGVmdCA9IChyaWdodCA8PCAyNCkgfCAoKHJpZ2h0IDw8IDgpICYgMHhmZjAwMDApIHwgKChyaWdodCA+Pj4gOCkgJiAweGZmMDApIHwgKChyaWdodCA+Pj4gMjQpICYgMHhmMCk7XG4gICAgcmlnaHQgPSB0ZW1wO1xuXG4gICAgLy9ub3cgZ28gdGhyb3VnaCBhbmQgcGVyZm9ybSB0aGVzZSBzaGlmdHMgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IGtleXNcbiAgICBmb3IgKGk9MDsgaSA8IHNoaWZ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgLy9zaGlmdCB0aGUga2V5cyBlaXRoZXIgb25lIG9yIHR3byBiaXRzIHRvIHRoZSBsZWZ0XG4gICAgICBpZiAoc2hpZnRzW2ldKSB7bGVmdCA9IChsZWZ0IDw8IDIpIHwgKGxlZnQgPj4+IDI2KTsgcmlnaHQgPSAocmlnaHQgPDwgMikgfCAocmlnaHQgPj4+IDI2KTt9XG4gICAgICBlbHNlIHtsZWZ0ID0gKGxlZnQgPDwgMSkgfCAobGVmdCA+Pj4gMjcpOyByaWdodCA9IChyaWdodCA8PCAxKSB8IChyaWdodCA+Pj4gMjcpO31cbiAgICAgIGxlZnQgJj0gLTB4ZjsgcmlnaHQgJj0gLTB4ZjtcblxuICAgICAgLy9ub3cgYXBwbHkgUEMtMiwgaW4gc3VjaCBhIHdheSB0aGF0IEUgaXMgZWFzaWVyIHdoZW4gZW5jcnlwdGluZyBvciBkZWNyeXB0aW5nXG4gICAgICAvL3RoaXMgY29udmVyc2lvbiB3aWxsIGxvb2sgbGlrZSBQQy0yIGV4Y2VwdCBvbmx5IHRoZSBsYXN0IDYgYml0cyBvZiBlYWNoIGJ5dGUgYXJlIHVzZWRcbiAgICAgIC8vcmF0aGVyIHRoYW4gNDggY29uc2VjdXRpdmUgYml0cyBhbmQgdGhlIG9yZGVyIG9mIGxpbmVzIHdpbGwgYmUgYWNjb3JkaW5nIHRvIFxuICAgICAgLy9ob3cgdGhlIFMgc2VsZWN0aW9uIGZ1bmN0aW9ucyB3aWxsIGJlIGFwcGxpZWQ6IFMyLCBTNCwgUzYsIFM4LCBTMSwgUzMsIFM1LCBTN1xuICAgICAgbGVmdHRlbXAgPSBwYzJieXRlczBbbGVmdCA+Pj4gMjhdIHwgcGMyYnl0ZXMxWyhsZWZ0ID4+PiAyNCkgJiAweGZdXG4gICAgICAgICAgICAgIHwgcGMyYnl0ZXMyWyhsZWZ0ID4+PiAyMCkgJiAweGZdIHwgcGMyYnl0ZXMzWyhsZWZ0ID4+PiAxNikgJiAweGZdXG4gICAgICAgICAgICAgIHwgcGMyYnl0ZXM0WyhsZWZ0ID4+PiAxMikgJiAweGZdIHwgcGMyYnl0ZXM1WyhsZWZ0ID4+PiA4KSAmIDB4Zl1cbiAgICAgICAgICAgICAgfCBwYzJieXRlczZbKGxlZnQgPj4+IDQpICYgMHhmXTtcbiAgICAgIHJpZ2h0dGVtcCA9IHBjMmJ5dGVzN1tyaWdodCA+Pj4gMjhdIHwgcGMyYnl0ZXM4WyhyaWdodCA+Pj4gMjQpICYgMHhmXVxuICAgICAgICAgICAgICAgIHwgcGMyYnl0ZXM5WyhyaWdodCA+Pj4gMjApICYgMHhmXSB8IHBjMmJ5dGVzMTBbKHJpZ2h0ID4+PiAxNikgJiAweGZdXG4gICAgICAgICAgICAgICAgfCBwYzJieXRlczExWyhyaWdodCA+Pj4gMTIpICYgMHhmXSB8IHBjMmJ5dGVzMTJbKHJpZ2h0ID4+PiA4KSAmIDB4Zl1cbiAgICAgICAgICAgICAgICB8IHBjMmJ5dGVzMTNbKHJpZ2h0ID4+PiA0KSAmIDB4Zl07XG4gICAgICB0ZW1wID0gKChyaWdodHRlbXAgPj4+IDE2KSBeIGxlZnR0ZW1wKSAmIDB4MDAwMGZmZmY7IFxuICAgICAga2V5c1tuKytdID0gbGVmdHRlbXAgXiB0ZW1wOyBrZXlzW24rK10gPSByaWdodHRlbXAgXiAodGVtcCA8PCAxNik7XG4gICAgfVxuICB9IC8vZm9yIGVhY2ggaXRlcmF0aW9uc1xuICAvL3JldHVybiB0aGUga2V5cyB3ZSd2ZSBjcmVhdGVkXG4gIHJldHVybiBrZXlzO1xufSAvL2VuZCBvZiBkZXNfY3JlYXRlS2V5c1xuXG5cclxuZnVuY3Rpb24gZGVzX2FkZFBhZGRpbmcobWVzc2FnZSwgcGFkZGluZykge1xyXG4gICAgdmFyIHBhZExlbmd0aCA9IDggLSAobWVzc2FnZS5sZW5ndGggJSA4KTtcclxuICAgIGlmICgocGFkZGluZyA9PSAyKSAmJiAocGFkTGVuZ3RoIDwgOCkpIHsgICAgICAgICAgICAvL3BhZCB0aGUgbWVzc2FnZSB3aXRoIHNwYWNlc1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCIgICAgICAgIFwiLnN1YnN0cigwLCBwYWRMZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAocGFkZGluZyA9PSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUEtDUzcgcGFkZGluZ1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYWRMZW5ndGgsIHBhZExlbmd0aCwgcGFkTGVuZ3RoLCBwYWRMZW5ndGgsIHBhZExlbmd0aCwgcGFkTGVuZ3RoLCBwYWRMZW5ndGgsIHBhZExlbmd0aCkuc3Vic3RyKDAsIHBhZExlbmd0aCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghcGFkZGluZyAmJiAocGFkTGVuZ3RoIDwgOCkpIHsgICAgICAgICAgICAgLy9wYWQgdGhlIG1lc3NhZ2Ugb3V0IHdpdGggbnVsbCBieXRlc1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcIi5zdWJzdHIoMCwgcGFkTGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXNzYWdlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZXNfcmVtb3ZlUGFkZGluZyhtZXNzYWdlLCBwYWRkaW5nKSB7XHJcbiAgICBpZiAocGFkZGluZyA9PSAyKSB7ICAgICAgICAgLy8gc3BhY2UgcGFkZGVkXHJcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvICokL2csIFwiXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAocGFkZGluZyA9PSAxKSB7ICAgIC8vIFBLQ1M3XHJcbiAgICAgICAgdmFyIHBhZENvdW50ID0gbWVzc2FnZS5jaGFyQ29kZUF0KG1lc3NhZ2UubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyKDAsIG1lc3NhZ2UubGVuZ3RoIC0gcGFkQ291bnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoIXBhZGRpbmcpIHsgICAgICAgIC8vIG51bGwgcGFkZGluZ1xyXG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoL1xcMCokL2csIFwiXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1lc3NhZ2U7XHJcbn1cclxuXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbCcpO1xuXG4vLyBhZGRlZCBieSBSZWN1cml0eSBMYWJzXG5mdW5jdGlvbiBEZXMoa2V5KSB7XG5cdHRoaXMua2V5ID0gW107XG5cblx0Zm9yKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHRoaXMua2V5LnB1c2goa2V5LnN1YnN0cihpICogOCwgOCkpO1xuXHR9XG5cblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oYmxvY2spIHtcblx0XHRyZXR1cm4gdXRpbC5zdHIyYmluKGRlcyhkZXNfY3JlYXRlS2V5cyh0aGlzLmtleVsyXSksXG5cdFx0XHRkZXMoZGVzX2NyZWF0ZUtleXModGhpcy5rZXlbMV0pLFxuXHRcdFx0ZGVzKGRlc19jcmVhdGVLZXlzKHRoaXMua2V5WzBdKSxcblx0XHRcdHV0aWwuYmluMnN0cihibG9jayksIHRydWUsIDAsbnVsbCxudWxsKSwgXG5cdFx0XHRmYWxzZSwgMCxudWxsLG51bGwpLCB0cnVlLCAwLG51bGwsbnVsbCkpO1xuXHR9XG59XG5cbkRlcy5rZXlTaXplID0gRGVzLnByb3RvdHlwZS5rZXlTaXplID0gMjQ7XG5EZXMuYmxvY2tTaXplID0gRGVzLnByb3RvdHlwZS5ibG9ja1NpemUgPSA4O1xuXG4vLyBUaGlzIGlzIFwib3JpZ2luYWxcIiBERVMgLSBEZXMgaXMgYWN0dWFsbHkgVHJpcGxlIERFUy5cbi8vIFRoaXMgaXMgb25seSBleHBvcnRlZCBzbyB3ZSBjYW4gdW5pdCB0ZXN0LlxuZnVuY3Rpb24gT3JpZ2luYWxEZXMoa2V5KSB7XHJcbiAgICB0aGlzLmtleSA9IGtleTtcblxuICAgIHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uIChibG9jaywgcGFkZGluZykge1xyXG4gICAgICAgIHZhciBrZXlzID0gZGVzX2NyZWF0ZUtleXModGhpcy5rZXkpO1xyXG4gICAgICAgIHJldHVybiB1dGlsLnN0cjJiaW4oZGVzKGtleXMsIHV0aWwuYmluMnN0cihibG9jayksIHRydWUsIDAsIG51bGwsIHBhZGRpbmcpKTtcclxuICAgIH1cclxuXG4gICAgdGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24gKGJsb2NrLCBwYWRkaW5nKSB7XHJcbiAgICAgICAgdmFyIGtleXMgPSBkZXNfY3JlYXRlS2V5cyh0aGlzLmtleSk7XHJcbiAgICAgICAgcmV0dXJuIHV0aWwuc3RyMmJpbihkZXMoa2V5cywgdXRpbC5iaW4yc3RyKGJsb2NrKSwgZmFsc2UsIDAsIG51bGwsIHBhZGRpbmcpKTtcclxuICAgIH1cclxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIGRlczogRGVzLFxuICAgIG9yaWdpbmFsRGVzOiBPcmlnaW5hbERlc1xyXG59XG5cbiIsIlxudmFyIGRlc01vZHVsZSA9IHJlcXVpcmUoJy4vZGVzLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGRlczogZGVzTW9kdWxlWydkZXMnXSxcbiAgICBvcmlnaW5hbERlczogZGVzTW9kdWxlWydvcmlnaW5hbERlcyddLFxuXHRjYXN0NTogcmVxdWlyZSgnLi9jYXN0NS5qcycpLFxuXHR0d29maXNoOiByZXF1aXJlKCcuL3R3b2Zpc2guanMnKSxcblx0Ymxvd2Zpc2g6IHJlcXVpcmUoJy4vYmxvd2Zpc2guanMnKVxufVxuXG52YXIgYWVzID0gcmVxdWlyZSgnLi9hZXMuanMnKTtcblxuZm9yKHZhciBpIGluIGFlcykge1xuXHRtb2R1bGUuZXhwb3J0c1snYWVzJyArIGldID0gYWVzW2ldO1xufVxuIiwiLyogTW9kaWZpZWQgYnkgUmVjdXJpdHkgTGFicyBHbWJIIFxuICogXG4gKiBDaXBoZXIuanNcbiAqIEEgYmxvY2stY2lwaGVyIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbiBvbiBKYXZhU2NyaXB0XG4gKiBTZWUgQ2lwaGVyLnJlYWRtZS50eHQgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uXG4gKlxuICogQ29weXJpZ2h0KGMpIDIwMDkgQXRzdXNoaSBPa2EgWyBodHRwOi8vb2thLm51LyBdXG4gKiBUaGlzIHNjcmlwdCBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMR1BMXG4gKlxuICogQUNLTk9XTEVER01FTlRcbiAqXG4gKiAgICAgVGhlIG1haW4gc3Vicm91dGluZXMgYXJlIHdyaXR0ZW4gYnkgTWljaGllbCB2YW4gRXZlcmRpbmdlbi5cbiAqIFxuICogICAgIE1pY2hpZWwgdmFuIEV2ZXJkaW5nZW5cbiAqICAgICBodHRwOi8vaG9tZS52ZXJzYXRlbC5ubC9NQXZhbkV2ZXJkaW5nZW4vaW5kZXguaHRtbFxuICogXG4gKiAgICAgQWxsIHJpZ2h0cyBmb3IgdGhlc2Ugcm91dGluZXMgYXJlIHJlc2VydmVkIHRvIE1pY2hpZWwgdmFuIEV2ZXJkaW5nZW4uXG4gKlxuICovXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vTWF0aFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbnZhciBNQVhJTlQgPSAweEZGRkZGRkZGO1xuXG5mdW5jdGlvbiByb3RiKGIsbil7IHJldHVybiAoIGI8PG4gfCBiPj4+KCA4LW4pICkgJiAweEZGOyB9XG5mdW5jdGlvbiByb3R3KHcsbil7IHJldHVybiAoIHc8PG4gfCB3Pj4+KDMyLW4pICkgJiBNQVhJTlQ7IH1cbmZ1bmN0aW9uIGdldFcoYSxpKXsgcmV0dXJuIGFbaV18YVtpKzFdPDw4fGFbaSsyXTw8MTZ8YVtpKzNdPDwyNDsgfVxuZnVuY3Rpb24gc2V0VyhhLGksdyl7IGEuc3BsaWNlKGksNCx3JjB4RkYsKHc+Pj44KSYweEZGLCh3Pj4+MTYpJjB4RkYsKHc+Pj4yNCkmMHhGRik7IH1cbmZ1bmN0aW9uIHNldFdJbnYoYSxpLHcpeyBhLnNwbGljZShpLDQsKHc+Pj4yNCkmMHhGRiwodz4+PjE2KSYweEZGLCh3Pj4+OCkmMHhGRix3JjB4RkYpOyB9XG5mdW5jdGlvbiBnZXRCKHgsbil7IHJldHVybiAoeD4+PihuKjgpKSYweEZGOyB9XG5cbmZ1bmN0aW9uIGdldE5yQml0cyhpKXsgdmFyIG49MDsgd2hpbGUgKGk+MCl7IG4rKzsgaT4+Pj0xOyB9IHJldHVybiBuOyB9XG5mdW5jdGlvbiBnZXRNYXNrKG4peyByZXR1cm4gKDE8PG4pLTE7IH1cblxuLy9hZGRlZCAyMDA4LzExLzEzIFhYWCBNVVNUIFVTRSBPTkUtV0FZIEhBU0ggRlVOQ1RJT04gRk9SIFNFQ1VSSVRZIFJFQVNPTlxuZnVuY3Rpb24gcmFuZEJ5dGUoKSB7XG4gcmV0dXJuIE1hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAyNTYgKTtcbn1cbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFR3b2Zpc2hcbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZnVuY3Rpb24gY3JlYXRlVHdvZmlzaCgpIHtcblx0Ly9cblx0dmFyIGtleUJ5dGVzID0gbnVsbDtcblx0dmFyIGRhdGFCeXRlcyA9IG51bGw7XG5cdHZhciBkYXRhT2Zmc2V0ID0gLTE7XG5cdC8vIHZhciBkYXRhTGVuZ3RoID0gLTE7XG5cdHZhciBhbGdvcml0aG1OYW1lID0gbnVsbDtcblx0Ly8gdmFyIGlkeDIgPSAtMTtcblx0Ly9cblxuXHRhbGdvcml0aG1OYW1lID0gXCJ0d29maXNoXCI7XG5cblx0dmFyIHRmc0tleSA9IFtdO1xuXHR2YXIgdGZzTSA9IFsgW10sIFtdLCBbXSwgW10gXTtcblxuXHRmdW5jdGlvbiB0ZnNJbml0KGtleSkge1xuXHRcdGtleUJ5dGVzID0ga2V5O1xuXHRcdHZhciBpLCBhLCBiLCBjLCBkLCBtZUtleSA9IFtdLCBtb0tleSA9IFtdLCBpbktleSA9IFtdO1xuXHRcdHZhciBrTGVuO1xuXHRcdHZhciBzS2V5ID0gW107XG5cdFx0dmFyIGYwMSwgZjViLCBmZWY7XG5cblx0XHR2YXIgcTAgPSBbIFsgOCwgMSwgNywgMTMsIDYsIDE1LCAzLCAyLCAwLCAxMSwgNSwgOSwgMTQsIDEyLCAxMCwgNCBdLFxuXHRcdFx0XHRbIDIsIDgsIDExLCAxMywgMTUsIDcsIDYsIDE0LCAzLCAxLCA5LCA0LCAwLCAxMCwgMTIsIDUgXSBdO1xuXHRcdHZhciBxMSA9IFsgWyAxNCwgMTIsIDExLCA4LCAxLCAyLCAzLCA1LCAxNSwgNCwgMTAsIDYsIDcsIDAsIDksIDEzIF0sXG5cdFx0XHRcdFsgMSwgMTQsIDIsIDExLCA0LCAxMiwgMywgNywgNiwgMTMsIDEwLCA1LCAxNSwgOSwgMCwgOCBdIF07XG5cdFx0dmFyIHEyID0gWyBbIDExLCAxMCwgNSwgMTQsIDYsIDEzLCA5LCAwLCAxMiwgOCwgMTUsIDMsIDIsIDQsIDcsIDEgXSxcblx0XHRcdFx0WyA0LCAxMiwgNywgNSwgMSwgNiwgOSwgMTAsIDAsIDE0LCAxMywgOCwgMiwgMTEsIDMsIDE1IF0gXTtcblx0XHR2YXIgcTMgPSBbIFsgMTMsIDcsIDE1LCA0LCAxLCAyLCA2LCAxNCwgOSwgMTEsIDMsIDAsIDgsIDUsIDEyLCAxMCBdLFxuXHRcdFx0XHRbIDExLCA5LCA1LCAxLCAxMiwgMywgMTMsIDE0LCA2LCA0LCA3LCAxNSwgMiwgMCwgOCwgMTAgXSBdO1xuXHRcdHZhciByb3I0ID0gWyAwLCA4LCAxLCA5LCAyLCAxMCwgMywgMTEsIDQsIDEyLCA1LCAxMywgNiwgMTQsIDcsIDE1IF07XG5cdFx0dmFyIGFzaHggPSBbIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMiwgNSwgMTQsIDcgXTtcblx0XHR2YXIgcSA9IFsgW10sIFtdIF07XG5cdFx0dmFyIG0gPSBbIFtdLCBbXSwgW10sIFtdIF07XG5cblx0XHRmdW5jdGlvbiBmZm01Yih4KSB7XG5cdFx0XHRyZXR1cm4geCBeICh4ID4+IDIpIF4gWyAwLCA5MCwgMTgwLCAyMzggXVt4ICYgM107XG5cdFx0fVxuXHRcdGZ1bmN0aW9uIGZmbUVmKHgpIHtcblx0XHRcdHJldHVybiB4IF4gKHggPj4gMSkgXiAoeCA+PiAyKSBeIFsgMCwgMjM4LCAxODAsIDkwIF1beCAmIDNdO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG1kc1JlbShwLCBxKSB7XG5cdFx0XHR2YXIgaSwgdCwgdTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHtcblx0XHRcdFx0dCA9IHEgPj4+IDI0O1xuXHRcdFx0XHRxID0gKChxIDw8IDgpICYgTUFYSU5UKSB8IHAgPj4+IDI0O1xuXHRcdFx0XHRwID0gKHAgPDwgOCkgJiBNQVhJTlQ7XG5cdFx0XHRcdHUgPSB0IDw8IDE7XG5cdFx0XHRcdGlmICh0ICYgMTI4KSB7XG5cdFx0XHRcdFx0dSBePSAzMzM7XG5cdFx0XHRcdH1cblx0XHRcdFx0cSBePSB0IF4gKHUgPDwgMTYpO1xuXHRcdFx0XHR1IF49IHQgPj4+IDE7XG5cdFx0XHRcdGlmICh0ICYgMSkge1xuXHRcdFx0XHRcdHUgXj0gMTY2O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHEgXj0gdSA8PCAyNCB8IHUgPDwgODtcblx0XHRcdH1cblx0XHRcdHJldHVybiBxO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHFwKG4sIHgpIHtcblx0XHRcdHZhciBhLCBiLCBjLCBkO1xuXHRcdFx0YSA9IHggPj4gNDtcblx0XHRcdGIgPSB4ICYgMTU7XG5cdFx0XHRjID0gcTBbbl1bYSBeIGJdO1xuXHRcdFx0ZCA9IHExW25dW3JvcjRbYl0gXiBhc2h4W2FdXTtcblx0XHRcdHJldHVybiBxM1tuXVtyb3I0W2RdIF4gYXNoeFtjXV0gPDwgNCB8IHEyW25dW2MgXiBkXTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBoRnVuKHgsIGtleSkge1xuXHRcdFx0dmFyIGEgPSBnZXRCKHgsIDApLCBiID0gZ2V0Qih4LCAxKSwgYyA9IGdldEIoeCwgMiksIGQgPSBnZXRCKHgsIDMpO1xuXHRcdFx0c3dpdGNoIChrTGVuKSB7XG5cdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdGEgPSBxWzFdW2FdIF4gZ2V0QihrZXlbM10sIDApO1xuXHRcdFx0XHRiID0gcVswXVtiXSBeIGdldEIoa2V5WzNdLCAxKTtcblx0XHRcdFx0YyA9IHFbMF1bY10gXiBnZXRCKGtleVszXSwgMik7XG5cdFx0XHRcdGQgPSBxWzFdW2RdIF4gZ2V0QihrZXlbM10sIDMpO1xuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRhID0gcVsxXVthXSBeIGdldEIoa2V5WzJdLCAwKTtcblx0XHRcdFx0YiA9IHFbMV1bYl0gXiBnZXRCKGtleVsyXSwgMSk7XG5cdFx0XHRcdGMgPSBxWzBdW2NdIF4gZ2V0QihrZXlbMl0sIDIpO1xuXHRcdFx0XHRkID0gcVswXVtkXSBeIGdldEIoa2V5WzJdLCAzKTtcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0YSA9IHFbMF1bcVswXVthXSBeIGdldEIoa2V5WzFdLCAwKV0gXiBnZXRCKGtleVswXSwgMCk7XG5cdFx0XHRcdGIgPSBxWzBdW3FbMV1bYl0gXiBnZXRCKGtleVsxXSwgMSldIF4gZ2V0QihrZXlbMF0sIDEpO1xuXHRcdFx0XHRjID0gcVsxXVtxWzBdW2NdIF4gZ2V0QihrZXlbMV0sIDIpXSBeIGdldEIoa2V5WzBdLCAyKTtcblx0XHRcdFx0ZCA9IHFbMV1bcVsxXVtkXSBeIGdldEIoa2V5WzFdLCAzKV0gXiBnZXRCKGtleVswXSwgMyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbVswXVthXSBeIG1bMV1bYl0gXiBtWzJdW2NdIF4gbVszXVtkXTtcblx0XHR9XG5cblx0XHRrZXlCeXRlcyA9IGtleUJ5dGVzLnNsaWNlKDAsIDMyKTtcblx0XHRpID0ga2V5Qnl0ZXMubGVuZ3RoO1xuXHRcdHdoaWxlIChpICE9IDE2ICYmIGkgIT0gMjQgJiYgaSAhPSAzMilcblx0XHRcdGtleUJ5dGVzW2krK10gPSAwO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGtleUJ5dGVzLmxlbmd0aDsgaSArPSA0KSB7XG5cdFx0XHRpbktleVtpID4+IDJdID0gZ2V0VyhrZXlCeXRlcywgaSk7XG5cdFx0fVxuXHRcdGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHRcdFx0cVswXVtpXSA9IHFwKDAsIGkpO1xuXHRcdFx0cVsxXVtpXSA9IHFwKDEsIGkpO1xuXHRcdH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0XHRcdGYwMSA9IHFbMV1baV07XG5cdFx0XHRmNWIgPSBmZm01YihmMDEpO1xuXHRcdFx0ZmVmID0gZmZtRWYoZjAxKTtcblx0XHRcdG1bMF1baV0gPSBmMDEgKyAoZjViIDw8IDgpICsgKGZlZiA8PCAxNikgKyAoZmVmIDw8IDI0KTtcblx0XHRcdG1bMl1baV0gPSBmNWIgKyAoZmVmIDw8IDgpICsgKGYwMSA8PCAxNikgKyAoZmVmIDw8IDI0KTtcblx0XHRcdGYwMSA9IHFbMF1baV07XG5cdFx0XHRmNWIgPSBmZm01YihmMDEpO1xuXHRcdFx0ZmVmID0gZmZtRWYoZjAxKTtcblx0XHRcdG1bMV1baV0gPSBmZWYgKyAoZmVmIDw8IDgpICsgKGY1YiA8PCAxNikgKyAoZjAxIDw8IDI0KTtcblx0XHRcdG1bM11baV0gPSBmNWIgKyAoZjAxIDw8IDgpICsgKGZlZiA8PCAxNikgKyAoZjViIDw8IDI0KTtcblx0XHR9XG5cblx0XHRrTGVuID0gaW5LZXkubGVuZ3RoIC8gMjtcblx0XHRmb3IgKGkgPSAwOyBpIDwga0xlbjsgaSsrKSB7XG5cdFx0XHRhID0gaW5LZXlbaSArIGldO1xuXHRcdFx0bWVLZXlbaV0gPSBhO1xuXHRcdFx0YiA9IGluS2V5W2kgKyBpICsgMV07XG5cdFx0XHRtb0tleVtpXSA9IGI7XG5cdFx0XHRzS2V5W2tMZW4gLSBpIC0gMV0gPSBtZHNSZW0oYSwgYik7XG5cdFx0fVxuXHRcdGZvciAoaSA9IDA7IGkgPCA0MDsgaSArPSAyKSB7XG5cdFx0XHRhID0gMHgxMDEwMTAxICogaTtcblx0XHRcdGIgPSBhICsgMHgxMDEwMTAxO1xuXHRcdFx0YSA9IGhGdW4oYSwgbWVLZXkpO1xuXHRcdFx0YiA9IHJvdHcoaEZ1bihiLCBtb0tleSksIDgpO1xuXHRcdFx0dGZzS2V5W2ldID0gKGEgKyBiKSAmIE1BWElOVDtcblx0XHRcdHRmc0tleVtpICsgMV0gPSByb3R3KGEgKyAyICogYiwgOSk7XG5cdFx0fVxuXHRcdGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHRcdFx0YSA9IGIgPSBjID0gZCA9IGk7XG5cdFx0XHRzd2l0Y2ggKGtMZW4pIHtcblx0XHRcdGNhc2UgNDpcblx0XHRcdFx0YSA9IHFbMV1bYV0gXiBnZXRCKHNLZXlbM10sIDApO1xuXHRcdFx0XHRiID0gcVswXVtiXSBeIGdldEIoc0tleVszXSwgMSk7XG5cdFx0XHRcdGMgPSBxWzBdW2NdIF4gZ2V0QihzS2V5WzNdLCAyKTtcblx0XHRcdFx0ZCA9IHFbMV1bZF0gXiBnZXRCKHNLZXlbM10sIDMpO1xuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRhID0gcVsxXVthXSBeIGdldEIoc0tleVsyXSwgMCk7XG5cdFx0XHRcdGIgPSBxWzFdW2JdIF4gZ2V0QihzS2V5WzJdLCAxKTtcblx0XHRcdFx0YyA9IHFbMF1bY10gXiBnZXRCKHNLZXlbMl0sIDIpO1xuXHRcdFx0XHRkID0gcVswXVtkXSBeIGdldEIoc0tleVsyXSwgMyk7XG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRmc01bMF1baV0gPSBtWzBdW3FbMF1bcVswXVthXSBeIGdldEIoc0tleVsxXSwgMCldXG5cdFx0XHRcdFx0XHReIGdldEIoc0tleVswXSwgMCldO1xuXHRcdFx0XHR0ZnNNWzFdW2ldID0gbVsxXVtxWzBdW3FbMV1bYl0gXiBnZXRCKHNLZXlbMV0sIDEpXVxuXHRcdFx0XHRcdFx0XiBnZXRCKHNLZXlbMF0sIDEpXTtcblx0XHRcdFx0dGZzTVsyXVtpXSA9IG1bMl1bcVsxXVtxWzBdW2NdIF4gZ2V0QihzS2V5WzFdLCAyKV1cblx0XHRcdFx0XHRcdF4gZ2V0QihzS2V5WzBdLCAyKV07XG5cdFx0XHRcdHRmc01bM11baV0gPSBtWzNdW3FbMV1bcVsxXVtkXSBeIGdldEIoc0tleVsxXSwgMyldXG5cdFx0XHRcdFx0XHReIGdldEIoc0tleVswXSwgMyldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIHRmc0cwKHgpIHtcblx0XHRyZXR1cm4gdGZzTVswXVtnZXRCKHgsIDApXSBeIHRmc01bMV1bZ2V0Qih4LCAxKV0gXiB0ZnNNWzJdW2dldEIoeCwgMildXG5cdFx0XHRcdF4gdGZzTVszXVtnZXRCKHgsIDMpXTtcblx0fVxuXHRmdW5jdGlvbiB0ZnNHMSh4KSB7XG5cdFx0cmV0dXJuIHRmc01bMF1bZ2V0Qih4LCAzKV0gXiB0ZnNNWzFdW2dldEIoeCwgMCldIF4gdGZzTVsyXVtnZXRCKHgsIDEpXVxuXHRcdFx0XHReIHRmc01bM11bZ2V0Qih4LCAyKV07XG5cdH1cblxuXHRmdW5jdGlvbiB0ZnNGcm5kKHIsIGJsaykge1xuXHRcdHZhciBhID0gdGZzRzAoYmxrWzBdKTtcblx0XHR2YXIgYiA9IHRmc0cxKGJsa1sxXSk7XG5cdFx0YmxrWzJdID0gcm90dyhibGtbMl0gXiAoYSArIGIgKyB0ZnNLZXlbNCAqIHIgKyA4XSkgJiBNQVhJTlQsIDMxKTtcblx0XHRibGtbM10gPSByb3R3KGJsa1szXSwgMSkgXiAoYSArIDIgKiBiICsgdGZzS2V5WzQgKiByICsgOV0pICYgTUFYSU5UO1xuXHRcdGEgPSB0ZnNHMChibGtbMl0pO1xuXHRcdGIgPSB0ZnNHMShibGtbM10pO1xuXHRcdGJsa1swXSA9IHJvdHcoYmxrWzBdIF4gKGEgKyBiICsgdGZzS2V5WzQgKiByICsgMTBdKSAmIE1BWElOVCwgMzEpO1xuXHRcdGJsa1sxXSA9IHJvdHcoYmxrWzFdLCAxKSBeIChhICsgMiAqIGIgKyB0ZnNLZXlbNCAqIHIgKyAxMV0pICYgTUFYSU5UO1xuXHR9XG5cblx0ZnVuY3Rpb24gdGZzSXJuZChpLCBibGspIHtcblx0XHR2YXIgYSA9IHRmc0cwKGJsa1swXSk7XG5cdFx0dmFyIGIgPSB0ZnNHMShibGtbMV0pO1xuXHRcdGJsa1syXSA9IHJvdHcoYmxrWzJdLCAxKSBeIChhICsgYiArIHRmc0tleVs0ICogaSArIDEwXSkgJiBNQVhJTlQ7XG5cdFx0YmxrWzNdID0gcm90dyhibGtbM10gXiAoYSArIDIgKiBiICsgdGZzS2V5WzQgKiBpICsgMTFdKSAmIE1BWElOVCwgMzEpO1xuXHRcdGEgPSB0ZnNHMChibGtbMl0pO1xuXHRcdGIgPSB0ZnNHMShibGtbM10pO1xuXHRcdGJsa1swXSA9IHJvdHcoYmxrWzBdLCAxKSBeIChhICsgYiArIHRmc0tleVs0ICogaSArIDhdKSAmIE1BWElOVDtcblx0XHRibGtbMV0gPSByb3R3KGJsa1sxXSBeIChhICsgMiAqIGIgKyB0ZnNLZXlbNCAqIGkgKyA5XSkgJiBNQVhJTlQsIDMxKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRmc0Nsb3NlKCkge1xuXHRcdHRmc0tleSA9IFtdO1xuXHRcdHRmc00gPSBbIFtdLCBbXSwgW10sIFtdIF07XG5cdH1cblxuXHRmdW5jdGlvbiB0ZnNFbmNyeXB0KGRhdGEsIG9mZnNldCkge1xuXHRcdGRhdGFCeXRlcyA9IGRhdGE7XG5cdFx0ZGF0YU9mZnNldCA9IG9mZnNldDtcblx0XHR2YXIgYmxrID0gWyBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCkgXiB0ZnNLZXlbMF0sXG5cdFx0XHRcdGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgNCkgXiB0ZnNLZXlbMV0sXG5cdFx0XHRcdGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgOCkgXiB0ZnNLZXlbMl0sXG5cdFx0XHRcdGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgMTIpIF4gdGZzS2V5WzNdIF07XG5cdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgODsgaisrKSB7XG5cdFx0XHR0ZnNGcm5kKGosIGJsayk7XG5cdFx0fVxuXHRcdHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0LCBibGtbMl0gXiB0ZnNLZXlbNF0pO1xuXHRcdHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgNCwgYmxrWzNdIF4gdGZzS2V5WzVdKTtcblx0XHRzZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDgsIGJsa1swXSBeIHRmc0tleVs2XSk7XG5cdFx0c2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyAxMiwgYmxrWzFdIF4gdGZzS2V5WzddKTtcblx0XHRkYXRhT2Zmc2V0ICs9IDE2O1xuXHRcdHJldHVybiBkYXRhQnl0ZXM7XG5cdH1cblxuXHRmdW5jdGlvbiB0ZnNEZWNyeXB0KGRhdGEsIG9mZnNldCkge1xuXHRcdGRhdGFCeXRlcyA9IGRhdGE7XG5cdFx0ZGF0YU9mZnNldCA9IG9mZnNldDtcblx0XHR2YXIgYmxrID0gWyBnZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCkgXiB0ZnNLZXlbNF0sXG5cdFx0XHRcdGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgNCkgXiB0ZnNLZXlbNV0sXG5cdFx0XHRcdGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgOCkgXiB0ZnNLZXlbNl0sXG5cdFx0XHRcdGdldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgMTIpIF4gdGZzS2V5WzddIF07XG5cdFx0Zm9yICggdmFyIGogPSA3OyBqID49IDA7IGotLSkge1xuXHRcdFx0dGZzSXJuZChqLCBibGspO1xuXHRcdH1cblx0XHRzZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCwgYmxrWzJdIF4gdGZzS2V5WzBdKTtcblx0XHRzZXRXKGRhdGFCeXRlcywgZGF0YU9mZnNldCArIDQsIGJsa1szXSBeIHRmc0tleVsxXSk7XG5cdFx0c2V0VyhkYXRhQnl0ZXMsIGRhdGFPZmZzZXQgKyA4LCBibGtbMF0gXiB0ZnNLZXlbMl0pO1xuXHRcdHNldFcoZGF0YUJ5dGVzLCBkYXRhT2Zmc2V0ICsgMTIsIGJsa1sxXSBeIHRmc0tleVszXSk7XG5cdFx0ZGF0YU9mZnNldCArPSAxNjtcblx0fVxuXHRcblx0Ly8gYWRkZWQgYnkgUmVjdXJpdHkgTGFic1xuXHRmdW5jdGlvbiB0ZnNGaW5hbCgpIHtcblx0XHRyZXR1cm4gZGF0YUJ5dGVzO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRuYW1lIDogXCJ0d29maXNoXCIsXG5cdFx0YmxvY2tzaXplIDogMTI4IC8gOCxcblx0XHRvcGVuIDogdGZzSW5pdCxcblx0XHRjbG9zZSA6IHRmc0Nsb3NlLFxuXHRcdGVuY3J5cHQgOiB0ZnNFbmNyeXB0LFxuXHRcdGRlY3J5cHQgOiB0ZnNEZWNyeXB0LFxuXHRcdC8vIGFkZGVkIGJ5IFJlY3VyaXR5IExhYnNcblx0XHRmaW5hbGl6ZTogdGZzRmluYWxcblx0fTtcbn1cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyk7XG5cbi8vIGFkZGVkIGJ5IFJlY3VyaXR5IExhYnNcbmZ1bmN0aW9uIFRGZW5jcnlwdChibG9jaywga2V5KSB7XG5cdHZhciBibG9ja19jb3B5ID0gW10uY29uY2F0KGJsb2NrKTtcblx0dmFyIHRmID0gY3JlYXRlVHdvZmlzaCgpO1xuXHR0Zi5vcGVuKHV0aWwuc3RyMmJpbihrZXkpLDApO1xuXHR2YXIgcmVzdWx0ID0gdGYuZW5jcnlwdChibG9ja19jb3B5LCAwKTtcblx0dGYuY2xvc2UoKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gVEYoa2V5KSB7XG5cdHRoaXMudGYgPSBjcmVhdGVUd29maXNoKCk7XG5cdHRoaXMudGYub3Blbih1dGlsLnN0cjJiaW4oa2V5KSwwKTtcblxuXHR0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbihibG9jaykge1xuXHRcdHJldHVybiB0aGlzLnRmLmVuY3J5cHQoW10uY29uY2F0KGJsb2NrKSwgMCk7XG5cdH1cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IFRGO1xubW9kdWxlLmV4cG9ydHMua2V5U2l6ZSA9IFRGLnByb3RvdHlwZS5rZXlTaXplID0gMzI7XG5tb2R1bGUuZXhwb3J0cy5ibG9ja1NpemUgPSBURi5wcm90b3R5cGUuYmxvY2tTaXplID0gMTY7XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQSBcblxuLy8gVGhlIEdQRzRCcm93c2VycyBjcnlwdG8gaW50ZXJmYWNlXG5cbnZhciByYW5kb20gPSByZXF1aXJlKCcuL3JhbmRvbS5qcycpLFxuICBjaXBoZXIgPSByZXF1aXJlKCcuL2NpcGhlcicpLFxuICBwdWJsaWNLZXkgPSByZXF1aXJlKCcuL3B1YmxpY19rZXknKSxcbiAgdHlwZV9tcGkgPSByZXF1aXJlKCcuLi90eXBlL21waS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbi8qKlxuICogRW5jcnlwdHMgZGF0YSB1c2luZyB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgXG4gKiBhbmQgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0uXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGFsZ28gQWxnb3JpdGhtIHRvIGJlIHVzZWQgKFNlZSBSRkM0ODgwIDkuMSlcbiAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waVtdfSBwdWJsaWNNUElzIEFsZ29yaXRobSBkZXBlbmRlbnQgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnNcbiAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waX0gZGF0YSBEYXRhIHRvIGJlIGVuY3J5cHRlZCBhcyBNUElcbiAqIEByZXR1cm4ge29wZW5wZ3BfdHlwZV9tcGlbXX0gaWYgUlNBIGFuIG9wZW5wZ3BfdHlwZV9tcGk7IFxuICogaWYgZWxnYW1hbCBlbmNyeXB0aW9uIGFuIGFycmF5IG9mIHR3byBvcGVucGdwX3R5cGVfbXBpIGlzIHJldHVybmVkOyBvdGhlcndpc2UgbnVsbFxuICovXG5wdWJsaWNLZXlFbmNyeXB0OiBmdW5jdGlvbihhbGdvLCBwdWJsaWNNUElzLCBkYXRhKSB7XG4gIHZhciByZXN1bHQgPSAoZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoKGFsZ28pIHtcbiAgICBjYXNlICdyc2FfZW5jcnlwdCc6XG4gICAgY2FzZSAncnNhX2VuY3J5cHRfc2lnbic6XG4gICAgICB2YXIgcnNhID0gbmV3IHB1YmxpY0tleS5yc2EoKTtcbiAgICAgIHZhciBuID0gcHVibGljTVBJc1swXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBlID0gcHVibGljTVBJc1sxXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBtID0gZGF0YS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHJldHVybiBbcnNhLmVuY3J5cHQobSxlLG4pXTtcblxuICAgIGNhc2UgJ2VsZ2FtYWwnOlxuICAgICAgdmFyIGVsZ2FtYWwgPSBuZXcgcHVibGljS2V5LmVsZ2FtYWwoKTtcbiAgICAgIHZhciBwID0gcHVibGljTVBJc1swXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBnID0gcHVibGljTVBJc1sxXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciB5ID0gcHVibGljTVBJc1syXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBtID0gZGF0YS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHJldHVybiBlbGdhbWFsLmVuY3J5cHQobSxnLHAseSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gcmVzdWx0Lm1hcChmdW5jdGlvbihibikge1xuICAgIHZhciBtcGkgPSBuZXcgdHlwZV9tcGkoKTtcbiAgICBtcGkuZnJvbUJpZ0ludGVnZXIoYm4pO1xuICAgIHJldHVybiBtcGk7XG4gIH0pO1xufSxcblxuLyoqXG4gKiBEZWNyeXB0cyBkYXRhIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VycyBvZiB0aGUgcHJpdmF0ZSBrZXksXG4gKiB0aGUgc3BlY2lmaWVkIHNlY3JldE1QSXMgb2YgdGhlIHByaXZhdGUga2V5IGFuZCB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gYWxnbyBBbGdvcml0aG0gdG8gYmUgdXNlZCAoU2VlIFJGQzQ4ODAgOS4xKVxuICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpW119IHB1YmxpY01QSXMgQWxnb3JpdGhtIGRlcGVuZGVudCBtdWx0aXByZWNpc2lvbiBpbnRlZ2VycyBcbiAqIG9mIHRoZSBwdWJsaWMga2V5IHBhcnQgb2YgdGhlIHByaXZhdGUga2V5XG4gKiBAcGFyYW0ge29wZW5wZ3BfdHlwZV9tcGlbXX0gc2VjcmV0TVBJcyBBbGdvcml0aG0gZGVwZW5kZW50IG11bHRpcHJlY2lzaW9uIGludGVnZXJzIFxuICogb2YgdGhlIHByaXZhdGUga2V5IHVzZWRcbiAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waX0gZGF0YSBEYXRhIHRvIGJlIGVuY3J5cHRlZCBhcyBNUElcbiAqIEByZXR1cm4ge29wZW5wZ3BfdHlwZV9tcGl9IHJldHVybnMgYSBiaWcgaW50ZWdlciBjb250YWluaW5nIHRoZSBkZWNyeXB0ZWQgZGF0YTsgb3RoZXJ3aXNlIG51bGxcbiAqL1xuXG5wdWJsaWNLZXlEZWNyeXB0OiBmdW5jdGlvbiAoYWxnbywga2V5SW50ZWdlcnMsIGRhdGFJbnRlZ2Vycykge1xuICB2YXIgYm4gPSAoZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoKGFsZ28pIHtcbiAgICBjYXNlICdyc2FfZW5jcnlwdF9zaWduJzpcbiAgICBjYXNlICdyc2FfZW5jcnlwdCc6XG4gICAgICB2YXIgcnNhID0gbmV3IHB1YmxpY0tleS5yc2EoKTtcbiAgICAgIC8vIDAgYW5kIDEgYXJlIHRoZSBwdWJsaWMga2V5LlxuICAgICAgdmFyIGQgPSBrZXlJbnRlZ2Vyc1syXS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBwID0ga2V5SW50ZWdlcnNbM10udG9CaWdJbnRlZ2VyKCk7XG4gICAgICB2YXIgcSA9IGtleUludGVnZXJzWzRdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgdmFyIHUgPSBrZXlJbnRlZ2Vyc1s1XS50b0JpZ0ludGVnZXIoKTtcbiAgICAgIHZhciBtID0gZGF0YUludGVnZXJzWzBdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgcmV0dXJuIHJzYS5kZWNyeXB0KG0sIGQsIHAsIHEsIHUpO1xuICAgIGNhc2UgJ2VsZ2FtYWwnOlxuICAgICAgdmFyIGVsZ2FtYWwgPSBuZXcgcHVibGljS2V5LmVsZ2FtYWwoKTtcbiAgICAgIHZhciB4ID0ga2V5SW50ZWdlcnNbM10udG9CaWdJbnRlZ2VyKCk7XG4gICAgICB2YXIgYzEgPSBkYXRhSW50ZWdlcnNbMF0udG9CaWdJbnRlZ2VyKCk7XG4gICAgICB2YXIgYzIgPSBkYXRhSW50ZWdlcnNbMV0udG9CaWdJbnRlZ2VyKCk7XG4gICAgICB2YXIgcCA9IGtleUludGVnZXJzWzBdLnRvQmlnSW50ZWdlcigpO1xuICAgICAgcmV0dXJuIGVsZ2FtYWwuZGVjcnlwdChjMSxjMixwLHgpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyB0eXBlX21waSgpO1xuICByZXN1bHQuZnJvbUJpZ0ludGVnZXIoYm4pO1xuICByZXR1cm4gcmVzdWx0O1xufSxcblxuLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiBpbnRlZ2VycyBjb21wcmlzaW5nIHRoZSBwcml2YXRlIGtleSBvZiBhbiBhbGdvcml0aG1cbiAqIEBwYXJhbSB7b3BlbnBncC5wdWJsaWNrZXl9IGFsZ28gVGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgbnVtYmVyIG9mIGludGVnZXJzLlxuICovXG5nZXRQcml2YXRlTXBpQ291bnQ6IGZ1bmN0aW9uKGFsZ28pIHtcbiAgc3dpdGNoKGFsZ28pIHtcbiAgICBjYXNlICdyc2FfZW5jcnlwdCc6XG4gICAgY2FzZSAncnNhX2VuY3J5cHRfc2lnbic6XG4gICAgY2FzZSAncnNhX3NpZ24nOlxuICAgIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgUlNBIHNlY3JldCBrZXlzOlxuICAgIC8vICAgLSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VyIChNUEkpIG9mIFJTQSBzZWNyZXQgZXhwb25lbnQgZC5cbiAgICAvLyAgIC0gTVBJIG9mIFJTQSBzZWNyZXQgcHJpbWUgdmFsdWUgcC5cbiAgICAvLyAgIC0gTVBJIG9mIFJTQSBzZWNyZXQgcHJpbWUgdmFsdWUgcSAocCA8IHEpLlxuICAgIC8vICAgLSBNUEkgb2YgdSwgdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2Ugb2YgcCwgbW9kIHEuXG4gICAgcmV0dXJuIDQ7XG4gIGNhc2UgJ2VsZ2FtYWwnOlxuICAgIC8vIEFsZ29yaXRobS1TcGVjaWZpYyBGaWVsZHMgZm9yIEVsZ2FtYWwgc2VjcmV0IGtleXM6XG4gICAgLy8gICAtIE1QSSBvZiBFbGdhbWFsIHNlY3JldCBleHBvbmVudCB4LlxuICAgIHJldHVybiAxO1xuICBjYXNlICdkc2EnOlxuICAgIC8vIEFsZ29yaXRobS1TcGVjaWZpYyBGaWVsZHMgZm9yIERTQSBzZWNyZXQga2V5czpcbiAgICAvLyAgIC0gTVBJIG9mIERTQSBzZWNyZXQgZXhwb25lbnQgeC5cbiAgICByZXR1cm4gMTtcbiAgZGVmYXVsdDpcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYWxnb3JpdGhtJyk7XG4gIH1cbn0sXG4gIFxuZ2V0UHVibGljTXBpQ291bnQ6IGZ1bmN0aW9uKGFsZ28pIHtcbiAgLy8gLSBBIHNlcmllcyBvZiBtdWx0aXByZWNpc2lvbiBpbnRlZ2VycyBjb21wcmlzaW5nIHRoZSBrZXkgbWF0ZXJpYWw6XG4gIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgUlNBIHB1YmxpYyBrZXlzOlxuICAvLyAgICAgICAtIGEgbXVsdGlwcmVjaXNpb24gaW50ZWdlciAoTVBJKSBvZiBSU0EgcHVibGljIG1vZHVsdXMgbjtcbiAgLy8gICAgICAgLSBhbiBNUEkgb2YgUlNBIHB1YmxpYyBlbmNyeXB0aW9uIGV4cG9uZW50IGUuXG4gIHN3aXRjaChhbGdvKSB7XG4gICAgY2FzZSAncnNhX2VuY3J5cHQnOlxuICAgIGNhc2UgJ3JzYV9lbmNyeXB0X3NpZ24nOlxuICAgIGNhc2UgJ3JzYV9zaWduJzpcbiAgICByZXR1cm4gMjtcblxuICAvLyAgIEFsZ29yaXRobS1TcGVjaWZpYyBGaWVsZHMgZm9yIEVsZ2FtYWwgcHVibGljIGtleXM6XG4gIC8vICAgICAtIE1QSSBvZiBFbGdhbWFsIHByaW1lIHA7XG4gIC8vICAgICAtIE1QSSBvZiBFbGdhbWFsIGdyb3VwIGdlbmVyYXRvciBnO1xuICAvLyAgICAgLSBNUEkgb2YgRWxnYW1hbCBwdWJsaWMga2V5IHZhbHVlIHkgKD0gZyoqeCBtb2QgcCB3aGVyZSB4ICBpcyBzZWNyZXQpLlxuICAgIGNhc2UgJ2VsZ2FtYWwnOlxuICAgIHJldHVybiAzO1xuXG4gIC8vICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRFNBIHB1YmxpYyBrZXlzOlxuICAvLyAgICAgICAtIE1QSSBvZiBEU0EgcHJpbWUgcDtcbiAgLy8gICAgICAgLSBNUEkgb2YgRFNBIGdyb3VwIG9yZGVyIHEgKHEgaXMgYSBwcmltZSBkaXZpc29yIG9mIHAtMSk7XG4gIC8vICAgICAgIC0gTVBJIG9mIERTQSBncm91cCBnZW5lcmF0b3IgZztcbiAgLy8gICAgICAgLSBNUEkgb2YgRFNBIHB1YmxpYy1rZXkgdmFsdWUgeSAoPSBnKip4IG1vZCBwIHdoZXJlIHggIGlzIHNlY3JldCkuXG4gICAgY2FzZSAnZHNhJzpcbiAgICByZXR1cm4gNDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYWxnb3JpdGhtLicpO1xuICB9XG59LFxuXG5cbi8qKlxuICogZ2VuZXJhdGUgcmFuZG9tIGJ5dGUgcHJlZml4IGFzIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBhbGdvcml0aG1cbiAqIEBwYXJhbSB7SW50ZWdlcn0gYWxnbyBBbGdvcml0aG0gdG8gdXNlIChzZWUgUkZDNDg4MCA5LjIpXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFJhbmRvbSBieXRlcyB3aXRoIGxlbmd0aCBlcXVhbCB0byB0aGUgYmxvY2tcbiAqIHNpemUgb2YgdGhlIGNpcGhlclxuICovXG5nZXRQcmVmaXhSYW5kb206IGZ1bmN0aW9uKGFsZ28pIHtcbiAgcmV0dXJuIHJhbmRvbS5nZXRSYW5kb21CeXRlcyhjaXBoZXJbYWxnb10uYmxvY2tTaXplKTtcbn0sXG5cbi8qKlxuICogR2VuZXJhdGluZyBhIHNlc3Npb24ga2V5IGZvciB0aGUgc3BlY2lmaWVkIHN5bW1ldHJpYyBhbGdvcml0aG1cbiAqIEBwYXJhbSB7SW50ZWdlcn0gYWxnbyBBbGdvcml0aG0gdG8gdXNlIChzZWUgUkZDNDg4MCA5LjIpXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFJhbmRvbSBieXRlcyBhcyBhIHN0cmluZyB0byBiZSB1c2VkIGFzIGEga2V5XG4gKi9cbmdlbmVyYXRlU2Vzc2lvbktleTogZnVuY3Rpb24oYWxnbykge1xuICByZXR1cm4gcmFuZG9tLmdldFJhbmRvbUJ5dGVzKGNpcGhlclthbGdvXS5rZXlTaXplKTsgXG59LFxuXG59O1xuIiwiXG52YXIgc2hhID0gcmVxdWlyZSgnLi9zaGEuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdG1kNTogcmVxdWlyZSgnLi9tZDUuanMnKSxcblx0c2hhMTogc2hhLnNoYTEsXG5cdHNoYTI1Njogc2hhLnNoYTI1Nixcblx0c2hhMjI0OiBzaGEuc2hhMjI0LFxuXHRzaGEzODQ6IHNoYS5zaGEzODQsXG5cdHNoYTUxMjogc2hhLnNoYTUxMixcblx0cmlwZW1kOiByZXF1aXJlKCcuL3JpcGUtbWQuanMnKSxcblxuXHQvKipcblx0ICogQ3JlYXRlIGEgaGFzaCBvbiB0aGUgc3BlY2lmaWVkIGRhdGEgdXNpbmcgdGhlIHNwZWNpZmllZCBhbGdvcml0aG1cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBhbGdvIEhhc2ggYWxnb3JpdGhtIHR5cGUgKHNlZSBSRkM0ODgwIDkuNClcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgRGF0YSB0byBiZSBoYXNoZWRcblx0ICogQHJldHVybiB7U3RyaW5nfSBoYXNoIHZhbHVlXG5cdCAqL1xuXHRkaWdlc3Q6IGZ1bmN0aW9uKGFsZ28sIGRhdGEpIHtcblx0XHRzd2l0Y2goYWxnbykge1xuXHRcdGNhc2UgMTogLy8gLSBNRDUgW0hBQ11cblx0XHRcdHJldHVybiB0aGlzLm1kNShkYXRhKTtcblx0XHRjYXNlIDI6IC8vIC0gU0hBLTEgW0ZJUFMxODBdXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGExKGRhdGEpO1xuXHRcdGNhc2UgMzogLy8gLSBSSVBFLU1ELzE2MCBbSEFDXVxuXHRcdFx0cmV0dXJuIHRoaXMucmlwZW1kKGRhdGEpO1xuXHRcdGNhc2UgODogLy8gLSBTSEEyNTYgW0ZJUFMxODBdXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGEyNTYoZGF0YSk7XG5cdFx0Y2FzZSA5OiAvLyAtIFNIQTM4NCBbRklQUzE4MF1cblx0XHRcdHJldHVybiB0aGlzLnNoYTM4NChkYXRhKTtcblx0XHRjYXNlIDEwOi8vIC0gU0hBNTEyIFtGSVBTMTgwXVxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhNTEyKGRhdGEpO1xuXHRcdGNhc2UgMTE6Ly8gLSBTSEEyMjQgW0ZJUFMxODBdXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGEyMjQoZGF0YSk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoYXNoIGZ1bmN0aW9uLicpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaGFzaCBzaXplIGluIGJ5dGVzIG9mIHRoZSBzcGVjaWZpZWQgaGFzaCBhbGdvcml0aG0gdHlwZVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGFsZ28gSGFzaCBhbGdvcml0aG0gdHlwZSAoU2VlIFJGQzQ4ODAgOS40KVxuXHQgKiBAcmV0dXJuIHtJbnRlZ2VyfSBTaXplIGluIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgaGFzaFxuXHQgKi9cblx0Z2V0SGFzaEJ5dGVMZW5ndGg6IGZ1bmN0aW9uKGFsZ28pIHtcblx0XHRzd2l0Y2goYWxnbykge1xuXHRcdGNhc2UgMTogLy8gLSBNRDUgW0hBQ11cblx0XHRcdHJldHVybiAxNjtcblx0XHRjYXNlIDI6IC8vIC0gU0hBLTEgW0ZJUFMxODBdXG5cdFx0Y2FzZSAzOiAvLyAtIFJJUEUtTUQvMTYwIFtIQUNdXG5cdFx0XHRyZXR1cm4gMjA7XG5cdFx0Y2FzZSA4OiAvLyAtIFNIQTI1NiBbRklQUzE4MF1cblx0XHRcdHJldHVybiAzMjtcblx0XHRjYXNlIDk6IC8vIC0gU0hBMzg0IFtGSVBTMTgwXVxuXHRcdFx0cmV0dXJuIDQ4XG5cdFx0Y2FzZSAxMDovLyAtIFNIQTUxMiBbRklQUzE4MF1cblx0XHRcdHJldHVybiA2NDtcblx0XHRjYXNlIDExOi8vIC0gU0hBMjI0IFtGSVBTMTgwXVxuXHRcdFx0cmV0dXJuIDI4O1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaGFzaCBhbGdvcml0aG0uJyk7XG5cdFx0fVxuXHR9XG5cbn1cblxuIiwiLyoqXG4gKiBBIGZhc3QgTUQ1IEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb25cbiAqIENvcHlyaWdodCAoYykgMjAxMiBKb3NlcGggTXllcnNcbiAqIGh0dHA6Ly93d3cubXllcnNkYWlseS5vcmcvam9zZXBoL2phdmFzY3JpcHQvbWQ1LXRleHQuaHRtbFxuICpcbiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmVcbiAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2VzIGFuZCB3aXRob3V0XG4gKiBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQgcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2VcbiAqIGFwcGVhcnMgaW4gYWxsIGNvcGllcy5cbiAqXG4gKiBPZiBjb3Vyc2UsIHRoaXMgc29mdCBpcyBwcm92aWRlZCBcImFzIGlzXCIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWRcbiAqIHdhcnJhbnR5IG9mIGFueSBraW5kLlxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsLmpzJyk7XG5cbmZ1bmN0aW9uIE1ENShlbnRyZWUpIHtcblx0dmFyIGhleCA9IG1kNShlbnRyZWUpO1xuXHR2YXIgYmluID0gdXRpbC5oZXgyYmluKGhleCk7XG5cdHJldHVybiBiaW47XG59XG5cbmZ1bmN0aW9uIG1kNWN5Y2xlKHgsIGspIHtcbnZhciBhID0geFswXSwgYiA9IHhbMV0sIGMgPSB4WzJdLCBkID0geFszXTtcblxuYSA9IGZmKGEsIGIsIGMsIGQsIGtbMF0sIDcsIC02ODA4NzY5MzYpO1xuZCA9IGZmKGQsIGEsIGIsIGMsIGtbMV0sIDEyLCAtMzg5NTY0NTg2KTtcbmMgPSBmZihjLCBkLCBhLCBiLCBrWzJdLCAxNywgIDYwNjEwNTgxOSk7XG5iID0gZmYoYiwgYywgZCwgYSwga1szXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbmEgPSBmZihhLCBiLCBjLCBkLCBrWzRdLCA3LCAtMTc2NDE4ODk3KTtcbmQgPSBmZihkLCBhLCBiLCBjLCBrWzVdLCAxMiwgIDEyMDAwODA0MjYpO1xuYyA9IGZmKGMsIGQsIGEsIGIsIGtbNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG5iID0gZmYoYiwgYywgZCwgYSwga1s3XSwgMjIsIC00NTcwNTk4Myk7XG5hID0gZmYoYSwgYiwgYywgZCwga1s4XSwgNywgIDE3NzAwMzU0MTYpO1xuZCA9IGZmKGQsIGEsIGIsIGMsIGtbOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG5jID0gZmYoYywgZCwgYSwgYiwga1sxMF0sIDE3LCAtNDIwNjMpO1xuYiA9IGZmKGIsIGMsIGQsIGEsIGtbMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuYSA9IGZmKGEsIGIsIGMsIGQsIGtbMTJdLCA3LCAgMTgwNDYwMzY4Mik7XG5kID0gZmYoZCwgYSwgYiwgYywga1sxM10sIDEyLCAtNDAzNDExMDEpO1xuYyA9IGZmKGMsIGQsIGEsIGIsIGtbMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuYiA9IGZmKGIsIGMsIGQsIGEsIGtbMTVdLCAyMiwgIDEyMzY1MzUzMjkpO1xuXG5hID0gZ2coYSwgYiwgYywgZCwga1sxXSwgNSwgLTE2NTc5NjUxMCk7XG5kID0gZ2coZCwgYSwgYiwgYywga1s2XSwgOSwgLTEwNjk1MDE2MzIpO1xuYyA9IGdnKGMsIGQsIGEsIGIsIGtbMTFdLCAxNCwgIDY0MzcxNzcxMyk7XG5iID0gZ2coYiwgYywgZCwgYSwga1swXSwgMjAsIC0zNzM4OTczMDIpO1xuYSA9IGdnKGEsIGIsIGMsIGQsIGtbNV0sIDUsIC03MDE1NTg2OTEpO1xuZCA9IGdnKGQsIGEsIGIsIGMsIGtbMTBdLCA5LCAgMzgwMTYwODMpO1xuYyA9IGdnKGMsIGQsIGEsIGIsIGtbMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG5iID0gZ2coYiwgYywgZCwgYSwga1s0XSwgMjAsIC00MDU1Mzc4NDgpO1xuYSA9IGdnKGEsIGIsIGMsIGQsIGtbOV0sIDUsICA1Njg0NDY0MzgpO1xuZCA9IGdnKGQsIGEsIGIsIGMsIGtbMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG5jID0gZ2coYywgZCwgYSwgYiwga1szXSwgMTQsIC0xODczNjM5NjEpO1xuYiA9IGdnKGIsIGMsIGQsIGEsIGtbOF0sIDIwLCAgMTE2MzUzMTUwMSk7XG5hID0gZ2coYSwgYiwgYywgZCwga1sxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbmQgPSBnZyhkLCBhLCBiLCBjLCBrWzJdLCA5LCAtNTE0MDM3ODQpO1xuYyA9IGdnKGMsIGQsIGEsIGIsIGtbN10sIDE0LCAgMTczNTMyODQ3Myk7XG5iID0gZ2coYiwgYywgZCwgYSwga1sxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG5cbmEgPSBoaChhLCBiLCBjLCBkLCBrWzVdLCA0LCAtMzc4NTU4KTtcbmQgPSBoaChkLCBhLCBiLCBjLCBrWzhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuYyA9IGhoKGMsIGQsIGEsIGIsIGtbMTFdLCAxNiwgIDE4MzkwMzA1NjIpO1xuYiA9IGhoKGIsIGMsIGQsIGEsIGtbMTRdLCAyMywgLTM1MzA5NTU2KTtcbmEgPSBoaChhLCBiLCBjLCBkLCBrWzFdLCA0LCAtMTUzMDk5MjA2MCk7XG5kID0gaGgoZCwgYSwgYiwgYywga1s0XSwgMTEsICAxMjcyODkzMzUzKTtcbmMgPSBoaChjLCBkLCBhLCBiLCBrWzddLCAxNiwgLTE1NTQ5NzYzMik7XG5iID0gaGgoYiwgYywgZCwgYSwga1sxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG5hID0gaGgoYSwgYiwgYywgZCwga1sxM10sIDQsICA2ODEyNzkxNzQpO1xuZCA9IGhoKGQsIGEsIGIsIGMsIGtbMF0sIDExLCAtMzU4NTM3MjIyKTtcbmMgPSBoaChjLCBkLCBhLCBiLCBrWzNdLCAxNiwgLTcyMjUyMTk3OSk7XG5iID0gaGgoYiwgYywgZCwgYSwga1s2XSwgMjMsICA3NjAyOTE4OSk7XG5hID0gaGgoYSwgYiwgYywgZCwga1s5XSwgNCwgLTY0MDM2NDQ4Nyk7XG5kID0gaGgoZCwgYSwgYiwgYywga1sxMl0sIDExLCAtNDIxODE1ODM1KTtcbmMgPSBoaChjLCBkLCBhLCBiLCBrWzE1XSwgMTYsICA1MzA3NDI1MjApO1xuYiA9IGhoKGIsIGMsIGQsIGEsIGtbMl0sIDIzLCAtOTk1MzM4NjUxKTtcblxuYSA9IGlpKGEsIGIsIGMsIGQsIGtbMF0sIDYsIC0xOTg2MzA4NDQpO1xuZCA9IGlpKGQsIGEsIGIsIGMsIGtbN10sIDEwLCAgMTEyNjg5MTQxNSk7XG5jID0gaWkoYywgZCwgYSwgYiwga1sxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG5iID0gaWkoYiwgYywgZCwgYSwga1s1XSwgMjEsIC01NzQzNDA1NSk7XG5hID0gaWkoYSwgYiwgYywgZCwga1sxMl0sIDYsICAxNzAwNDg1NTcxKTtcbmQgPSBpaShkLCBhLCBiLCBjLCBrWzNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuYyA9IGlpKGMsIGQsIGEsIGIsIGtbMTBdLCAxNSwgLTEwNTE1MjMpO1xuYiA9IGlpKGIsIGMsIGQsIGEsIGtbMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG5hID0gaWkoYSwgYiwgYywgZCwga1s4XSwgNiwgIDE4NzMzMTMzNTkpO1xuZCA9IGlpKGQsIGEsIGIsIGMsIGtbMTVdLCAxMCwgLTMwNjExNzQ0KTtcbmMgPSBpaShjLCBkLCBhLCBiLCBrWzZdLCAxNSwgLTE1NjAxOTgzODApO1xuYiA9IGlpKGIsIGMsIGQsIGEsIGtbMTNdLCAyMSwgIDEzMDkxNTE2NDkpO1xuYSA9IGlpKGEsIGIsIGMsIGQsIGtbNF0sIDYsIC0xNDU1MjMwNzApO1xuZCA9IGlpKGQsIGEsIGIsIGMsIGtbMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuYyA9IGlpKGMsIGQsIGEsIGIsIGtbMl0sIDE1LCAgNzE4Nzg3MjU5KTtcbmIgPSBpaShiLCBjLCBkLCBhLCBrWzldLCAyMSwgLTM0MzQ4NTU1MSk7XG5cbnhbMF0gPSBhZGQzMihhLCB4WzBdKTtcbnhbMV0gPSBhZGQzMihiLCB4WzFdKTtcbnhbMl0gPSBhZGQzMihjLCB4WzJdKTtcbnhbM10gPSBhZGQzMihkLCB4WzNdKTtcblxufVxuXG5mdW5jdGlvbiBjbW4ocSwgYSwgYiwgeCwgcywgdCkge1xuYSA9IGFkZDMyKGFkZDMyKGEsIHEpLCBhZGQzMih4LCB0KSk7XG5yZXR1cm4gYWRkMzIoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcbn1cblxuZnVuY3Rpb24gZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xucmV0dXJuIGNtbigoYiAmIGMpIHwgKCh+YikgJiBkKSwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIGdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbnJldHVybiBjbW4oKGIgJiBkKSB8IChjICYgKH5kKSksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBoaChhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG5yZXR1cm4gY21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIGlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbnJldHVybiBjbW4oYyBeIChiIHwgKH5kKSksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDUxKHMpIHtcbnR4dCA9ICcnO1xudmFyIG4gPSBzLmxlbmd0aCxcbnN0YXRlID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdLCBpO1xuZm9yIChpPTY0OyBpPD1zLmxlbmd0aDsgaSs9NjQpIHtcbm1kNWN5Y2xlKHN0YXRlLCBtZDVibGsocy5zdWJzdHJpbmcoaS02NCwgaSkpKTtcbn1cbnMgPSBzLnN1YnN0cmluZyhpLTY0KTtcbnZhciB0YWlsID0gWzAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDBdO1xuZm9yIChpPTA7IGk8cy5sZW5ndGg7IGkrKylcbnRhaWxbaT4+Ml0gfD0gcy5jaGFyQ29kZUF0KGkpIDw8ICgoaSU0KSA8PCAzKTtcbnRhaWxbaT4+Ml0gfD0gMHg4MCA8PCAoKGklNCkgPDwgMyk7XG5pZiAoaSA+IDU1KSB7XG5tZDVjeWNsZShzdGF0ZSwgdGFpbCk7XG5mb3IgKGk9MDsgaTwxNjsgaSsrKSB0YWlsW2ldID0gMDtcbn1cbnRhaWxbMTRdID0gbio4O1xubWQ1Y3ljbGUoc3RhdGUsIHRhaWwpO1xucmV0dXJuIHN0YXRlO1xufVxuXG4vKiB0aGVyZSBuZWVkcyB0byBiZSBzdXBwb3J0IGZvciBVbmljb2RlIGhlcmUsXG4gKiB1bmxlc3Mgd2UgcHJldGVuZCB0aGF0IHdlIGNhbiByZWRlZmluZSB0aGUgTUQtNVxuICogYWxnb3JpdGhtIGZvciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgKHBlcmhhcHNcbiAqIGJ5IGFkZGluZyBldmVyeSBmb3VyIDE2LWJpdCBjaGFyYWN0ZXJzIGFuZFxuICogc2hvcnRlbmluZyB0aGUgc3VtIHRvIDMyIGJpdHMpLiBPdGhlcndpc2VcbiAqIEkgc3VnZ2VzdCBwZXJmb3JtaW5nIE1ELTUgYXMgaWYgZXZlcnkgY2hhcmFjdGVyXG4gKiB3YXMgdHdvIGJ5dGVzLS1lLmcuLCAwMDQwIDAwMjUgPSBAJS0tYnV0IHRoZW5cbiAqIGhvdyB3aWxsIGFuIG9yZGluYXJ5IE1ELTUgc3VtIGJlIG1hdGNoZWQ/XG4gKiBUaGVyZSBpcyBubyB3YXkgdG8gc3RhbmRhcmRpemUgdGV4dCB0byBzb21ldGhpbmdcbiAqIGxpa2UgVVRGLTggYmVmb3JlIHRyYW5zZm9ybWF0aW9uOyBzcGVlZCBjb3N0IGlzXG4gKiB1dHRlcmx5IHByb2hpYml0aXZlLiBUaGUgSmF2YVNjcmlwdCBzdGFuZGFyZFxuICogaXRzZWxmIG5lZWRzIHRvIGxvb2sgYXQgdGhpczogaXQgc2hvdWxkIHN0YXJ0XG4gKiBwcm92aWRpbmcgYWNjZXNzIHRvIHN0cmluZ3MgYXMgcHJlZm9ybWVkIFVURi04XG4gKiA4LWJpdCB1bnNpZ25lZCB2YWx1ZSBhcnJheXMuXG4gKi9cbmZ1bmN0aW9uIG1kNWJsayhzKSB7IC8qIEkgZmlndXJlZCBnbG9iYWwgd2FzIGZhc3Rlci4gICAqL1xudmFyIG1kNWJsa3MgPSBbXSwgaTsgLyogQW5keSBLaW5nIHNhaWQgZG8gaXQgdGhpcyB3YXkuICovXG5mb3IgKGk9MDsgaTw2NDsgaSs9NCkge1xubWQ1Ymxrc1tpPj4yXSA9IHMuY2hhckNvZGVBdChpKVxuKyAocy5jaGFyQ29kZUF0KGkrMSkgPDwgOClcbisgKHMuY2hhckNvZGVBdChpKzIpIDw8IDE2KVxuKyAocy5jaGFyQ29kZUF0KGkrMykgPDwgMjQpO1xufVxucmV0dXJuIG1kNWJsa3M7XG59XG5cbnZhciBoZXhfY2hyID0gJzAxMjM0NTY3ODlhYmNkZWYnLnNwbGl0KCcnKTtcblxuZnVuY3Rpb24gcmhleChuKVxue1xudmFyIHM9JycsIGo9MDtcbmZvcig7IGo8NDsgaisrKVxucyArPSBoZXhfY2hyWyhuID4+IChqICogOCArIDQpKSAmIDB4MEZdXG4rIGhleF9jaHJbKG4gPj4gKGogKiA4KSkgJiAweDBGXTtcbnJldHVybiBzO1xufVxuXG5mdW5jdGlvbiBoZXgoeCkge1xuZm9yICh2YXIgaT0wOyBpPHgubGVuZ3RoOyBpKyspXG54W2ldID0gcmhleCh4W2ldKTtcbnJldHVybiB4LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBtZDUocykge1xucmV0dXJuIGhleChtZDUxKHMpKTtcbn1cblxuLyogdGhpcyBmdW5jdGlvbiBpcyBtdWNoIGZhc3RlcixcbnNvIGlmIHBvc3NpYmxlIHdlIHVzZSBpdC4gU29tZSBJRXNcbmFyZSB0aGUgb25seSBvbmVzIEkga25vdyBvZiB0aGF0XG5uZWVkIHRoZSBpZGlvdGljIHNlY29uZCBmdW5jdGlvbixcbmdlbmVyYXRlZCBieSBhbiBpZiBjbGF1c2UuICAqL1xuXG5mdW5jdGlvbiBhZGQzMihhLCBiKSB7XG5yZXR1cm4gKGEgKyBiKSAmIDB4RkZGRkZGRkY7XG59XG5cbmlmIChtZDUoJ2hlbGxvJykgIT0gJzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJykge1xuZnVuY3Rpb24gYWRkMzIoeCwgeSkge1xudmFyIGxzdyA9ICh4ICYgMHhGRkZGKSArICh5ICYgMHhGRkZGKSxcbm1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xucmV0dXJuIChtc3cgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG59XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTUQ1XG4iLCIvKlxuICogQ3J5cHRvTVggVG9vbHNcbiAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDYgRGVyZWsgQnVpdGVuaHVpc1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMlxuICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLlxuICovXG5cbi8qIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSFxuICovXG5cbnZhciBSTURzaXplICAgPSAxNjA7XG52YXIgWCA9IG5ldyBBcnJheSgpO1xuXG5mdW5jdGlvbiBST0woeCwgbilcbntcbiAgcmV0dXJuIG5ldyBOdW1iZXIgKCh4IDw8IG4pIHwgKCB4ID4+PiAoMzIgLSBuKSkpO1xufVxuXG5mdW5jdGlvbiBGKHgsIHksIHopXG57XG4gIHJldHVybiBuZXcgTnVtYmVyKHggXiB5IF4geik7XG59XG5cbmZ1bmN0aW9uIEcoeCwgeSwgeilcbntcbiAgcmV0dXJuIG5ldyBOdW1iZXIoKHggJiB5KSB8ICh+eCAmIHopKTtcbn1cblxuZnVuY3Rpb24gSCh4LCB5LCB6KVxue1xuICByZXR1cm4gbmV3IE51bWJlcigoeCB8IH55KSBeIHopO1xufVxuXG5mdW5jdGlvbiBJKHgsIHksIHopXG57XG4gIHJldHVybiBuZXcgTnVtYmVyKCh4ICYgeikgfCAoeSAmIH56KSk7XG59XG5cbmZ1bmN0aW9uIEooeCwgeSwgeilcbntcbiAgcmV0dXJuIG5ldyBOdW1iZXIoeCBeICh5IHwgfnopKTtcbn1cblxuZnVuY3Rpb24gbWl4T25lUm91bmQoYSwgYiwgYywgZCwgZSwgeCwgcywgcm91bmROdW1iZXIpXG57XG4gIHN3aXRjaCAocm91bmROdW1iZXIpXG4gIHtcbiAgICBjYXNlIDAgOiBhICs9IEYoYiwgYywgZCkgKyB4ICsgMHgwMDAwMDAwMDsgYnJlYWs7XG4gICAgY2FzZSAxIDogYSArPSBHKGIsIGMsIGQpICsgeCArIDB4NWE4Mjc5OTk7IGJyZWFrO1xuICAgIGNhc2UgMiA6IGEgKz0gSChiLCBjLCBkKSArIHggKyAweDZlZDllYmExOyBicmVhaztcbiAgICBjYXNlIDMgOiBhICs9IEkoYiwgYywgZCkgKyB4ICsgMHg4ZjFiYmNkYzsgYnJlYWs7XG4gICAgY2FzZSA0IDogYSArPSBKKGIsIGMsIGQpICsgeCArIDB4YTk1M2ZkNGU7IGJyZWFrO1xuICAgIGNhc2UgNSA6IGEgKz0gSihiLCBjLCBkKSArIHggKyAweDUwYTI4YmU2OyBicmVhaztcbiAgICBjYXNlIDYgOiBhICs9IEkoYiwgYywgZCkgKyB4ICsgMHg1YzRkZDEyNDsgYnJlYWs7XG4gICAgY2FzZSA3IDogYSArPSBIKGIsIGMsIGQpICsgeCArIDB4NmQ3MDNlZjM7IGJyZWFrO1xuICAgIGNhc2UgOCA6IGEgKz0gRyhiLCBjLCBkKSArIHggKyAweDdhNmQ3NmU5OyBicmVhaztcbiAgICBjYXNlIDkgOiBhICs9IEYoYiwgYywgZCkgKyB4ICsgMHgwMDAwMDAwMDsgYnJlYWs7XG4gICAgXG4gICAgZGVmYXVsdCA6IGRvY3VtZW50LndyaXRlKFwiQm9ndXMgcm91bmQgbnVtYmVyXCIpOyBicmVhaztcbiAgfSAgXG4gIFxuICBhID0gUk9MKGEsIHMpICsgZTtcbiAgYyA9IFJPTChjLCAxMCk7XG5cbiAgYSAmPSAweGZmZmZmZmZmO1xuICBiICY9IDB4ZmZmZmZmZmY7XG4gIGMgJj0gMHhmZmZmZmZmZjtcbiAgZCAmPSAweGZmZmZmZmZmO1xuICBlICY9IDB4ZmZmZmZmZmY7XG5cbiAgdmFyIHJldEJsb2NrID0gbmV3IEFycmF5KCk7XG4gIHJldEJsb2NrWzBdID0gYTtcbiAgcmV0QmxvY2tbMV0gPSBiO1xuICByZXRCbG9ja1syXSA9IGM7XG4gIHJldEJsb2NrWzNdID0gZDtcbiAgcmV0QmxvY2tbNF0gPSBlO1xuICByZXRCbG9ja1s1XSA9IHg7XG4gIHJldEJsb2NrWzZdID0gcztcblxuICByZXR1cm4gcmV0QmxvY2s7XG59XG5cbmZ1bmN0aW9uIE1EaW5pdCAoTURidWYpXG57XG4gIE1EYnVmWzBdID0gMHg2NzQ1MjMwMTtcbiAgTURidWZbMV0gPSAweGVmY2RhYjg5O1xuICBNRGJ1ZlsyXSA9IDB4OThiYWRjZmU7XG4gIE1EYnVmWzNdID0gMHgxMDMyNTQ3NjtcbiAgTURidWZbNF0gPSAweGMzZDJlMWYwO1xufVxuXG52YXIgUk9McyA9IFtcbiAgWzExLCAxNCwgMTUsIDEyLCAgNSwgIDgsICA3LCAgOSwgMTEsIDEzLCAxNCwgMTUsICA2LCAgNywgIDksICA4XSxcbiAgWyA3LCAgNiwgIDgsIDEzLCAxMSwgIDksICA3LCAxNSwgIDcsIDEyLCAxNSwgIDksIDExLCAgNywgMTMsIDEyXSxcbiAgWzExLCAxMywgIDYsICA3LCAxNCwgIDksIDEzLCAxNSwgMTQsICA4LCAxMywgIDYsICA1LCAxMiwgIDcsICA1XSxcbiAgWzExLCAxMiwgMTQsIDE1LCAxNCwgMTUsICA5LCAgOCwgIDksIDE0LCAgNSwgIDYsICA4LCAgNiwgIDUsIDEyXSxcbiAgWyA5LCAxNSwgIDUsIDExLCAgNiwgIDgsIDEzLCAxMiwgIDUsIDEyLCAxMywgMTQsIDExLCAgOCwgIDUsICA2XSxcbiAgWyA4LCAgOSwgIDksIDExLCAxMywgMTUsIDE1LCAgNSwgIDcsICA3LCAgOCwgMTEsIDE0LCAxNCwgMTIsICA2XSxcbiAgWyA5LCAxMywgMTUsICA3LCAxMiwgIDgsICA5LCAxMSwgIDcsICA3LCAxMiwgIDcsICA2LCAxNSwgMTMsIDExXSxcbiAgWyA5LCAgNywgMTUsIDExLCAgOCwgIDYsICA2LCAxNCwgMTIsIDEzLCAgNSwgMTQsIDEzLCAxMywgIDcsICA1XSxcbiAgWzE1LCAgNSwgIDgsIDExLCAxNCwgMTQsICA2LCAxNCwgIDYsICA5LCAxMiwgIDksIDEyLCAgNSwgMTUsICA4XSxcbiAgWyA4LCAgNSwgMTIsICA5LCAxMiwgIDUsIDE0LCAgNiwgIDgsIDEzLCAgNiwgIDUsIDE1LCAxMywgMTEsIDExXVxuXTtcblxudmFyIGluZGV4ZXMgPSBbXG4gIFsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNV0sXG4gIFsgNywgIDQsIDEzLCAgMSwgMTAsICA2LCAxNSwgIDMsIDEyLCAgMCwgIDksICA1LCAgMiwgMTQsIDExLCAgOF0sXG4gIFsgMywgMTAsIDE0LCAgNCwgIDksIDE1LCAgOCwgIDEsICAyLCAgNywgIDAsICA2LCAxMywgMTEsICA1LCAxMl0sXG4gIFsgMSwgIDksIDExLCAxMCwgIDAsICA4LCAxMiwgIDQsIDEzLCAgMywgIDcsIDE1LCAxNCwgIDUsICA2LCAgMl0sXG4gIFsgNCwgIDAsICA1LCAgOSwgIDcsIDEyLCAgMiwgMTAsIDE0LCAgMSwgIDMsICA4LCAxMSwgIDYsIDE1LCAxM10sXG4gIFsgNSwgMTQsICA3LCAgMCwgIDksICAyLCAxMSwgIDQsIDEzLCAgNiwgMTUsICA4LCAgMSwgMTAsICAzLCAxMl0sXG4gIFsgNiwgMTEsICAzLCAgNywgIDAsIDEzLCAgNSwgMTAsIDE0LCAxNSwgIDgsIDEyLCAgNCwgIDksICAxLCAgMl0sXG4gIFsxNSwgIDUsICAxLCAgMywgIDcsIDE0LCAgNiwgIDksIDExLCAgOCwgMTIsICAyLCAxMCwgIDAsICA0LCAxM10sXG4gIFsgOCwgIDYsICA0LCAgMSwgIDMsIDExLCAxNSwgIDAsICA1LCAxMiwgIDIsIDEzLCAgOSwgIDcsIDEwLCAxNF0sXG4gIFsxMiwgMTUsIDEwLCAgNCwgIDEsICA1LCAgOCwgIDcsICA2LCAgMiwgMTMsIDE0LCAgMCwgIDMsICA5LCAxMV1cbl07XG5cbmZ1bmN0aW9uIGNvbXByZXNzIChNRGJ1ZiwgWClcbntcbiAgYmxvY2tBID0gbmV3IEFycmF5KCk7XG4gIGJsb2NrQiA9IG5ldyBBcnJheSgpO1xuXG4gIHZhciByZXRCbG9jaztcblxuICBmb3IgKHZhciBpPTA7IGkgPCA1OyBpKyspXG4gIHtcbiAgICBibG9ja0FbaV0gPSBuZXcgTnVtYmVyKE1EYnVmW2ldKTtcbiAgICBibG9ja0JbaV0gPSBuZXcgTnVtYmVyKE1EYnVmW2ldKTtcbiAgfVxuXG4gIHZhciBzdGVwID0gMDtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA1OyBqKyspXG4gIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAge1xuICAgICAgcmV0QmxvY2sgPSBtaXhPbmVSb3VuZChcbiAgICAgICAgYmxvY2tBWyhzdGVwKzApICUgNV0sXG4gICAgICAgIGJsb2NrQVsoc3RlcCsxKSAlIDVdLCAgIFxuICAgICAgICBibG9ja0FbKHN0ZXArMikgJSA1XSwgICBcbiAgICAgICAgYmxvY2tBWyhzdGVwKzMpICUgNV0sICAgXG4gICAgICAgIGJsb2NrQVsoc3RlcCs0KSAlIDVdLCAgXG4gICAgICAgIFhbaW5kZXhlc1tqXVtpXV0sIFxuICAgICAgICBST0xzW2pdW2ldLFxuICAgICAgICBqXG4gICAgICApO1xuXG4gICAgICBibG9ja0FbKHN0ZXArMCkgJSA1XSA9IHJldEJsb2NrWzBdO1xuICAgICAgYmxvY2tBWyhzdGVwKzEpICUgNV0gPSByZXRCbG9ja1sxXTtcbiAgICAgIGJsb2NrQVsoc3RlcCsyKSAlIDVdID0gcmV0QmxvY2tbMl07XG4gICAgICBibG9ja0FbKHN0ZXArMykgJSA1XSA9IHJldEJsb2NrWzNdO1xuICAgICAgYmxvY2tBWyhzdGVwKzQpICUgNV0gPSByZXRCbG9ja1s0XTtcblxuICAgICAgc3RlcCArPSA0O1xuICAgIH1cbiAgfVxuXG4gIHN0ZXAgPSAwO1xuICBmb3IgKHZhciBqID0gNTsgaiA8IDEwOyBqKyspXG4gIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgeyAgXG4gICAgICByZXRCbG9jayA9IG1peE9uZVJvdW5kKFxuICAgICAgICBibG9ja0JbKHN0ZXArMCkgJSA1XSwgXG4gICAgICAgIGJsb2NrQlsoc3RlcCsxKSAlIDVdLCBcbiAgICAgICAgYmxvY2tCWyhzdGVwKzIpICUgNV0sIFxuICAgICAgICBibG9ja0JbKHN0ZXArMykgJSA1XSwgXG4gICAgICAgIGJsb2NrQlsoc3RlcCs0KSAlIDVdLCAgXG4gICAgICAgIFhbaW5kZXhlc1tqXVtpXV0sIFxuICAgICAgICBST0xzW2pdW2ldLFxuICAgICAgICBqXG4gICAgICApO1xuXG4gICAgICBibG9ja0JbKHN0ZXArMCkgJSA1XSA9IHJldEJsb2NrWzBdO1xuICAgICAgYmxvY2tCWyhzdGVwKzEpICUgNV0gPSByZXRCbG9ja1sxXTtcbiAgICAgIGJsb2NrQlsoc3RlcCsyKSAlIDVdID0gcmV0QmxvY2tbMl07XG4gICAgICBibG9ja0JbKHN0ZXArMykgJSA1XSA9IHJldEJsb2NrWzNdO1xuICAgICAgYmxvY2tCWyhzdGVwKzQpICUgNV0gPSByZXRCbG9ja1s0XTtcblxuICAgICAgc3RlcCArPSA0O1xuICAgIH1cbiAgfVxuXG4gIGJsb2NrQlszXSArPSBibG9ja0FbMl0gKyBNRGJ1ZlsxXTtcbiAgTURidWZbMV0gID0gTURidWZbMl0gKyBibG9ja0FbM10gKyBibG9ja0JbNF07XG4gIE1EYnVmWzJdICA9IE1EYnVmWzNdICsgYmxvY2tBWzRdICsgYmxvY2tCWzBdO1xuICBNRGJ1ZlszXSAgPSBNRGJ1Zls0XSArIGJsb2NrQVswXSArIGJsb2NrQlsxXTtcbiAgTURidWZbNF0gID0gTURidWZbMF0gKyBibG9ja0FbMV0gKyBibG9ja0JbMl07XG4gIE1EYnVmWzBdICA9IGJsb2NrQlszXTtcbn1cblxuZnVuY3Rpb24gemVyb1goWClcbntcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7IFhbaV0gPSAwOyB9XG59XG5cbmZ1bmN0aW9uIE1EZmluaXNoIChNRGJ1Ziwgc3RycHRyLCBsc3dsZW4sIG1zd2xlbilcbntcbiAgdmFyIFggPSBuZXcgQXJyYXkoMTYpO1xuICB6ZXJvWChYKTtcblxuICB2YXIgaiA9IDA7XG4gIGZvciAodmFyIGk9MDsgaSA8IChsc3dsZW4gJiA2Myk7IGkrKylcbiAge1xuICAgIFhbaSA+Pj4gMl0gXj0gKHN0cnB0ci5jaGFyQ29kZUF0KGorKykgJiAyNTUpIDw8ICg4ICogKGkgJiAzKSk7XG4gIH1cblxuICBYWyhsc3dsZW4gPj4+IDIpICYgMTVdIF49IDEgPDwgKDggKiAobHN3bGVuICYgMykgKyA3KTtcblxuICBpZiAoKGxzd2xlbiAmIDYzKSA+IDU1KVxuICB7XG4gICAgY29tcHJlc3MoTURidWYsIFgpO1xuICAgIHZhciBYID0gbmV3IEFycmF5KDE2KTtcbiAgICB6ZXJvWChYKTtcbiAgfVxuXG4gIFhbMTRdID0gbHN3bGVuIDw8IDM7XG4gIFhbMTVdID0gKGxzd2xlbiA+Pj4gMjkpIHwgKG1zd2xlbiA8PCAzKTtcblxuICBjb21wcmVzcyhNRGJ1ZiwgWCk7XG59XG5cbmZ1bmN0aW9uIEJZVEVTX1RPX0RXT1JEKGZvdXJDaGFycylcbntcbiAgdmFyIHRtcCAgPSAoZm91ckNoYXJzLmNoYXJDb2RlQXQoMykgJiAyNTUpIDw8IDI0O1xuICB0bXAgICB8PSAoZm91ckNoYXJzLmNoYXJDb2RlQXQoMikgJiAyNTUpIDw8IDE2O1xuICB0bXAgICB8PSAoZm91ckNoYXJzLmNoYXJDb2RlQXQoMSkgJiAyNTUpIDw8IDg7XG4gIHRtcCAgIHw9IChmb3VyQ2hhcnMuY2hhckNvZGVBdCgwKSAmIDI1NSk7ICBcblxuICByZXR1cm4gdG1wO1xufVxuXG5mdW5jdGlvbiBSTUQobWVzc2FnZSlcbntcbiAgdmFyIE1EYnVmICAgPSBuZXcgQXJyYXkoUk1Ec2l6ZSAvIDMyKTtcbiAgdmFyIGhhc2hjb2RlICAgPSBuZXcgQXJyYXkoUk1Ec2l6ZSAvIDgpO1xuICB2YXIgbGVuZ3RoOyAgXG4gIHZhciBuYnl0ZXM7XG5cbiAgTURpbml0KE1EYnVmKTtcbiAgbGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG5cbiAgdmFyIFggPSBuZXcgQXJyYXkoMTYpO1xuICB6ZXJvWChYKTtcblxuICB2YXIgaj0wO1xuICBmb3IgKHZhciBuYnl0ZXM9bGVuZ3RoOyBuYnl0ZXMgPiA2MzsgbmJ5dGVzIC09IDY0KVxuICB7XG4gICAgZm9yICh2YXIgaT0wOyBpIDwgMTY7IGkrKylcbiAgICB7XG4gICAgICBYW2ldID0gQllURVNfVE9fRFdPUkQobWVzc2FnZS5zdWJzdHIoaiwgNCkpO1xuICAgICAgaiArPSA0O1xuICAgIH1cbiAgICBjb21wcmVzcyhNRGJ1ZiwgWCk7XG4gIH1cblxuICBNRGZpbmlzaChNRGJ1ZiwgbWVzc2FnZS5zdWJzdHIoaiksIGxlbmd0aCwgMCk7XG5cbiAgZm9yICh2YXIgaT0wOyBpIDwgUk1Ec2l6ZSAvIDg7IGkgKz0gNClcbiAge1xuICAgIGhhc2hjb2RlW2ldICAgPSAgTURidWZbaSA+Pj4gMl0gICAmIDI1NTtcbiAgICBoYXNoY29kZVtpKzFdID0gKE1EYnVmW2kgPj4+IDJdID4+PiA4KSAgICYgMjU1O1xuICAgIGhhc2hjb2RlW2krMl0gPSAoTURidWZbaSA+Pj4gMl0gPj4+IDE2KSAmIDI1NTtcbiAgICBoYXNoY29kZVtpKzNdID0gKE1EYnVmW2kgPj4+IDJdID4+PiAyNCkgJiAyNTU7XG4gIH1cblxuICByZXR1cm4gaGFzaGNvZGU7XG59XG5cblxuZnVuY3Rpb24gUk1Ec3RyaW5nKG1lc3NhZ2UpXG57XG4gIHZhciBoYXNoY29kZSA9IFJNRChtZXNzYWdlKTtcbiAgdmFyIHJldFN0cmluZyA9IFwiXCI7XG5cbiAgZm9yICh2YXIgaT0wOyBpIDwgUk1Ec2l6ZS84OyBpKyspXG4gIHtcbiAgICByZXRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShoYXNoY29kZVtpXSk7XG4gIH0gIFxuXG4gIHJldHVybiByZXRTdHJpbmc7ICBcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSTURzdHJpbmc7XG4iLCIvKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNIQSBmYW1pbHkgb2YgaGFzaGVzLCBhcyBkZWZpbmVkIGluIEZJUFMgXG4gKiBQVUIgMTgwLTIgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBITUFDIGltcGxlbWVudGF0aW9uIGFzIGRlZmluZWQgaW5cbiAqIEZJUFMgUFVCIDE5OGFcbiAqXG4gKiBWZXJzaW9uIDEuMyBDb3B5cmlnaHQgQnJpYW4gVHVyZWsgMjAwOC0yMDEwXG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vanNzaGEuc291cmNlZm9yZ2UubmV0LyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICpcbiAqIFNldmVyYWwgZnVuY3Rpb25zIHRha2VuIGZyb20gUGF1bCBKb2huc29uXG4gKi9cblxuLyogTW9kaWZpZWQgYnkgUmVjdXJpdHkgTGFicyBHbWJIXG4gKiBcbiAqIFRoaXMgY29kZSBoYXMgYmVlbiBzbGlnaHRseSBtb2RpZmllZCBkaXJlY3Qgc3RyaW5nIG91dHB1dDpcbiAqIC0gYmluMmJzdHIgaGFzIGJlZW4gYWRkZWRcbiAqIC0gZm9sbG93aW5nIHdyYXBwZXJzIG9mIHRoaXMgbGlicmFyeSBoYXZlIGJlZW4gYWRkZWQ6XG4gKiAgIC0gc3RyX3NoYTFcbiAqICAgLSBzdHJfc2hhMjU2XG4gKiAgIC0gc3RyX3NoYTIyNFxuICogICAtIHN0cl9zaGEzODRcbiAqICAgLSBzdHJfc2hhNTEyXG4gKi9cblxudmFyIGpzU0hBID0gKGZ1bmN0aW9uICgpIHtcblx0XG5cdC8qXG5cdCAqIENvbmZpZ3VyYWJsZSB2YXJpYWJsZXMuIERlZmF1bHRzIHR5cGljYWxseSB3b3JrXG5cdCAqL1xuXHQvKiBOdW1iZXIgb2YgQml0cyBQZXIgY2hhcmFjdGVyICg4IGZvciBBU0NJSSwgMTYgZm9yIFVuaWNvZGUpICovXG5cdHZhciBjaGFyU2l6ZSA9IDgsIFxuXHQvKiBiYXNlLTY0IHBhZCBjaGFyYWN0ZXIuIFwiPVwiIGZvciBzdHJpY3QgUkZDIGNvbXBsaWFuY2UgKi9cblx0YjY0cGFkID0gXCJcIiwgXG5cdC8qIGhleCBvdXRwdXQgZm9ybWF0LiAwIC0gbG93ZXJjYXNlOyAxIC0gdXBwZXJjYXNlICovXG5cdGhleENhc2UgPSAwLCBcblxuXHQvKlxuXHQgKiBJbnRfNjQgaXMgYSBvYmplY3QgZm9yIDIgMzItYml0IG51bWJlcnMgZW11bGF0aW5nIGEgNjQtYml0IG51bWJlclxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtOdW1iZXJ9IG1zaW50XzMyIFRoZSBtb3N0IHNpZ25pZmljYW50IDMyLWJpdHMgb2YgYSA2NC1iaXQgbnVtYmVyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBsc2ludF8zMiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgMzItYml0cyBvZiBhIDY0LWJpdCBudW1iZXJcblx0ICovXG5cdEludF82NCA9IGZ1bmN0aW9uIChtc2ludF8zMiwgbHNpbnRfMzIpXG5cdHtcblx0XHR0aGlzLmhpZ2hPcmRlciA9IG1zaW50XzMyO1xuXHRcdHRoaXMubG93T3JkZXIgPSBsc2ludF8zMjtcblx0fSxcblxuXHQvKlxuXHQgKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIGFycmF5IG9mIGJpZy1lbmRpYW4gd29yZHNcblx0ICogSWYgY2hhclNpemUgaXMgQVNDSUksIGNoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpLWJ5dGUgc2lsZW50bHlcblx0ICogaWdub3JlZC5cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGJpbmFyeSByZXByZXNlbnRhdGlvblxuXHQgKiBAcmV0dXJuIEludGVnZXIgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlclxuXHQgKi9cblx0c3RyMmJpbmIgPSBmdW5jdGlvbiAoc3RyKVxuXHR7XG5cdFx0dmFyIGJpbiA9IFtdLCBtYXNrID0gKDEgPDwgY2hhclNpemUpIC0gMSxcblx0XHRcdGxlbmd0aCA9IHN0ci5sZW5ndGggKiBjaGFyU2l6ZSwgaTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gY2hhclNpemUpXG5cdFx0e1xuXHRcdFx0YmluW2kgPj4gNV0gfD0gKHN0ci5jaGFyQ29kZUF0KGkgLyBjaGFyU2l6ZSkgJiBtYXNrKSA8PFxuXHRcdFx0XHQoMzIgLSBjaGFyU2l6ZSAtIChpICUgMzIpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYmluO1xuXHR9LFxuXG5cdC8qXG5cdCAqIENvbnZlcnQgYSBoZXggc3RyaW5nIHRvIGFuIGFycmF5IG9mIGJpZy1lbmRpYW4gd29yZHNcblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGJpbmFyeSByZXByZXNlbnRhdGlvblxuXHQgKiBAcmV0dXJuIEludGVnZXIgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlclxuXHQgKi9cblx0aGV4MmJpbmIgPSBmdW5jdGlvbiAoc3RyKVxuXHR7XG5cdFx0dmFyIGJpbiA9IFtdLCBsZW5ndGggPSBzdHIubGVuZ3RoLCBpLCBudW07XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDIpXG5cdFx0e1xuXHRcdFx0bnVtID0gcGFyc2VJbnQoc3RyLnN1YnN0cihpLCAyKSwgMTYpO1xuXHRcdFx0aWYgKCFpc05hTihudW0pKVxuXHRcdFx0e1xuXHRcdFx0XHRiaW5baSA+PiAzXSB8PSBudW0gPDwgKDI0IC0gKDQgKiAoaSAlIDgpKSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiBcIklOVkFMSUQgSEVYIFNUUklOR1wiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBiaW47XG5cdH0sXG5cblx0Lypcblx0ICogQ29udmVydCBhbiBhcnJheSBvZiBiaWctZW5kaWFuIHdvcmRzIHRvIGEgaGV4IHN0cmluZy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYmluYXJyYXkgQXJyYXkgb2YgaW50ZWdlcnMgdG8gYmUgY29udmVydGVkIHRvIGhleGlkZWNpbWFsXG5cdCAqXHQgcmVwcmVzZW50YXRpb25cblx0ICogQHJldHVybiBIZXhpZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIGluIFN0cmluZyBmb3JtXG5cdCAqL1xuXHRiaW5iMmhleCA9IGZ1bmN0aW9uIChiaW5hcnJheSlcblx0e1xuXHRcdHZhciBoZXhfdGFiID0gKGhleENhc2UpID8gXCIwMTIzNDU2Nzg5QUJDREVGXCIgOiBcIjAxMjM0NTY3ODlhYmNkZWZcIixcblx0XHRcdHN0ciA9IFwiXCIsIGxlbmd0aCA9IGJpbmFycmF5Lmxlbmd0aCAqIDQsIGksIHNyY0J5dGU7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpXG5cdFx0e1xuXHRcdFx0c3JjQnl0ZSA9IGJpbmFycmF5W2kgPj4gMl0gPj4gKCgzIC0gKGkgJSA0KSkgKiA4KTtcblx0XHRcdHN0ciArPSBoZXhfdGFiLmNoYXJBdCgoc3JjQnl0ZSA+PiA0KSAmIDB4RikgK1xuXHRcdFx0XHRoZXhfdGFiLmNoYXJBdChzcmNCeXRlICYgMHhGKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyO1xuXHR9LFxuXG5cdC8qXG5cdCAqIENvbnZlcnQgYW4gYXJyYXkgb2YgYmlnLWVuZGlhbiB3b3JkcyB0byBhIGJhc2UtNjQgc3RyaW5nXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGJpbmFycmF5IEFycmF5IG9mIGludGVnZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBiYXNlLTY0XG5cdCAqXHQgcmVwcmVzZW50YXRpb25cblx0ICogQHJldHVybiBCYXNlLTY0IGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcmFtZXRlciBpbiBTdHJpbmcgZm9ybVxuXHQgKi9cblx0YmluYjJiNjQgPSBmdW5jdGlvbiAoYmluYXJyYXkpXG5cdHtcblx0XHR2YXIgdGFiID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCIgK1xuXHRcdFx0XCIwMTIzNDU2Nzg5Ky9cIiwgc3RyID0gXCJcIiwgbGVuZ3RoID0gYmluYXJyYXkubGVuZ3RoICogNCwgaSwgaixcblx0XHRcdHRyaXBsZXQ7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDMpXG5cdFx0e1xuXHRcdFx0dHJpcGxldCA9ICgoKGJpbmFycmF5W2kgPj4gMl0gPj4gOCAqICgzIC0gaSAlIDQpKSAmIDB4RkYpIDw8IDE2KSB8XG5cdFx0XHRcdCgoKGJpbmFycmF5W2kgKyAxID4+IDJdID4+IDggKiAoMyAtIChpICsgMSkgJSA0KSkgJiAweEZGKSA8PCA4KSB8XG5cdFx0XHRcdCgoYmluYXJyYXlbaSArIDIgPj4gMl0gPj4gOCAqICgzIC0gKGkgKyAyKSAlIDQpKSAmIDB4RkYpO1xuXHRcdFx0Zm9yIChqID0gMDsgaiA8IDQ7IGogKz0gMSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKGkgKiA4ICsgaiAqIDYgPD0gYmluYXJyYXkubGVuZ3RoICogMzIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzdHIgKz0gdGFiLmNoYXJBdCgodHJpcGxldCA+PiA2ICogKDMgLSBqKSkgJiAweDNGKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzdHIgKz0gYjY0cGFkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzdHI7XG5cdH0sXG5cblx0Lypcblx0ICogQ29udmVydCBhbiBhcnJheSBvZiBiaWctZW5kaWFuIHdvcmRzIHRvIGEgc3RyaW5nXG5cdCAqL1xuXHRiaW5iMnN0ciA9IGZ1bmN0aW9uIChiaW4pXG5cdHtcblx0ICB2YXIgc3RyID0gXCJcIjtcblx0ICB2YXIgbWFzayA9ICgxIDw8IDgpIC0gMTtcblx0ICBmb3IodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aCAqIDMyOyBpICs9IDgpXG5cdCAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYmluW2k+PjVdID4+PiAoMjQgLSBpJTMyKSkgJiBtYXNrKTtcblx0ICByZXR1cm4gc3RyO1xuXHR9LFxuXHQvKlxuXHQgKiBUaGUgMzItYml0IGltcGxlbWVudGF0aW9uIG9mIGNpcmN1bGFyIHJvdGF0ZSBsZWZ0XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnRcblx0ICogQHJldHVybiBUaGUgeCBzaGlmdGVkIGNpcmN1bGFybHkgYnkgbiBiaXRzXG5cdCAqL1xuXHRyb3RsXzMyID0gZnVuY3Rpb24gKHgsIG4pXG5cdHtcblx0XHRyZXR1cm4gKHggPDwgbikgfCAoeCA+Pj4gKDMyIC0gbikpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgY2lyY3VsYXIgcm90YXRlIHJpZ2h0XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnRcblx0ICogQHJldHVybiBUaGUgeCBzaGlmdGVkIGNpcmN1bGFybHkgYnkgbiBiaXRzXG5cdCAqL1xuXHRyb3RyXzMyID0gZnVuY3Rpb24gKHgsIG4pXG5cdHtcblx0XHRyZXR1cm4gKHggPj4+IG4pIHwgKHggPDwgKDMyIC0gbikpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSA2NC1iaXQgaW1wbGVtZW50YXRpb24gb2YgY2lyY3VsYXIgcm90YXRlIHJpZ2h0XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSB4IFRoZSA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnRcblx0ICogQHJldHVybiBUaGUgeCBzaGlmdGVkIGNpcmN1bGFybHkgYnkgbiBiaXRzXG5cdCAqL1xuXHRyb3RyXzY0ID0gZnVuY3Rpb24gKHgsIG4pXG5cdHtcblx0XHRpZiAobiA8PSAzMilcblx0XHR7XG5cdFx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0XHQoeC5oaWdoT3JkZXIgPj4+IG4pIHwgKHgubG93T3JkZXIgPDwgKDMyIC0gbikpLFxuXHRcdFx0XHRcdCh4Lmxvd09yZGVyID4+PiBuKSB8ICh4LmhpZ2hPcmRlciA8PCAoMzIgLSBuKSlcblx0XHRcdFx0KTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHJldHVybiBuZXcgSW50XzY0KFxuXHRcdFx0XHRcdCh4Lmxvd09yZGVyID4+PiBuKSB8ICh4LmhpZ2hPcmRlciA8PCAoMzIgLSBuKSksXG5cdFx0XHRcdFx0KHguaGlnaE9yZGVyID4+PiBuKSB8ICh4Lmxvd09yZGVyIDw8ICgzMiAtIG4pKVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgMzItYml0IGltcGxlbWVudGF0aW9uIG9mIHNoaWZ0IHJpZ2h0XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnRcblx0ICogQHJldHVybiBUaGUgeCBzaGlmdGVkIGJ5IG4gYml0c1xuXHQgKi9cblx0c2hyXzMyID0gZnVuY3Rpb24gKHgsIG4pXG5cdHtcblx0XHRyZXR1cm4geCA+Pj4gbjtcblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgNjQtYml0IGltcGxlbWVudGF0aW9uIG9mIHNoaWZ0IHJpZ2h0XG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSB4IFRoZSA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnRcblx0ICogQHJldHVybiBUaGUgeCBzaGlmdGVkIGJ5IG4gYml0c1xuXHQgKi9cblx0c2hyXzY0ID0gZnVuY3Rpb24gKHgsIG4pXG5cdHtcblx0XHRpZiAobiA8PSAzMilcblx0XHR7XG5cdFx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0XHR4LmhpZ2hPcmRlciA+Pj4gbixcblx0XHRcdFx0XHR4Lmxvd09yZGVyID4+PiBuIHwgKHguaGlnaE9yZGVyIDw8ICgzMiAtIG4pKVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0cmV0dXJuIG5ldyBJbnRfNjQoXG5cdFx0XHRcdFx0MCxcblx0XHRcdFx0XHR4LmhpZ2hPcmRlciA8PCAoMzIgLSBuKVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgMzItYml0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBOSVNUIHNwZWNpZmllZCBQYXJpdHkgZnVuY3Rpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIGZpcnN0IDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB5IFRoZSBzZWNvbmQgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHogVGhlIHRoaXJkIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEByZXR1cm4gVGhlIE5JU1Qgc3BlY2lmaWVkIG91dHB1dCBvZiB0aGUgZnVuY3Rpb25cblx0ICovXG5cdHBhcml0eV8zMiA9IGZ1bmN0aW9uICh4LCB5LCB6KVxuXHR7XG5cdFx0cmV0dXJuIHggXiB5IF4gejtcblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgMzItYml0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBOSVNUIHNwZWNpZmllZCBDaCBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0geCBUaGUgZmlyc3QgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHkgVGhlIHNlY29uZCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0geiBUaGUgdGhpcmQgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0Y2hfMzIgPSBmdW5jdGlvbiAoeCwgeSwgeilcblx0e1xuXHRcdHJldHVybiAoeCAmIHkpIF4gKH54ICYgeik7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDY0LWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgQ2ggZnVuY3Rpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJbnRfNjR9IHggVGhlIGZpcnN0IDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEBwYXJhbSB7SW50XzY0fSB5IFRoZSBzZWNvbmQgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHBhcmFtIHtJbnRfNjR9IHogVGhlIHRoaXJkIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEByZXR1cm4gVGhlIE5JU1Qgc3BlY2lmaWVkIG91dHB1dCBvZiB0aGUgZnVuY3Rpb25cblx0ICovXG5cdGNoXzY0ID0gZnVuY3Rpb24gKHgsIHksIHopXG5cdHtcblx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0KHguaGlnaE9yZGVyICYgeS5oaWdoT3JkZXIpIF4gKH54LmhpZ2hPcmRlciAmIHouaGlnaE9yZGVyKSxcblx0XHRcdFx0KHgubG93T3JkZXIgJiB5Lmxvd09yZGVyKSBeICh+eC5sb3dPcmRlciAmIHoubG93T3JkZXIpXG5cdFx0XHQpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIE1haiBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0geCBUaGUgZmlyc3QgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHkgVGhlIHNlY29uZCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge051bWJlcn0geiBUaGUgdGhpcmQgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0bWFqXzMyID0gZnVuY3Rpb24gKHgsIHksIHopXG5cdHtcblx0XHRyZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSA2NC1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIE1haiBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0ludF82NH0geCBUaGUgZmlyc3QgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHBhcmFtIHtJbnRfNjR9IHkgVGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcGFyYW0ge0ludF82NH0geiBUaGUgdGhpcmQgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0bWFqXzY0ID0gZnVuY3Rpb24gKHgsIHksIHopXG5cdHtcblx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0KHguaGlnaE9yZGVyICYgeS5oaWdoT3JkZXIpIF5cblx0XHRcdFx0KHguaGlnaE9yZGVyICYgei5oaWdoT3JkZXIpIF5cblx0XHRcdFx0KHkuaGlnaE9yZGVyICYgei5oaWdoT3JkZXIpLFxuXHRcdFx0XHQoeC5sb3dPcmRlciAmIHkubG93T3JkZXIpIF5cblx0XHRcdFx0KHgubG93T3JkZXIgJiB6Lmxvd09yZGVyKSBeXG5cdFx0XHRcdCh5Lmxvd09yZGVyICYgei5sb3dPcmRlcilcblx0XHRcdCk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDMyLWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgU2lnbWEwIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSAzMi1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRzaWdtYTBfMzIgPSBmdW5jdGlvbiAoeClcblx0e1xuXHRcdHJldHVybiByb3RyXzMyKHgsIDIpIF4gcm90cl8zMih4LCAxMykgXiByb3RyXzMyKHgsIDIyKTtcblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgNjQtYml0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBOSVNUIHNwZWNpZmllZCBTaWdtYTAgZnVuY3Rpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJbnRfNjR9IHggVGhlIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEByZXR1cm4gVGhlIE5JU1Qgc3BlY2lmaWVkIG91dHB1dCBvZiB0aGUgZnVuY3Rpb25cblx0ICovXG5cdHNpZ21hMF82NCA9IGZ1bmN0aW9uICh4KVxuXHR7XG5cdFx0dmFyIHJvdHIyOCA9IHJvdHJfNjQoeCwgMjgpLCByb3RyMzQgPSByb3RyXzY0KHgsIDM0KSxcblx0XHRcdHJvdHIzOSA9IHJvdHJfNjQoeCwgMzkpO1xuXG5cdFx0cmV0dXJuIG5ldyBJbnRfNjQoXG5cdFx0XHRcdHJvdHIyOC5oaWdoT3JkZXIgXiByb3RyMzQuaGlnaE9yZGVyIF4gcm90cjM5LmhpZ2hPcmRlcixcblx0XHRcdFx0cm90cjI4Lmxvd09yZGVyIF4gcm90cjM0Lmxvd09yZGVyIF4gcm90cjM5Lmxvd09yZGVyKTtcblx0fSxcblxuXHQvKlxuXHQgKiBUaGUgMzItYml0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBOSVNUIHNwZWNpZmllZCBTaWdtYTEgZnVuY3Rpb25cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHggVGhlIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50XG5cdCAqIEByZXR1cm4gVGhlIE5JU1Qgc3BlY2lmaWVkIG91dHB1dCBvZiB0aGUgZnVuY3Rpb25cblx0ICovXG5cdHNpZ21hMV8zMiA9IGZ1bmN0aW9uICh4KVxuXHR7XG5cdFx0cmV0dXJuIHJvdHJfMzIoeCwgNikgXiByb3RyXzMyKHgsIDExKSBeIHJvdHJfMzIoeCwgMjUpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSA2NC1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIFNpZ21hMSBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0ludF82NH0geCBUaGUgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0c2lnbWExXzY0ID0gZnVuY3Rpb24gKHgpXG5cdHtcblx0XHR2YXIgcm90cjE0ID0gcm90cl82NCh4LCAxNCksIHJvdHIxOCA9IHJvdHJfNjQoeCwgMTgpLFxuXHRcdFx0cm90cjQxID0gcm90cl82NCh4LCA0MSk7XG5cblx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0cm90cjE0LmhpZ2hPcmRlciBeIHJvdHIxOC5oaWdoT3JkZXIgXiByb3RyNDEuaGlnaE9yZGVyLFxuXHRcdFx0XHRyb3RyMTQubG93T3JkZXIgXiByb3RyMTgubG93T3JkZXIgXiByb3RyNDEubG93T3JkZXIpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIEdhbW1hMCBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0geCBUaGUgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0Z2FtbWEwXzMyID0gZnVuY3Rpb24gKHgpXG5cdHtcblx0XHRyZXR1cm4gcm90cl8zMih4LCA3KSBeIHJvdHJfMzIoeCwgMTgpIF4gc2hyXzMyKHgsIDMpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSA2NC1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIEdhbW1hMCBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0ludF82NH0geCBUaGUgNjQtYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0Z2FtbWEwXzY0ID0gZnVuY3Rpb24gKHgpXG5cdHtcblx0XHR2YXIgcm90cjEgPSByb3RyXzY0KHgsIDEpLCByb3RyOCA9IHJvdHJfNjQoeCwgOCksIHNocjcgPSBzaHJfNjQoeCwgNyk7XG5cblx0XHRyZXR1cm4gbmV3IEludF82NChcblx0XHRcdFx0cm90cjEuaGlnaE9yZGVyIF4gcm90cjguaGlnaE9yZGVyIF4gc2hyNy5oaWdoT3JkZXIsXG5cdFx0XHRcdHJvdHIxLmxvd09yZGVyIF4gcm90cjgubG93T3JkZXIgXiBzaHI3Lmxvd09yZGVyXG5cdFx0XHQpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIFRoZSAzMi1iaXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE5JU1Qgc3BlY2lmaWVkIEdhbW1hMSBmdW5jdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0geCBUaGUgMzItYml0IGludGVnZXIgYXJndW1lbnRcblx0ICogQHJldHVybiBUaGUgTklTVCBzcGVjaWZpZWQgb3V0cHV0IG9mIHRoZSBmdW5jdGlvblxuXHQgKi9cblx0Z2FtbWExXzMyID0gZnVuY3Rpb24gKHgpXG5cdHtcblx0XHRyZXR1cm4gcm90cl8zMih4LCAxNykgXiByb3RyXzMyKHgsIDE5KSBeIHNocl8zMih4LCAxMCk7XG5cdH0sXG5cblx0Lypcblx0ICogVGhlIDY0LWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTklTVCBzcGVjaWZpZWQgR2FtbWExIGZ1bmN0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSB4IFRoZSA2NC1iaXQgaW50ZWdlciBhcmd1bWVudFxuXHQgKiBAcmV0dXJuIFRoZSBOSVNUIHNwZWNpZmllZCBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uXG5cdCAqL1xuXHRnYW1tYTFfNjQgPSBmdW5jdGlvbiAoeClcblx0e1xuXHRcdHZhciByb3RyMTkgPSByb3RyXzY0KHgsIDE5KSwgcm90cjYxID0gcm90cl82NCh4LCA2MSksXG5cdFx0XHRzaHI2ID0gc2hyXzY0KHgsIDYpO1xuXG5cdFx0cmV0dXJuIG5ldyBJbnRfNjQoXG5cdFx0XHRcdHJvdHIxOS5oaWdoT3JkZXIgXiByb3RyNjEuaGlnaE9yZGVyIF4gc2hyNi5oaWdoT3JkZXIsXG5cdFx0XHRcdHJvdHIxOS5sb3dPcmRlciBeIHJvdHI2MS5sb3dPcmRlciBeIHNocjYubG93T3JkZXJcblx0XHRcdCk7XG5cdH0sXG5cblx0Lypcblx0ICogQWRkIHR3byAzMi1iaXQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9uc1xuXHQgKiBpbnRlcm5hbGx5IHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IFRoZSBmaXJzdCAzMi1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge051bWJlcn0geSBUaGUgc2Vjb25kIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm4gVGhlIHN1bSBvZiB4ICsgeVxuXHQgKi9cblx0c2FmZUFkZF8zMl8yID0gZnVuY3Rpb24gKHgsIHkpXG5cdHtcblx0XHR2YXIgbHN3ID0gKHggJiAweEZGRkYpICsgKHkgJiAweEZGRkYpLFxuXHRcdFx0bXN3ID0gKHggPj4+IDE2KSArICh5ID4+PiAxNikgKyAobHN3ID4+PiAxNik7XG5cblx0XHRyZXR1cm4gKChtc3cgJiAweEZGRkYpIDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEFkZCBmb3VyIDMyLWJpdCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zXG5cdCAqIGludGVybmFsbHkgdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGMgVGhlIHRoaXJkIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkIFRoZSBmb3VydGggMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybiBUaGUgc3VtIG9mIGEgKyBiICsgYyArIGRcblx0ICovXG5cdHNhZmVBZGRfMzJfNCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKVxuXHR7XG5cdFx0dmFyIGxzdyA9IChhICYgMHhGRkZGKSArIChiICYgMHhGRkZGKSArIChjICYgMHhGRkZGKSArIChkICYgMHhGRkZGKSxcblx0XHRcdG1zdyA9IChhID4+PiAxNikgKyAoYiA+Pj4gMTYpICsgKGMgPj4+IDE2KSArIChkID4+PiAxNikgK1xuXHRcdFx0XHQobHN3ID4+PiAxNik7XG5cblx0XHRyZXR1cm4gKChtc3cgJiAweEZGRkYpIDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEFkZCBmaXZlIDMyLWJpdCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zXG5cdCAqIGludGVybmFsbHkgdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGMgVGhlIHRoaXJkIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkIFRoZSBmb3VydGggMzItYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGUgVGhlIGZpZnRoIDMyLWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm4gVGhlIHN1bSBvZiBhICsgYiArIGMgKyBkICsgZVxuXHQgKi9cblx0c2FmZUFkZF8zMl81ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIGUpXG5cdHtcblx0XHR2YXIgbHN3ID0gKGEgJiAweEZGRkYpICsgKGIgJiAweEZGRkYpICsgKGMgJiAweEZGRkYpICsgKGQgJiAweEZGRkYpICtcblx0XHRcdFx0KGUgJiAweEZGRkYpLFxuXHRcdFx0bXN3ID0gKGEgPj4+IDE2KSArIChiID4+PiAxNikgKyAoYyA+Pj4gMTYpICsgKGQgPj4+IDE2KSArXG5cdFx0XHRcdChlID4+PiAxNikgKyAobHN3ID4+PiAxNik7XG5cblx0XHRyZXR1cm4gKChtc3cgJiAweEZGRkYpIDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEFkZCB0d28gNjQtYml0IGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjY0LiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnNcblx0ICogaW50ZXJuYWxseSB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0ludF82NH0geCBUaGUgZmlyc3QgNjQtYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtJbnRfNjR9IHkgVGhlIHNlY29uZCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcmV0dXJuIFRoZSBzdW0gb2YgeCArIHlcblx0ICovXG5cdHNhZmVBZGRfNjRfMiA9IGZ1bmN0aW9uICh4LCB5KVxuXHR7XG5cdFx0dmFyIGxzdywgbXN3LCBsb3dPcmRlciwgaGlnaE9yZGVyO1xuXG5cdFx0bHN3ID0gKHgubG93T3JkZXIgJiAweEZGRkYpICsgKHkubG93T3JkZXIgJiAweEZGRkYpO1xuXHRcdG1zdyA9ICh4Lmxvd09yZGVyID4+PiAxNikgKyAoeS5sb3dPcmRlciA+Pj4gMTYpICsgKGxzdyA+Pj4gMTYpO1xuXHRcdGxvd09yZGVyID0gKChtc3cgJiAweEZGRkYpIDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuXG5cdFx0bHN3ID0gKHguaGlnaE9yZGVyICYgMHhGRkZGKSArICh5LmhpZ2hPcmRlciAmIDB4RkZGRikgKyAobXN3ID4+PiAxNik7XG5cdFx0bXN3ID0gKHguaGlnaE9yZGVyID4+PiAxNikgKyAoeS5oaWdoT3JkZXIgPj4+IDE2KSArIChsc3cgPj4+IDE2KTtcblx0XHRoaWdoT3JkZXIgPSAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cblx0XHRyZXR1cm4gbmV3IEludF82NChoaWdoT3JkZXIsIGxvd09yZGVyKTtcblx0fSxcblxuXHQvKlxuXHQgKiBBZGQgZm91ciA2NC1iaXQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeNjQuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9uc1xuXHQgKiBpbnRlcm5hbGx5IHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBhIFRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge0ludF82NH0gYiBUaGUgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBjIFRoZSB0aGlyZCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge0ludF82NH0gZCBUaGUgZm91dGggNjQtYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybiBUaGUgc3VtIG9mIGEgKyBiICsgYyArIGRcblx0ICovXG5cdHNhZmVBZGRfNjRfNCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKVxuXHR7XG5cdFx0dmFyIGxzdywgbXN3LCBsb3dPcmRlciwgaGlnaE9yZGVyO1xuXG5cdFx0bHN3ID0gKGEubG93T3JkZXIgJiAweEZGRkYpICsgKGIubG93T3JkZXIgJiAweEZGRkYpICtcblx0XHRcdChjLmxvd09yZGVyICYgMHhGRkZGKSArIChkLmxvd09yZGVyICYgMHhGRkZGKTtcblx0XHRtc3cgPSAoYS5sb3dPcmRlciA+Pj4gMTYpICsgKGIubG93T3JkZXIgPj4+IDE2KSArXG5cdFx0XHQoYy5sb3dPcmRlciA+Pj4gMTYpICsgKGQubG93T3JkZXIgPj4+IDE2KSArIChsc3cgPj4+IDE2KTtcblx0XHRsb3dPcmRlciA9ICgobXN3ICYgMHhGRkZGKSA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTtcblxuXHRcdGxzdyA9IChhLmhpZ2hPcmRlciAmIDB4RkZGRikgKyAoYi5oaWdoT3JkZXIgJiAweEZGRkYpICtcblx0XHRcdChjLmhpZ2hPcmRlciAmIDB4RkZGRikgKyAoZC5oaWdoT3JkZXIgJiAweEZGRkYpICsgKG1zdyA+Pj4gMTYpO1xuXHRcdG1zdyA9IChhLmhpZ2hPcmRlciA+Pj4gMTYpICsgKGIuaGlnaE9yZGVyID4+PiAxNikgK1xuXHRcdFx0KGMuaGlnaE9yZGVyID4+PiAxNikgKyAoZC5oaWdoT3JkZXIgPj4+IDE2KSArIChsc3cgPj4+IDE2KTtcblx0XHRoaWdoT3JkZXIgPSAoKG1zdyAmIDB4RkZGRikgPDwgMTYpIHwgKGxzdyAmIDB4RkZGRik7XG5cblx0XHRyZXR1cm4gbmV3IEludF82NChoaWdoT3JkZXIsIGxvd09yZGVyKTtcblx0fSxcblxuXHQvKlxuXHQgKiBBZGQgZml2ZSA2NC1iaXQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeNjQuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9uc1xuXHQgKiBpbnRlcm5hbGx5IHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBhIFRoZSBmaXJzdCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge0ludF82NH0gYiBUaGUgc2Vjb25kIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSB7SW50XzY0fSBjIFRoZSB0aGlyZCA2NC1iaXQgaW50ZWdlciBhcmd1bWVudCB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0ge0ludF82NH0gZCBUaGUgZm91dGggNjQtYml0IGludGVnZXIgYXJndW1lbnQgdG8gYmUgYWRkZWRcblx0ICogQHBhcmFtIHtJbnRfNjR9IGUgVGhlIGZvdXRoIDY0LWJpdCBpbnRlZ2VyIGFyZ3VtZW50IHRvIGJlIGFkZGVkXG5cdCAqIEByZXR1cm4gVGhlIHN1bSBvZiBhICsgYiArIGMgKyBkICsgZVxuXHQgKi9cblx0c2FmZUFkZF82NF81ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIGUpXG5cdHtcblx0XHR2YXIgbHN3LCBtc3csIGxvd09yZGVyLCBoaWdoT3JkZXI7XG5cblx0XHRsc3cgPSAoYS5sb3dPcmRlciAmIDB4RkZGRikgKyAoYi5sb3dPcmRlciAmIDB4RkZGRikgK1xuXHRcdFx0KGMubG93T3JkZXIgJiAweEZGRkYpICsgKGQubG93T3JkZXIgJiAweEZGRkYpICtcblx0XHRcdChlLmxvd09yZGVyICYgMHhGRkZGKTtcblx0XHRtc3cgPSAoYS5sb3dPcmRlciA+Pj4gMTYpICsgKGIubG93T3JkZXIgPj4+IDE2KSArXG5cdFx0XHQoYy5sb3dPcmRlciA+Pj4gMTYpICsgKGQubG93T3JkZXIgPj4+IDE2KSArIChlLmxvd09yZGVyID4+PiAxNikgK1xuXHRcdFx0KGxzdyA+Pj4gMTYpO1xuXHRcdGxvd09yZGVyID0gKChtc3cgJiAweEZGRkYpIDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuXG5cdFx0bHN3ID0gKGEuaGlnaE9yZGVyICYgMHhGRkZGKSArIChiLmhpZ2hPcmRlciAmIDB4RkZGRikgK1xuXHRcdFx0KGMuaGlnaE9yZGVyICYgMHhGRkZGKSArIChkLmhpZ2hPcmRlciAmIDB4RkZGRikgK1xuXHRcdFx0KGUuaGlnaE9yZGVyICYgMHhGRkZGKSArIChtc3cgPj4+IDE2KTtcblx0XHRtc3cgPSAoYS5oaWdoT3JkZXIgPj4+IDE2KSArIChiLmhpZ2hPcmRlciA+Pj4gMTYpICtcblx0XHRcdChjLmhpZ2hPcmRlciA+Pj4gMTYpICsgKGQuaGlnaE9yZGVyID4+PiAxNikgK1xuXHRcdFx0KGUuaGlnaE9yZGVyID4+PiAxNikgKyAobHN3ID4+PiAxNik7XG5cdFx0aGlnaE9yZGVyID0gKChtc3cgJiAweEZGRkYpIDw8IDE2KSB8IChsc3cgJiAweEZGRkYpO1xuXG5cdFx0cmV0dXJuIG5ldyBJbnRfNjQoaGlnaE9yZGVyLCBsb3dPcmRlcik7XG5cdH0sXG5cblx0Lypcblx0ICogQ2FsY3VsYXRlcyB0aGUgU0hBLTEgaGFzaCBvZiB0aGUgc3RyaW5nIHNldCBhdCBpbnN0YW50aWF0aW9uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2UgVGhlIGJpbmFyeSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RyaW5nIHRvXG5cdCAqXHQgaGFzaFxuXHQgKiBAcGFyYW0ge051bWJlcn0gbWVzc2FnZUxlbiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG1lc3NhZ2Vcblx0ICogQHJldHVybiBUaGUgYXJyYXkgb2YgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZSBTSEEtMSBoYXNoIG9mIG1lc3NhZ2Vcblx0ICovXG5cdGNvcmVTSEExID0gZnVuY3Rpb24gKG1lc3NhZ2UsIG1lc3NhZ2VMZW4pXG5cdHtcblx0XHR2YXIgVyA9IFtdLCBhLCBiLCBjLCBkLCBlLCBULCBjaCA9IGNoXzMyLCBwYXJpdHkgPSBwYXJpdHlfMzIsXG5cdFx0XHRtYWogPSBtYWpfMzIsIHJvdGwgPSByb3RsXzMyLCBzYWZlQWRkXzIgPSBzYWZlQWRkXzMyXzIsIGksIHQsXG5cdFx0XHRzYWZlQWRkXzUgPSBzYWZlQWRkXzMyXzUsIGFwcGVuZGVkTWVzc2FnZUxlbmd0aCxcblx0XHRcdEggPSBbXG5cdFx0XHRcdDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBcblx0XHRcdF0sXG5cdFx0XHRLID0gW1xuXHRcdFx0XHQweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LFxuXHRcdFx0XHQweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LFxuXHRcdFx0XHQweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LFxuXHRcdFx0XHQweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LFxuXHRcdFx0XHQweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LFxuXHRcdFx0XHQweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLFxuXHRcdFx0XHQweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLFxuXHRcdFx0XHQweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLFxuXHRcdFx0XHQweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLFxuXHRcdFx0XHQweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLCAweDZlZDllYmExLFxuXHRcdFx0XHQweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLFxuXHRcdFx0XHQweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLFxuXHRcdFx0XHQweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLFxuXHRcdFx0XHQweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLFxuXHRcdFx0XHQweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLCAweDhmMWJiY2RjLFxuXHRcdFx0XHQweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LFxuXHRcdFx0XHQweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LFxuXHRcdFx0XHQweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LFxuXHRcdFx0XHQweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LFxuXHRcdFx0XHQweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2XG5cdFx0XHRdO1xuXG5cdFx0LyogQXBwZW5kICcxJyBhdCB0aGUgZW5kIG9mIHRoZSBiaW5hcnkgc3RyaW5nICovXG5cdFx0bWVzc2FnZVttZXNzYWdlTGVuID4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gKG1lc3NhZ2VMZW4gJSAzMikpO1xuXHRcdC8qIEFwcGVuZCBsZW5ndGggb2YgYmluYXJ5IHN0cmluZyBpbiB0aGUgcG9zaXRpb24gc3VjaCB0aGF0IHRoZSBuZXdcblx0XHRsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA1MTIuICBMb2dpYyBkb2VzIG5vdCB3b3JrIGZvciBldmVuIG11bHRpcGxlc1xuXHRcdG9mIDUxMiBidXQgdGhlcmUgY2FuIG5ldmVyIGJlIGV2ZW4gbXVsdGlwbGVzIG9mIDUxMiAqL1xuXHRcdG1lc3NhZ2VbKCgobWVzc2FnZUxlbiArIDY1KSA+PiA5KSA8PCA0KSArIDE1XSA9IG1lc3NhZ2VMZW47XG5cblx0XHRhcHBlbmRlZE1lc3NhZ2VMZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBhcHBlbmRlZE1lc3NhZ2VMZW5ndGg7IGkgKz0gMTYpXG5cdFx0e1xuXHRcdFx0YSA9IEhbMF07XG5cdFx0XHRiID0gSFsxXTtcblx0XHRcdGMgPSBIWzJdO1xuXHRcdFx0ZCA9IEhbM107XG5cdFx0XHRlID0gSFs0XTtcblxuXHRcdFx0Zm9yICh0ID0gMDsgdCA8IDgwOyB0ICs9IDEpXG5cdFx0XHR7XG5cdFx0XHRcdGlmICh0IDwgMTYpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRXW3RdID0gbWVzc2FnZVt0ICsgaV07XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0V1t0XSA9IHJvdGwoV1t0IC0gM10gXiBXW3QgLSA4XSBeIFdbdCAtIDE0XSBeIFdbdCAtIDE2XSwgMSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodCA8IDIwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0VCA9IHNhZmVBZGRfNShyb3RsKGEsIDUpLCBjaChiLCBjLCBkKSwgZSwgS1t0XSwgV1t0XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAodCA8IDQwKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0VCA9IHNhZmVBZGRfNShyb3RsKGEsIDUpLCBwYXJpdHkoYiwgYywgZCksIGUsIEtbdF0sIFdbdF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHQgPCA2MClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFQgPSBzYWZlQWRkXzUocm90bChhLCA1KSwgbWFqKGIsIGMsIGQpLCBlLCBLW3RdLCBXW3RdKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRUID0gc2FmZUFkZF81KHJvdGwoYSwgNSksIHBhcml0eShiLCBjLCBkKSwgZSwgS1t0XSwgV1t0XSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlID0gZDtcblx0XHRcdFx0ZCA9IGM7XG5cdFx0XHRcdGMgPSByb3RsKGIsIDMwKTtcblx0XHRcdFx0YiA9IGE7XG5cdFx0XHRcdGEgPSBUO1xuXHRcdFx0fVxuXG5cdFx0XHRIWzBdID0gc2FmZUFkZF8yKGEsIEhbMF0pO1xuXHRcdFx0SFsxXSA9IHNhZmVBZGRfMihiLCBIWzFdKTtcblx0XHRcdEhbMl0gPSBzYWZlQWRkXzIoYywgSFsyXSk7XG5cdFx0XHRIWzNdID0gc2FmZUFkZF8yKGQsIEhbM10pO1xuXHRcdFx0SFs0XSA9IHNhZmVBZGRfMihlLCBIWzRdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gSDtcblx0fSxcblxuXHQvKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBkZXNpcmVkIFNIQS0yIGhhc2ggb2YgdGhlIHN0cmluZyBzZXQgYXQgaW5zdGFudGlhdGlvblxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBUaGUgYmluYXJ5IGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdHJpbmcgdG8gaGFzaFxuXHQgKiBAcGFyYW0ge051bWJlcn0gVGhlIG51bWJlciBvZiBiaXRzIGluIG1lc3NhZ2Vcblx0ICogQHBhcmFtIHtTdHJpbmd9IHZhcmlhbnQgVGhlIGRlc2lyZWQgU0hBLTIgdmFyaWFudFxuXHQgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIFNIQS0yIGhhc2ggb2YgbWVzc2FnZVxuXHQgKi9cblx0Y29yZVNIQTIgPSBmdW5jdGlvbiAobWVzc2FnZSwgbWVzc2FnZUxlbiwgdmFyaWFudClcblx0e1xuXHRcdHZhciBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBUMSwgVDIsIEgsIG51bVJvdW5kcywgbGVuZ3RoUG9zaXRpb24sIGksIHQsXG5cdFx0XHRiaW5hcnlTdHJpbmdJbmMsIGJpbmFyeVN0cmluZ011bHQsIHNhZmVBZGRfMiwgc2FmZUFkZF80LCBzYWZlQWRkXzUsXG5cdFx0XHRnYW1tYTAsIGdhbW1hMSwgc2lnbWEwLCBzaWdtYTEsIGNoLCBtYWosIEludCwgSywgVyA9IFtdLFxuXHRcdFx0YXBwZW5kZWRNZXNzYWdlTGVuZ3RoO1xuXG5cdFx0LyogU2V0IHVwIHRoZSB2YXJpb3VzIGZ1bmN0aW9uIGhhbmRsZXMgYW5kIHZhcmlhYmxlIGZvciB0aGUgc3BlY2lmaWMgXG5cdFx0ICogdmFyaWFudCAqL1xuXHRcdGlmICh2YXJpYW50ID09PSBcIlNIQS0yMjRcIiB8fCB2YXJpYW50ID09PSBcIlNIQS0yNTZcIilcblx0XHR7XG5cdFx0XHQvKiAzMi1iaXQgdmFyaWFudCAqL1xuXHRcdFx0bnVtUm91bmRzID0gNjQ7XG5cdFx0XHRsZW5ndGhQb3NpdGlvbiA9ICgoKG1lc3NhZ2VMZW4gKyA2NSkgPj4gOSkgPDwgNCkgKyAxNTtcblx0XHRcdGJpbmFyeVN0cmluZ0luYyA9IDE2O1xuXHRcdFx0YmluYXJ5U3RyaW5nTXVsdCA9IDE7XG5cdFx0XHRJbnQgPSBOdW1iZXI7XG5cdFx0XHRzYWZlQWRkXzIgPSBzYWZlQWRkXzMyXzI7XG5cdFx0XHRzYWZlQWRkXzQgPSBzYWZlQWRkXzMyXzQ7XG5cdFx0XHRzYWZlQWRkXzUgPSBzYWZlQWRkXzMyXzU7XG5cdFx0XHRnYW1tYTAgPSBnYW1tYTBfMzI7XG5cdFx0XHRnYW1tYTEgPSBnYW1tYTFfMzI7XG5cdFx0XHRzaWdtYTAgPSBzaWdtYTBfMzI7XG5cdFx0XHRzaWdtYTEgPSBzaWdtYTFfMzI7XG5cdFx0XHRtYWogPSBtYWpfMzI7XG5cdFx0XHRjaCA9IGNoXzMyO1xuXHRcdFx0SyA9IFtcblx0XHRcdFx0XHQweDQyOEEyRjk4LCAweDcxMzc0NDkxLCAweEI1QzBGQkNGLCAweEU5QjVEQkE1LFxuXHRcdFx0XHRcdDB4Mzk1NkMyNUIsIDB4NTlGMTExRjEsIDB4OTIzRjgyQTQsIDB4QUIxQzVFRDUsXG5cdFx0XHRcdFx0MHhEODA3QUE5OCwgMHgxMjgzNUIwMSwgMHgyNDMxODVCRSwgMHg1NTBDN0RDMyxcblx0XHRcdFx0XHQweDcyQkU1RDc0LCAweDgwREVCMUZFLCAweDlCREMwNkE3LCAweEMxOUJGMTc0LFxuXHRcdFx0XHRcdDB4RTQ5QjY5QzEsIDB4RUZCRTQ3ODYsIDB4MEZDMTlEQzYsIDB4MjQwQ0ExQ0MsXG5cdFx0XHRcdFx0MHgyREU5MkM2RiwgMHg0QTc0ODRBQSwgMHg1Q0IwQTlEQywgMHg3NkY5ODhEQSxcblx0XHRcdFx0XHQweDk4M0U1MTUyLCAweEE4MzFDNjZELCAweEIwMDMyN0M4LCAweEJGNTk3RkM3LFxuXHRcdFx0XHRcdDB4QzZFMDBCRjMsIDB4RDVBNzkxNDcsIDB4MDZDQTYzNTEsIDB4MTQyOTI5NjcsXG5cdFx0XHRcdFx0MHgyN0I3MEE4NSwgMHgyRTFCMjEzOCwgMHg0RDJDNkRGQywgMHg1MzM4MEQxMyxcblx0XHRcdFx0XHQweDY1MEE3MzU0LCAweDc2NkEwQUJCLCAweDgxQzJDOTJFLCAweDkyNzIyQzg1LFxuXHRcdFx0XHRcdDB4QTJCRkU4QTEsIDB4QTgxQTY2NEIsIDB4QzI0QjhCNzAsIDB4Qzc2QzUxQTMsXG5cdFx0XHRcdFx0MHhEMTkyRTgxOSwgMHhENjk5MDYyNCwgMHhGNDBFMzU4NSwgMHgxMDZBQTA3MCxcblx0XHRcdFx0XHQweDE5QTRDMTE2LCAweDFFMzc2QzA4LCAweDI3NDg3NzRDLCAweDM0QjBCQ0I1LFxuXHRcdFx0XHRcdDB4MzkxQzBDQjMsIDB4NEVEOEFBNEEsIDB4NUI5Q0NBNEYsIDB4NjgyRTZGRjMsXG5cdFx0XHRcdFx0MHg3NDhGODJFRSwgMHg3OEE1NjM2RiwgMHg4NEM4NzgxNCwgMHg4Q0M3MDIwOCxcblx0XHRcdFx0XHQweDkwQkVGRkZBLCAweEE0NTA2Q0VCLCAweEJFRjlBM0Y3LCAweEM2NzE3OEYyXG5cdFx0XHRcdF07XG5cblx0XHRcdGlmICh2YXJpYW50ID09PSBcIlNIQS0yMjRcIilcblx0XHRcdHtcblx0XHRcdFx0SCA9IFtcblx0XHRcdFx0XHRcdDB4YzEwNTllZDgsIDB4MzY3Y2Q1MDcsIDB4MzA3MGRkMTcsIDB4ZjcwZTU5MzksXG5cdFx0XHRcdFx0XHQweGZmYzAwYjMxLCAweDY4NTgxNTExLCAweDY0Zjk4ZmE3LCAweGJlZmE0ZmE0XG5cdFx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0SCA9IFtcblx0XHRcdFx0XHRcdDB4NkEwOUU2NjcsIDB4QkI2N0FFODUsIDB4M0M2RUYzNzIsIDB4QTU0RkY1M0EsXG5cdFx0XHRcdFx0XHQweDUxMEU1MjdGLCAweDlCMDU2ODhDLCAweDFGODNEOUFCLCAweDVCRTBDRDE5XG5cdFx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSBpZiAodmFyaWFudCA9PT0gXCJTSEEtMzg0XCIgfHwgdmFyaWFudCA9PT0gXCJTSEEtNTEyXCIpXG5cdFx0e1xuXHRcdFx0LyogNjQtYml0IHZhcmlhbnQgKi9cblx0XHRcdG51bVJvdW5kcyA9IDgwO1xuXHRcdFx0bGVuZ3RoUG9zaXRpb24gPSAoKChtZXNzYWdlTGVuICsgMTI4KSA+PiAxMCkgPDwgNSkgKyAzMTtcblx0XHRcdGJpbmFyeVN0cmluZ0luYyA9IDMyO1xuXHRcdFx0YmluYXJ5U3RyaW5nTXVsdCA9IDI7XG5cdFx0XHRJbnQgPSBJbnRfNjQ7XG5cdFx0XHRzYWZlQWRkXzIgPSBzYWZlQWRkXzY0XzI7XG5cdFx0XHRzYWZlQWRkXzQgPSBzYWZlQWRkXzY0XzQ7XG5cdFx0XHRzYWZlQWRkXzUgPSBzYWZlQWRkXzY0XzU7XG5cdFx0XHRnYW1tYTAgPSBnYW1tYTBfNjQ7XG5cdFx0XHRnYW1tYTEgPSBnYW1tYTFfNjQ7XG5cdFx0XHRzaWdtYTAgPSBzaWdtYTBfNjQ7XG5cdFx0XHRzaWdtYTEgPSBzaWdtYTFfNjQ7XG5cdFx0XHRtYWogPSBtYWpfNjQ7XG5cdFx0XHRjaCA9IGNoXzY0O1xuXG5cdFx0XHRLID0gW1xuXHRcdFx0XHRuZXcgSW50KDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIpLCBuZXcgSW50KDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QpLFxuXHRcdFx0XHRuZXcgSW50KDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYpLCBuZXcgSW50KDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMpLFxuXHRcdFx0XHRuZXcgSW50KDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgpLCBuZXcgSW50KDB4NTlmMTExZjEsIDB4YjYwNWQwMTkpLFxuXHRcdFx0XHRuZXcgSW50KDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIpLCBuZXcgSW50KDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgpLFxuXHRcdFx0XHRuZXcgSW50KDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIpLCBuZXcgSW50KDB4MTI4MzViMDEsIDB4NDU3MDZmYmUpLFxuXHRcdFx0XHRuZXcgSW50KDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMpLCBuZXcgSW50KDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIpLFxuXHRcdFx0XHRuZXcgSW50KDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYpLCBuZXcgSW50KDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEpLFxuXHRcdFx0XHRuZXcgSW50KDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUpLCBuZXcgSW50KDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQpLFxuXHRcdFx0XHRuZXcgSW50KDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIpLCBuZXcgSW50KDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMpLFxuXHRcdFx0XHRuZXcgSW50KDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUpLCBuZXcgSW50KDB4MjQwY2ExY2MsIDB4NzdhYzljNjUpLFxuXHRcdFx0XHRuZXcgSW50KDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUpLCBuZXcgSW50KDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMpLFxuXHRcdFx0XHRuZXcgSW50KDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQpLCBuZXcgSW50KDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUpLFxuXHRcdFx0XHRuZXcgSW50KDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIpLCBuZXcgSW50KDB4YTgzMWM2NmQsIDB4MmRiNDMyMTApLFxuXHRcdFx0XHRuZXcgSW50KDB4YjAwMzI3YzgsIDB4OThmYjIxM2YpLCBuZXcgSW50KDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQpLFxuXHRcdFx0XHRuZXcgSW50KDB4YzZlMDBiZjMsIDB4M2RhODhmYzIpLCBuZXcgSW50KDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUpLFxuXHRcdFx0XHRuZXcgSW50KDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYpLCBuZXcgSW50KDB4MTQyOTI5NjcsIDB4MGEwZTZlNzApLFxuXHRcdFx0XHRuZXcgSW50KDB4MjdiNzBhODUsIDB4NDZkMjJmZmMpLCBuZXcgSW50KDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYpLFxuXHRcdFx0XHRuZXcgSW50KDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQpLCBuZXcgSW50KDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYpLFxuXHRcdFx0XHRuZXcgSW50KDB4NjUwYTczNTQsIDB4OGJhZjYzZGUpLCBuZXcgSW50KDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgpLFxuXHRcdFx0XHRuZXcgSW50KDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYpLCBuZXcgSW50KDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IpLFxuXHRcdFx0XHRuZXcgSW50KDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQpLCBuZXcgSW50KDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEpLFxuXHRcdFx0XHRuZXcgSW50KDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEpLCBuZXcgSW50KDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzApLFxuXHRcdFx0XHRuZXcgSW50KDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgpLCBuZXcgSW50KDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTApLFxuXHRcdFx0XHRuZXcgSW50KDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEpLCBuZXcgSW50KDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgpLFxuXHRcdFx0XHRuZXcgSW50KDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgpLCBuZXcgSW50KDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMpLFxuXHRcdFx0XHRuZXcgSW50KDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTkpLCBuZXcgSW50KDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgpLFxuXHRcdFx0XHRuZXcgSW50KDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMpLCBuZXcgSW50KDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IpLFxuXHRcdFx0XHRuZXcgSW50KDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMpLCBuZXcgSW50KDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMpLFxuXHRcdFx0XHRuZXcgSW50KDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMpLCBuZXcgSW50KDB4NzhhNTYzNmYsIDB4NDMxNzJmNjApLFxuXHRcdFx0XHRuZXcgSW50KDB4ODRjODc4MTQsIDB4YTFmMGFiNzIpLCBuZXcgSW50KDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMpLFxuXHRcdFx0XHRuZXcgSW50KDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgpLCBuZXcgSW50KDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTkpLFxuXHRcdFx0XHRuZXcgSW50KDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUpLCBuZXcgSW50KDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIpLFxuXHRcdFx0XHRuZXcgSW50KDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMpLCBuZXcgSW50KDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcpLFxuXHRcdFx0XHRuZXcgSW50KDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUpLCBuZXcgSW50KDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgpLFxuXHRcdFx0XHRuZXcgSW50KDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEpLCBuZXcgSW50KDB4MGE2MzdkYzUsIDB4YTJjODk4YTYpLFxuXHRcdFx0XHRuZXcgSW50KDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUpLCBuZXcgSW50KDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIpLFxuXHRcdFx0XHRuZXcgSW50KDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQpLCBuZXcgSW50KDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMpLFxuXHRcdFx0XHRuZXcgSW50KDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMpLCBuZXcgSW50KDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMpLFxuXHRcdFx0XHRuZXcgSW50KDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYpLCBuZXcgSW50KDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEpLFxuXHRcdFx0XHRuZXcgSW50KDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMpLCBuZXcgSW50KDB4NmM0NDE5OGMsIDB4NGE0NzU4MTcpXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAodmFyaWFudCA9PT0gXCJTSEEtMzg0XCIpXG5cdFx0XHR7XG5cdFx0XHRcdEggPSBbXG5cdFx0XHRcdFx0bmV3IEludCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KSwgbmV3IEludCgweDA2MjlhMjkyYSwgMHgzNjdjZDUwNyksXG5cdFx0XHRcdFx0bmV3IEludCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KSwgbmV3IEludCgweDAxNTJmZWNkOCwgMHhmNzBlNTkzOSksXG5cdFx0XHRcdFx0bmV3IEludCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKSwgbmV3IEludCgweDk4ZWI0NGE4NywgMHg2ODU4MTUxMSksXG5cdFx0XHRcdFx0bmV3IEludCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KSwgbmV3IEludCgweDA0N2I1NDgxZCwgMHhiZWZhNGZhNClcblx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0SCA9IFtcblx0XHRcdFx0XHRuZXcgSW50KDB4NmEwOWU2NjcsIDB4ZjNiY2M5MDgpLCBuZXcgSW50KDB4YmI2N2FlODUsIDB4ODRjYWE3M2IpLFxuXHRcdFx0XHRcdG5ldyBJbnQoMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYiksIG5ldyBJbnQoMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSksXG5cdFx0XHRcdFx0bmV3IEludCgweDUxMGU1MjdmLCAweGFkZTY4MmQxKSwgbmV3IEludCgweDliMDU2ODhjLCAweDJiM2U2YzFmKSxcblx0XHRcdFx0XHRuZXcgSW50KDB4MWY4M2Q5YWIsIDB4ZmI0MWJkNmIpLCBuZXcgSW50KDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkpXG5cdFx0XHRcdF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyogQXBwZW5kICcxJyBhdCB0aGUgZW5kIG9mIHRoZSBiaW5hcnkgc3RyaW5nICovXG5cdFx0bWVzc2FnZVttZXNzYWdlTGVuID4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbWVzc2FnZUxlbiAlIDMyKTtcblx0XHQvKiBBcHBlbmQgbGVuZ3RoIG9mIGJpbmFyeSBzdHJpbmcgaW4gdGhlIHBvc2l0aW9uIHN1Y2ggdGhhdCB0aGUgbmV3XG5cdFx0ICogbGVuZ3RoIGlzIGNvcnJlY3QgKi9cblx0XHRtZXNzYWdlW2xlbmd0aFBvc2l0aW9uXSA9IG1lc3NhZ2VMZW47XG5cblx0XHRhcHBlbmRlZE1lc3NhZ2VMZW5ndGggPSBtZXNzYWdlLmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBhcHBlbmRlZE1lc3NhZ2VMZW5ndGg7IGkgKz0gYmluYXJ5U3RyaW5nSW5jKVxuXHRcdHtcblx0XHRcdGEgPSBIWzBdO1xuXHRcdFx0YiA9IEhbMV07XG5cdFx0XHRjID0gSFsyXTtcblx0XHRcdGQgPSBIWzNdO1xuXHRcdFx0ZSA9IEhbNF07XG5cdFx0XHRmID0gSFs1XTtcblx0XHRcdGcgPSBIWzZdO1xuXHRcdFx0aCA9IEhbN107XG5cblx0XHRcdGZvciAodCA9IDA7IHQgPCBudW1Sb3VuZHM7IHQgKz0gMSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHQgPCAxNilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8qIEJpdCBvZiBhIGhhY2sgLSBmb3IgMzItYml0LCB0aGUgc2Vjb25kIHRlcm0gaXMgaWdub3JlZCAqL1xuXHRcdFx0XHRcdFdbdF0gPSBuZXcgSW50KG1lc3NhZ2VbdCAqIGJpbmFyeVN0cmluZ011bHQgKyBpXSxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZVt0ICogYmluYXJ5U3RyaW5nTXVsdCArIGkgKyAxXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0V1t0XSA9IHNhZmVBZGRfNChcblx0XHRcdFx0XHRcdFx0Z2FtbWExKFdbdCAtIDJdKSwgV1t0IC0gN10sXG5cdFx0XHRcdFx0XHRcdGdhbW1hMChXW3QgLSAxNV0pLCBXW3QgLSAxNl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRUMSA9IHNhZmVBZGRfNShoLCBzaWdtYTEoZSksIGNoKGUsIGYsIGcpLCBLW3RdLCBXW3RdKTtcblx0XHRcdFx0VDIgPSBzYWZlQWRkXzIoc2lnbWEwKGEpLCBtYWooYSwgYiwgYykpO1xuXHRcdFx0XHRoID0gZztcblx0XHRcdFx0ZyA9IGY7XG5cdFx0XHRcdGYgPSBlO1xuXHRcdFx0XHRlID0gc2FmZUFkZF8yKGQsIFQxKTtcblx0XHRcdFx0ZCA9IGM7XG5cdFx0XHRcdGMgPSBiO1xuXHRcdFx0XHRiID0gYTtcblx0XHRcdFx0YSA9IHNhZmVBZGRfMihUMSwgVDIpO1xuXHRcdFx0fVxuXG5cdFx0XHRIWzBdID0gc2FmZUFkZF8yKGEsIEhbMF0pO1xuXHRcdFx0SFsxXSA9IHNhZmVBZGRfMihiLCBIWzFdKTtcblx0XHRcdEhbMl0gPSBzYWZlQWRkXzIoYywgSFsyXSk7XG5cdFx0XHRIWzNdID0gc2FmZUFkZF8yKGQsIEhbM10pO1xuXHRcdFx0SFs0XSA9IHNhZmVBZGRfMihlLCBIWzRdKTtcblx0XHRcdEhbNV0gPSBzYWZlQWRkXzIoZiwgSFs1XSk7XG5cdFx0XHRIWzZdID0gc2FmZUFkZF8yKGcsIEhbNl0pO1xuXHRcdFx0SFs3XSA9IHNhZmVBZGRfMihoLCBIWzddKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHZhcmlhbnQpXG5cdFx0e1xuXHRcdGNhc2UgXCJTSEEtMjI0XCI6XG5cdFx0XHRyZXR1cm5cdFtcblx0XHRcdFx0SFswXSwgSFsxXSwgSFsyXSwgSFszXSxcblx0XHRcdFx0SFs0XSwgSFs1XSwgSFs2XVxuXHRcdFx0XTtcblx0XHRjYXNlIFwiU0hBLTI1NlwiOlxuXHRcdFx0cmV0dXJuIEg7XG5cdFx0Y2FzZSBcIlNIQS0zODRcIjpcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdEhbMF0uaGlnaE9yZGVyLCBIWzBdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzFdLmhpZ2hPcmRlciwgSFsxXS5sb3dPcmRlcixcblx0XHRcdFx0SFsyXS5oaWdoT3JkZXIsIEhbMl0ubG93T3JkZXIsXG5cdFx0XHRcdEhbM10uaGlnaE9yZGVyLCBIWzNdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzRdLmhpZ2hPcmRlciwgSFs0XS5sb3dPcmRlcixcblx0XHRcdFx0SFs1XS5oaWdoT3JkZXIsIEhbNV0ubG93T3JkZXJcblx0XHRcdF07XG5cdFx0Y2FzZSBcIlNIQS01MTJcIjpcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdEhbMF0uaGlnaE9yZGVyLCBIWzBdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzFdLmhpZ2hPcmRlciwgSFsxXS5sb3dPcmRlcixcblx0XHRcdFx0SFsyXS5oaWdoT3JkZXIsIEhbMl0ubG93T3JkZXIsXG5cdFx0XHRcdEhbM10uaGlnaE9yZGVyLCBIWzNdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzRdLmhpZ2hPcmRlciwgSFs0XS5sb3dPcmRlcixcblx0XHRcdFx0SFs1XS5oaWdoT3JkZXIsIEhbNV0ubG93T3JkZXIsXG5cdFx0XHRcdEhbNl0uaGlnaE9yZGVyLCBIWzZdLmxvd09yZGVyLFxuXHRcdFx0XHRIWzddLmhpZ2hPcmRlciwgSFs3XS5sb3dPcmRlclxuXHRcdFx0XTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0LyogVGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqL1xuXHRcdFx0cmV0dXJuIFtdOyBcblx0XHR9XG5cdH0sXG5cblx0Lypcblx0ICoganNTSEEgaXMgdGhlIHdvcmtob3JzZSBvZiB0aGUgbGlicmFyeS4gIEluc3RhbnRpYXRlIGl0IHdpdGggdGhlIHN0cmluZyB0b1xuXHQgKiBiZSBoYXNoZWQgYXMgdGhlIHBhcmFtZXRlclxuXHQgKlxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICogQHBhcmFtIHtTdHJpbmd9IHNyY1N0cmluZyBUaGUgc3RyaW5nIHRvIGJlIGhhc2hlZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRGb3JtYXQgVGhlIGZvcm1hdCBvZiBzcmNTdHJpbmcsIEFTQ0lJIG9yIEhFWFxuXHQgKi9cblx0anNTSEEgPSBmdW5jdGlvbiAoc3JjU3RyaW5nLCBpbnB1dEZvcm1hdClcblx0e1xuXG5cdFx0dGhpcy5zaGExID0gbnVsbDtcblx0XHR0aGlzLnNoYTIyNCA9IG51bGw7XG5cdFx0dGhpcy5zaGEyNTYgPSBudWxsO1xuXHRcdHRoaXMuc2hhMzg0ID0gbnVsbDtcblx0XHR0aGlzLnNoYTUxMiA9IG51bGw7XG5cblx0XHR0aGlzLnN0ckJpbkxlbiA9IG51bGw7XG5cdFx0dGhpcy5zdHJUb0hhc2ggPSBudWxsO1xuXG5cdFx0LyogQ29udmVydCB0aGUgaW5wdXQgc3RyaW5nIGludG8gdGhlIGNvcnJlY3QgdHlwZSAqL1xuXHRcdGlmIChcIkhFWFwiID09PSBpbnB1dEZvcm1hdClcblx0XHR7XG5cdFx0XHRpZiAoMCAhPT0gKHNyY1N0cmluZy5sZW5ndGggJSAyKSlcblx0XHRcdHtcblx0XHRcdFx0cmV0dXJuIFwiVEVYVCBNVVNUIEJFIElOIEJZVEUgSU5DUkVNRU5UU1wiO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zdHJCaW5MZW4gPSBzcmNTdHJpbmcubGVuZ3RoICogNDtcblx0XHRcdHRoaXMuc3RyVG9IYXNoID0gaGV4MmJpbmIoc3JjU3RyaW5nKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoKFwiQVNDSUlcIiA9PT0gaW5wdXRGb3JtYXQpIHx8XG5cdFx0XHQgKCd1bmRlZmluZWQnID09PSB0eXBlb2YoaW5wdXRGb3JtYXQpKSlcblx0XHR7XG5cdFx0XHR0aGlzLnN0ckJpbkxlbiA9IHNyY1N0cmluZy5sZW5ndGggKiBjaGFyU2l6ZTtcblx0XHRcdHRoaXMuc3RyVG9IYXNoID0gc3RyMmJpbmIoc3JjU3RyaW5nKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHJldHVybiBcIlVOS05PV04gVEVYVCBJTlBVVCBUWVBFXCI7XG5cdFx0fVxuXHR9O1xuXG5cdGpzU0hBLnByb3RvdHlwZSA9IHtcblx0XHQvKlxuXHRcdCAqIFJldHVybnMgdGhlIGRlc2lyZWQgU0hBIGhhc2ggb2YgdGhlIHN0cmluZyBzcGVjaWZpZWQgYXQgaW5zdGFudGlhdGlvblxuXHRcdCAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyc1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IHZhcmlhbnQgVGhlIGRlc2lyZWQgU0hBIHZhcmlhbnQgKFNIQS0xLCBTSEEtMjI0LFxuXHRcdCAqXHQgU0hBLTI1NiwgU0hBLTM4NCwgb3IgU0hBLTUxMilcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFRoZSBkZXNpcmVkIG91dHB1dCBmb3JtYXR0aW5nIChCNjQgb3IgSEVYKVxuXHRcdCAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaGFzaCBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZFxuXHRcdCAqL1xuXHRcdGdldEhhc2ggOiBmdW5jdGlvbiAodmFyaWFudCwgZm9ybWF0KVxuXHRcdHtcblx0XHRcdHZhciBmb3JtYXRGdW5jID0gbnVsbCwgbWVzc2FnZSA9IHRoaXMuc3RyVG9IYXNoLnNsaWNlKCk7XG5cblx0XHRcdHN3aXRjaCAoZm9ybWF0KVxuXHRcdFx0e1xuXHRcdFx0Y2FzZSBcIkhFWFwiOlxuXHRcdFx0XHRmb3JtYXRGdW5jID0gYmluYjJoZXg7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkI2NFwiOlxuXHRcdFx0XHRmb3JtYXRGdW5jID0gYmluYjJiNjQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkFTQ0lJXCI6XG5cdFx0XHRcdGZvcm1hdEZ1bmMgPSBiaW5iMnN0cjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gXCJGT1JNQVQgTk9UIFJFQ09HTklaRURcIjtcblx0XHRcdH1cblxuXHRcdFx0c3dpdGNoICh2YXJpYW50KVxuXHRcdFx0e1xuXHRcdFx0Y2FzZSBcIlNIQS0xXCI6XG5cdFx0XHRcdGlmIChudWxsID09PSB0aGlzLnNoYTEpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0aGlzLnNoYTEgPSBjb3JlU0hBMShtZXNzYWdlLCB0aGlzLnN0ckJpbkxlbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZvcm1hdEZ1bmModGhpcy5zaGExKTtcblx0XHRcdGNhc2UgXCJTSEEtMjI0XCI6XG5cdFx0XHRcdGlmIChudWxsID09PSB0aGlzLnNoYTIyNClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuc2hhMjI0ID0gY29yZVNIQTIobWVzc2FnZSwgdGhpcy5zdHJCaW5MZW4sIHZhcmlhbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmb3JtYXRGdW5jKHRoaXMuc2hhMjI0KTtcblx0XHRcdGNhc2UgXCJTSEEtMjU2XCI6XG5cdFx0XHRcdGlmIChudWxsID09PSB0aGlzLnNoYTI1Nilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuc2hhMjU2ID0gY29yZVNIQTIobWVzc2FnZSwgdGhpcy5zdHJCaW5MZW4sIHZhcmlhbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmb3JtYXRGdW5jKHRoaXMuc2hhMjU2KTtcblx0XHRcdGNhc2UgXCJTSEEtMzg0XCI6XG5cdFx0XHRcdGlmIChudWxsID09PSB0aGlzLnNoYTM4NClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuc2hhMzg0ID0gY29yZVNIQTIobWVzc2FnZSwgdGhpcy5zdHJCaW5MZW4sIHZhcmlhbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmb3JtYXRGdW5jKHRoaXMuc2hhMzg0KTtcblx0XHRcdGNhc2UgXCJTSEEtNTEyXCI6XG5cdFx0XHRcdGlmIChudWxsID09PSB0aGlzLnNoYTUxMilcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRoaXMuc2hhNTEyID0gY29yZVNIQTIobWVzc2FnZSwgdGhpcy5zdHJCaW5MZW4sIHZhcmlhbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmb3JtYXRGdW5jKHRoaXMuc2hhNTEyKTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBcIkhBU0ggTk9UIFJFQ09HTklaRURcIjtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Lypcblx0XHQgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIEhNQUMgb2YgdGhlIHN0cmluZyBzcGVjaWZpZWQgYXQgaW5zdGFudGlhdGlvblxuXHRcdCAqIHVzaW5nIHRoZSBrZXkgYW5kIHZhcmlhbnQgcGFyYW0uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSBrZXkgdXNlZCB0byBjYWxjdWxhdGUgdGhlIEhNQUNcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXRGb3JtYXQgVGhlIGZvcm1hdCBvZiBrZXksIEFTQ0lJIG9yIEhFWFxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSB2YXJpYW50IFRoZSBkZXNpcmVkIFNIQSB2YXJpYW50IChTSEEtMSwgU0hBLTIyNCxcblx0XHQgKlx0IFNIQS0yNTYsIFNIQS0zODQsIG9yIFNIQS01MTIpXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dEZvcm1hdCBUaGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0dGluZ1xuXHRcdCAqXHQgKEI2NCBvciBIRVgpXG5cdFx0ICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBoYXNoIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkXG5cdFx0ICovXG5cdFx0Z2V0SE1BQyA6IGZ1bmN0aW9uIChrZXksIGlucHV0Rm9ybWF0LCB2YXJpYW50LCBvdXRwdXRGb3JtYXQpXG5cdFx0e1xuXHRcdFx0dmFyIGZvcm1hdEZ1bmMsIGtleVRvVXNlLCBibG9ja0J5dGVTaXplLCBibG9ja0JpdFNpemUsIGksXG5cdFx0XHRcdHJldFZhbCwgbGFzdEFycmF5SW5kZXgsIGtleUJpbkxlbiwgaGFzaEJpdFNpemUsXG5cdFx0XHRcdGtleVdpdGhJUGFkID0gW10sIGtleVdpdGhPUGFkID0gW107XG5cblx0XHRcdC8qIFZhbGlkYXRlIHRoZSBvdXRwdXQgZm9ybWF0IHNlbGVjdGlvbiAqL1xuXHRcdFx0c3dpdGNoIChvdXRwdXRGb3JtYXQpXG5cdFx0XHR7XG5cdFx0XHRjYXNlIFwiSEVYXCI6XG5cdFx0XHRcdGZvcm1hdEZ1bmMgPSBiaW5iMmhleDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQjY0XCI6XG5cdFx0XHRcdGZvcm1hdEZ1bmMgPSBiaW5iMmI2NDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQVNDSUlcIjpcblx0XHRcdFx0Zm9ybWF0RnVuYyA9IGJpbmIyc3RyO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBcIkZPUk1BVCBOT1QgUkVDT0dOSVpFRFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiBWYWxpZGF0ZSB0aGUgaGFzaCB2YXJpYW50IHNlbGVjdGlvbiBhbmQgc2V0IG5lZWRlZCB2YXJpYWJsZXMgKi9cblx0XHRcdHN3aXRjaCAodmFyaWFudClcblx0XHRcdHtcblx0XHRcdGNhc2UgXCJTSEEtMVwiOlxuXHRcdFx0XHRibG9ja0J5dGVTaXplID0gNjQ7XG5cdFx0XHRcdGhhc2hCaXRTaXplID0gMTYwO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJTSEEtMjI0XCI6XG5cdFx0XHRcdGJsb2NrQnl0ZVNpemUgPSA2NDtcblx0XHRcdFx0aGFzaEJpdFNpemUgPSAyMjQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlNIQS0yNTZcIjpcblx0XHRcdFx0YmxvY2tCeXRlU2l6ZSA9IDY0O1xuXHRcdFx0XHRoYXNoQml0U2l6ZSA9IDI1Njtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU0hBLTM4NFwiOlxuXHRcdFx0XHRibG9ja0J5dGVTaXplID0gMTI4O1xuXHRcdFx0XHRoYXNoQml0U2l6ZSA9IDM4NDtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiU0hBLTUxMlwiOlxuXHRcdFx0XHRibG9ja0J5dGVTaXplID0gMTI4O1xuXHRcdFx0XHRoYXNoQml0U2l6ZSA9IDUxMjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gXCJIQVNIIE5PVCBSRUNPR05JWkVEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8qIFZhbGlkYXRlIGlucHV0IGZvcm1hdCBzZWxlY3Rpb24gKi9cblx0XHRcdGlmIChcIkhFWFwiID09PSBpbnB1dEZvcm1hdClcblx0XHRcdHtcblx0XHRcdFx0LyogTmliYmxlcyBtdXN0IGNvbWUgaW4gcGFpcnMgKi9cblx0XHRcdFx0aWYgKDAgIT09IChrZXkubGVuZ3RoICUgMikpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXR1cm4gXCJLRVkgTVVTVCBCRSBJTiBCWVRFIElOQ1JFTUVOVFNcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRrZXlUb1VzZSA9IGhleDJiaW5iKGtleSk7XG5cdFx0XHRcdGtleUJpbkxlbiA9IGtleS5sZW5ndGggKiA0O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoXCJBU0NJSVwiID09PSBpbnB1dEZvcm1hdClcblx0XHRcdHtcblx0XHRcdFx0a2V5VG9Vc2UgPSBzdHIyYmluYihrZXkpO1xuXHRcdFx0XHRrZXlCaW5MZW4gPSBrZXkubGVuZ3RoICogY2hhclNpemU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHJldHVybiBcIlVOS05PV04gS0VZIElOUFVUIFRZUEVcIjtcblx0XHRcdH1cblxuXHRcdFx0LyogVGhlc2UgYXJlIHVzZWQgbXVsdGlwbGUgdGltZXMsIGNhbGN1bGF0ZSBhbmQgc3RvcmUgdGhlbSAqL1xuXHRcdFx0YmxvY2tCaXRTaXplID0gYmxvY2tCeXRlU2l6ZSAqIDg7XG5cdFx0XHRsYXN0QXJyYXlJbmRleCA9IChibG9ja0J5dGVTaXplIC8gNCkgLSAxO1xuXG5cdFx0XHQvKiBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGUga2V5IGJhc2VkIG9uIGl0cyBzaXplIHJlbGF0aXZlIHRvXG5cdFx0XHQgKiB0aGUgaGFzaCdzIGJsb2NrIHNpemUgKi9cblx0XHRcdGlmIChibG9ja0J5dGVTaXplIDwgKGtleUJpbkxlbiAvIDgpKVxuXHRcdFx0e1xuXHRcdFx0XHRpZiAoXCJTSEEtMVwiID09PSB2YXJpYW50KVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5VG9Vc2UgPSBjb3JlU0hBMShrZXlUb1VzZSwga2V5QmluTGVuKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXlUb1VzZSA9IGNvcmVTSEEyKGtleVRvVXNlLCBrZXlCaW5MZW4sIHZhcmlhbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qIEZvciBhbGwgdmFyaWFudHMsIHRoZSBibG9jayBzaXplIGlzIGJpZ2dlciB0aGFuIHRoZSBvdXRwdXRcblx0XHRcdFx0ICogc2l6ZSBzbyB0aGVyZSB3aWxsIG5ldmVyIGJlIGEgdXNlZnVsIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGVcblx0XHRcdFx0ICogc3RyaW5nICovXG5cdFx0XHRcdGtleVRvVXNlW2xhc3RBcnJheUluZGV4XSAmPSAweEZGRkZGRjAwO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoYmxvY2tCeXRlU2l6ZSA+IChrZXlCaW5MZW4gLyA4KSlcblx0XHRcdHtcblx0XHRcdFx0LyogSWYgdGhlIGJsb2NrQnl0ZVNpemUgaXMgZ3JlYXRlciB0aGFuIHRoZSBrZXkgbGVuZ3RoLCB0aGVyZVxuXHRcdFx0XHQgKiB3aWxsIGFsd2F5cyBiZSBhdCBMRUFTVCBvbmUgXCJ1c2VsZXNzXCIgYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZVxuXHRcdFx0XHQgKiBzdHJpbmcgKi9cblx0XHRcdFx0a2V5VG9Vc2VbbGFzdEFycmF5SW5kZXhdICY9IDB4RkZGRkZGMDA7XG5cdFx0XHR9XG5cblx0XHRcdC8qIENyZWF0ZSBpcGFkIGFuZCBvcGFkICovXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDw9IGxhc3RBcnJheUluZGV4OyBpICs9IDEpXG5cdFx0XHR7XG5cdFx0XHRcdGtleVdpdGhJUGFkW2ldID0ga2V5VG9Vc2VbaV0gXiAweDM2MzYzNjM2O1xuXHRcdFx0XHRrZXlXaXRoT1BhZFtpXSA9IGtleVRvVXNlW2ldIF4gMHg1QzVDNUM1Qztcblx0XHRcdH1cblxuXHRcdFx0LyogQ2FsY3VsYXRlIHRoZSBITUFDICovXG5cdFx0XHRpZiAoXCJTSEEtMVwiID09PSB2YXJpYW50KVxuXHRcdFx0e1xuXHRcdFx0XHRyZXRWYWwgPSBjb3JlU0hBMShcblx0XHRcdFx0XHRcdFx0a2V5V2l0aElQYWQuY29uY2F0KHRoaXMuc3RyVG9IYXNoKSxcblx0XHRcdFx0XHRcdFx0YmxvY2tCaXRTaXplICsgdGhpcy5zdHJCaW5MZW4pO1xuXHRcdFx0XHRyZXRWYWwgPSBjb3JlU0hBMShcblx0XHRcdFx0XHRcdFx0a2V5V2l0aE9QYWQuY29uY2F0KHJldFZhbCksXG5cdFx0XHRcdFx0XHRcdGJsb2NrQml0U2l6ZSArIGhhc2hCaXRTaXplKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0cmV0VmFsID0gY29yZVNIQTIoXG5cdFx0XHRcdFx0XHRcdGtleVdpdGhJUGFkLmNvbmNhdCh0aGlzLnN0clRvSGFzaCksXG5cdFx0XHRcdFx0XHRcdGJsb2NrQml0U2l6ZSArIHRoaXMuc3RyQmluTGVuLCB2YXJpYW50KTtcblx0XHRcdFx0cmV0VmFsID0gY29yZVNIQTIoXG5cdFx0XHRcdFx0XHRcdGtleVdpdGhPUGFkLmNvbmNhdChyZXRWYWwpLFxuXHRcdFx0XHRcdFx0XHRibG9ja0JpdFNpemUgKyBoYXNoQml0U2l6ZSwgdmFyaWFudCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoZm9ybWF0RnVuYyhyZXRWYWwpKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIGpzU0hBO1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHNoYTE6IGZ1bmN0aW9uKHN0cikge1xuXHRcdHZhciBzaGFPYmogPSBuZXcganNTSEEoc3RyLCBcIkFTQ0lJXCIpO1xuXHRcdHJldHVybiBzaGFPYmouZ2V0SGFzaChcIlNIQS0xXCIsIFwiQVNDSUlcIik7XG5cdH0sXG5cdHNoYTIyNDogZnVuY3Rpb24oc3RyKSB7XG5cdFx0dmFyIHNoYU9iaiA9IG5ldyBqc1NIQShzdHIsIFwiQVNDSUlcIik7XG5cdFx0cmV0dXJuIHNoYU9iai5nZXRIYXNoKFwiU0hBLTIyNFwiLCBcIkFTQ0lJXCIpO1xuXHR9LFxuXHRzaGEyNTY6IGZ1bmN0aW9uKHN0cikge1xuXHRcdHZhciBzaGFPYmogPSBuZXcganNTSEEoc3RyLCBcIkFTQ0lJXCIpO1xuXHRcdHJldHVybiBzaGFPYmouZ2V0SGFzaChcIlNIQS0yNTZcIiwgXCJBU0NJSVwiKTtcblx0fSxcblx0c2hhMzg0OiBmdW5jdGlvbihzdHIpIHtcblx0XHR2YXIgc2hhT2JqID0gbmV3IGpzU0hBKHN0ciwgXCJBU0NJSVwiKTtcblx0XHRyZXR1cm4gc2hhT2JqLmdldEhhc2goXCJTSEEtMzg0XCIsIFwiQVNDSUlcIik7XG5cblx0fSxcblx0c2hhNTEyOiBmdW5jdGlvbihzdHIpIHtcblx0XHR2YXIgc2hhT2JqID0gbmV3IGpzU0hBKHN0ciwgXCJBU0NJSVwiKTtcblx0XHRyZXR1cm4gc2hhT2JqLmdldEhhc2goXCJTSEEtNTEyXCIsIFwiQVNDSUlcIik7XG5cdH1cbn1cbiIsIlxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGNpcGhlcjogcmVxdWlyZSgnLi9jaXBoZXInKSxcblx0aGFzaDogcmVxdWlyZSgnLi9oYXNoJyksXG5cdGNmYjogcmVxdWlyZSgnLi9jZmIuanMnKSxcblx0cHVibGljS2V5OiByZXF1aXJlKCcuL3B1YmxpY19rZXknKSxcblx0c2lnbmF0dXJlOiByZXF1aXJlKCcuL3NpZ25hdHVyZS5qcycpLFxuXHRyYW5kb206IHJlcXVpcmUoJy4vcmFuZG9tLmpzJyksXG5cdHBrY3MxOiByZXF1aXJlKCcuL3BrY3MxLmpzJylcblxufVxuXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnLi9jcnlwdG8uanMnKTtcblxuZm9yKHZhciBpIGluIGNyeXB0bylcblx0bW9kdWxlLmV4cG9ydHNbaV0gPSBjcnlwdG9baV07XG5cblxuXG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEFTTjEgb2JqZWN0IGlkZW50aWZpZXJzIGZvciBoYXNoZXMgKFNlZSBSRkM0ODgwIDUuMi4yKVxuICovXG5oYXNoX2hlYWRlcnMgPSBuZXcgQXJyYXkoKTtcbmhhc2hfaGVhZGVyc1sxXSAgPSBbMHgzMCwweDIwLDB4MzAsMHgwYywweDA2LDB4MDgsMHgyYSwweDg2LDB4NDgsMHg4NiwweGY3LDB4MGQsMHgwMiwweDA1LDB4MDUsMHgwMCwweDA0LDB4MTBdO1xuaGFzaF9oZWFkZXJzWzNdICA9IFsweDMwLDB4MjEsMHgzMCwweDA5LDB4MDYsMHgwNSwweDJCLDB4MjQsMHgwMywweDAyLDB4MDEsMHgwNSwweDAwLDB4MDQsMHgxNF07XG5oYXNoX2hlYWRlcnNbMl0gID0gWzB4MzAsMHgyMSwweDMwLDB4MDksMHgwNiwweDA1LDB4MmIsMHgwZSwweDAzLDB4MDIsMHgxYSwweDA1LDB4MDAsMHgwNCwweDE0XTtcbmhhc2hfaGVhZGVyc1s4XSAgPSBbMHgzMCwweDMxLDB4MzAsMHgwZCwweDA2LDB4MDksMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAyLDB4MDEsMHgwNSwweDAwLDB4MDQsMHgyMF07XG5oYXNoX2hlYWRlcnNbOV0gID0gWzB4MzAsMHg0MSwweDMwLDB4MGQsMHgwNiwweDA5LDB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMiwweDAyLDB4MDUsMHgwMCwweDA0LDB4MzBdO1xuaGFzaF9oZWFkZXJzWzEwXSA9IFsweDMwLDB4NTEsMHgzMCwweDBkLDB4MDYsMHgwOSwweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDIsMHgwMywweDA1LDB4MDAsMHgwNCwweDQwXTtcbmhhc2hfaGVhZGVyc1sxMV0gPSBbMHgzMCwweDMxLDB4MzAsMHgwZCwweDA2LDB4MDksMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAyLDB4MDQsMHgwNSwweDAwLDB4MDQsMHgxQ107XG5cblxudmFyIGNyeXB0byA9IHJlcXVpcmUoJy4vY3J5cHRvLmpzJyksXG5cdHJhbmRvbSA9IHJlcXVpcmUoJy4vcmFuZG9tLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdEJpZ0ludGVnZXIgPSByZXF1aXJlKCcuL3B1YmxpY19rZXkvanNibi5qcycpLFxuXHRoYXNoID0gcmVxdWlyZSgnLi9oYXNoJyk7XG5cdFxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGVtZToge1xuXHQvKipcblx0ICogY3JlYXRlIGEgRU1FLVBLQ1MxLXYxXzUgcGFkZGluZyAoU2VlIFJGQzQ4ODAgMTMuMS4xKVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIHBhZGRlZFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlbmd0aCBMZW5ndGggdG8gdGhlIHJlc3VsdGluZyBtZXNzYWdlXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gRU1FLVBLQ1MxIHBhZGRlZCBtZXNzYWdlXG5cdCAqL1xuXHRlbmNvZGU6IGZ1bmN0aW9uKG1lc3NhZ2UsIGxlbmd0aCkge1xuXHRcdGlmIChtZXNzYWdlLmxlbmd0aCA+IGxlbmd0aC0xMSlcblx0XHRcdHJldHVybiAtMTtcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgyKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aCAtIG1lc3NhZ2UubGVuZ3RoIC0gMzsgaSsrKSB7XG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShyYW5kb20uZ2V0UHNldWRvUmFuZG9tKDEsMjU1KSk7XG5cdFx0fVxuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDApO1xuXHRcdHJlc3VsdCArPSBtZXNzYWdlO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIGRlY29kZXMgYSBFTUUtUEtDUzEtdjFfNSBwYWRkaW5nIChTZWUgUkZDNDg4MCAxMy4xLjIpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIEVNRS1QS0NTMSBwYWRkZWQgbWVzc2FnZVxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IGRlY29kZWQgbWVzc2FnZSBcblx0ICovXG5cdCBkZWNvZGU6IGZ1bmN0aW9uKG1lc3NhZ2UsIGxlbikge1xuXHRcdGlmIChtZXNzYWdlLmxlbmd0aCA8IGxlbilcblx0XHRcdG1lc3NhZ2UgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDApK21lc3NhZ2U7XG5cdFx0aWYgKG1lc3NhZ2UubGVuZ3RoIDwgMTIgfHwgbWVzc2FnZS5jaGFyQ29kZUF0KDApICE9IDAgfHwgbWVzc2FnZS5jaGFyQ29kZUF0KDEpICE9IDIpXG5cdFx0XHRyZXR1cm4gLTE7XG5cdFx0dmFyIGkgPSAyO1xuXHRcdHdoaWxlIChtZXNzYWdlLmNoYXJDb2RlQXQoaSkgIT0gMCAmJiBtZXNzYWdlLmxlbmd0aCA+IGkpXG5cdFx0XHRpKys7XG5cdFx0cmV0dXJuIG1lc3NhZ2Uuc3Vic3RyaW5nKGkrMSwgbWVzc2FnZS5sZW5ndGgpO1xuXHR9LFxuXHR9LFxuXG5cdGVtc2E6IHtcblxuXHQvKipcblx0ICogY3JlYXRlIGEgRU1TQS1QS0NTMS12MV81IHBhZGRpbmcgKFNlZSBSRkM0ODgwIDEzLjEuMylcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBhbGdvIEhhc2ggYWxnb3JpdGhtIHR5cGUgdXNlZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGJlIGhhc2hlZFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGtleWxlbmd0aCBLZXkgc2l6ZSBvZiB0aGUgcHVibGljIG1waSBpbiBieXRlc1xuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBIYXNoY29kZSB3aXRoIHBrY3MxcGFkZGluZyBhcyBzdHJpbmdcblx0ICovXG5cdGVuY29kZTogZnVuY3Rpb24oYWxnbywgZGF0YSwga2V5bGVuZ3RoKSB7XG5cdFx0dmFyIGRhdGEyID0gXCJcIjtcblx0XHRkYXRhMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApO1xuXHRcdGRhdGEyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHgwMSk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAoa2V5bGVuZ3RoIC0gaGFzaF9oZWFkZXJzW2FsZ29dLmxlbmd0aCAtIDMgLSBcblx0XHRcdGhhc2guZ2V0SGFzaEJ5dGVMZW5ndGgoYWxnbykpOyBpKyspXG5cblx0XHRcdGRhdGEyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhmZik7XG5cblx0XHRkYXRhMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApO1xuXHRcdFxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaGFzaF9oZWFkZXJzW2FsZ29dLmxlbmd0aDsgaSsrKVxuXHRcdFx0ZGF0YTIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShoYXNoX2hlYWRlcnNbYWxnb11baV0pO1xuXHRcdFxuXHRcdGRhdGEyICs9IGhhc2guZGlnZXN0KGFsZ28sIGRhdGEpO1xuXHRcdHJldHVybiBuZXcgQmlnSW50ZWdlcih1dGlsLmhleHN0cmR1bXAoZGF0YTIpLDE2KTtcblx0fSxcblxuXHQvKipcblx0ICogZXh0cmFjdCB0aGUgaGFzaCBvdXQgb2YgYW4gRU1TQS1QS0NTMS12MS41IHBhZGRpbmcgKFNlZSBSRkM0ODgwIDEzLjEuMykgXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIEhhc2ggaW4gcGtjczEgZW5jb2Rpbmdcblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIGhhc2ggYXMgc3RyaW5nXG5cdCAqL1xuXHRkZWNvZGU6IGZ1bmN0aW9uKGFsZ28sIGRhdGEpIHsgXG5cdFx0dmFyIGkgPSAwO1xuXHRcdGlmIChkYXRhLmNoYXJDb2RlQXQoMCkgPT0gMCkgaSsrO1xuXHRcdGVsc2UgaWYgKGRhdGEuY2hhckNvZGVBdCgwKSAhPSAxKSByZXR1cm4gLTE7XG5cdFx0ZWxzZSBpKys7XG5cblx0XHR3aGlsZSAoZGF0YS5jaGFyQ29kZUF0KGkpID09IDB4RkYpIGkrKztcblx0XHRpZiAoZGF0YS5jaGFyQ29kZUF0KGkrKykgIT0gMCkgcmV0dXJuIC0xO1xuXHRcdHZhciBqID0gMDtcblx0XHRmb3IgKGogPSAwOyBqIDwgaGFzaF9oZWFkZXJzW2FsZ29dLmxlbmd0aCAmJiBqK2kgPCBkYXRhLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRpZiAoZGF0YS5jaGFyQ29kZUF0KGoraSkgIT0gaGFzaF9oZWFkZXJzW2FsZ29dW2pdKSByZXR1cm4gLTE7XG5cdFx0fVxuXHRcdGkrPSBqO1x0XG5cdFx0aWYgKGRhdGEuc3Vic3RyaW5nKGkpLmxlbmd0aCA8IGhhc2guZ2V0SGFzaEJ5dGVMZW5ndGgoYWxnbykpIHJldHVybiAtMTtcblx0XHRyZXR1cm4gZGF0YS5zdWJzdHJpbmcoaSk7XG5cdH1cblx0fVxufVxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0Fcbi8vXG4vLyBBIERpZ2l0YWwgc2lnbmF0dXJlIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvblxuXG52YXIgQmlnSW50ZWdlciA9IHJlcXVpcmUoJy4vanNibi5qcycpLFxuICByYW5kb20gPSByZXF1aXJlKCcuLi9yYW5kb20uanMnKSxcbiAgaGFzaE1vZHVsZSA9IHJlcXVpcmUoJy4uL2hhc2gnKSxcblx0dXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwnKTtcblxuZnVuY3Rpb24gRFNBKCkge1xuXHQvLyBzMSA9ICgoZyoqcykgbW9kIHApIG1vZCBxXG5cdC8vIHMxID0gKChzKiotMSkqKHNoYS0xKG0pKyhzMSp4KSBtb2QgcSlcblx0ZnVuY3Rpb24gc2lnbihoYXNoYWxnbywgbSwgZywgcCwgcSwgeCkge1xuXHRcdC8vIElmIHRoZSBvdXRwdXQgc2l6ZSBvZiB0aGUgY2hvc2VuIGhhc2ggaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZlxuXHRcdC8vIGJpdHMgb2YgcSwgdGhlIGhhc2ggcmVzdWx0IGlzIHRydW5jYXRlZCB0byBmaXQgYnkgdGFraW5nIHRoZSBudW1iZXJcblx0XHQvLyBvZiBsZWZ0bW9zdCBiaXRzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cyBvZiBxLiAgVGhpcyAocG9zc2libHlcblx0XHQvLyB0cnVuY2F0ZWQpIGhhc2ggZnVuY3Rpb24gcmVzdWx0IGlzIHRyZWF0ZWQgYXMgYSBudW1iZXIgYW5kIHVzZWRcblx0XHQvLyBkaXJlY3RseSBpbiB0aGUgRFNBIHNpZ25hdHVyZSBhbGdvcml0aG0uXG5cdFx0dmFyIGhhc2hlZF9kYXRhID0gdXRpbC5nZXRMZWZ0TkJpdHMoaGFzaE1vZHVsZS5kaWdlc3QoaGFzaGFsZ28sbSkscS5iaXRMZW5ndGgoKSk7XG5cdFx0dmFyIGhhc2ggPSBuZXcgQmlnSW50ZWdlcih1dGlsLmhleHN0cmR1bXAoaGFzaGVkX2RhdGEpLCAxNik7XG5cdFx0dmFyIGsgPSByYW5kb20uZ2V0UmFuZG9tQmlnSW50ZWdlckluUmFuZ2UoQmlnSW50ZWdlci5PTkUuYWRkKEJpZ0ludGVnZXIuT05FKSwgcS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpO1xuXHRcdHZhciBzMSA9IChnLm1vZFBvdyhrLHApKS5tb2QocSk7IFxuXHRcdHZhciBzMiA9IChrLm1vZEludmVyc2UocSkubXVsdGlwbHkoaGFzaC5hZGQoeC5tdWx0aXBseShzMSkpKSkubW9kKHEpO1xuXHRcdHZhciByZXN1bHQgPSBuZXcgQXJyYXkoKTtcblx0XHRyZXN1bHRbMF0gPSBzMS50b01QSSgpO1xuXHRcdHJlc3VsdFsxXSA9IHMyLnRvTVBJKCk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXHRmdW5jdGlvbiBzZWxlY3RfaGFzaF9hbGdvcml0aG0ocSkge1xuXHRcdHZhciB1c2Vyc2V0dGluZyA9IG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5wcmVmZXJfaGFzaF9hbGdvcml0aG07XG5cdFx0Lypcblx0XHQgKiAxMDI0LWJpdCBrZXksIDE2MC1iaXQgcSwgU0hBLTEsIFNIQS0yMjQsIFNIQS0yNTYsIFNIQS0zODQsIG9yIFNIQS01MTIgaGFzaFxuXHRcdCAqIDIwNDgtYml0IGtleSwgMjI0LWJpdCBxLCBTSEEtMjI0LCBTSEEtMjU2LCBTSEEtMzg0LCBvciBTSEEtNTEyIGhhc2hcblx0XHQgKiAyMDQ4LWJpdCBrZXksIDI1Ni1iaXQgcSwgU0hBLTI1NiwgU0hBLTM4NCwgb3IgU0hBLTUxMiBoYXNoXG5cdFx0ICogMzA3Mi1iaXQga2V5LCAyNTYtYml0IHEsIFNIQS0yNTYsIFNIQS0zODQsIG9yIFNIQS01MTIgaGFzaFxuXHRcdCAqL1xuXHRcdHN3aXRjaCAoTWF0aC5yb3VuZChxLmJpdExlbmd0aCgpIC8gOCkpIHtcblx0XHRjYXNlIDIwOiAvLyAxMDI0IGJpdFxuXHRcdFx0aWYgKHVzZXJzZXR0aW5nICE9IDIgJiZcblx0XHRcdFx0dXNlcnNldHRpbmcgPiAxMSAmJlxuXHRcdFx0XHR1c2Vyc2V0dGluZyAhPSAxMCAmJlxuXHRcdFx0XHR1c2Vyc2V0dGluZyA8IDgpXG5cdFx0XHRcdHJldHVybiAyOyAvLyBwcmVmZXIgc2hhMVxuXHRcdFx0cmV0dXJuIHVzZXJzZXR0aW5nO1xuXHRcdGNhc2UgMjg6IC8vIDIwNDggYml0XG5cdFx0XHRpZiAodXNlcnNldHRpbmcgPiAxMSAmJlxuXHRcdFx0XHRcdHVzZXJzZXR0aW5nIDwgOClcblx0XHRcdFx0XHRyZXR1cm4gMTE7XG5cdFx0XHRyZXR1cm4gdXNlcnNldHRpbmc7XG5cdFx0Y2FzZSAzMjogLy8gNDA5NiBiaXQgLy8gcHJlZmVyIHNoYTIyNFxuXHRcdFx0aWYgKHVzZXJzZXR0aW5nID4gMTAgJiZcblx0XHRcdFx0XHR1c2Vyc2V0dGluZyA8IDgpXG5cdFx0XHRcdFx0cmV0dXJuIDg7IC8vIHByZWZlciBzaGEyNTZcblx0XHRcdHJldHVybiB1c2Vyc2V0dGluZztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dXRpbC5wcmludF9kZWJ1ZyhcIkRTQSBzZWxlY3QgaGFzaCBhbGdvcml0aG06IHJldHVybmluZyBudWxsIGZvciBhbiB1bmtub3duIGxlbmd0aCBvZiBxXCIpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcblx0XHR9XG5cdH1cblx0dGhpcy5zZWxlY3RfaGFzaF9hbGdvcml0aG0gPSBzZWxlY3RfaGFzaF9hbGdvcml0aG07XG5cdFxuXHRmdW5jdGlvbiB2ZXJpZnkoaGFzaGFsZ28sIHMxLHMyLG0scCxxLGcseSkge1xuXHRcdHZhciBoYXNoZWRfZGF0YSA9IHV0aWwuZ2V0TGVmdE5CaXRzKGhhc2hNb2R1bGUuZGlnZXN0KGhhc2hhbGdvLG0pLHEuYml0TGVuZ3RoKCkpO1xuXHRcdHZhciBoYXNoID0gbmV3IEJpZ0ludGVnZXIodXRpbC5oZXhzdHJkdW1wKGhhc2hlZF9kYXRhKSwgMTYpOyBcblx0XHRpZiAoQmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhzMSkgPiAwIHx8XG5cdFx0XHRcdHMxLmNvbXBhcmVUbyhxKSA+IDAgfHxcblx0XHRcdFx0QmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhzMikgPiAwIHx8XG5cdFx0XHRcdHMyLmNvbXBhcmVUbyhxKSA+IDApIHtcblx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJpbnZhbGlkIERTQSBTaWduYXR1cmVcIik7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0dmFyIHcgPSBzMi5tb2RJbnZlcnNlKHEpO1xuXHRcdHZhciB1MSA9IGhhc2gubXVsdGlwbHkodykubW9kKHEpO1xuXHRcdHZhciB1MiA9IHMxLm11bHRpcGx5KHcpLm1vZChxKTtcblx0XHRyZXR1cm4gZy5tb2RQb3codTEscCkubXVsdGlwbHkoeS5tb2RQb3codTIscCkpLm1vZChwKS5tb2QocSk7XG5cdH1cblx0XG5cdC8qXG5cdCAqIHVudXNlZCBjb2RlLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgc3RhcnQgdG8gd3JpdGUgYSBrZXkgZ2VuZXJhdG9yXG5cdCAqIGZ1bmN0aW9uLlxuXHRcblx0ZnVuY3Rpb24gZ2VuZXJhdGVLZXkoYml0Y291bnQpIHtcblx0ICAgIHZhciBxaSA9IG5ldyBCaWdJbnRlZ2VyKGJpdGNvdW50LCBwcmltZUNlbnRlcmllKTtcblx0ICAgIHZhciBwaSA9IGdlbmVyYXRlUChxLCA1MTIpO1xuXHQgICAgdmFyIGdpID0gZ2VuZXJhdGVHKHAsIHEsIGJpdGNvdW50KTtcblx0ICAgIHZhciB4aTtcblx0ICAgIGRvIHtcblx0ICAgICAgICB4aSA9IG5ldyBCaWdJbnRlZ2VyKHEuYml0Q291bnQoKSwgcmFuZCk7XG5cdCAgICB9IHdoaWxlICh4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pICE9IDEgJiYgeC5jb21wYXJlVG8ocSkgIT0gLTEpO1xuXHQgICAgdmFyIHlpID0gZy5tb2RQb3coeCwgcCk7XG5cdCAgICByZXR1cm4ge3g6IHhpLCBxOiBxaSwgcDogcGksIGc6IGdpLCB5OiB5aX07XG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVAocSwgYml0bGVuZ3RoLCByYW5kb21mbikge1xuXHQgICAgaWYgKGJpdGxlbmd0aCAlIDY0ICE9IDApIHtcblx0ICAgIFx0cmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgICAgdmFyIHBUZW1wO1xuXHQgICAgdmFyIHBUZW1wMjtcblx0ICAgIGRvIHtcblx0ICAgICAgICBwVGVtcCA9IHJhbmRvbWZuKGJpdGNvdW50LCB0cnVlKTtcblx0ICAgICAgICBwVGVtcDIgPSBwVGVtcC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG5cdCAgICAgICAgcFRlbXAgPSBwVGVtcC5zdWJ0cmFjdChwVGVtcDIucmVtYWluZGVyKHEpKTtcblx0ICAgIH0gd2hpbGUgKCFwVGVtcC5pc1Byb2JhYmxlUHJpbWUocHJpbWVDZW50ZXJpZSkgfHwgcFRlbXAuYml0TGVuZ3RoKCkgIT0gbCk7XG5cdCAgICByZXR1cm4gcFRlbXA7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGdlbmVyYXRlRyhwLCBxLCBiaXRsZW5ndGgsIHJhbmRvbWZuKSB7XG5cdCAgICB2YXIgYXV4ID0gcC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG5cdCAgICB2YXIgcG93ID0gYXV4LmRpdmlkZShxKTtcblx0ICAgIHZhciBnVGVtcDtcblx0ICAgIGRvIHtcblx0ICAgICAgICBnVGVtcCA9IHJhbmRvbWZuKGJpdGxlbmd0aCk7XG5cdCAgICB9IHdoaWxlIChnVGVtcC5jb21wYXJlVG8oYXV4KSAhPSAtMSAmJiBnVGVtcC5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDEpO1xuXHQgICAgcmV0dXJuIGdUZW1wLm1vZFBvdyhwb3csIHApO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVLKHEsIGJpdGxlbmd0aCwgcmFuZG9tZm4pIHtcblx0ICAgIHZhciB0ZW1wSztcblx0ICAgIGRvIHtcblx0ICAgICAgICB0ZW1wSyA9IHJhbmRvbWZuKGJpdGxlbmd0aCwgZmFsc2UpO1xuXHQgICAgfSB3aGlsZSAodGVtcEsuY29tcGFyZVRvKHEpICE9IC0xICYmIHRlbXBLLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pICE9IDEpO1xuXHQgICAgcmV0dXJuIHRlbXBLO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVSKHEscCkge1xuXHQgICAgayA9IGdlbmVyYXRlSyhxKTtcblx0ICAgIHZhciByID0gZy5tb2RQb3coaywgcCkubW9kKHEpO1xuXHQgICAgcmV0dXJuIHI7XG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVMoaGFzaGZuLGsscixtLHEseCkge1xuICAgICAgICB2YXIgaGFzaCA9IGhhc2hmbihtKTtcbiAgICAgICAgcyA9IChrLm1vZEludmVyc2UocSkubXVsdGlwbHkoaGFzaC5hZGQoeC5tdWx0aXBseShyKSkpKS5tb2QocSk7XG5cdCAgICByZXR1cm4gcztcblx0fSAqL1xuXHR0aGlzLnNpZ24gPSBzaWduO1xuXHR0aGlzLnZlcmlmeSA9IHZlcmlmeTtcblx0Ly8gdGhpcy5nZW5lcmF0ZSA9IGdlbmVyYXRlS2V5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERTQTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdEpYRyA9IHJlcXVpcmUoJy4uL2NvbXByZXNzaW9uL2p4Zy5qcycpLFxuXHRiYXNlNjQgPSByZXF1aXJlKCcuLi9lbmNvZGluZy9iYXNlNjQuanMnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIENvbXByZXNzZWQgRGF0YSBQYWNrZXQgKFRhZyA4KVxuICogXG4gKiBSRkM0ODgwIDUuNjpcbiAqIFRoZSBDb21wcmVzc2VkIERhdGEgcGFja2V0IGNvbnRhaW5zIGNvbXByZXNzZWQgZGF0YS4gIFR5cGljYWxseSwgdGhpc1xuICogcGFja2V0IGlzIGZvdW5kIGFzIHRoZSBjb250ZW50cyBvZiBhbiBlbmNyeXB0ZWQgcGFja2V0LCBvciBmb2xsb3dpbmdcbiAqIGEgU2lnbmF0dXJlIG9yIE9uZS1QYXNzIFNpZ25hdHVyZSBwYWNrZXQsIGFuZCBjb250YWlucyBhIGxpdGVyYWwgZGF0YVxuICogcGFja2V0LlxuICovICAgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldF9jb21wcmVzc2VkKCkge1xuXHQvKiogQHR5cGUge3BhY2tldGxpc3R9ICovXG5cdHRoaXMucGFja2V0cztcblx0LyoqIEB0eXBlIHtjb21wcmVzc2lvbn0gKi9cblx0dGhpcy5hbGdvcml0aG0gPSAndW5jb21wcmVzc2VkJztcblxuXHR0aGlzLmNvbXByZXNzZWQgPSBudWxsO1xuXG5cdFxuXHQvKipcblx0ICogUGFyc2luZyBmdW5jdGlvbiBmb3IgdGhlIHBhY2tldC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFBheWxvYWQgb2YgYSB0YWcgOCBwYWNrZXRcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmluZ1xuXHQgKiBAcGFyQU0ge2lOVEVHRVJ9IExFTiBsRU5HVEggT0YgdGhlIHBhY2tldCBvciB0aGUgcmVtYWluaW5nIGxlbmd0aCBvZiBcblx0ICogaW5wdXQgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfY29tcHJlc3NlZH0gT2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdC8vIE9uZSBvY3RldCB0aGF0IGdpdmVzIHRoZSBhbGdvcml0aG0gdXNlZCB0byBjb21wcmVzcyB0aGUgcGFja2V0LlxuXHRcdHRoaXMuYWxnb3JpdGhtID0gZW51bXMucmVhZChlbnVtcy5jb21wcmVzc2lvbiwgYnl0ZXMuY2hhckNvZGVBdCgwKSk7XG5cblx0XHQvLyBDb21wcmVzc2VkIGRhdGEsIHdoaWNoIG1ha2VzIHVwIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhY2tldC5cblx0XHR0aGlzLmNvbXByZXNzZWQgPSBieXRlcy5zdWJzdHIoMSk7XG5cblx0XHR0aGlzLmRlY29tcHJlc3MoKTtcblx0fVxuXG5cdFxuXHRcblx0dGhpcy53cml0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmKHRoaXMuY29tcHJlc3NlZCA9PSBudWxsKVxuXHRcdFx0dGhpcy5jb21wcmVzcygpO1xuXG5cdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZW51bXMud3JpdGUoZW51bXMuY29tcHJlc3Npb24sIHRoaXMuYWxnb3JpdGhtKSkgXG5cdFx0XHQrIHRoaXMuY29tcHJlc3NlZDtcblx0fVxuXG5cblx0LyoqXG5cdCAqIERlY29tcHJlc3Npb24gbWV0aG9kIGZvciBkZWNvbXByZXNzaW5nIHRoZSBjb21wcmVzc2VkIGRhdGFcblx0ICogcmVhZCBieSByZWFkX3BhY2tldFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBkZWNvbXByZXNzZWQgZGF0YVxuXHQgKi9cblx0dGhpcy5kZWNvbXByZXNzID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGRlY29tcHJlc3NlZDtcblxuXHRcdHN3aXRjaCAodGhpcy5hbGdvcml0aG0pIHtcblx0XHRjYXNlICd1bmNvbXByZXNzZWQnOlxuXHRcdFx0ZGVjb21wcmVzc2VkID0gdGhpcy5jb21wcmVzc2VkO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICd6aXAnOlxuXHRcdFx0dmFyIGNvbXBEYXRhID0gdGhpcy5jb21wcmVzc2VkO1xuXG5cdFx0XHR2YXIgcmFkaXggPSBiYXNlNjQuZW5jb2RlKGNvbXBEYXRhKS5yZXBsYWNlKC9cXG4vZyxcIlwiKTtcblx0XHRcdC8vIG5vIGhlYWRlciBpbiB0aGlzIGNhc2UsIGRpcmVjdGx5IGNhbGwgZGVmbGF0ZVxuXHRcdFx0dmFyIGp4Z19vYmogPSBuZXcgSlhHLlV0aWwuVW56aXAoSlhHLlV0aWwuQmFzZTY0LmRlY29kZUFzQXJyYXkocmFkaXgpKTtcblxuXHRcdFx0ZGVjb21wcmVzc2VkID0gdW5lc2NhcGUoanhnX29iai5kZWZsYXRlKClbMF1bMF0pO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICd6bGliJzpcblx0XHRcdC8vUkZDIDE5NTAuIEJpdHMgMC0zIENvbXByZXNzaW9uIE1ldGhvZFxuXHRcdFx0dmFyIGNvbXByZXNzaW9uTWV0aG9kID0gdGhpcy5jb21wcmVzc2VkLmNoYXJDb2RlQXQoMCkgJSAweDEwO1xuXG5cdFx0XHQvL0JpdHMgNC03IFJGQyAxOTUwIGFyZSBMWjc3IFdpbmRvdy4gR2VuZXJhbGx5IHRoaXMgdmFsdWUgaXMgNyA9PSAzMmsgd2luZG93IHNpemUuXG5cdFx0XHQvLyAybmQgQnl0ZSBpbiBSRkMgMTk1MCBpcyBmb3IgXCJGTEFHc1wiIEFsbG93cyBmb3IgYSBEaWN0aW9uYXJ5IFxuXHRcdFx0Ly8gKGhvdyBpcyB0aGlzIGRlZmluZWQpLiBCYXNpYyBjaGVja3N1bSwgYW5kIGNvbXByZXNzaW9uIGxldmVsLlxuXG5cdFx0XHRpZiAoY29tcHJlc3Npb25NZXRob2QgPT0gOCkgeyAvL0NNIDggaXMgZm9yIERFRkxBVEUsIFJGQyAxOTUxXG5cdFx0XHRcdC8vIHJlbW92ZSA0IGJ5dGVzIEFETEVSMzIgY2hlY2tzdW0gZnJvbSB0aGUgZW5kXG5cdFx0XHRcdHZhciBjb21wRGF0YSA9IHRoaXMuY29tcHJlc3NlZC5zdWJzdHJpbmcoMCwgdGhpcy5jb21wcmVzc2VkLmxlbmd0aCAtIDQpO1xuXHRcdFx0XHR2YXIgcmFkaXggPSBiYXNlNjQuZW5jb2RlKGNvbXBEYXRhKS5yZXBsYWNlKC9cXG4vZyxcIlwiKTtcblx0XHRcdFx0Ly9UT0RPIGNoZWNrIEFETEVSMzIgY2hlY2tzdW1cblx0XHRcdFx0ZGVjb21wcmVzc2VkID0gSlhHLmRlY29tcHJlc3MocmFkaXgpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXRpbC5wcmludF9lcnJvcihcIkNvbXByZXNzaW9uIGFsZ29yaXRobSBaTElCIG9ubHkgc3VwcG9ydHMgXCIgK1xuXHRcdFx0XHRcdFwiREVGTEFURSBjb21wcmVzc2lvbiBtZXRob2QuXCIpO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdiemlwMic6XG5cdFx0XHQvLyBUT0RPOiBuZWVkIHRvIGltcGxlbWVudCB0aGlzXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvbXByZXNzaW9uIGFsZ29yaXRobSBCWmlwMiBbQloyXSBpcyBub3QgaW1wbGVtZW50ZWQuJyk7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb21wcmVzc2lvbiBhbGdvcml0aG0gdW5rbm93biA6XCIgKyB0aGlzLmFsb2dyaXRobSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHR0aGlzLnBhY2tldHMucmVhZChkZWNvbXByZXNzZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbXByZXNzIHRoZSBwYWNrZXQgZGF0YSAobWVtYmVyIGRlY29tcHJlc3NlZERhdGEpXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gdHlwZSBBbGdvcml0aG0gdG8gYmUgdXNlZCAvLyBTZWUgUkZDIDQ4ODAgOS4zXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIERhdGEgdG8gYmUgY29tcHJlc3NlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjb21wcmVzc2VkIGRhdGEgc3RvcmVkIGluIGF0dHJpYnV0ZSBjb21wcmVzc2VkRGF0YVxuXHQgKi9cblx0dGhpcy5jb21wcmVzcyA9IGZ1bmN0aW9uKCkge1xuXHRcdHN3aXRjaCAodGhpcy5hbGdvcml0aG0pIHtcblxuXHRcdGNhc2UgJ3VuY29tcHJlc3NlZCc6IC8vIC0gVW5jb21wcmVzc2VkXG5cdFx0XHR0aGlzLmNvbXByZXNzZWQgPSB0aGlzLnBhY2tldHMud3JpdGUoKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnemlwJzogLy8gLSBaSVAgW1JGQzE5NTFdXG5cdFx0XHR1dGlsLnByaW50X2Vycm9yKFwiQ29tcHJlc3Npb24gYWxnb3JpdGhtIFpJUCBbUkZDMTk1MV0gaXMgbm90IGltcGxlbWVudGVkLlwiKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnemxpYic6IC8vIC0gWkxJQiBbUkZDMTk1MF1cblx0XHRcdC8vIFRPRE86IG5lZWQgdG8gaW1wbGVtZW50IHRoaXNcblx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJDb21wcmVzc2lvbiBhbGdvcml0aG0gWkxJQiBbUkZDMTk1MF0gaXMgbm90IGltcGxlbWVudGVkLlwiKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnYnppcDInOiAvLyAgLSBCWmlwMiBbQloyXVxuXHRcdFx0Ly8gVE9ETzogbmVlZCB0byBpbXBsZW1lbnQgdGhpc1xuXHRcdFx0dXRpbC5wcmludF9lcnJvcihcIkNvbXByZXNzaW9uIGFsZ29yaXRobSBCWmlwMiBbQloyXSBpcyBub3QgaW1wbGVtZW50ZWQuXCIpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0dXRpbC5wcmludF9lcnJvcihcIkNvbXByZXNzaW9uIGFsZ29yaXRobSB1bmtub3duIDpcIit0aGlzLnR5cGUpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG59O1xuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0Fcbi8vXG4vLyBFbEdhbWFsIGltcGxlbWVudGF0aW9uXG5cbnZhciBCaWdJbnRlZ2VyID0gcmVxdWlyZSgnLi9qc2JuLmpzJyksXG4gIHJhbmRvbSA9IHJlcXVpcmUoJy4uL3JhbmRvbS5qcycpLFxuICB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbCcpO1xuXG5mdW5jdGlvbiBFbGdhbWFsKCkge1xuXG4gIGZ1bmN0aW9uIGVuY3J5cHQobSxnLHAseSkge1xuICAgIC8vICBjaG9vc2UgayBpbiB7MiwuLi4scC0yfVxuICAgIHZhciB0d28gPSBCaWdJbnRlZ2VyLk9ORS5hZGQoQmlnSW50ZWdlci5PTkUpO1xuICAgIHZhciBwTWludXMyID0gcC5zdWJ0cmFjdCh0d28pO1xuICAgIHZhciBrID0gcmFuZG9tLmdldFJhbmRvbUJpZ0ludGVnZXJJblJhbmdlKHR3bywgcE1pbnVzMik7XG4gICAgayA9IGsubW9kKHBNaW51czIpLmFkZChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgdmFyIGMgPSBbXTtcbiAgICBjWzBdID0gZy5tb2RQb3coaywgcCk7XG4gICAgY1sxXSA9IHkubW9kUG93KGssIHApLm11bHRpcGx5KG0pLm1vZChwKTtcbiAgICByZXR1cm4gYztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY3J5cHQoYzEsYzIscCx4KSB7XG4gICAgdXRpbC5wcmludF9kZWJ1ZyhcIkVsZ2FtYWwgRGVjcnlwdDpcXG5jMTpcIit1dGlsLmhleHN0cmR1bXAoYzEudG9NUEkoKSkrXCJcXG5cIitcbiAgICAgICAgXCJjMjpcIit1dGlsLmhleHN0cmR1bXAoYzIudG9NUEkoKSkrXCJcXG5cIitcbiAgICAgICAgXCJwOlwiK3V0aWwuaGV4c3RyZHVtcChwLnRvTVBJKCkpK1wiXFxuXCIrXG4gICAgICAgIFwieDpcIit1dGlsLmhleHN0cmR1bXAoeC50b01QSSgpKSk7XG4gICAgcmV0dXJuIChjMS5tb2RQb3coeCwgcCkubW9kSW52ZXJzZShwKSkubXVsdGlwbHkoYzIpLm1vZChwKTtcbiAgICAvL3ZhciBjID0gYzEucG93KHgpLm1vZEludmVyc2UocCk7IC8vIGMwXi1hIG1vZCBwXG4gICAgICAvL3JldHVybiBjLm11bHRpcGx5KGMyKS5tb2QocCk7XG4gIH1cblxuICAvLyBzaWduaW5nIGFuZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHVzaW5nIEVsZ2FtYWwgaXMgbm90IHJlcXVpcmVkIGJ5IE9wZW5QR1AuXG4gIHRoaXMuZW5jcnlwdCA9IGVuY3J5cHQ7XG4gIHRoaXMuZGVjcnlwdCA9IGRlY3J5cHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRWxnYW1hbDtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuXHRyc2E6IHJlcXVpcmUoJy4vcnNhLmpzJyksXG5cdGVsZ2FtYWw6IHJlcXVpcmUoJy4vZWxnYW1hbC5qcycpLFxuXHRkc2E6IHJlcXVpcmUoJy4vZHNhLmpzJylcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSAgVG9tIFd1ICh0andAY3MuU3RhbmZvcmQuRURVKSBcbiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTW9kaWZpZWQgYnkgUmVjdXJpdHkgTGFicyBHbWJIIFxuICogXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuICogXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xuICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4gKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUy1JU1wiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBcbiAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgXG4gKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBcbiAqXG4gKiBJTiBOTyBFVkVOVCBTSEFMTCBUT00gV1UgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCxcbiAqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUlxuICogUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRlxuICogVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVFxuICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gYXBwbGllczpcbiAqXG4gKiBBbGwgcmVkaXN0cmlidXRpb25zIG11c3QgcmV0YWluIGFuIGludGFjdCBjb3B5IG9mIHRoaXMgY29weXJpZ2h0IG5vdGljZVxuICogYW5kIGRpc2NsYWltZXIuXG4gKi9cblxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwnKTtcblxuLy8gQmFzaWMgSmF2YVNjcmlwdCBCTiBsaWJyYXJ5IC0gc3Vic2V0IHVzZWZ1bCBmb3IgUlNBIGVuY3J5cHRpb24uXG5cbi8vIEJpdHMgcGVyIGRpZ2l0XG52YXIgZGJpdHM7XG5cbi8vIEphdmFTY3JpcHQgZW5naW5lIGFuYWx5c2lzXG52YXIgY2FuYXJ5ID0gMHhkZWFkYmVlZmNhZmU7XG52YXIgal9sbSA9ICgoY2FuYXJ5JjB4ZmZmZmZmKT09MHhlZmNhZmUpO1xuXG4vLyAocHVibGljKSBDb25zdHJ1Y3RvclxuZnVuY3Rpb24gQmlnSW50ZWdlcihhLGIsYykge1xuICBpZihhICE9IG51bGwpXG4gICAgaWYoXCJudW1iZXJcIiA9PSB0eXBlb2YgYSkgdGhpcy5mcm9tTnVtYmVyKGEsYixjKTtcbiAgICBlbHNlIGlmKGIgPT0gbnVsbCAmJiBcInN0cmluZ1wiICE9IHR5cGVvZiBhKSB0aGlzLmZyb21TdHJpbmcoYSwyNTYpO1xuICAgIGVsc2UgdGhpcy5mcm9tU3RyaW5nKGEsYik7XG59XG5cbi8vIHJldHVybiBuZXcsIHVuc2V0IEJpZ0ludGVnZXJcbmZ1bmN0aW9uIG5iaSgpIHsgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG51bGwpOyB9XG5cbi8vIGFtOiBDb21wdXRlIHdfaiArPSAoeCp0aGlzX2kpLCBwcm9wYWdhdGUgY2Fycmllcyxcbi8vIGMgaXMgaW5pdGlhbCBjYXJyeSwgcmV0dXJucyBmaW5hbCBjYXJyeS5cbi8vIGMgPCAzKmR2YWx1ZSwgeCA8IDIqZHZhbHVlLCB0aGlzX2kgPCBkdmFsdWVcbi8vIFdlIG5lZWQgdG8gc2VsZWN0IHRoZSBmYXN0ZXN0IG9uZSB0aGF0IHdvcmtzIGluIHRoaXMgZW52aXJvbm1lbnQuXG5cbi8vIGFtMTogdXNlIGEgc2luZ2xlIG11bHQgYW5kIGRpdmlkZSB0byBnZXQgdGhlIGhpZ2ggYml0cyxcbi8vIG1heCBkaWdpdCBiaXRzIHNob3VsZCBiZSAyNiBiZWNhdXNlXG4vLyBtYXggaW50ZXJuYWwgdmFsdWUgPSAyKmR2YWx1ZV4yLTIqZHZhbHVlICg8IDJeNTMpXG5mdW5jdGlvbiBhbTEoaSx4LHcsaixjLG4pIHtcbiAgd2hpbGUoLS1uID49IDApIHtcbiAgICB2YXIgdiA9IHgqdGhpc1tpKytdK3dbal0rYztcbiAgICBjID0gTWF0aC5mbG9vcih2LzB4NDAwMDAwMCk7XG4gICAgd1tqKytdID0gdiYweDNmZmZmZmY7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG4vLyBhbTIgYXZvaWRzIGEgYmlnIG11bHQtYW5kLWV4dHJhY3QgY29tcGxldGVseS5cbi8vIE1heCBkaWdpdCBiaXRzIHNob3VsZCBiZSA8PSAzMCBiZWNhdXNlIHdlIGRvIGJpdHdpc2Ugb3BzXG4vLyBvbiB2YWx1ZXMgdXAgdG8gMipoZHZhbHVlXjItaGR2YWx1ZS0xICg8IDJeMzEpXG5mdW5jdGlvbiBhbTIoaSx4LHcsaixjLG4pIHtcbiAgdmFyIHhsID0geCYweDdmZmYsIHhoID0geD4+MTU7XG4gIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgdmFyIGwgPSB0aGlzW2ldJjB4N2ZmZjtcbiAgICB2YXIgaCA9IHRoaXNbaSsrXT4+MTU7XG4gICAgdmFyIG0gPSB4aCpsK2gqeGw7XG4gICAgbCA9IHhsKmwrKChtJjB4N2ZmZik8PDE1KSt3W2pdKyhjJjB4M2ZmZmZmZmYpO1xuICAgIGMgPSAobD4+PjMwKSsobT4+PjE1KSt4aCpoKyhjPj4+MzApO1xuICAgIHdbaisrXSA9IGwmMHgzZmZmZmZmZjtcbiAgfVxuICByZXR1cm4gYztcbn1cbi8vIEFsdGVybmF0ZWx5LCBzZXQgbWF4IGRpZ2l0IGJpdHMgdG8gMjggc2luY2Ugc29tZVxuLy8gYnJvd3NlcnMgc2xvdyBkb3duIHdoZW4gZGVhbGluZyB3aXRoIDMyLWJpdCBudW1iZXJzLlxuZnVuY3Rpb24gYW0zKGkseCx3LGosYyxuKSB7XG4gIHZhciB4bCA9IHgmMHgzZmZmLCB4aCA9IHg+PjE0O1xuICB3aGlsZSgtLW4gPj0gMCkge1xuICAgIHZhciBsID0gdGhpc1tpXSYweDNmZmY7XG4gICAgdmFyIGggPSB0aGlzW2krK10+PjE0O1xuICAgIHZhciBtID0geGgqbCtoKnhsO1xuICAgIGwgPSB4bCpsKygobSYweDNmZmYpPDwxNCkrd1tqXStjO1xuICAgIGMgPSAobD4+MjgpKyhtPj4xNCkreGgqaDtcbiAgICB3W2orK10gPSBsJjB4ZmZmZmZmZjtcbiAgfVxuICByZXR1cm4gYztcbn1cbi8qaWYoal9sbSAmJiAobmF2aWdhdG9yICE9IHVuZGVmaW5lZCAmJiBcblx0bmF2aWdhdG9yLmFwcE5hbWUgPT0gXCJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcIikpIHtcbiAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTI7XG4gIGRiaXRzID0gMzA7XG59XG5lbHNlIGlmKGpfbG0gJiYgKG5hdmlnYXRvciAhPSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLmFwcE5hbWUgIT0gXCJOZXRzY2FwZVwiKSkgeyovXG4gIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0xO1xuICBkYml0cyA9IDI2O1xuLyp9XG5lbHNlIHsgLy8gTW96aWxsYS9OZXRzY2FwZSBzZWVtcyB0byBwcmVmZXIgYW0zXG4gIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0zO1xuICBkYml0cyA9IDI4O1xufSovXG5cbkJpZ0ludGVnZXIucHJvdG90eXBlLkRCID0gZGJpdHM7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5ETSA9ICgoMTw8ZGJpdHMpLTEpO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuRFYgPSAoMTw8ZGJpdHMpO1xuXG52YXIgQklfRlAgPSA1MjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLkZWID0gTWF0aC5wb3coMixCSV9GUCk7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5GMSA9IEJJX0ZQLWRiaXRzO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuRjIgPSAyKmRiaXRzLUJJX0ZQO1xuXG4vLyBEaWdpdCBjb252ZXJzaW9uc1xudmFyIEJJX1JNID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbnZhciBCSV9SQyA9IG5ldyBBcnJheSgpO1xudmFyIHJyLHZ2O1xucnIgPSBcIjBcIi5jaGFyQ29kZUF0KDApO1xuZm9yKHZ2ID0gMDsgdnYgPD0gOTsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcbnJyID0gXCJhXCIuY2hhckNvZGVBdCgwKTtcbmZvcih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xucnIgPSBcIkFcIi5jaGFyQ29kZUF0KDApO1xuZm9yKHZ2ID0gMTA7IHZ2IDwgMzY7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG5cbmZ1bmN0aW9uIGludDJjaGFyKG4pIHsgcmV0dXJuIEJJX1JNLmNoYXJBdChuKTsgfVxuZnVuY3Rpb24gaW50QXQocyxpKSB7XG4gIHZhciBjID0gQklfUkNbcy5jaGFyQ29kZUF0KGkpXTtcbiAgcmV0dXJuIChjPT1udWxsKT8tMTpjO1xufVxuXG4vLyAocHJvdGVjdGVkKSBjb3B5IHRoaXMgdG8gclxuZnVuY3Rpb24gYm5wQ29weVRvKHIpIHtcbiAgZm9yKHZhciBpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByW2ldID0gdGhpc1tpXTtcbiAgci50ID0gdGhpcy50O1xuICByLnMgPSB0aGlzLnM7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHNldCBmcm9tIGludGVnZXIgdmFsdWUgeCwgLURWIDw9IHggPCBEVlxuZnVuY3Rpb24gYm5wRnJvbUludCh4KSB7XG4gIHRoaXMudCA9IDE7XG4gIHRoaXMucyA9ICh4PDApPy0xOjA7XG4gIGlmKHggPiAwKSB0aGlzWzBdID0geDtcbiAgZWxzZSBpZih4IDwgLTEpIHRoaXNbMF0gPSB4K0RWO1xuICBlbHNlIHRoaXMudCA9IDA7XG59XG5cbi8vIHJldHVybiBiaWdpbnQgaW5pdGlhbGl6ZWQgdG8gdmFsdWVcbmZ1bmN0aW9uIG5idihpKSB7IHZhciByID0gbmJpKCk7IHIuZnJvbUludChpKTsgcmV0dXJuIHI7IH1cblxuLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gc3RyaW5nIGFuZCByYWRpeFxuZnVuY3Rpb24gYm5wRnJvbVN0cmluZyhzLGIpIHtcbiAgdmFyIGs7XG4gIGlmKGIgPT0gMTYpIGsgPSA0O1xuICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7XG4gIGVsc2UgaWYoYiA9PSAyNTYpIGsgPSA4OyAvLyBieXRlIGFycmF5XG4gIGVsc2UgaWYoYiA9PSAyKSBrID0gMTtcbiAgZWxzZSBpZihiID09IDMyKSBrID0gNTtcbiAgZWxzZSBpZihiID09IDQpIGsgPSAyO1xuICBlbHNlIHsgdGhpcy5mcm9tUmFkaXgocyxiKTsgcmV0dXJuOyB9XG4gIHRoaXMudCA9IDA7XG4gIHRoaXMucyA9IDA7XG4gIHZhciBpID0gcy5sZW5ndGgsIG1pID0gZmFsc2UsIHNoID0gMDtcbiAgd2hpbGUoLS1pID49IDApIHtcbiAgICB2YXIgeCA9IChrPT04KT9zW2ldJjB4ZmY6aW50QXQocyxpKTtcbiAgICBpZih4IDwgMCkge1xuICAgICAgaWYocy5jaGFyQXQoaSkgPT0gXCItXCIpIG1pID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtaSA9IGZhbHNlO1xuICAgIGlmKHNoID09IDApXG4gICAgICB0aGlzW3RoaXMudCsrXSA9IHg7XG4gICAgZWxzZSBpZihzaCtrID4gdGhpcy5EQikge1xuICAgICAgdGhpc1t0aGlzLnQtMV0gfD0gKHgmKCgxPDwodGhpcy5EQi1zaCkpLTEpKTw8c2g7XG4gICAgICB0aGlzW3RoaXMudCsrXSA9ICh4Pj4odGhpcy5EQi1zaCkpO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICB0aGlzW3RoaXMudC0xXSB8PSB4PDxzaDtcbiAgICBzaCArPSBrO1xuICAgIGlmKHNoID49IHRoaXMuREIpIHNoIC09IHRoaXMuREI7XG4gIH1cbiAgaWYoayA9PSA4ICYmIChzWzBdJjB4ODApICE9IDApIHtcbiAgICB0aGlzLnMgPSAtMTtcbiAgICBpZihzaCA+IDApIHRoaXNbdGhpcy50LTFdIHw9ICgoMTw8KHRoaXMuREItc2gpKS0xKTw8c2g7XG4gIH1cbiAgdGhpcy5jbGFtcCgpO1xuICBpZihtaSkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMsdGhpcyk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIGNsYW1wIG9mZiBleGNlc3MgaGlnaCB3b3Jkc1xuZnVuY3Rpb24gYm5wQ2xhbXAoKSB7XG4gIHZhciBjID0gdGhpcy5zJnRoaXMuRE07XG4gIHdoaWxlKHRoaXMudCA+IDAgJiYgdGhpc1t0aGlzLnQtMV0gPT0gYykgLS10aGlzLnQ7XG59XG5cbi8vIChwdWJsaWMpIHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gZ2l2ZW4gcmFkaXhcbmZ1bmN0aW9uIGJuVG9TdHJpbmcoYikge1xuICBpZih0aGlzLnMgPCAwKSByZXR1cm4gXCItXCIrdGhpcy5uZWdhdGUoKS50b1N0cmluZyhiKTtcbiAgdmFyIGs7XG4gIGlmKGIgPT0gMTYpIGsgPSA0O1xuICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7XG4gIGVsc2UgaWYoYiA9PSAyKSBrID0gMTtcbiAgZWxzZSBpZihiID09IDMyKSBrID0gNTtcbiAgZWxzZSBpZihiID09IDQpIGsgPSAyO1xuICBlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7XG4gIHZhciBrbSA9ICgxPDxrKS0xLCBkLCBtID0gZmFsc2UsIHIgPSBcIlwiLCBpID0gdGhpcy50O1xuICB2YXIgcCA9IHRoaXMuREItKGkqdGhpcy5EQiklaztcbiAgaWYoaS0tID4gMCkge1xuICAgIGlmKHAgPCB0aGlzLkRCICYmIChkID0gdGhpc1tpXT4+cCkgPiAwKSB7IG0gPSB0cnVlOyByID0gaW50MmNoYXIoZCk7IH1cbiAgICB3aGlsZShpID49IDApIHtcbiAgICAgIGlmKHAgPCBrKSB7XG4gICAgICAgIGQgPSAodGhpc1tpXSYoKDE8PHApLTEpKTw8KGstcCk7XG4gICAgICAgIGQgfD0gdGhpc1stLWldPj4ocCs9dGhpcy5EQi1rKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkID0gKHRoaXNbaV0+PihwLT1rKSkma207XG4gICAgICAgIGlmKHAgPD0gMCkgeyBwICs9IHRoaXMuREI7IC0taTsgfVxuICAgICAgfVxuICAgICAgaWYoZCA+IDApIG0gPSB0cnVlO1xuICAgICAgaWYobSkgciArPSBpbnQyY2hhcihkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG0/cjpcIjBcIjtcbn1cblxuLy8gKHB1YmxpYykgLXRoaXNcbmZ1bmN0aW9uIGJuTmVnYXRlKCkgeyB2YXIgciA9IG5iaSgpOyBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxyKTsgcmV0dXJuIHI7IH1cblxuLy8gKHB1YmxpYykgfHRoaXN8XG5mdW5jdGlvbiBibkFicygpIHsgcmV0dXJuICh0aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzOyB9XG5cbi8vIChwdWJsaWMpIHJldHVybiArIGlmIHRoaXMgPiBhLCAtIGlmIHRoaXMgPCBhLCAwIGlmIGVxdWFsXG5mdW5jdGlvbiBibkNvbXBhcmVUbyhhKSB7XG4gIHZhciByID0gdGhpcy5zLWEucztcbiAgaWYociAhPSAwKSByZXR1cm4gcjtcbiAgdmFyIGkgPSB0aGlzLnQ7XG4gIHIgPSBpLWEudDtcbiAgaWYociAhPSAwKSByZXR1cm4gcjtcbiAgd2hpbGUoLS1pID49IDApIGlmKChyPXRoaXNbaV0tYVtpXSkgIT0gMCkgcmV0dXJuIHI7XG4gIHJldHVybiAwO1xufVxuXG4vLyByZXR1cm5zIGJpdCBsZW5ndGggb2YgdGhlIGludGVnZXIgeFxuZnVuY3Rpb24gbmJpdHMoeCkge1xuICB2YXIgciA9IDEsIHQ7XG4gIGlmKCh0PXg+Pj4xNikgIT0gMCkgeyB4ID0gdDsgciArPSAxNjsgfVxuICBpZigodD14Pj44KSAhPSAwKSB7IHggPSB0OyByICs9IDg7IH1cbiAgaWYoKHQ9eD4+NCkgIT0gMCkgeyB4ID0gdDsgciArPSA0OyB9XG4gIGlmKCh0PXg+PjIpICE9IDApIHsgeCA9IHQ7IHIgKz0gMjsgfVxuICBpZigodD14Pj4xKSAhPSAwKSB7IHggPSB0OyByICs9IDE7IH1cbiAgcmV0dXJuIHI7XG59XG5cbi8vIChwdWJsaWMpIHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gXCJ0aGlzXCJcbmZ1bmN0aW9uIGJuQml0TGVuZ3RoKCkge1xuICBpZih0aGlzLnQgPD0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiB0aGlzLkRCKih0aGlzLnQtMSkrbmJpdHModGhpc1t0aGlzLnQtMV1eKHRoaXMucyZ0aGlzLkRNKSk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG4qREJcbmZ1bmN0aW9uIGJucERMU2hpZnRUbyhuLHIpIHtcbiAgdmFyIGk7XG4gIGZvcihpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByW2krbl0gPSB0aGlzW2ldO1xuICBmb3IoaSA9IG4tMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSAwO1xuICByLnQgPSB0aGlzLnQrbjtcbiAgci5zID0gdGhpcy5zO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuKkRCXG5mdW5jdGlvbiBibnBEUlNoaWZ0VG8obixyKSB7XG4gIGZvcih2YXIgaSA9IG47IGkgPCB0aGlzLnQ7ICsraSkgcltpLW5dID0gdGhpc1tpXTtcbiAgci50ID0gTWF0aC5tYXgodGhpcy50LW4sMCk7XG4gIHIucyA9IHRoaXMucztcbn1cblxuLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPDwgblxuZnVuY3Rpb24gYm5wTFNoaWZ0VG8obixyKSB7XG4gIHZhciBicyA9IG4ldGhpcy5EQjtcbiAgdmFyIGNicyA9IHRoaXMuREItYnM7XG4gIHZhciBibSA9ICgxPDxjYnMpLTE7XG4gIHZhciBkcyA9IE1hdGguZmxvb3Iobi90aGlzLkRCKSwgYyA9ICh0aGlzLnM8PGJzKSZ0aGlzLkRNLCBpO1xuICBmb3IoaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkge1xuICAgIHJbaStkcysxXSA9ICh0aGlzW2ldPj5jYnMpfGM7XG4gICAgYyA9ICh0aGlzW2ldJmJtKTw8YnM7XG4gIH1cbiAgZm9yKGkgPSBkcy0xOyBpID49IDA7IC0taSkgcltpXSA9IDA7XG4gIHJbZHNdID0gYztcbiAgci50ID0gdGhpcy50K2RzKzE7XG4gIHIucyA9IHRoaXMucztcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuXG5mdW5jdGlvbiBibnBSU2hpZnRUbyhuLHIpIHtcbiAgci5zID0gdGhpcy5zO1xuICB2YXIgZHMgPSBNYXRoLmZsb29yKG4vdGhpcy5EQik7XG4gIGlmKGRzID49IHRoaXMudCkgeyByLnQgPSAwOyByZXR1cm47IH1cbiAgdmFyIGJzID0gbiV0aGlzLkRCO1xuICB2YXIgY2JzID0gdGhpcy5EQi1icztcbiAgdmFyIGJtID0gKDE8PGJzKS0xO1xuICByWzBdID0gdGhpc1tkc10+PmJzO1xuICBmb3IodmFyIGkgPSBkcysxOyBpIDwgdGhpcy50OyArK2kpIHtcbiAgICByW2ktZHMtMV0gfD0gKHRoaXNbaV0mYm0pPDxjYnM7XG4gICAgcltpLWRzXSA9IHRoaXNbaV0+PmJzO1xuICB9XG4gIGlmKGJzID4gMCkgclt0aGlzLnQtZHMtMV0gfD0gKHRoaXMucyZibSk8PGNicztcbiAgci50ID0gdGhpcy50LWRzO1xuICByLmNsYW1wKCk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIC0gYVxuZnVuY3Rpb24gYm5wU3ViVG8oYSxyKSB7XG4gIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgd2hpbGUoaSA8IG0pIHtcbiAgICBjICs9IHRoaXNbaV0tYVtpXTtcbiAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgYyA+Pj0gdGhpcy5EQjtcbiAgfVxuICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICBjIC09IGEucztcbiAgICB3aGlsZShpIDwgdGhpcy50KSB7XG4gICAgICBjICs9IHRoaXNbaV07XG4gICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICBjID4+PSB0aGlzLkRCO1xuICAgIH1cbiAgICBjICs9IHRoaXMucztcbiAgfVxuICBlbHNlIHtcbiAgICBjICs9IHRoaXMucztcbiAgICB3aGlsZShpIDwgYS50KSB7XG4gICAgICBjIC09IGFbaV07XG4gICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICBjID4+PSB0aGlzLkRCO1xuICAgIH1cbiAgICBjIC09IGEucztcbiAgfVxuICByLnMgPSAoYzwwKT8tMTowO1xuICBpZihjIDwgLTEpIHJbaSsrXSA9IHRoaXMuRFYrYztcbiAgZWxzZSBpZihjID4gMCkgcltpKytdID0gYztcbiAgci50ID0gaTtcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyAqIGEsIHIgIT0gdGhpcyxhIChIQUMgMTQuMTIpXG4vLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG5mdW5jdGlvbiBibnBNdWx0aXBseVRvKGEscikge1xuICB2YXIgeCA9IHRoaXMuYWJzKCksIHkgPSBhLmFicygpO1xuICB2YXIgaSA9IHgudDtcbiAgci50ID0gaSt5LnQ7XG4gIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgZm9yKGkgPSAwOyBpIDwgeS50OyArK2kpIHJbaSt4LnRdID0geC5hbSgwLHlbaV0scixpLDAseC50KTtcbiAgci5zID0gMDtcbiAgci5jbGFtcCgpO1xuICBpZih0aGlzLnMgIT0gYS5zKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKTtcbn1cblxuLy8gKHByb3RlY3RlZCkgciA9IHRoaXNeMiwgciAhPSB0aGlzIChIQUMgMTQuMTYpXG5mdW5jdGlvbiBibnBTcXVhcmVUbyhyKSB7XG4gIHZhciB4ID0gdGhpcy5hYnMoKTtcbiAgdmFyIGkgPSByLnQgPSAyKngudDtcbiAgd2hpbGUoLS1pID49IDApIHJbaV0gPSAwO1xuICBmb3IoaSA9IDA7IGkgPCB4LnQtMTsgKytpKSB7XG4gICAgdmFyIGMgPSB4LmFtKGkseFtpXSxyLDIqaSwwLDEpO1xuICAgIGlmKChyW2kreC50XSs9eC5hbShpKzEsMip4W2ldLHIsMippKzEsYyx4LnQtaS0xKSkgPj0geC5EVikge1xuICAgICAgcltpK3gudF0gLT0geC5EVjtcbiAgICAgIHJbaSt4LnQrMV0gPSAxO1xuICAgIH1cbiAgfVxuICBpZihyLnQgPiAwKSByW3IudC0xXSArPSB4LmFtKGkseFtpXSxyLDIqaSwwLDEpO1xuICByLnMgPSAwO1xuICByLmNsYW1wKCk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIGRpdmlkZSB0aGlzIGJ5IG0sIHF1b3RpZW50IGFuZCByZW1haW5kZXIgdG8gcSwgciAoSEFDIDE0LjIwKVxuLy8gciAhPSBxLCB0aGlzICE9IG0uICBxIG9yIHIgbWF5IGJlIG51bGwuXG5mdW5jdGlvbiBibnBEaXZSZW1UbyhtLHEscikge1xuICB2YXIgcG0gPSBtLmFicygpO1xuICBpZihwbS50IDw9IDApIHJldHVybjtcbiAgdmFyIHB0ID0gdGhpcy5hYnMoKTtcbiAgaWYocHQudCA8IHBtLnQpIHtcbiAgICBpZihxICE9IG51bGwpIHEuZnJvbUludCgwKTtcbiAgICBpZihyICE9IG51bGwpIHRoaXMuY29weVRvKHIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZihyID09IG51bGwpIHIgPSBuYmkoKTtcbiAgdmFyIHkgPSBuYmkoKSwgdHMgPSB0aGlzLnMsIG1zID0gbS5zO1xuICB2YXIgbnNoID0gdGhpcy5EQi1uYml0cyhwbVtwbS50LTFdKTtcdC8vIG5vcm1hbGl6ZSBtb2R1bHVzXG4gIGlmKG5zaCA+IDApIHsgcG0ubFNoaWZ0VG8obnNoLHkpOyBwdC5sU2hpZnRUbyhuc2gscik7IH1cbiAgZWxzZSB7IHBtLmNvcHlUbyh5KTsgcHQuY29weVRvKHIpOyB9XG4gIHZhciB5cyA9IHkudDtcbiAgdmFyIHkwID0geVt5cy0xXTtcbiAgaWYoeTAgPT0gMCkgcmV0dXJuO1xuICB2YXIgeXQgPSB5MCooMTw8dGhpcy5GMSkrKCh5cz4xKT95W3lzLTJdPj50aGlzLkYyOjApO1xuICB2YXIgZDEgPSB0aGlzLkZWL3l0LCBkMiA9ICgxPDx0aGlzLkYxKS95dCwgZSA9IDE8PHRoaXMuRjI7XG4gIHZhciBpID0gci50LCBqID0gaS15cywgdCA9IChxPT1udWxsKT9uYmkoKTpxO1xuICB5LmRsU2hpZnRUbyhqLHQpO1xuICBpZihyLmNvbXBhcmVUbyh0KSA+PSAwKSB7XG4gICAgcltyLnQrK10gPSAxO1xuICAgIHIuc3ViVG8odCxyKTtcbiAgfVxuICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oeXMsdCk7XG4gIHQuc3ViVG8oeSx5KTtcdC8vIFwibmVnYXRpdmVcIiB5IHNvIHdlIGNhbiByZXBsYWNlIHN1YiB3aXRoIGFtIGxhdGVyXG4gIHdoaWxlKHkudCA8IHlzKSB5W3kudCsrXSA9IDA7XG4gIHdoaWxlKC0taiA+PSAwKSB7XG4gICAgLy8gRXN0aW1hdGUgcXVvdGllbnQgZGlnaXRcbiAgICB2YXIgcWQgPSAoclstLWldPT15MCk/dGhpcy5ETTpNYXRoLmZsb29yKHJbaV0qZDErKHJbaS0xXStlKSpkMik7XG4gICAgaWYoKHJbaV0rPXkuYW0oMCxxZCxyLGosMCx5cykpIDwgcWQpIHtcdC8vIFRyeSBpdCBvdXRcbiAgICAgIHkuZGxTaGlmdFRvKGosdCk7XG4gICAgICByLnN1YlRvKHQscik7XG4gICAgICB3aGlsZShyW2ldIDwgLS1xZCkgci5zdWJUbyh0LHIpO1xuICAgIH1cbiAgfVxuICBpZihxICE9IG51bGwpIHtcbiAgICByLmRyU2hpZnRUbyh5cyxxKTtcbiAgICBpZih0cyAhPSBtcykgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHEscSk7XG4gIH1cbiAgci50ID0geXM7XG4gIHIuY2xhbXAoKTtcbiAgaWYobnNoID4gMCkgci5yU2hpZnRUbyhuc2gscik7XHQvLyBEZW5vcm1hbGl6ZSByZW1haW5kZXJcbiAgaWYodHMgPCAwKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKTtcbn1cblxuLy8gKHB1YmxpYykgdGhpcyBtb2QgYVxuZnVuY3Rpb24gYm5Nb2QoYSkge1xuICB2YXIgciA9IG5iaSgpO1xuICB0aGlzLmFicygpLmRpdlJlbVRvKGEsbnVsbCxyKTtcbiAgaWYodGhpcy5zIDwgMCAmJiByLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID4gMCkgYS5zdWJUbyhyLHIpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gTW9kdWxhciByZWR1Y3Rpb24gdXNpbmcgXCJjbGFzc2ljXCIgYWxnb3JpdGhtXG5mdW5jdGlvbiBDbGFzc2ljKG0pIHsgdGhpcy5tID0gbTsgfVxuZnVuY3Rpb24gY0NvbnZlcnQoeCkge1xuICBpZih4LnMgPCAwIHx8IHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgcmV0dXJuIHgubW9kKHRoaXMubSk7XG4gIGVsc2UgcmV0dXJuIHg7XG59XG5mdW5jdGlvbiBjUmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cbmZ1bmN0aW9uIGNSZWR1Y2UoeCkgeyB4LmRpdlJlbVRvKHRoaXMubSxudWxsLHgpOyB9XG5mdW5jdGlvbiBjTXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG5mdW5jdGlvbiBjU3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbkNsYXNzaWMucHJvdG90eXBlLmNvbnZlcnQgPSBjQ29udmVydDtcbkNsYXNzaWMucHJvdG90eXBlLnJldmVydCA9IGNSZXZlcnQ7XG5DbGFzc2ljLnByb3RvdHlwZS5yZWR1Y2UgPSBjUmVkdWNlO1xuQ2xhc3NpYy5wcm90b3R5cGUubXVsVG8gPSBjTXVsVG87XG5DbGFzc2ljLnByb3RvdHlwZS5zcXJUbyA9IGNTcXJUbztcblxuLy8gKHByb3RlY3RlZCkgcmV0dXJuIFwiLTEvdGhpcyAlIDJeREJcIjsgdXNlZnVsIGZvciBNb250LiByZWR1Y3Rpb25cbi8vIGp1c3RpZmljYXRpb246XG4vLyAgICAgICAgIHh5ID09IDEgKG1vZCBtKVxuLy8gICAgICAgICB4eSA9ICAxK2ttXG4vLyAgIHh5KDIteHkpID0gKDEra20pKDEta20pXG4vLyB4W3koMi14eSldID0gMS1rXjJtXjJcbi8vIHhbeSgyLXh5KV0gPT0gMSAobW9kIG1eMilcbi8vIGlmIHkgaXMgMS94IG1vZCBtLCB0aGVuIHkoMi14eSkgaXMgMS94IG1vZCBtXjJcbi8vIHNob3VsZCByZWR1Y2UgeCBhbmQgeSgyLXh5KSBieSBtXjIgYXQgZWFjaCBzdGVwIHRvIGtlZXAgc2l6ZSBib3VuZGVkLlxuLy8gSlMgbXVsdGlwbHkgXCJvdmVyZmxvd3NcIiBkaWZmZXJlbnRseSBmcm9tIEMvQysrLCBzbyBjYXJlIGlzIG5lZWRlZCBoZXJlLlxuZnVuY3Rpb24gYm5wSW52RGlnaXQoKSB7XG4gIGlmKHRoaXMudCA8IDEpIHJldHVybiAwO1xuICB2YXIgeCA9IHRoaXNbMF07XG4gIGlmKCh4JjEpID09IDApIHJldHVybiAwO1xuICB2YXIgeSA9IHgmMztcdFx0Ly8geSA9PSAxL3ggbW9kIDJeMlxuICB5ID0gKHkqKDItKHgmMHhmKSp5KSkmMHhmO1x0Ly8geSA9PSAxL3ggbW9kIDJeNFxuICB5ID0gKHkqKDItKHgmMHhmZikqeSkpJjB4ZmY7XHQvLyB5ID09IDEveCBtb2QgMl44XG4gIHkgPSAoeSooMi0oKCh4JjB4ZmZmZikqeSkmMHhmZmZmKSkpJjB4ZmZmZjtcdC8vIHkgPT0gMS94IG1vZCAyXjE2XG4gIC8vIGxhc3Qgc3RlcCAtIGNhbGN1bGF0ZSBpbnZlcnNlIG1vZCBEViBkaXJlY3RseTtcbiAgLy8gYXNzdW1lcyAxNiA8IERCIDw9IDMyIGFuZCBhc3N1bWVzIGFiaWxpdHkgdG8gaGFuZGxlIDQ4LWJpdCBpbnRzXG4gIHkgPSAoeSooMi14KnkldGhpcy5EVikpJXRoaXMuRFY7XHRcdC8vIHkgPT0gMS94IG1vZCAyXmRiaXRzXG4gIC8vIHdlIHJlYWxseSB3YW50IHRoZSBuZWdhdGl2ZSBpbnZlcnNlLCBhbmQgLURWIDwgeSA8IERWXG4gIHJldHVybiAoeT4wKT90aGlzLkRWLXk6LXk7XG59XG5cbi8vIE1vbnRnb21lcnkgcmVkdWN0aW9uXG5mdW5jdGlvbiBNb250Z29tZXJ5KG0pIHtcbiAgdGhpcy5tID0gbTtcbiAgdGhpcy5tcCA9IG0uaW52RGlnaXQoKTtcbiAgdGhpcy5tcGwgPSB0aGlzLm1wJjB4N2ZmZjtcbiAgdGhpcy5tcGggPSB0aGlzLm1wPj4xNTtcbiAgdGhpcy51bSA9ICgxPDwobS5EQi0xNSkpLTE7XG4gIHRoaXMubXQyID0gMiptLnQ7XG59XG5cbi8vIHhSIG1vZCBtXG5mdW5jdGlvbiBtb250Q29udmVydCh4KSB7XG4gIHZhciByID0gbmJpKCk7XG4gIHguYWJzKCkuZGxTaGlmdFRvKHRoaXMubS50LHIpO1xuICByLmRpdlJlbVRvKHRoaXMubSxudWxsLHIpO1xuICBpZih4LnMgPCAwICYmIHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPiAwKSB0aGlzLm0uc3ViVG8ocixyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIHgvUiBtb2QgbVxuZnVuY3Rpb24gbW9udFJldmVydCh4KSB7XG4gIHZhciByID0gbmJpKCk7XG4gIHguY29weVRvKHIpO1xuICB0aGlzLnJlZHVjZShyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIHggPSB4L1IgbW9kIG0gKEhBQyAxNC4zMilcbmZ1bmN0aW9uIG1vbnRSZWR1Y2UoeCkge1xuICB3aGlsZSh4LnQgPD0gdGhpcy5tdDIpXHQvLyBwYWQgeCBzbyBhbSBoYXMgZW5vdWdoIHJvb20gbGF0ZXJcbiAgICB4W3gudCsrXSA9IDA7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLm0udDsgKytpKSB7XG4gICAgLy8gZmFzdGVyIHdheSBvZiBjYWxjdWxhdGluZyB1MCA9IHhbaV0qbXAgbW9kIERWXG4gICAgdmFyIGogPSB4W2ldJjB4N2ZmZjtcbiAgICB2YXIgdTAgPSAoaip0aGlzLm1wbCsoKChqKnRoaXMubXBoKyh4W2ldPj4xNSkqdGhpcy5tcGwpJnRoaXMudW0pPDwxNSkpJnguRE07XG4gICAgLy8gdXNlIGFtIHRvIGNvbWJpbmUgdGhlIG11bHRpcGx5LXNoaWZ0LWFkZCBpbnRvIG9uZSBjYWxsXG4gICAgaiA9IGkrdGhpcy5tLnQ7XG4gICAgeFtqXSArPSB0aGlzLm0uYW0oMCx1MCx4LGksMCx0aGlzLm0udCk7XG4gICAgLy8gcHJvcGFnYXRlIGNhcnJ5XG4gICAgd2hpbGUoeFtqXSA+PSB4LkRWKSB7IHhbal0gLT0geC5EVjsgeFsrK2pdKys7IH1cbiAgfVxuICB4LmNsYW1wKCk7XG4gIHguZHJTaGlmdFRvKHRoaXMubS50LHgpO1xuICBpZih4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHguc3ViVG8odGhpcy5tLHgpO1xufVxuXG4vLyByID0gXCJ4XjIvUiBtb2QgbVwiOyB4ICE9IHJcbmZ1bmN0aW9uIG1vbnRTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuLy8gciA9IFwieHkvUiBtb2QgbVwiOyB4LHkgIT0gclxuZnVuY3Rpb24gbW9udE11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG5Nb250Z29tZXJ5LnByb3RvdHlwZS5jb252ZXJ0ID0gbW9udENvbnZlcnQ7XG5Nb250Z29tZXJ5LnByb3RvdHlwZS5yZXZlcnQgPSBtb250UmV2ZXJ0O1xuTW9udGdvbWVyeS5wcm90b3R5cGUucmVkdWNlID0gbW9udFJlZHVjZTtcbk1vbnRnb21lcnkucHJvdG90eXBlLm11bFRvID0gbW9udE11bFRvO1xuTW9udGdvbWVyeS5wcm90b3R5cGUuc3FyVG8gPSBtb250U3FyVG87XG5cbi8vIChwcm90ZWN0ZWQpIHRydWUgaWZmIHRoaXMgaXMgZXZlblxuZnVuY3Rpb24gYm5wSXNFdmVuKCkgeyByZXR1cm4gKCh0aGlzLnQ+MCk/KHRoaXNbMF0mMSk6dGhpcy5zKSA9PSAwOyB9XG5cbi8vIChwcm90ZWN0ZWQpIHRoaXNeZSwgZSA8IDJeMzIsIGRvaW5nIHNxciBhbmQgbXVsIHdpdGggXCJyXCIgKEhBQyAxNC43OSlcbmZ1bmN0aW9uIGJucEV4cChlLHopIHtcbiAgaWYoZSA+IDB4ZmZmZmZmZmYgfHwgZSA8IDEpIHJldHVybiBCaWdJbnRlZ2VyLk9ORTtcbiAgdmFyIHIgPSBuYmkoKSwgcjIgPSBuYmkoKSwgZyA9IHouY29udmVydCh0aGlzKSwgaSA9IG5iaXRzKGUpLTE7XG4gIGcuY29weVRvKHIpO1xuICB3aGlsZSgtLWkgPj0gMCkge1xuICAgIHouc3FyVG8ocixyMik7XG4gICAgaWYoKGUmKDE8PGkpKSA+IDApIHoubXVsVG8ocjIsZyxyKTtcbiAgICBlbHNlIHsgdmFyIHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICB9XG4gIHJldHVybiB6LnJldmVydChyKTtcbn1cblxuLy8gKHB1YmxpYykgdGhpc15lICUgbSwgMCA8PSBlIDwgMl4zMlxuZnVuY3Rpb24gYm5Nb2RQb3dJbnQoZSxtKSB7XG4gIHZhciB6O1xuICBpZihlIDwgMjU2IHx8IG0uaXNFdmVuKCkpIHogPSBuZXcgQ2xhc3NpYyhtKTsgZWxzZSB6ID0gbmV3IE1vbnRnb21lcnkobSk7XG4gIHJldHVybiB0aGlzLmV4cChlLHopO1xufVxuXG4vLyBwcm90ZWN0ZWRcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNvcHlUbyA9IGJucENvcHlUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21JbnQgPSBibnBGcm9tSW50O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZyA9IGJucEZyb21TdHJpbmc7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGFtcCA9IGJucENsYW1wO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvID0gYm5wRExTaGlmdFRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvID0gYm5wRFJTaGlmdFRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubFNoaWZ0VG8gPSBibnBMU2hpZnRUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLnJTaGlmdFRvID0gYm5wUlNoaWZ0VG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbyA9IGJucFN1YlRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlUbyA9IGJucE11bHRpcGx5VG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmVUbyA9IGJucFNxdWFyZVRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG8gPSBibnBEaXZSZW1UbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmludkRpZ2l0ID0gYm5wSW52RGlnaXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW4gPSBibnBJc0V2ZW47XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5leHAgPSBibnBFeHA7XG5cbi8vIHB1YmxpY1xuQmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmcgPSBiblRvU3RyaW5nO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlID0gYm5OZWdhdGU7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnMgPSBibkFicztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IGJuQ29tcGFyZVRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoID0gYm5CaXRMZW5ndGg7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2QgPSBibk1vZDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludCA9IGJuTW9kUG93SW50O1xuXG4vLyBcImNvbnN0YW50c1wiXG5CaWdJbnRlZ2VyLlpFUk8gPSBuYnYoMCk7XG5CaWdJbnRlZ2VyLk9ORSA9IG5idigxKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCaWdJbnRlZ2VyO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgIFRvbSBXdSAodGp3QGNzLlN0YW5mb3JkLkVEVSkgXG4gKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIE1vZGlmaWVkIGJ5IFJlY3VyaXR5IExhYnMgR21iSFxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG4gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTLUlTXCIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIFxuICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBcbiAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFxuICpcbiAqIElOIE5PIEVWRU5UIFNIQUxMIFRPTSBXVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLFxuICogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSXG4gKiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GXG4gKiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUXG4gKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuICpcbiAqIEluIGFkZGl0aW9uLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBhcHBsaWVzOlxuICpcbiAqIEFsbCByZWRpc3RyaWJ1dGlvbnMgbXVzdCByZXRhaW4gYW4gaW50YWN0IGNvcHkgb2YgdGhpcyBjb3B5cmlnaHQgbm90aWNlXG4gKiBhbmQgZGlzY2xhaW1lci5cbiAqL1xuXG5cbi8vIEV4dGVuZGVkIEphdmFTY3JpcHQgQk4gZnVuY3Rpb25zLCByZXF1aXJlZCBmb3IgUlNBIHByaXZhdGUgb3BzLlxuXG4vLyBWZXJzaW9uIDEuMTogbmV3IEJpZ0ludGVnZXIoXCIwXCIsIDEwKSByZXR1cm5zIFwicHJvcGVyXCIgemVyb1xuLy8gVmVyc2lvbiAxLjI6IHNxdWFyZSgpIEFQSSwgaXNQcm9iYWJsZVByaW1lIGZpeFxuXG4vLyAocHVibGljKVxuZnVuY3Rpb24gYm5DbG9uZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5jb3B5VG8ocik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHJldHVybiB2YWx1ZSBhcyBpbnRlZ2VyXG5mdW5jdGlvbiBibkludFZhbHVlKCkge1xuICBpZih0aGlzLnMgPCAwKSB7XG4gICAgaWYodGhpcy50ID09IDEpIHJldHVybiB0aGlzWzBdLXRoaXMuRFY7XG4gICAgZWxzZSBpZih0aGlzLnQgPT0gMCkgcmV0dXJuIC0xO1xuICB9XG4gIGVsc2UgaWYodGhpcy50ID09IDEpIHJldHVybiB0aGlzWzBdO1xuICBlbHNlIGlmKHRoaXMudCA9PSAwKSByZXR1cm4gMDtcbiAgLy8gYXNzdW1lcyAxNiA8IERCIDwgMzJcbiAgcmV0dXJuICgodGhpc1sxXSYoKDE8PCgzMi10aGlzLkRCKSktMSkpPDx0aGlzLkRCKXx0aGlzWzBdO1xufVxuXG4vLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgYnl0ZVxuZnVuY3Rpb24gYm5CeXRlVmFsdWUoKSB7IHJldHVybiAodGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDI0KT4+MjQ7IH1cblxuLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIHNob3J0IChhc3N1bWVzIERCPj0xNilcbmZ1bmN0aW9uIGJuU2hvcnRWYWx1ZSgpIHsgcmV0dXJuICh0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MTYpPj4xNjsgfVxuXG4vLyAocHJvdGVjdGVkKSByZXR1cm4geCBzLnQuIHJeeCA8IERWXG5mdW5jdGlvbiBibnBDaHVua1NpemUocikgeyByZXR1cm4gTWF0aC5mbG9vcihNYXRoLkxOMip0aGlzLkRCL01hdGgubG9nKHIpKTsgfVxuXG4vLyAocHVibGljKSAwIGlmIHRoaXMgPT0gMCwgMSBpZiB0aGlzID4gMFxuZnVuY3Rpb24gYm5TaWdOdW0oKSB7XG4gIGlmKHRoaXMucyA8IDApIHJldHVybiAtMTtcbiAgZWxzZSBpZih0aGlzLnQgPD0gMCB8fCAodGhpcy50ID09IDEgJiYgdGhpc1swXSA8PSAwKSkgcmV0dXJuIDA7XG4gIGVsc2UgcmV0dXJuIDE7XG59XG5cbi8vIChwcm90ZWN0ZWQpIGNvbnZlcnQgdG8gcmFkaXggc3RyaW5nXG5mdW5jdGlvbiBibnBUb1JhZGl4KGIpIHtcbiAgaWYoYiA9PSBudWxsKSBiID0gMTA7XG4gIGlmKHRoaXMuc2lnbnVtKCkgPT0gMCB8fCBiIDwgMiB8fCBiID4gMzYpIHJldHVybiBcIjBcIjtcbiAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG4gIHZhciBhID0gTWF0aC5wb3coYixjcyk7XG4gIHZhciBkID0gbmJ2KGEpLCB5ID0gbmJpKCksIHogPSBuYmkoKSwgciA9IFwiXCI7XG4gIHRoaXMuZGl2UmVtVG8oZCx5LHopO1xuICB3aGlsZSh5LnNpZ251bSgpID4gMCkge1xuICAgIHIgPSAoYSt6LmludFZhbHVlKCkpLnRvU3RyaW5nKGIpLnN1YnN0cigxKSArIHI7XG4gICAgeS5kaXZSZW1UbyhkLHkseik7XG4gIH1cbiAgcmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKSArIHI7XG59XG5cbi8vIChwcm90ZWN0ZWQpIGNvbnZlcnQgZnJvbSByYWRpeCBzdHJpbmdcbmZ1bmN0aW9uIGJucEZyb21SYWRpeChzLGIpIHtcbiAgdGhpcy5mcm9tSW50KDApO1xuICBpZihiID09IG51bGwpIGIgPSAxMDtcbiAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG4gIHZhciBkID0gTWF0aC5wb3coYixjcyksIG1pID0gZmFsc2UsIGogPSAwLCB3ID0gMDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgeCA9IGludEF0KHMsaSk7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIGlmKHMuY2hhckF0KGkpID09IFwiLVwiICYmIHRoaXMuc2lnbnVtKCkgPT0gMCkgbWkgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHcgPSBiKncreDtcbiAgICBpZigrK2ogPj0gY3MpIHtcbiAgICAgIHRoaXMuZE11bHRpcGx5KGQpO1xuICAgICAgdGhpcy5kQWRkT2Zmc2V0KHcsMCk7XG4gICAgICBqID0gMDtcbiAgICAgIHcgPSAwO1xuICAgIH1cbiAgfVxuICBpZihqID4gMCkge1xuICAgIHRoaXMuZE11bHRpcGx5KE1hdGgucG93KGIsaikpO1xuICAgIHRoaXMuZEFkZE9mZnNldCh3LDApO1xuICB9XG4gIGlmKG1pKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKTtcbn1cblxuLy8gKHByb3RlY3RlZCkgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yXG5mdW5jdGlvbiBibnBGcm9tTnVtYmVyKGEsYixjKSB7XG4gIGlmKFwibnVtYmVyXCIgPT0gdHlwZW9mIGIpIHtcbiAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsaW50LFJORylcbiAgICBpZihhIDwgMikgdGhpcy5mcm9tSW50KDEpO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5mcm9tTnVtYmVyKGEsYyk7XG4gICAgICBpZighdGhpcy50ZXN0Qml0KGEtMSkpXHQvLyBmb3JjZSBNU0Igc2V0XG4gICAgICAgIHRoaXMuYml0d2lzZVRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChhLTEpLG9wX29yLHRoaXMpO1xuICAgICAgaWYodGhpcy5pc0V2ZW4oKSkgdGhpcy5kQWRkT2Zmc2V0KDEsMCk7IC8vIGZvcmNlIG9kZFxuICAgICAgd2hpbGUoIXRoaXMuaXNQcm9iYWJsZVByaW1lKGIpKSB7XG4gICAgICAgIHRoaXMuZEFkZE9mZnNldCgyLDApO1xuICAgICAgICBpZih0aGlzLmJpdExlbmd0aCgpID4gYSkgdGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYS0xKSx0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gbmV3IEJpZ0ludGVnZXIoaW50LFJORylcbiAgICB2YXIgeCA9IG5ldyBBcnJheSgpLCB0ID0gYSY3O1xuICAgIHgubGVuZ3RoID0gKGE+PjMpKzE7XG4gICAgYi5uZXh0Qnl0ZXMoeCk7XG4gICAgaWYodCA+IDApIHhbMF0gJj0gKCgxPDx0KS0xKTsgZWxzZSB4WzBdID0gMDtcbiAgICB0aGlzLmZyb21TdHJpbmcoeCwyNTYpO1xuICB9XG59XG5cbi8vIChwdWJsaWMpIGNvbnZlcnQgdG8gYmlnZW5kaWFuIGJ5dGUgYXJyYXlcbmZ1bmN0aW9uIGJuVG9CeXRlQXJyYXkoKSB7XG4gIHZhciBpID0gdGhpcy50LCByID0gbmV3IEFycmF5KCk7XG4gIHJbMF0gPSB0aGlzLnM7XG4gIHZhciBwID0gdGhpcy5EQi0oaSp0aGlzLkRCKSU4LCBkLCBrID0gMDtcbiAgaWYoaS0tID4gMCkge1xuICAgIGlmKHAgPCB0aGlzLkRCICYmIChkID0gdGhpc1tpXT4+cCkgIT0gKHRoaXMucyZ0aGlzLkRNKT4+cClcbiAgICAgIHJbaysrXSA9IGR8KHRoaXMuczw8KHRoaXMuREItcCkpO1xuICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgaWYocCA8IDgpIHtcbiAgICAgICAgZCA9ICh0aGlzW2ldJigoMTw8cCktMSkpPDwoOC1wKTtcbiAgICAgICAgZCB8PSB0aGlzWy0taV0+PihwKz10aGlzLkRCLTgpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGQgPSAodGhpc1tpXT4+KHAtPTgpKSYweGZmO1xuICAgICAgICBpZihwIDw9IDApIHsgcCArPSB0aGlzLkRCOyAtLWk7IH1cbiAgICAgIH1cbiAgICAgIC8vaWYoKGQmMHg4MCkgIT0gMCkgZCB8PSAtMjU2O1xuICAgICAgLy9pZihrID09IDAgJiYgKHRoaXMucyYweDgwKSAhPSAoZCYweDgwKSkgKytrO1xuICAgICAgaWYoayA+IDAgfHwgZCAhPSB0aGlzLnMpIHJbaysrXSA9IGQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBibkVxdWFscyhhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT09MCk7IH1cbmZ1bmN0aW9uIGJuTWluKGEpIHsgcmV0dXJuKHRoaXMuY29tcGFyZVRvKGEpPDApP3RoaXM6YTsgfVxuZnVuY3Rpb24gYm5NYXgoYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk+MCk/dGhpczphOyB9XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIG9wIGEgKGJpdHdpc2UpXG5mdW5jdGlvbiBibnBCaXR3aXNlVG8oYSxvcCxyKSB7XG4gIHZhciBpLCBmLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gIGZvcihpID0gMDsgaSA8IG07ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sYVtpXSk7XG4gIGlmKGEudCA8IHRoaXMudCkge1xuICAgIGYgPSBhLnMmdGhpcy5ETTtcbiAgICBmb3IoaSA9IG07IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sZik7XG4gICAgci50ID0gdGhpcy50O1xuICB9XG4gIGVsc2Uge1xuICAgIGYgPSB0aGlzLnMmdGhpcy5ETTtcbiAgICBmb3IoaSA9IG07IGkgPCBhLnQ7ICsraSkgcltpXSA9IG9wKGYsYVtpXSk7XG4gICAgci50ID0gYS50O1xuICB9XG4gIHIucyA9IG9wKHRoaXMucyxhLnMpO1xuICByLmNsYW1wKCk7XG59XG5cbi8vIChwdWJsaWMpIHRoaXMgJiBhXG5mdW5jdGlvbiBvcF9hbmQoeCx5KSB7IHJldHVybiB4Jnk7IH1cbmZ1bmN0aW9uIGJuQW5kKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmQscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHRoaXMgfCBhXG5mdW5jdGlvbiBvcF9vcih4LHkpIHsgcmV0dXJuIHh8eTsgfVxuZnVuY3Rpb24gYm5PcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3Bfb3Iscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHRoaXMgXiBhXG5mdW5jdGlvbiBvcF94b3IoeCx5KSB7IHJldHVybiB4Xnk7IH1cbmZ1bmN0aW9uIGJuWG9yKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF94b3Iscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHRoaXMgJiB+YVxuZnVuY3Rpb24gb3BfYW5kbm90KHgseSkgeyByZXR1cm4geCZ+eTsgfVxuZnVuY3Rpb24gYm5BbmROb3QoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX2FuZG5vdCxyKTsgcmV0dXJuIHI7IH1cblxuLy8gKHB1YmxpYykgfnRoaXNcbmZ1bmN0aW9uIGJuTm90KCkge1xuICB2YXIgciA9IG5iaSgpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpIHJbaV0gPSB0aGlzLkRNJn50aGlzW2ldO1xuICByLnQgPSB0aGlzLnQ7XG4gIHIucyA9IH50aGlzLnM7XG4gIHJldHVybiByO1xufVxuXG4vLyAocHVibGljKSB0aGlzIDw8IG5cbmZ1bmN0aW9uIGJuU2hpZnRMZWZ0KG4pIHtcbiAgdmFyIHIgPSBuYmkoKTtcbiAgaWYobiA8IDApIHRoaXMuclNoaWZ0VG8oLW4scik7IGVsc2UgdGhpcy5sU2hpZnRUbyhuLHIpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gKHB1YmxpYykgdGhpcyA+PiBuXG5mdW5jdGlvbiBiblNoaWZ0UmlnaHQobikge1xuICB2YXIgciA9IG5iaSgpO1xuICBpZihuIDwgMCkgdGhpcy5sU2hpZnRUbygtbixyKTsgZWxzZSB0aGlzLnJTaGlmdFRvKG4scik7XG4gIHJldHVybiByO1xufVxuXG4vLyByZXR1cm4gaW5kZXggb2YgbG93ZXN0IDEtYml0IGluIHgsIHggPCAyXjMxXG5mdW5jdGlvbiBsYml0KHgpIHtcbiAgaWYoeCA9PSAwKSByZXR1cm4gLTE7XG4gIHZhciByID0gMDtcbiAgaWYoKHgmMHhmZmZmKSA9PSAwKSB7IHggPj49IDE2OyByICs9IDE2OyB9XG4gIGlmKCh4JjB4ZmYpID09IDApIHsgeCA+Pj0gODsgciArPSA4OyB9XG4gIGlmKCh4JjB4ZikgPT0gMCkgeyB4ID4+PSA0OyByICs9IDQ7IH1cbiAgaWYoKHgmMykgPT0gMCkgeyB4ID4+PSAyOyByICs9IDI7IH1cbiAgaWYoKHgmMSkgPT0gMCkgKytyO1xuICByZXR1cm4gcjtcbn1cblxuLy8gKHB1YmxpYykgcmV0dXJucyBpbmRleCBvZiBsb3dlc3QgMS1iaXQgKG9yIC0xIGlmIG5vbmUpXG5mdW5jdGlvbiBibkdldExvd2VzdFNldEJpdCgpIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKVxuICAgIGlmKHRoaXNbaV0gIT0gMCkgcmV0dXJuIGkqdGhpcy5EQitsYml0KHRoaXNbaV0pO1xuICBpZih0aGlzLnMgPCAwKSByZXR1cm4gdGhpcy50KnRoaXMuREI7XG4gIHJldHVybiAtMTtcbn1cblxuLy8gcmV0dXJuIG51bWJlciBvZiAxIGJpdHMgaW4geFxuZnVuY3Rpb24gY2JpdCh4KSB7XG4gIHZhciByID0gMDtcbiAgd2hpbGUoeCAhPSAwKSB7IHggJj0geC0xOyArK3I7IH1cbiAgcmV0dXJuIHI7XG59XG5cbi8vIChwdWJsaWMpIHJldHVybiBudW1iZXIgb2Ygc2V0IGJpdHNcbmZ1bmN0aW9uIGJuQml0Q291bnQoKSB7XG4gIHZhciByID0gMCwgeCA9IHRoaXMucyZ0aGlzLkRNO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpIHIgKz0gY2JpdCh0aGlzW2ldXngpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gKHB1YmxpYykgdHJ1ZSBpZmYgbnRoIGJpdCBpcyBzZXRcbmZ1bmN0aW9uIGJuVGVzdEJpdChuKSB7XG4gIHZhciBqID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICBpZihqID49IHRoaXMudCkgcmV0dXJuKHRoaXMucyE9MCk7XG4gIHJldHVybigodGhpc1tqXSYoMTw8KG4ldGhpcy5EQikpKSE9MCk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHRoaXMgb3AgKDE8PG4pXG5mdW5jdGlvbiBibnBDaGFuZ2VCaXQobixvcCkge1xuICB2YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTtcbiAgdGhpcy5iaXR3aXNlVG8ocixvcCxyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIChwdWJsaWMpIHRoaXMgfCAoMTw8bilcbmZ1bmN0aW9uIGJuU2V0Qml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3Bfb3IpOyB9XG5cbi8vIChwdWJsaWMpIHRoaXMgJiB+KDE8PG4pXG5mdW5jdGlvbiBibkNsZWFyQml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3BfYW5kbm90KTsgfVxuXG4vLyAocHVibGljKSB0aGlzIF4gKDE8PG4pXG5mdW5jdGlvbiBibkZsaXBCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF94b3IpOyB9XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzICsgYVxuZnVuY3Rpb24gYm5wQWRkVG8oYSxyKSB7XG4gIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgd2hpbGUoaSA8IG0pIHtcbiAgICBjICs9IHRoaXNbaV0rYVtpXTtcbiAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgYyA+Pj0gdGhpcy5EQjtcbiAgfVxuICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICBjICs9IGEucztcbiAgICB3aGlsZShpIDwgdGhpcy50KSB7XG4gICAgICBjICs9IHRoaXNbaV07XG4gICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICBjID4+PSB0aGlzLkRCO1xuICAgIH1cbiAgICBjICs9IHRoaXMucztcbiAgfVxuICBlbHNlIHtcbiAgICBjICs9IHRoaXMucztcbiAgICB3aGlsZShpIDwgYS50KSB7XG4gICAgICBjICs9IGFbaV07XG4gICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICBjID4+PSB0aGlzLkRCO1xuICAgIH1cbiAgICBjICs9IGEucztcbiAgfVxuICByLnMgPSAoYzwwKT8tMTowO1xuICBpZihjID4gMCkgcltpKytdID0gYztcbiAgZWxzZSBpZihjIDwgLTEpIHJbaSsrXSA9IHRoaXMuRFYrYztcbiAgci50ID0gaTtcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHVibGljKSB0aGlzICsgYVxuZnVuY3Rpb24gYm5BZGQoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmFkZFRvKGEscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHRoaXMgLSBhXG5mdW5jdGlvbiBiblN1YnRyYWN0KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zdWJUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSB0aGlzICogYVxuZnVuY3Rpb24gYm5NdWx0aXBseShhKSB7IHZhciByID0gbmJpKCk7IHRoaXMubXVsdGlwbHlUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSB0aGlzXjJcbmZ1bmN0aW9uIGJuU3F1YXJlKCkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLnNxdWFyZVRvKHIpOyByZXR1cm4gcjsgfVxuXG4vLyAocHVibGljKSB0aGlzIC8gYVxuZnVuY3Rpb24gYm5EaXZpZGUoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEscixudWxsKTsgcmV0dXJuIHI7IH1cblxuLy8gKHB1YmxpYykgdGhpcyAlIGFcbmZ1bmN0aW9uIGJuUmVtYWluZGVyKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5kaXZSZW1UbyhhLG51bGwscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIFt0aGlzL2EsdGhpcyVhXVxuZnVuY3Rpb24gYm5EaXZpZGVBbmRSZW1haW5kZXIoYSkge1xuICB2YXIgcSA9IG5iaSgpLCByID0gbmJpKCk7XG4gIHRoaXMuZGl2UmVtVG8oYSxxLHIpO1xuICByZXR1cm4gbmV3IEFycmF5KHEscik7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHRoaXMgKj0gbiwgdGhpcyA+PSAwLCAxIDwgbiA8IERWXG5mdW5jdGlvbiBibnBETXVsdGlwbHkobikge1xuICB0aGlzW3RoaXMudF0gPSB0aGlzLmFtKDAsbi0xLHRoaXMsMCwwLHRoaXMudCk7XG4gICsrdGhpcy50O1xuICB0aGlzLmNsYW1wKCk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHRoaXMgKz0gbiA8PCB3IHdvcmRzLCB0aGlzID49IDBcbmZ1bmN0aW9uIGJucERBZGRPZmZzZXQobix3KSB7XG4gIGlmKG4gPT0gMCkgcmV0dXJuO1xuICB3aGlsZSh0aGlzLnQgPD0gdykgdGhpc1t0aGlzLnQrK10gPSAwO1xuICB0aGlzW3ddICs9IG47XG4gIHdoaWxlKHRoaXNbd10gPj0gdGhpcy5EVikge1xuICAgIHRoaXNbd10gLT0gdGhpcy5EVjtcbiAgICBpZigrK3cgPj0gdGhpcy50KSB0aGlzW3RoaXMudCsrXSA9IDA7XG4gICAgKyt0aGlzW3ddO1xuICB9XG59XG5cbi8vIEEgXCJudWxsXCIgcmVkdWNlclxuZnVuY3Rpb24gTnVsbEV4cCgpIHt9XG5mdW5jdGlvbiBuTm9wKHgpIHsgcmV0dXJuIHg7IH1cbmZ1bmN0aW9uIG5NdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgfVxuZnVuY3Rpb24gblNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB9XG5cbk51bGxFeHAucHJvdG90eXBlLmNvbnZlcnQgPSBuTm9wO1xuTnVsbEV4cC5wcm90b3R5cGUucmV2ZXJ0ID0gbk5vcDtcbk51bGxFeHAucHJvdG90eXBlLm11bFRvID0gbk11bFRvO1xuTnVsbEV4cC5wcm90b3R5cGUuc3FyVG8gPSBuU3FyVG87XG5cbi8vIChwdWJsaWMpIHRoaXNeZVxuZnVuY3Rpb24gYm5Qb3coZSkgeyByZXR1cm4gdGhpcy5leHAoZSxuZXcgTnVsbEV4cCgpKTsgfVxuXG4vLyAocHJvdGVjdGVkKSByID0gbG93ZXIgbiB3b3JkcyBvZiBcInRoaXMgKiBhXCIsIGEudCA8PSBuXG4vLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG5mdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYSxuLHIpIHtcbiAgdmFyIGkgPSBNYXRoLm1pbih0aGlzLnQrYS50LG4pO1xuICByLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhpcyA+PSAwXG4gIHIudCA9IGk7XG4gIHdoaWxlKGkgPiAwKSByWy0taV0gPSAwO1xuICB2YXIgajtcbiAgZm9yKGogPSByLnQtdGhpcy50OyBpIDwgajsgKytpKSByW2krdGhpcy50XSA9IHRoaXMuYW0oMCxhW2ldLHIsaSwwLHRoaXMudCk7XG4gIGZvcihqID0gTWF0aC5taW4oYS50LG4pOyBpIDwgajsgKytpKSB0aGlzLmFtKDAsYVtpXSxyLGksMCxuLWkpO1xuICByLmNsYW1wKCk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSBcInRoaXMgKiBhXCIgd2l0aG91dCBsb3dlciBuIHdvcmRzLCBuID4gMFxuLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGEsbixyKSB7XG4gIC0tbjtcbiAgdmFyIGkgPSByLnQgPSB0aGlzLnQrYS50LW47XG4gIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgd2hpbGUoLS1pID49IDApIHJbaV0gPSAwO1xuICBmb3IoaSA9IE1hdGgubWF4KG4tdGhpcy50LDApOyBpIDwgYS50OyArK2kpXG4gICAgclt0aGlzLnQraS1uXSA9IHRoaXMuYW0obi1pLGFbaV0sciwwLDAsdGhpcy50K2ktbik7XG4gIHIuY2xhbXAoKTtcbiAgci5kclNoaWZ0VG8oMSxyKTtcbn1cblxuLy8gQmFycmV0dCBtb2R1bGFyIHJlZHVjdGlvblxuZnVuY3Rpb24gQmFycmV0dChtKSB7XG4gIC8vIHNldHVwIEJhcnJldHRcbiAgdGhpcy5yMiA9IG5iaSgpO1xuICB0aGlzLnEzID0gbmJpKCk7XG4gIEJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKm0udCx0aGlzLnIyKTtcbiAgdGhpcy5tdSA9IHRoaXMucjIuZGl2aWRlKG0pO1xuICB0aGlzLm0gPSBtO1xufVxuXG5mdW5jdGlvbiBiYXJyZXR0Q29udmVydCh4KSB7XG4gIGlmKHgucyA8IDAgfHwgeC50ID4gMip0aGlzLm0udCkgcmV0dXJuIHgubW9kKHRoaXMubSk7XG4gIGVsc2UgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA8IDApIHJldHVybiB4O1xuICBlbHNlIHsgdmFyIHIgPSBuYmkoKTsgeC5jb3B5VG8ocik7IHRoaXMucmVkdWNlKHIpOyByZXR1cm4gcjsgfVxufVxuXG5mdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cblxuLy8geCA9IHggbW9kIG0gKEhBQyAxNC40MilcbmZ1bmN0aW9uIGJhcnJldHRSZWR1Y2UoeCkge1xuICB4LmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO1xuICBpZih4LnQgPiB0aGlzLm0udCsxKSB7IHgudCA9IHRoaXMubS50KzE7IHguY2xhbXAoKTsgfVxuICB0aGlzLm11Lm11bHRpcGx5VXBwZXJUbyh0aGlzLnIyLHRoaXMubS50KzEsdGhpcy5xMyk7XG4gIHRoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO1xuICB3aGlsZSh4LmNvbXBhcmVUbyh0aGlzLnIyKSA8IDApIHguZEFkZE9mZnNldCgxLHRoaXMubS50KzEpO1xuICB4LnN1YlRvKHRoaXMucjIseCk7XG4gIHdoaWxlKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG59XG5cbi8vIHIgPSB4XjIgbW9kIG07IHggIT0gclxuZnVuY3Rpb24gYmFycmV0dFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4vLyByID0geCp5IG1vZCBtOyB4LHkgIT0gclxuZnVuY3Rpb24gYmFycmV0dE11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG5CYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0ID0gYmFycmV0dENvbnZlcnQ7XG5CYXJyZXR0LnByb3RvdHlwZS5yZXZlcnQgPSBiYXJyZXR0UmV2ZXJ0O1xuQmFycmV0dC5wcm90b3R5cGUucmVkdWNlID0gYmFycmV0dFJlZHVjZTtcbkJhcnJldHQucHJvdG90eXBlLm11bFRvID0gYmFycmV0dE11bFRvO1xuQmFycmV0dC5wcm90b3R5cGUuc3FyVG8gPSBiYXJyZXR0U3FyVG87XG5cbi8vIChwdWJsaWMpIHRoaXNeZSAlIG0gKEhBQyAxNC44NSlcbmZ1bmN0aW9uIGJuTW9kUG93KGUsbSkge1xuICB2YXIgaSA9IGUuYml0TGVuZ3RoKCksIGssIHIgPSBuYnYoMSksIHo7XG4gIGlmKGkgPD0gMCkgcmV0dXJuIHI7XG4gIGVsc2UgaWYoaSA8IDE4KSBrID0gMTtcbiAgZWxzZSBpZihpIDwgNDgpIGsgPSAzO1xuICBlbHNlIGlmKGkgPCAxNDQpIGsgPSA0O1xuICBlbHNlIGlmKGkgPCA3NjgpIGsgPSA1O1xuICBlbHNlIGsgPSA2O1xuICBpZihpIDwgOClcbiAgICB6ID0gbmV3IENsYXNzaWMobSk7XG4gIGVsc2UgaWYobS5pc0V2ZW4oKSlcbiAgICB6ID0gbmV3IEJhcnJldHQobSk7XG4gIGVsc2VcbiAgICB6ID0gbmV3IE1vbnRnb21lcnkobSk7XG5cbiAgLy8gcHJlY29tcHV0YXRpb25cbiAgdmFyIGcgPSBuZXcgQXJyYXkoKSwgbiA9IDMsIGsxID0gay0xLCBrbSA9ICgxPDxrKS0xO1xuICBnWzFdID0gei5jb252ZXJ0KHRoaXMpO1xuICBpZihrID4gMSkge1xuICAgIHZhciBnMiA9IG5iaSgpO1xuICAgIHouc3FyVG8oZ1sxXSxnMik7XG4gICAgd2hpbGUobiA8PSBrbSkge1xuICAgICAgZ1tuXSA9IG5iaSgpO1xuICAgICAgei5tdWxUbyhnMixnW24tMl0sZ1tuXSk7XG4gICAgICBuICs9IDI7XG4gICAgfVxuICB9XG5cbiAgdmFyIGogPSBlLnQtMSwgdywgaXMxID0gdHJ1ZSwgcjIgPSBuYmkoKSwgdDtcbiAgaSA9IG5iaXRzKGVbal0pLTE7XG4gIHdoaWxlKGogPj0gMCkge1xuICAgIGlmKGkgPj0gazEpIHcgPSAoZVtqXT4+KGktazEpKSZrbTtcbiAgICBlbHNlIHtcbiAgICAgIHcgPSAoZVtqXSYoKDE8PChpKzEpKS0xKSk8PChrMS1pKTtcbiAgICAgIGlmKGogPiAwKSB3IHw9IGVbai0xXT4+KHRoaXMuREIraS1rMSk7XG4gICAgfVxuXG4gICAgbiA9IGs7XG4gICAgd2hpbGUoKHcmMSkgPT0gMCkgeyB3ID4+PSAxOyAtLW47IH1cbiAgICBpZigoaSAtPSBuKSA8IDApIHsgaSArPSB0aGlzLkRCOyAtLWo7IH1cbiAgICBpZihpczEpIHtcdC8vIHJldCA9PSAxLCBkb24ndCBib3RoZXIgc3F1YXJpbmcgb3IgbXVsdGlwbHlpbmcgaXRcbiAgICAgIGdbd10uY29weVRvKHIpO1xuICAgICAgaXMxID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgd2hpbGUobiA+IDEpIHsgei5zcXJUbyhyLHIyKTsgei5zcXJUbyhyMixyKTsgbiAtPSAyOyB9XG4gICAgICBpZihuID4gMCkgei5zcXJUbyhyLHIyKTsgZWxzZSB7IHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICAgICAgei5tdWxUbyhyMixnW3ddLHIpO1xuICAgIH1cblxuICAgIHdoaWxlKGogPj0gMCAmJiAoZVtqXSYoMTw8aSkpID09IDApIHtcbiAgICAgIHouc3FyVG8ocixyMik7IHQgPSByOyByID0gcjI7IHIyID0gdDtcbiAgICAgIGlmKC0taSA8IDApIHsgaSA9IHRoaXMuREItMTsgLS1qOyB9XG4gICAgfVxuICB9XG4gIHJldHVybiB6LnJldmVydChyKTtcbn1cblxuLy8gKHB1YmxpYykgZ2NkKHRoaXMsYSkgKEhBQyAxNC41NClcbmZ1bmN0aW9uIGJuR0NEKGEpIHtcbiAgdmFyIHggPSAodGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpO1xuICB2YXIgeSA9IChhLnM8MCk/YS5uZWdhdGUoKTphLmNsb25lKCk7XG4gIGlmKHguY29tcGFyZVRvKHkpIDwgMCkgeyB2YXIgdCA9IHg7IHggPSB5OyB5ID0gdDsgfVxuICB2YXIgaSA9IHguZ2V0TG93ZXN0U2V0Qml0KCksIGcgPSB5LmdldExvd2VzdFNldEJpdCgpO1xuICBpZihnIDwgMCkgcmV0dXJuIHg7XG4gIGlmKGkgPCBnKSBnID0gaTtcbiAgaWYoZyA+IDApIHtcbiAgICB4LnJTaGlmdFRvKGcseCk7XG4gICAgeS5yU2hpZnRUbyhnLHkpO1xuICB9XG4gIHdoaWxlKHguc2lnbnVtKCkgPiAwKSB7XG4gICAgaWYoKGkgPSB4LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHguclNoaWZ0VG8oaSx4KTtcbiAgICBpZigoaSA9IHkuZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkgeS5yU2hpZnRUbyhpLHkpO1xuICAgIGlmKHguY29tcGFyZVRvKHkpID49IDApIHtcbiAgICAgIHguc3ViVG8oeSx4KTtcbiAgICAgIHguclNoaWZ0VG8oMSx4KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB5LnN1YlRvKHgseSk7XG4gICAgICB5LnJTaGlmdFRvKDEseSk7XG4gICAgfVxuICB9XG4gIGlmKGcgPiAwKSB5LmxTaGlmdFRvKGcseSk7XG4gIHJldHVybiB5O1xufVxuXG4vLyAocHJvdGVjdGVkKSB0aGlzICUgbiwgbiA8IDJeMjZcbmZ1bmN0aW9uIGJucE1vZEludChuKSB7XG4gIGlmKG4gPD0gMCkgcmV0dXJuIDA7XG4gIHZhciBkID0gdGhpcy5EViVuLCByID0gKHRoaXMuczwwKT9uLTE6MDtcbiAgaWYodGhpcy50ID4gMClcbiAgICBpZihkID09IDApIHIgPSB0aGlzWzBdJW47XG4gICAgZWxzZSBmb3IodmFyIGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHIgPSAoZCpyK3RoaXNbaV0pJW47XG4gIHJldHVybiByO1xufVxuXG4vLyAocHVibGljKSAxL3RoaXMgJSBtIChIQUMgMTQuNjEpXG5mdW5jdGlvbiBibk1vZEludmVyc2UobSkge1xuICB2YXIgYWMgPSBtLmlzRXZlbigpO1xuICBpZigodGhpcy5pc0V2ZW4oKSAmJiBhYykgfHwgbS5zaWdudW0oKSA9PSAwKSByZXR1cm4gQmlnSW50ZWdlci5aRVJPO1xuICB2YXIgdSA9IG0uY2xvbmUoKSwgdiA9IHRoaXMuY2xvbmUoKTtcbiAgdmFyIGEgPSBuYnYoMSksIGIgPSBuYnYoMCksIGMgPSBuYnYoMCksIGQgPSBuYnYoMSk7XG4gIHdoaWxlKHUuc2lnbnVtKCkgIT0gMCkge1xuICAgIHdoaWxlKHUuaXNFdmVuKCkpIHtcbiAgICAgIHUuclNoaWZ0VG8oMSx1KTtcbiAgICAgIGlmKGFjKSB7XG4gICAgICAgIGlmKCFhLmlzRXZlbigpIHx8ICFiLmlzRXZlbigpKSB7IGEuYWRkVG8odGhpcyxhKTsgYi5zdWJUbyhtLGIpOyB9XG4gICAgICAgIGEuclNoaWZ0VG8oMSxhKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYoIWIuaXNFdmVuKCkpIGIuc3ViVG8obSxiKTtcbiAgICAgIGIuclNoaWZ0VG8oMSxiKTtcbiAgICB9XG4gICAgd2hpbGUodi5pc0V2ZW4oKSkge1xuICAgICAgdi5yU2hpZnRUbygxLHYpO1xuICAgICAgaWYoYWMpIHtcbiAgICAgICAgaWYoIWMuaXNFdmVuKCkgfHwgIWQuaXNFdmVuKCkpIHsgYy5hZGRUbyh0aGlzLGMpOyBkLnN1YlRvKG0sZCk7IH1cbiAgICAgICAgYy5yU2hpZnRUbygxLGMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZighZC5pc0V2ZW4oKSkgZC5zdWJUbyhtLGQpO1xuICAgICAgZC5yU2hpZnRUbygxLGQpO1xuICAgIH1cbiAgICBpZih1LmNvbXBhcmVUbyh2KSA+PSAwKSB7XG4gICAgICB1LnN1YlRvKHYsdSk7XG4gICAgICBpZihhYykgYS5zdWJUbyhjLGEpO1xuICAgICAgYi5zdWJUbyhkLGIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHYuc3ViVG8odSx2KTtcbiAgICAgIGlmKGFjKSBjLnN1YlRvKGEsYyk7XG4gICAgICBkLnN1YlRvKGIsZCk7XG4gICAgfVxuICB9XG4gIGlmKHYuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwKSByZXR1cm4gQmlnSW50ZWdlci5aRVJPO1xuICBpZihkLmNvbXBhcmVUbyhtKSA+PSAwKSByZXR1cm4gZC5zdWJ0cmFjdChtKTtcbiAgaWYoZC5zaWdudW0oKSA8IDApIGQuYWRkVG8obSxkKTsgZWxzZSByZXR1cm4gZDtcbiAgaWYoZC5zaWdudW0oKSA8IDApIHJldHVybiBkLmFkZChtKTsgZWxzZSByZXR1cm4gZDtcbn1cblxudmFyIGxvd3ByaW1lcyA9IFsyLDMsNSw3LDExLDEzLDE3LDE5LDIzLDI5LDMxLDM3LDQxLDQzLDQ3LDUzLDU5LDYxLDY3LDcxLDczLDc5LDgzLDg5LDk3LDEwMSwxMDMsMTA3LDEwOSwxMTMsMTI3LDEzMSwxMzcsMTM5LDE0OSwxNTEsMTU3LDE2MywxNjcsMTczLDE3OSwxODEsMTkxLDE5MywxOTcsMTk5LDIxMSwyMjMsMjI3LDIyOSwyMzMsMjM5LDI0MSwyNTEsMjU3LDI2MywyNjksMjcxLDI3NywyODEsMjgzLDI5MywzMDcsMzExLDMxMywzMTcsMzMxLDMzNywzNDcsMzQ5LDM1MywzNTksMzY3LDM3MywzNzksMzgzLDM4OSwzOTcsNDAxLDQwOSw0MTksNDIxLDQzMSw0MzMsNDM5LDQ0Myw0NDksNDU3LDQ2MSw0NjMsNDY3LDQ3OSw0ODcsNDkxLDQ5OSw1MDMsNTA5LDUyMSw1MjMsNTQxLDU0Nyw1NTcsNTYzLDU2OSw1NzEsNTc3LDU4Nyw1OTMsNTk5LDYwMSw2MDcsNjEzLDYxNyw2MTksNjMxLDY0MSw2NDMsNjQ3LDY1Myw2NTksNjYxLDY3Myw2NzcsNjgzLDY5MSw3MDEsNzA5LDcxOSw3MjcsNzMzLDczOSw3NDMsNzUxLDc1Nyw3NjEsNzY5LDc3Myw3ODcsNzk3LDgwOSw4MTEsODIxLDgyMyw4MjcsODI5LDgzOSw4NTMsODU3LDg1OSw4NjMsODc3LDg4MSw4ODMsODg3LDkwNyw5MTEsOTE5LDkyOSw5MzcsOTQxLDk0Nyw5NTMsOTY3LDk3MSw5NzcsOTgzLDk5MSw5OTddO1xudmFyIGxwbGltID0gKDE8PDI2KS9sb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXTtcblxuLy8gKHB1YmxpYykgdGVzdCBwcmltYWxpdHkgd2l0aCBjZXJ0YWludHkgPj0gMS0uNV50XG5mdW5jdGlvbiBibklzUHJvYmFibGVQcmltZSh0KSB7XG4gIHZhciBpLCB4ID0gdGhpcy5hYnMoKTtcbiAgaWYoeC50ID09IDEgJiYgeFswXSA8PSBsb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSkge1xuICAgIGZvcihpID0gMDsgaSA8IGxvd3ByaW1lcy5sZW5ndGg7ICsraSlcbiAgICAgIGlmKHhbMF0gPT0gbG93cHJpbWVzW2ldKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYoeC5pc0V2ZW4oKSkgcmV0dXJuIGZhbHNlO1xuICBpID0gMTtcbiAgd2hpbGUoaSA8IGxvd3ByaW1lcy5sZW5ndGgpIHtcbiAgICB2YXIgbSA9IGxvd3ByaW1lc1tpXSwgaiA9IGkrMTtcbiAgICB3aGlsZShqIDwgbG93cHJpbWVzLmxlbmd0aCAmJiBtIDwgbHBsaW0pIG0gKj0gbG93cHJpbWVzW2orK107XG4gICAgbSA9IHgubW9kSW50KG0pO1xuICAgIHdoaWxlKGkgPCBqKSBpZihtJWxvd3ByaW1lc1tpKytdID09IDApIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4geC5taWxsZXJSYWJpbih0KTtcbn1cblxuLyogYWRkZWQgYnkgUmVjdXJpdHkgTGFicyAqL1xuXG5mdW5jdGlvbiBuYml0cyh4KSB7XG5cdHZhciBuID0gMSwgdDtcblx0aWYgKCh0ID0geCA+Pj4gMTYpICE9IDApIHtcblx0XHR4ID0gdDtcblx0XHRuICs9IDE2O1xuXHR9XG5cdGlmICgodCA9IHggPj4gOCkgIT0gMCkge1xuXHRcdHggPSB0O1xuXHRcdG4gKz0gODtcblx0fVxuXHRpZiAoKHQgPSB4ID4+IDQpICE9IDApIHtcblx0XHR4ID0gdDtcblx0XHRuICs9IDQ7XG5cdH1cblx0aWYgKCh0ID0geCA+PiAyKSAhPSAwKSB7XG5cdFx0eCA9IHQ7XG5cdFx0biArPSAyO1xuXHR9XG5cdGlmICgodCA9IHggPj4gMSkgIT0gMCkge1xuXHRcdHggPSB0O1xuXHRcdG4gKz0gMTtcblx0fVxuXHRyZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gYm5Ub01QSSAoKSB7XG5cdHZhciBiYSA9IHRoaXMudG9CeXRlQXJyYXkoKTtcblx0dmFyIHNpemUgPSAoYmEubGVuZ3RoLTEpKjgrbmJpdHMoYmFbMF0pO1xuXHR2YXIgcmVzdWx0ID0gXCJcIjtcblx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHNpemUgJiAweEZGMDApID4+IDgpO1xuXHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShzaXplICYgMHhGRik7XG5cdHJlc3VsdCArPSB1dGlsLmJpbjJzdHIoYmEpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuLyogRU5EIG9mIGFkZGl0aW9uICovXG5cbi8vIChwcm90ZWN0ZWQpIHRydWUgaWYgcHJvYmFibHkgcHJpbWUgKEhBQyA0LjI0LCBNaWxsZXItUmFiaW4pXG5mdW5jdGlvbiBibnBNaWxsZXJSYWJpbih0KSB7XG4gIHZhciBuMSA9IHRoaXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuICB2YXIgayA9IG4xLmdldExvd2VzdFNldEJpdCgpO1xuICBpZihrIDw9IDApIHJldHVybiBmYWxzZTtcbiAgdmFyIHIgPSBuMS5zaGlmdFJpZ2h0KGspO1xuICB0ID0gKHQrMSk+PjE7XG4gIGlmKHQgPiBsb3dwcmltZXMubGVuZ3RoKSB0ID0gbG93cHJpbWVzLmxlbmd0aDtcbiAgdmFyIGEgPSBuYmkoKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHQ7ICsraSkge1xuICAgIC8vUGljayBiYXNlcyBhdCByYW5kb20sIGluc3RlYWQgb2Ygc3RhcnRpbmcgYXQgMlxuICAgIGEuZnJvbUludChsb3dwcmltZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxvd3ByaW1lcy5sZW5ndGgpXSk7XG4gICAgdmFyIHkgPSBhLm1vZFBvdyhyLHRoaXMpO1xuICAgIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICB2YXIgaiA9IDE7XG4gICAgICB3aGlsZShqKysgPCBrICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgIHkgPSB5Lm1vZFBvd0ludCgyLHRoaXMpO1xuICAgICAgICBpZih5LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYoeS5jb21wYXJlVG8objEpICE9IDApIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbnZhciBCaWdJbnRlZ2VyID0gcmVxdWlyZSgnLi9qc2JuLmpzJyk7XG5cbi8vIHByb3RlY3RlZFxuQmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplID0gYm5wQ2h1bmtTaXplO1xuQmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeCA9IGJucFRvUmFkaXg7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tUmFkaXggPSBibnBGcm9tUmFkaXg7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyID0gYm5wRnJvbU51bWJlcjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbyA9IGJucEJpdHdpc2VUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNoYW5nZUJpdCA9IGJucENoYW5nZUJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvID0gYm5wQWRkVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5kTXVsdGlwbHkgPSBibnBETXVsdGlwbHk7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0ID0gYm5wREFkZE9mZnNldDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbyA9IGJucE11bHRpcGx5TG93ZXJUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VXBwZXJUbyA9IGJucE11bHRpcGx5VXBwZXJUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1vZEludCA9IGJucE1vZEludDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluID0gYm5wTWlsbGVyUmFiaW47XG5cbi8vIHB1YmxpY1xuQmlnSW50ZWdlci5wcm90b3R5cGUuY2xvbmUgPSBibkNsb25lO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBibkludFZhbHVlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlID0gYm5CeXRlVmFsdWU7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zaG9ydFZhbHVlID0gYm5TaG9ydFZhbHVlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtID0gYm5TaWdOdW07XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheSA9IGJuVG9CeXRlQXJyYXk7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5lcXVhbHMgPSBibkVxdWFscztcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGJuTWluO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubWF4ID0gYm5NYXg7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQgPSBibkFuZDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm9yID0gYm5PcjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnhvciA9IGJuWG9yO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYW5kTm90ID0gYm5BbmROb3Q7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3QgPSBibk5vdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGJuU2hpZnRMZWZ0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodCA9IGJuU2hpZnRSaWdodDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdCA9IGJuR2V0TG93ZXN0U2V0Qml0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQgPSBibkJpdENvdW50O1xuQmlnSW50ZWdlci5wcm90b3R5cGUudGVzdEJpdCA9IGJuVGVzdEJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdCA9IGJuU2V0Qml0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQgPSBibkNsZWFyQml0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZmxpcEJpdCA9IGJuRmxpcEJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmFkZCA9IGJuQWRkO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3QgPSBiblN1YnRyYWN0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHkgPSBibk11bHRpcGx5O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlID0gYm5EaXZpZGU7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXIgPSBiblJlbWFpbmRlcjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZUFuZFJlbWFpbmRlciA9IGJuRGl2aWRlQW5kUmVtYWluZGVyO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gYm5Nb2RQb3c7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlID0gYm5Nb2RJbnZlcnNlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUucG93ID0gYm5Qb3c7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2QgPSBibkdDRDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZSA9IGJuSXNQcm9iYWJsZVByaW1lO1xuQmlnSW50ZWdlci5wcm90b3R5cGUudG9NUEkgPSBiblRvTVBJO1xuXG4vLyBKU0JOLXNwZWNpZmljIGV4dGVuc2lvblxuQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlID0gYm5TcXVhcmU7XG5cblxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0Fcbi8vXG4vLyBSU0EgaW1wbGVtZW50YXRpb25cblxudmFyIEJpZ0ludGVnZXIgPSByZXF1aXJlKCcuL2pzYm4uanMnKSxcblx0dXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwnKSxcblx0cmFuZG9tID0gcmVxdWlyZSgnLi4vcmFuZG9tLmpzJyk7XG5cbmZ1bmN0aW9uIFNlY3VyZVJhbmRvbSgpe1xuICAgIGZ1bmN0aW9uIG5leHRCeXRlcyhieXRlQXJyYXkpe1xuICAgICAgICBmb3IodmFyIG4gPSAwOyBuIDwgYnl0ZUFycmF5Lmxlbmd0aDtuKyspe1xuICAgICAgICAgICAgYnl0ZUFycmF5W25dID0gcmFuZG9tLmdldFNlY3VyZVJhbmRvbU9jdGV0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5uZXh0Qnl0ZXMgPSBuZXh0Qnl0ZXM7XG59XG5cbmZ1bmN0aW9uIFJTQSgpIHtcblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gdXNlcyBqc2JuIEJpZyBOdW0gbGlicmFyeSB0byBkZWNyeXB0IFJTQVxuXHQgKiBAcGFyYW0gbVxuXHQgKiAgICAgICAgICAgIG1lc3NhZ2Vcblx0ICogQHBhcmFtIGRcblx0ICogICAgICAgICAgICBSU0EgZCBhcyBCaWdJbnRlZ2VyXG5cdCAqIEBwYXJhbSBwXG5cdCAqICAgICAgICAgICAgUlNBIHAgYXMgQmlnSW50ZWdlclxuXHQgKiBAcGFyYW0gcVxuXHQgKiAgICAgICAgICAgIFJTQSBxIGFzIEJpZ0ludGVnZXJcblx0ICogQHBhcmFtIHVcblx0ICogICAgICAgICAgICBSU0EgdSBhcyBCaWdJbnRlZ2VyXG5cdCAqIEByZXR1cm4ge0JpZ0ludGVnZXJ9IFRoZSBkZWNyeXB0ZWQgdmFsdWUgb2YgdGhlIG1lc3NhZ2Vcblx0ICovXG5cdGZ1bmN0aW9uIGRlY3J5cHQobSwgZCwgcCwgcSwgdSkge1xuXHRcdHZhciB4cCA9IG0ubW9kKHApLm1vZFBvdyhkLm1vZChwLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSksIHApO1xuXHRcdHZhciB4cSA9IG0ubW9kKHEpLm1vZFBvdyhkLm1vZChxLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSksIHEpO1xuXHRcdHV0aWwucHJpbnRfZGVidWcoXCJyc2EuanMgZGVjcnlwdFxcbnhwbjpcIit1dGlsLmhleHN0cmR1bXAoeHAudG9NUEkoKSkrXCJcXG54cW46XCIrdXRpbC5oZXhzdHJkdW1wKHhxLnRvTVBJKCkpKTtcblxuXHRcdHZhciB0ID0geHEuc3VidHJhY3QoeHApO1xuXHRcdGlmICh0WzBdID09IDApIHtcblx0XHRcdHQgPSB4cC5zdWJ0cmFjdCh4cSk7XG5cdFx0XHR0ID0gdC5tdWx0aXBseSh1KS5tb2QocSk7XG5cdFx0XHR0ID0gcS5zdWJ0cmFjdCh0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dCA9IHQubXVsdGlwbHkodSkubW9kKHEpO1xuXHRcdH1cblx0XHRyZXR1cm4gdC5tdWx0aXBseShwKS5hZGQoeHApO1xuXHR9XG5cdFxuXHQvKipcblx0ICogZW5jcnlwdCBtZXNzYWdlXG5cdCAqIEBwYXJhbSBtIG1lc3NhZ2UgYXMgQmlnSW50ZWdlclxuXHQgKiBAcGFyYW0gZSBwdWJsaWMgTVBJIHBhcnQgYXMgQmlnSW50ZWdlclxuXHQgKiBAcGFyYW0gbiBwdWJsaWMgTVBJIHBhcnQgYXMgQmlnSW50ZWdlclxuXHQgKiBAcmV0dXJuIEJpZ0ludGVnZXJcblx0ICovXG5cdGZ1bmN0aW9uIGVuY3J5cHQobSxlLG4pIHtcblx0XHRyZXR1cm4gbS5tb2RQb3dJbnQoZSwgbik7XG5cdH1cblx0XG5cdC8qIFNpZ24gYW5kIFZlcmlmeSAqL1xuXHRmdW5jdGlvbiBzaWduKG0sZCxuKSB7XG5cdFx0cmV0dXJuIG0ubW9kUG93KGQsIG4pO1xuXHR9XG5cdFx0XG5cdGZ1bmN0aW9uIHZlcmlmeSh4LGUsbikge1xuXHRcdHJldHVybiB4Lm1vZFBvd0ludChlLCBuKTtcblx0fVxuXHRcblx0Ly8gXCJlbXB0eVwiIFJTQSBrZXkgY29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBrZXlPYmplY3QoKSB7XG4gICAgICAgIHRoaXMubiA9IG51bGw7XG4gICAgICAgIHRoaXMuZSA9IDA7XG4gICAgICAgIHRoaXMuZWUgPSBudWxsO1xuICAgICAgICB0aGlzLmQgPSBudWxsO1xuICAgICAgICB0aGlzLnAgPSBudWxsO1xuICAgICAgICB0aGlzLnEgPSBudWxsO1xuICAgICAgICB0aGlzLmRtcDEgPSBudWxsO1xuICAgICAgICB0aGlzLmRtcTEgPSBudWxsO1xuICAgICAgICB0aGlzLnUgPSBudWxsO1xuICAgIH1cblx0XG5cdC8vIEdlbmVyYXRlIGEgbmV3IHJhbmRvbSBwcml2YXRlIGtleSBCIGJpdHMgbG9uZywgdXNpbmcgcHVibGljIGV4cHQgRVxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlKEIsRSkge1xuICAgICAgICB2YXIga2V5ID0gbmV3IGtleU9iamVjdCgpO1xuICAgICAgICB2YXIgcm5nID0gbmV3IFNlY3VyZVJhbmRvbSgpO1xuICAgICAgICB2YXIgcXMgPSBCPj4xO1xuICAgICAgICBrZXkuZSA9IHBhcnNlSW50KEUsMTYpO1xuICAgICAgICBrZXkuZWUgPSBuZXcgQmlnSW50ZWdlcihFLDE2KTtcbiAgICAgICAgZm9yKDs7KSB7XG4gICAgICAgICAgICBmb3IoOzspIHtcbiAgICAgICAgICAgICAgICBrZXkucCA9IG5ldyBCaWdJbnRlZ2VyKEItcXMsMSxybmcpO1xuICAgICAgICAgICAgICAgIGlmKGtleS5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKS5nY2Qoa2V5LmVlKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDAgJiYga2V5LnAuaXNQcm9iYWJsZVByaW1lKDEwKSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IoOzspIHtcbiAgICAgICAgICAgICAgICBrZXkucSA9IG5ldyBCaWdJbnRlZ2VyKHFzLDEscm5nKTtcbiAgICAgICAgICAgICAgICBpZihrZXkucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGtleS5lZSkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwICYmIGtleS5xLmlzUHJvYmFibGVQcmltZSgxMCkpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoa2V5LnAuY29tcGFyZVRvKGtleS5xKSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSBrZXkucDtcbiAgICAgICAgICAgICAgICBrZXkucCA9IGtleS5xO1xuICAgICAgICAgICAgICAgIGtleS5xID0gdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwMSA9IGtleS5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgICAgICAgIHZhciBxMSA9IGtleS5xLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgICAgICAgIHZhciBwaGkgPSBwMS5tdWx0aXBseShxMSk7XG4gICAgICAgICAgICBpZihwaGkuZ2NkKGtleS5lZSkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5Lm4gPSBrZXkucC5tdWx0aXBseShrZXkucSk7XG4gICAgICAgICAgICAgICAga2V5LmQgPSBrZXkuZWUubW9kSW52ZXJzZShwaGkpO1xuICAgICAgICAgICAgICAgIGtleS5kbXAxID0ga2V5LmQubW9kKHAxKTtcbiAgICAgICAgICAgICAgICBrZXkuZG1xMSA9IGtleS5kLm1vZChxMSk7XG4gICAgICAgICAgICAgICAga2V5LnUgPSBrZXkucC5tb2RJbnZlcnNlKGtleS5xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cblx0XHRcblx0dGhpcy5lbmNyeXB0ID0gZW5jcnlwdDtcblx0dGhpcy5kZWNyeXB0ID0gZGVjcnlwdDtcblx0dGhpcy52ZXJpZnkgPSB2ZXJpZnk7XG5cdHRoaXMuc2lnbiA9IHNpZ247XG5cdHRoaXMuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcblx0dGhpcy5rZXlPYmplY3QgPSBrZXlPYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUlNBO1xuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EgXG5cbi8vIFRoZSBHUEc0QnJvd3NlcnMgY3J5cHRvIGludGVyZmFjZVxuXG52YXIgdHlwZV9tcGkgPSByZXF1aXJlKCcuLi90eXBlL21waS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyoqXG5cdCAqIFJldHJpZXZlIHNlY3VyZSByYW5kb20gYnl0ZSBzdHJpbmcgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGhcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5ndGggTGVuZ3RoIGluIGJ5dGVzIHRvIGdlbmVyYXRlXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gUmFuZG9tIGJ5dGUgc3RyaW5nXG5cdCAqL1xuXHRnZXRSYW5kb21CeXRlczogZnVuY3Rpb24obGVuZ3RoKSB7XG5cdFx0dmFyIHJlc3VsdCA9ICcnO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuZ2V0U2VjdXJlUmFuZG9tT2N0ZXQoKSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybiBhIHBzZXVkby1yYW5kb20gbnVtYmVyIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2Vcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBmcm9tIE1pbiBvZiB0aGUgcmFuZG9tIG51bWJlclxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHRvIE1heCBvZiB0aGUgcmFuZG9tIG51bWJlciAobWF4IDMyYml0KVxuXHQgKiBAcmV0dXJuIHtJbnRlZ2VyfSBBIHBzZXVkbyByYW5kb20gbnVtYmVyXG5cdCAqL1xuXHRnZXRQc2V1ZG9SYW5kb206IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSoodG8tZnJvbSkpK2Zyb207XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybiBhIHNlY3VyZSByYW5kb20gbnVtYmVyIGluIHRoZSBzcGVjaWZpZWQgcmFuZ2Vcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBmcm9tIE1pbiBvZiB0aGUgcmFuZG9tIG51bWJlclxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHRvIE1heCBvZiB0aGUgcmFuZG9tIG51bWJlciAobWF4IDMyYml0KVxuXHQgKiBAcmV0dXJuIHtJbnRlZ2VyfSBBIHNlY3VyZSByYW5kb20gbnVtYmVyXG5cdCAqL1xuXHRnZXRTZWN1cmVSYW5kb206IGZ1bmN0aW9uKGZyb20sIHRvKSB7XG5cdFx0dmFyIGJ1ZiA9IG5ldyBVaW50MzJBcnJheSgxKTtcblx0XHR3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhidWYpO1xuXHRcdHZhciBiaXRzID0gKCh0by1mcm9tKSkudG9TdHJpbmcoMikubGVuZ3RoO1xuXHRcdHdoaWxlICgoYnVmWzBdICYgKE1hdGgucG93KDIsIGJpdHMpIC0xKSkgPiAodG8tZnJvbSkpXG5cdFx0XHR3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhidWYpO1xuXHRcdHJldHVybiBmcm9tKyhNYXRoLmFicyhidWZbMF0gJiAoTWF0aC5wb3coMiwgYml0cykgLTEpKSk7XG5cdH0sXG5cblx0Z2V0U2VjdXJlUmFuZG9tT2N0ZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBidWYgPSBuZXcgVWludDMyQXJyYXkoMSk7XG5cdFx0d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnVmKTtcblx0XHRyZXR1cm4gYnVmWzBdICYgMHhGRjtcblx0fSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2VjdXJlIHJhbmRvbSBiaWcgaW50ZWdlciBvZiBiaXRzIGxlbmd0aFxuICAgKiBAcGFyYW0ge0ludGVnZXJ9IGJpdHMgQml0IGxlbmd0aCBvZiB0aGUgTVBJIHRvIGNyZWF0ZVxuICAgKiBAcmV0dXJuIHtCaWdJbnRlZ2VyfSBSZXN1bHRpbmcgYmlnIGludGVnZXJcbiAgICovXG4gIGdldFJhbmRvbUJpZ0ludGVnZXI6IGZ1bmN0aW9uKGJpdHMpIHtcbiAgICBpZiAoYml0cyA8IDApIHtcbiAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG51bUJ5dGVzID0gTWF0aC5mbG9vcigoYml0cys3KS84KTtcblxuICAgIHZhciByYW5kb21CaXRzID0gdGhpcy5nZXRSYW5kb21CeXRlcyhudW1CeXRlcyk7XG4gICAgaWYgKGJpdHMgJSA4ID4gMCkge1xuICAgICAgXG4gICAgICByYW5kb21CaXRzID0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgKE1hdGgucG93KDIsYml0cyAlIDgpLTEpICZcbiAgICAgICAgICAgICAgcmFuZG9tQml0cy5jaGFyQ29kZUF0KDApKSArXG4gICAgICAgIHJhbmRvbUJpdHMuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICB2YXIgbXBpID0gbmV3IHR5cGVfbXBpKCk7XG4gICAgbXBpLmZyb21CeXRlcyhyYW5kb21CaXRzKTtcbiAgICByZXR1cm4gbXBpLnRvQmlnSW50ZWdlcigpO1xuICB9LFxuXG4gIGdldFJhbmRvbUJpZ0ludGVnZXJJblJhbmdlOiBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIGlmIChtYXguY29tcGFyZVRvKG1pbikgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IG1heC5zdWJ0cmFjdChtaW4pO1xuICAgIHZhciByID0gdGhpcy5nZXRSYW5kb21CaWdJbnRlZ2VyKHJhbmdlLmJpdExlbmd0aCgpKTtcbiAgICB3aGlsZSAociA+IHJhbmdlKSB7XG4gICAgICByID0gdGhpcy5nZXRSYW5kb21CaWdJbnRlZ2VyKHJhbmdlLmJpdExlbmd0aCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1pbi5hZGQocik7XG4gIH1cblxufTtcbiIsIlxudmFyIHB1YmxpY0tleSA9IHJlcXVpcmUoJy4vcHVibGljX2tleScpLFxuXHRwa2NzMSA9IHJlcXVpcmUoJy4vcGtjczEuanMnKSxcblx0aGFzaE1vZHVsZSA9IHJlcXVpcmUoJy4vaGFzaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyoqXG5cdCAqIFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGFsZ28gcHVibGljIEtleSBhbGdvcml0aG1cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBoYXNoX2FsZ28gSGFzaCBhbGdvcml0aG1cblx0ICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpW119IG1zZ19NUElzIFNpZ25hdHVyZSBtdWx0aXByZWNpc2lvbiBpbnRlZ2Vyc1xuXHQgKiBAcGFyYW0ge29wZW5wZ3BfdHlwZV9tcGlbXX0gcHVibGlja2V5X01QSXMgUHVibGljIGtleSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VycyBcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgRGF0YSBvbiB3aGVyZSB0aGUgc2lnbmF0dXJlIHdhcyBjb21wdXRlZCBvbi5cblx0ICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBzaWduYXR1cmUgKHNpZ19kYXRhIHdhcyBlcXVhbCB0byBkYXRhIG92ZXIgaGFzaClcblx0ICovXG5cdHZlcmlmeTogZnVuY3Rpb24oYWxnbywgaGFzaF9hbGdvLCBtc2dfTVBJcywgcHVibGlja2V5X01QSXMsIGRhdGEpIHtcblx0XHR2YXIgY2FsY19oYXNoID0gaGFzaE1vZHVsZS5kaWdlc3QoaGFzaF9hbGdvLCBkYXRhKTtcblxuXHRcdHN3aXRjaChhbGdvKSB7XG5cdFx0Y2FzZSAxOiAvLyBSU0EgKEVuY3J5cHQgb3IgU2lnbikgW0hBQ10gIFxuXHRcdGNhc2UgMjogLy8gUlNBIEVuY3J5cHQtT25seSBbSEFDXVxuXHRcdGNhc2UgMzogLy8gUlNBIFNpZ24tT25seSBbSEFDXVxuXHRcdFx0dmFyIHJzYSA9IG5ldyBwdWJsaWNLZXkucnNhKCk7XG5cdFx0XHR2YXIgbiA9IHB1YmxpY2tleV9NUElzWzBdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIGUgPSBwdWJsaWNrZXlfTVBJc1sxXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciB4ID0gbXNnX01QSXNbMF0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgZG9wdWJsaWMgPSByc2EudmVyaWZ5KHgsZSxuKTtcblx0XHRcdHZhciBoYXNoICA9IHBrY3MxLmVtc2EuZGVjb2RlKGhhc2hfYWxnbyxkb3B1YmxpYy50b01QSSgpLnN1YnN0cmluZygyKSk7XG5cdFx0XHRpZiAoaGFzaCA9PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1BLQ1MxIHBhZGRpbmcgaW4gbWVzc2FnZSBvciBrZXkgaW5jb3JyZWN0LiBBYm9ydGluZy4uLicpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGhhc2ggPT0gY2FsY19oYXNoO1xuXHRcdFx0XG5cdFx0Y2FzZSAxNjogLy8gRWxnYW1hbCAoRW5jcnlwdC1Pbmx5KSBbRUxHQU1BTF0gW0hBQ11cblx0XHRcdHRocm93IG5ldyBFcnJvcihcInNpZ25pbmcgd2l0aCBFbGdhbWFsIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBPcGVuUEdQIHN0YW5kYXJkLlwiKTtcblx0XHRjYXNlIDE3OiAvLyBEU0EgKERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSkgW0ZJUFMxODZdIFtIQUNdXG5cdFx0XHR2YXIgZHNhID0gbmV3IHB1YmxpY0tleS5kc2EoKTtcblx0XHRcdHZhciBzMSA9IG1zZ19NUElzWzBdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIHMyID0gbXNnX01QSXNbMV0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgcCA9IHB1YmxpY2tleV9NUElzWzBdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIHEgPSBwdWJsaWNrZXlfTVBJc1sxXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBnID0gcHVibGlja2V5X01QSXNbMl0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgeSA9IHB1YmxpY2tleV9NUElzWzNdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIG0gPSBkYXRhO1xuXHRcdFx0dmFyIGRvcHVibGljID0gZHNhLnZlcmlmeShoYXNoX2FsZ28sczEsczIsbSxwLHEsZyx5KTtcblx0XHRcdHJldHVybiBkb3B1YmxpYy5jb21wYXJlVG8oczEpID09IDA7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUgYWxnb3JpdGhtLicpO1xuXHRcdH1cblx0XHRcblx0fSxcblx0ICAgXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBzaWduYXR1cmUgb24gZGF0YSB1c2luZyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGhhc2hfYWxnbyBoYXNoIEFsZ29yaXRobSB0byB1c2UgKFNlZSBSRkM0ODgwIDkuNClcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBhbGdvIEFzeW1tZXRyaWMgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UgKFNlZSBSRkM0ODgwIDkuMSlcblx0ICogQHBhcmFtIHtvcGVucGdwX3R5cGVfbXBpW119IHB1YmxpY01QSXMgUHVibGljIGtleSBtdWx0aXByZWNpc2lvbiBpbnRlZ2VycyBcblx0ICogb2YgdGhlIHByaXZhdGUga2V5IFxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfdHlwZV9tcGlbXX0gc2VjcmV0TVBJcyBQcml2YXRlIGtleSBtdWx0aXByZWNpc2lvbiBcblx0ICogaW50ZWdlcnMgd2hpY2ggaXMgdXNlZCB0byBzaWduIHRoZSBkYXRhXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIERhdGEgdG8gYmUgc2lnbmVkXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfdHlwZV9tcGlbXX1cblx0ICovXG5cdHNpZ246IGZ1bmN0aW9uKGhhc2hfYWxnbywgYWxnbywga2V5SW50ZWdlcnMsIGRhdGEpIHtcblx0XHRcblx0XHRzd2l0Y2goYWxnbykge1xuXHRcdGNhc2UgMTogLy8gUlNBIChFbmNyeXB0IG9yIFNpZ24pIFtIQUNdICBcblx0XHRjYXNlIDI6IC8vIFJTQSBFbmNyeXB0LU9ubHkgW0hBQ11cblx0XHRjYXNlIDM6IC8vIFJTQSBTaWduLU9ubHkgW0hBQ11cblx0XHRcdHZhciByc2EgPSBuZXcgcHVibGljS2V5LnJzYSgpO1xuXHRcdFx0dmFyIGQgPSBrZXlJbnRlZ2Vyc1syXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciBuID0ga2V5SW50ZWdlcnNbMF0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgbSA9IHBrY3MxLmVtc2EuZW5jb2RlKGhhc2hfYWxnbywgXG5cdFx0XHRcdGRhdGEsIGtleUludGVnZXJzWzBdLmJ5dGVMZW5ndGgoKSk7XG5cblx0XHRcdHJldHVybiByc2Euc2lnbihtLCBkLCBuKS50b01QSSgpO1xuXG5cdFx0Y2FzZSAxNzogLy8gRFNBIChEaWdpdGFsIFNpZ25hdHVyZSBBbGdvcml0aG0pIFtGSVBTMTg2XSBbSEFDXVxuXHRcdFx0dmFyIGRzYSA9IG5ldyBwdWJsaWNLZXkuZHNhKCk7XG5cblx0XHRcdHZhciBwID0ga2V5SW50ZWdlcnNbMF0udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgcSA9IGtleUludGVnZXJzWzFdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIGcgPSBrZXlJbnRlZ2Vyc1syXS50b0JpZ0ludGVnZXIoKTtcblx0XHRcdHZhciB5ID0ga2V5SW50ZWdlcnNbM10udG9CaWdJbnRlZ2VyKCk7XG5cdFx0XHR2YXIgeCA9IGtleUludGVnZXJzWzRdLnRvQmlnSW50ZWdlcigpO1xuXHRcdFx0dmFyIG0gPSBkYXRhO1xuXHRcdFx0dmFyIHJlc3VsdCA9IGRzYS5zaWduKGhhc2hfYWxnbyxtLCBnLCBwLCBxLCB4KTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdFswXS50b1N0cmluZygpICsgcmVzdWx0WzFdLnRvU3RyaW5nKCk7XG5cdFx0Y2FzZSAxNjogLy8gRWxnYW1hbCAoRW5jcnlwdC1Pbmx5KSBbRUxHQU1BTF0gW0hBQ11cblx0XHRcdHRocm93IG5ldyBFcnJvcignU2lnbmluZyB3aXRoIEVsZ2FtYWwgaXMgbm90IGRlZmluZWQgaW4gdGhlIE9wZW5QR1Agc3RhbmRhcmQuJyk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUgYWxnb3JpdGhtLicpO1xuXHRcdH1cdFxuXHR9XG59XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQuanMnKTtcblxuXG5cbi8qKlxuICogRmluZHMgb3V0IHdoaWNoIEFzY2lpIEFybW9yaW5nIHR5cGUgaXMgdXNlZC4gVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IHRleHQgW1N0cmluZ10gYXNjaWkgYXJtb3JlZCB0ZXh0XG4gKiBAcmV0dXJucyB7SW50ZWdlcn0gMCA9IE1FU1NBR0UgUEFSVCBuIG9mIG1cbiAqICAgICAgICAgMSA9IE1FU1NBR0UgUEFSVCBuXG4gKiAgICAgICAgIDIgPSBTSUdORUQgTUVTU0FHRVxuICogICAgICAgICAzID0gUEdQIE1FU1NBR0VcbiAqICAgICAgICAgNCA9IFBVQkxJQyBLRVkgQkxPQ0tcbiAqICAgICAgICAgNSA9IFBSSVZBVEUgS0VZIEJMT0NLXG4gKiAgICAgICAgIG51bGwgPSB1bmtub3duXG4gKi9cbmZ1bmN0aW9uIGdldF90eXBlKHRleHQpIHtcblx0dmFyIHNwbGl0dGVkdGV4dCA9IHRleHQuc3BsaXQoJy0tLS0tJyk7XG5cdC8vIEJFR0lOIFBHUCBNRVNTQUdFLCBQQVJUIFgvWVxuXHQvLyBVc2VkIGZvciBtdWx0aS1wYXJ0IG1lc3NhZ2VzLCB3aGVyZSB0aGUgYXJtb3IgaXMgc3BsaXQgYW1vbmdzdCBZXG5cdC8vIHBhcnRzLCBhbmQgdGhpcyBpcyB0aGUgWHRoIHBhcnQgb3V0IG9mIFkuXG5cdGlmIChzcGxpdHRlZHRleHRbMV0ubWF0Y2goL0JFR0lOIFBHUCBNRVNTQUdFLCBQQVJUIFxcZCtcXC9cXGQrLykpIHtcblx0XHRyZXR1cm4gMDtcblx0fSBlbHNlXG5cdFx0Ly8gQkVHSU4gUEdQIE1FU1NBR0UsIFBBUlQgWFxuXHRcdC8vIFVzZWQgZm9yIG11bHRpLXBhcnQgbWVzc2FnZXMsIHdoZXJlIHRoaXMgaXMgdGhlIFh0aCBwYXJ0IG9mIGFuXG5cdFx0Ly8gdW5zcGVjaWZpZWQgbnVtYmVyIG9mIHBhcnRzLiBSZXF1aXJlcyB0aGUgTUVTU0FHRS1JRCBBcm1vclxuXHRcdC8vIEhlYWRlciB0byBiZSB1c2VkLlxuXHRpZiAoc3BsaXR0ZWR0ZXh0WzFdLm1hdGNoKC9CRUdJTiBQR1AgTUVTU0FHRSwgUEFSVCBcXGQrLykpIHtcblx0XHRyZXR1cm4gMTtcblxuXHR9IGVsc2Vcblx0XHQvLyBCRUdJTiBQR1AgU0lHTkFUVVJFXG5cdFx0Ly8gVXNlZCBmb3IgZGV0YWNoZWQgc2lnbmF0dXJlcywgT3BlblBHUC9NSU1FIHNpZ25hdHVyZXMsIGFuZFxuXHRcdC8vIGNsZWFydGV4dCBzaWduYXR1cmVzLiBOb3RlIHRoYXQgUEdQIDIueCB1c2VzIEJFR0lOIFBHUCBNRVNTQUdFXG5cdFx0Ly8gZm9yIGRldGFjaGVkIHNpZ25hdHVyZXMuXG5cdGlmIChzcGxpdHRlZHRleHRbMV0ubWF0Y2goL0JFR0lOIFBHUCBTSUdORUQgTUVTU0FHRS8pKSB7XG5cdFx0cmV0dXJuIDI7XG5cblx0fSBlbHNlXG4gIFx0ICAgIC8vIEJFR0lOIFBHUCBNRVNTQUdFXG5cdCAgICAvLyBVc2VkIGZvciBzaWduZWQsIGVuY3J5cHRlZCwgb3IgY29tcHJlc3NlZCBmaWxlcy5cblx0aWYgKHNwbGl0dGVkdGV4dFsxXS5tYXRjaCgvQkVHSU4gUEdQIE1FU1NBR0UvKSkge1xuXHRcdHJldHVybiAzO1xuXG5cdH0gZWxzZVxuXHRcdC8vIEJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLXG5cdFx0Ly8gVXNlZCBmb3IgYXJtb3JpbmcgcHVibGljIGtleXMuXG5cdGlmIChzcGxpdHRlZHRleHRbMV0ubWF0Y2goL0JFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLykpIHtcblx0XHRyZXR1cm4gNDtcblxuXHR9IGVsc2Vcblx0XHQvLyBCRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0tcblx0XHQvLyBVc2VkIGZvciBhcm1vcmluZyBwcml2YXRlIGtleXMuXG5cdGlmIChzcGxpdHRlZHRleHRbMV0ubWF0Y2goL0JFR0lOIFBHUCBQUklWQVRFIEtFWSBCTE9DSy8pKSB7XG5cdFx0cmV0dXJuIDU7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgYXJtb3IgdmVyc2lvbiBvZiBhbiBPcGVuUEdQIGJpbmFyeVxuICogcGFja2V0IGJsb2NrLlxuICogQGF1dGhvciAgQWxleFxuICogQHZlcnNpb24gMjAxMS0xMi0xNlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIGhlYWRlciBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBhcm1vcl9hZGRoZWFkZXIoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFwiXCI7XG5cdGlmIChvcGVucGdwLmNvbmZpZy5jb25maWcuc2hvd192ZXJzaW9uKSB7XG4gICAgICAgIHJlc3VsdCArPSBcIlZlcnNpb246IFwiK29wZW5wZ3AuY29uZmlnLnZlcnNpb25zdHJpbmcrJ1xcclxcbic7XG4gICAgfVxuXHRpZiAob3BlbnBncC5jb25maWcuY29uZmlnLnNob3dfY29tbWVudCkge1xuICAgICAgICByZXN1bHQgKz0gXCJDb21tZW50OiBcIitvcGVucGdwLmNvbmZpZy5jb21tZW50c3RyaW5nKydcXHJcXG4nO1xuICAgIH1cbiAgICByZXN1bHQgKz0gJ1xcclxcbic7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIGNoZWNrc3VtIG92ZXIgdGhlIGdpdmVuIGRhdGEgYW5kIHJldHVybnMgaXQgYmFzZTY0IGVuY29kZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIERhdGEgdG8gY3JlYXRlIGEgQ1JDLTI0IGNoZWNrc3VtIGZvclxuICogQHJldHVybiB7U3RyaW5nfSBCYXNlNjQgZW5jb2RlZCBjaGVja3N1bVxuICovXG5mdW5jdGlvbiBnZXRDaGVja1N1bShkYXRhKSB7XG5cdHZhciBjID0gY3JlYXRlY3JjMjQoZGF0YSk7XG5cdHZhciBzdHIgPSBcIlwiICsgU3RyaW5nLmZyb21DaGFyQ29kZShjID4+IDE2KStcblx0XHRcdFx0ICAgU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiA4KSAmIDB4RkYpK1xuXHRcdFx0XHQgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgJiAweEZGKTtcblx0cmV0dXJuIGJhc2U2NC5lbmNvZGUoc3RyKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjaGVja3N1bSBvdmVyIHRoZSBnaXZlbiBkYXRhIGFuZCBjb21wYXJlcyBpdCB3aXRoIHRoZSBcbiAqIGdpdmVuIGJhc2U2NCBlbmNvZGVkIGNoZWNrc3VtXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGNyZWF0ZSBhIENSQy0yNCBjaGVja3N1bSBmb3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBjaGVja3N1bSBCYXNlNjQgZW5jb2RlZCBjaGVja3N1bVxuICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hlY2tzdW0gaXMgY29ycmVjdDsgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIHZlcmlmeUNoZWNrU3VtKGRhdGEsIGNoZWNrc3VtKSB7XG5cdHZhciBjID0gZ2V0Q2hlY2tTdW0oZGF0YSk7XG5cdHZhciBkID0gY2hlY2tzdW07XG5cdHJldHVybiBjWzBdID09IGRbMF0gJiYgY1sxXSA9PSBkWzFdICYmIGNbMl0gPT0gZFsyXTtcbn1cbi8qKlxuICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGEgQ1JDLTI0IGNoZWNrc3VtIG92ZXIgYSBnaXZlbiBzdHJpbmcgKGRhdGEpXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBEYXRhIHRvIGNyZWF0ZSBhIENSQy0yNCBjaGVja3N1bSBmb3JcbiAqIEByZXR1cm4ge0ludGVnZXJ9IFRoZSBDUkMtMjQgY2hlY2tzdW0gYXMgbnVtYmVyXG4gKi9cbnZhciBjcmNfdGFibGUgPSBbXG4weDAwMDAwMDAwLCAweDAwODY0Y2ZiLCAweDAxOGFkNTBkLCAweDAxMGM5OWY2LCAweDAzOTNlNmUxLCAweDAzMTVhYTFhLCAweDAyMTkzM2VjLCAweDAyOWY3ZjE3LCAweDA3YTE4MTM5LCAweDA3MjdjZGMyLCAweDA2MmI1NDM0LCAweDA2YWQxOGNmLCAweDA0MzI2N2Q4LCAweDA0YjQyYjIzLCAweDA1YjhiMmQ1LCAweDA1M2VmZTJlLCAweDBmYzU0ZTg5LCAweDBmNDMwMjcyLCAweDBlNGY5Yjg0LCAweDBlYzlkNzdmLCAweDBjNTZhODY4LCAweDBjZDBlNDkzLCAweDBkZGM3ZDY1LCAweDBkNWEzMTllLCAweDA4NjRjZmIwLCAweDA4ZTI4MzRiLCAweDA5ZWUxYWJkLCAweDA5Njg1NjQ2LCAweDBiZjcyOTUxLCAweDBiNzE2NWFhLCAweDBhN2RmYzVjLCAweDBhZmJiMGE3LCAweDFmMGNkMWU5LCAweDFmOGE5ZDEyLCAweDFlODYwNGU0LCAweDFlMDA0ODFmLCAweDFjOWYzNzA4LCAweDFjMTk3YmYzLCAweDFkMTVlMjA1LCAweDFkOTNhZWZlLCAweDE4YWQ1MGQwLCAweDE4MmIxYzJiLCAweDE5Mjc4NWRkLCAweDE5YTFjOTI2LCAweDFiM2ViNjMxLCAweDFiYjhmYWNhLCAweDFhYjQ2MzNjLCAweDFhMzIyZmM3LCAweDEwYzk5ZjYwLCAweDEwNGZkMzliLCAweDExNDM0YTZkLCAweDExYzUwNjk2LCAweDEzNWE3OTgxLCAweDEzZGMzNTdhLCAweDEyZDBhYzhjLCAweDEyNTZlMDc3LCAweDE3NjgxZTU5LCAweDE3ZWU1MmEyLCAweDE2ZTJjYjU0LCAweDE2NjQ4N2FmLCAweDE0ZmJmOGI4LCAweDE0N2RiNDQzLCAweDE1NzEyZGI1LCAweDE1Zjc2MTRlLCAweDNlMTlhM2QyLCAweDNlOWZlZjI5LCAweDNmOTM3NmRmLCAweDNmMTUzYTI0LCAweDNkOGE0NTMzLCAweDNkMGMwOWM4LCAweDNjMDA5MDNlLCAweDNjODZkY2M1LCAweDM5YjgyMmViLCAweDM5M2U2ZTEwLCAweDM4MzJmN2U2LCAweDM4YjRiYjFkLCAweDNhMmJjNDBhLCAweDNhYWQ4OGYxLCAweDNiYTExMTA3LCAweDNiMjc1ZGZjLCAweDMxZGNlZDViLCAweDMxNWFhMWEwLFxuMHgzMDU2Mzg1NiwgMHgzMGQwNzRhZCwgMHgzMjRmMGJiYSwgMHgzMmM5NDc0MSwgMHgzM2M1ZGViNywgMHgzMzQzOTI0YywgMHgzNjdkNmM2MiwgMHgzNmZiMjA5OSwgMHgzN2Y3Yjk2ZiwgMHgzNzcxZjU5NCwgMHgzNWVlOGE4MywgMHgzNTY4YzY3OCwgMHgzNDY0NWY4ZSwgMHgzNGUyMTM3NSwgMHgyMTE1NzIzYiwgMHgyMTkzM2VjMCwgMHgyMDlmYTczNiwgMHgyMDE5ZWJjZCwgMHgyMjg2OTRkYSwgMHgyMjAwZDgyMSwgMHgyMzBjNDFkNywgMHgyMzhhMGQyYywgMHgyNmI0ZjMwMiwgMHgyNjMyYmZmOSwgMHgyNzNlMjYwZiwgMHgyN2I4NmFmNCwgMHgyNTI3MTVlMywgMHgyNWExNTkxOCwgMHgyNGFkYzBlZSwgMHgyNDJiOGMxNSwgMHgyZWQwM2NiMiwgMHgyZTU2NzA0OSwgMHgyZjVhZTliZiwgMHgyZmRjYTU0NCwgMHgyZDQzZGE1MywgMHgyZGM1OTZhOCwgMHgyY2M5MGY1ZSwgMHgyYzRmNDNhNSwgMHgyOTcxYmQ4YiwgMHgyOWY3ZjE3MCwgMHgyOGZiNjg4NiwgMHgyODdkMjQ3ZCwgMHgyYWUyNWI2YSwgMHgyYTY0MTc5MSwgMHgyYjY4OGU2NywgMHgyYmVlYzI5YywgMHg3YzMzNDdhNCwgMHg3Y2I1MGI1ZiwgMHg3ZGI5OTJhOSwgMHg3ZDNmZGU1MiwgMHg3ZmEwYTE0NSwgMHg3ZjI2ZWRiZSwgMHg3ZTJhNzQ0OCwgMHg3ZWFjMzhiMywgMHg3YjkyYzY5ZCwgMHg3YjE0OGE2NiwgMHg3YTE4MTM5MCwgMHg3YTllNWY2YiwgMHg3ODAxMjA3YywgMHg3ODg3NmM4NywgMHg3OThiZjU3MSwgMHg3OTBkYjk4YSwgMHg3M2Y2MDkyZCwgMHg3MzcwNDVkNiwgMHg3MjdjZGMyMCwgMHg3MmZhOTBkYiwgMHg3MDY1ZWZjYywgMHg3MGUzYTMzNywgMHg3MWVmM2FjMSwgMHg3MTY5NzYzYSwgMHg3NDU3ODgxNCwgMHg3NGQxYzRlZiwgMHg3NWRkNWQxOSwgMHg3NTViMTFlMiwgMHg3N2M0NmVmNSwgMHg3NzQyMjIwZSwgMHg3NjRlYmJmOCwgMHg3NmM4ZjcwMywgMHg2MzNmOTY0ZCwgMHg2M2I5ZGFiNiwgMHg2MmI1NDM0MCwgMHg2MjMzMGZiYixcbjB4NjBhYzcwYWMsIDB4NjAyYTNjNTcsIDB4NjEyNmE1YTEsIDB4NjFhMGU5NWEsIDB4NjQ5ZTE3NzQsIDB4NjQxODViOGYsIDB4NjUxNGMyNzksIDB4NjU5MjhlODIsIDB4NjcwZGYxOTUsIDB4Njc4YmJkNmUsIDB4NjY4NzI0OTgsIDB4NjYwMTY4NjMsIDB4NmNmYWQ4YzQsIDB4NmM3Yzk0M2YsIDB4NmQ3MDBkYzksIDB4NmRmNjQxMzIsIDB4NmY2OTNlMjUsIDB4NmZlZjcyZGUsIDB4NmVlM2ViMjgsIDB4NmU2NWE3ZDMsIDB4NmI1YjU5ZmQsIDB4NmJkZDE1MDYsIDB4NmFkMThjZjAsIDB4NmE1N2MwMGIsIDB4NjhjOGJmMWMsIDB4Njg0ZWYzZTcsIDB4Njk0MjZhMTEsIDB4NjljNDI2ZWEsIDB4NDIyYWU0NzYsIDB4NDJhY2E4OGQsIDB4NDNhMDMxN2IsIDB4NDMyNjdkODAsIDB4NDFiOTAyOTcsIDB4NDEzZjRlNmMsIDB4NDAzM2Q3OWEsIDB4NDBiNTliNjEsIDB4NDU4YjY1NGYsIDB4NDUwZDI5YjQsIDB4NDQwMWIwNDIsIDB4NDQ4N2ZjYjksIDB4NDYxODgzYWUsIDB4NDY5ZWNmNTUsIDB4NDc5MjU2YTMsIDB4NDcxNDFhNTgsIDB4NGRlZmFhZmYsIDB4NGQ2OWU2MDQsIDB4NGM2NTdmZjIsIDB4NGNlMzMzMDksIDB4NGU3YzRjMWUsIDB4NGVmYTAwZTUsIDB4NGZmNjk5MTMsIDB4NGY3MGQ1ZTgsIDB4NGE0ZTJiYzYsIDB4NGFjODY3M2QsIDB4NGJjNGZlY2IsIDB4NGI0MmIyMzAsIDB4NDlkZGNkMjcsIDB4NDk1YjgxZGMsIDB4NDg1NzE4MmEsIDB4NDhkMTU0ZDEsIDB4NWQyNjM1OWYsIDB4NWRhMDc5NjQsIDB4NWNhY2UwOTIsIDB4NWMyYWFjNjksIDB4NWViNWQzN2UsIDB4NWUzMzlmODUsIDB4NWYzZjA2NzMsIDB4NWZiOTRhODgsIDB4NWE4N2I0YTYsIDB4NWEwMWY4NWQsIDB4NWIwZDYxYWIsIDB4NWI4YjJkNTAsIDB4NTkxNDUyNDcsIDB4NTk5MjFlYmMsIDB4NTg5ZTg3NGEsIDB4NTgxOGNiYjEsIDB4NTJlMzdiMTYsIDB4NTI2NTM3ZWQsIDB4NTM2OWFlMWIsIDB4NTNlZmUyZTAsIDB4NTE3MDlkZjcsIDB4NTFmNmQxMGMsXG4weDUwZmE0OGZhLCAweDUwN2MwNDAxLCAweDU1NDJmYTJmLCAweDU1YzRiNmQ0LCAweDU0YzgyZjIyLCAweDU0NGU2M2Q5LCAweDU2ZDExY2NlLCAweDU2NTc1MDM1LCAweDU3NWJjOWMzLCAweDU3ZGQ4NTM4XTtcblxuZnVuY3Rpb24gY3JlYXRlY3JjMjQoaW5wdXQpIHtcbiAgdmFyIGNyYyA9IDB4QjcwNENFO1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIHdoaWxlKChpbnB1dC5sZW5ndGggLSBpbmRleCkgPiAxNikgIHtcbiAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmNfdGFibGVbKChjcmMgPj4gMTYpIF4gaW5wdXQuY2hhckNvZGVBdChpbmRleCkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrMSkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrMikpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrMykpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrNCkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrNSkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrNikpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrNykpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrOCkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrOSkpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrMTApKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzExKSkgJiAweGZmXTtcbiAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmNfdGFibGVbKChjcmMgPj4gMTYpIF4gaW5wdXQuY2hhckNvZGVBdChpbmRleCsxMikpICYgMHhmZl07XG4gICBjcmMgPSAoY3JjIDw8IDgpIF4gY3JjX3RhYmxlWygoY3JjID4+IDE2KSBeIGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrMTMpKSAmIDB4ZmZdO1xuICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY190YWJsZVsoKGNyYyA+PiAxNikgXiBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KzE0KSkgJiAweGZmXTtcbiAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmNfdGFibGVbKChjcmMgPj4gMTYpIF4gaW5wdXQuY2hhckNvZGVBdChpbmRleCsxNSkpICYgMHhmZl07XG4gICBpbmRleCArPSAxNjtcbiAgfVxuXG4gIGZvcih2YXIgaiA9IGluZGV4OyBqIDwgaW5wdXQubGVuZ3RoOyBqKyspIHtcbiAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmNfdGFibGVbKChjcmMgPj4gMTYpIF4gaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSkgJiAweGZmXVxuICB9XG4gIHJldHVybiBjcmMgJiAweGZmZmZmZjtcbn1cblxuLyoqXG4gKiBEZUFybW9yIGFuIE9wZW5QR1AgYXJtb3JlZCBtZXNzYWdlOyB2ZXJpZnkgdGhlIGNoZWNrc3VtIGFuZCByZXR1cm4gXG4gKiB0aGUgZW5jb2RlZCBieXRlc1xuICogQHBhcmFtIHtTdHJpbmd9IHRleHQgT3BlblBHUCBhcm1vcmVkIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHsoQm9vbGVhbnxPYmplY3QpfSBFaXRoZXIgZmFsc2UgaW4gY2FzZSBvZiBhbiBlcnJvciBcbiAqIG9yIGFuIG9iamVjdCB3aXRoIGF0dHJpYnV0ZSBcInRleHRcIiBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRleHRcbiAqIGFuZCBhbiBhdHRyaWJ1dGUgXCJvcGVucGdwXCIgY29udGFpbmluZyB0aGUgYnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIGRlYXJtb3IodGV4dCkge1xuXHR0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHIvZywgJycpXG5cblx0dmFyIHR5cGUgPSBnZXRfdHlwZSh0ZXh0KTtcblxuXHRpZiAodHlwZSAhPSAyKSB7XG5cdFx0dmFyIHNwbGl0dGVkdGV4dCA9IHRleHQuc3BsaXQoJy0tLS0tJyk7XG5cblx0XHR2YXIgZGF0YSA9IHsgXG5cdFx0XHRvcGVucGdwOiBiYXNlNjQuZGVjb2RlKFxuXHRcdFx0XHRzcGxpdHRlZHRleHRbMl1cblx0XHRcdFx0XHQuc3BsaXQoJ1xcblxcbicpWzFdXG5cdFx0XHRcdFx0LnNwbGl0KFwiXFxuPVwiKVswXVxuXHRcdFx0XHRcdC5yZXBsYWNlKC9cXG4tIC9nLFwiXFxuXCIpKSxcblx0XHRcdHR5cGU6IHR5cGVcblx0XHR9O1xuXG5cdFx0aWYgKHZlcmlmeUNoZWNrU3VtKGRhdGEub3BlbnBncCwgXG5cdFx0XHRzcGxpdHRlZHRleHRbMl1cblx0XHRcdFx0LnNwbGl0KCdcXG5cXG4nKVsxXVxuXHRcdFx0XHQuc3BsaXQoXCJcXG49XCIpWzFdXG5cdFx0XHRcdC5zcGxpdCgnXFxuJylbMF0pKVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRlbHNlIHtcblx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJBc2NpaSBhcm1vciBpbnRlZ3JpdHkgY2hlY2sgb24gbWVzc2FnZSBmYWlsZWQ6ICdcIlxuXHRcdFx0XHQrIHNwbGl0dGVkdGV4dFsyXVxuXHRcdFx0XHRcdC5zcGxpdCgnXFxuXFxuJylbMV1cblx0XHRcdFx0XHQuc3BsaXQoXCJcXG49XCIpWzFdXG5cdFx0XHRcdFx0LnNwbGl0KCdcXG4nKVswXSBcblx0XHRcdFx0KyBcIicgc2hvdWxkIGJlICdcIlxuXHRcdFx0XHQrIGdldENoZWNrU3VtKGRhdGEpKSArIFwiJ1wiO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR2YXIgc3BsaXR0ZWR0ZXh0ID0gdGV4dC5zcGxpdCgnLS0tLS0nKTtcblxuXHRcdHZhciByZXN1bHQgPSB7XG5cdFx0XHR0ZXh0OiBzcGxpdHRlZHRleHRbMl1cblx0XHRcdFx0LnJlcGxhY2UoL1xcbi0gL2csXCJcXG5cIilcblx0XHRcdFx0LnNwbGl0KFwiXFxuXFxuXCIpWzFdLFxuXHRcdFx0b3BlbnBncDogYmFzZTY0X2RlY29kZShzcGxpdHRlZHRleHRbNF1cblx0XHRcdFx0LnNwbGl0KFwiXFxuXFxuXCIpWzFdXG5cdFx0XHRcdC5zcGxpdChcIlxcbj1cIilbMF0pLFxuXHRcdFx0dHlwZTogdHlwZVxuXHRcdH07XG5cblx0XHRpZiAodmVyaWZ5Q2hlY2tTdW0ocmVzdWx0Lm9wZW5wZ3AsIHNwbGl0dGVkdGV4dFs0XVxuXHRcdFx0LnNwbGl0KFwiXFxuXFxuXCIpWzFdXG5cdFx0XHQuc3BsaXQoXCJcXG49XCIpWzFdKSlcblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdGVsc2Uge1xuXHRcdFx0dXRpbC5wcmludF9lcnJvcihcIkFzY2lpIGFybW9yIGludGVncml0eSBjaGVjayBvbiBtZXNzYWdlIGZhaWxlZFwiKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cbn1cblxuXG4vKipcbiAqIEFybW9yIGFuIE9wZW5QR1AgYmluYXJ5IHBhY2tldCBibG9ja1xuICogQHBhcmFtIHtJbnRlZ2VyfSBtZXNzYWdldHlwZSB0eXBlIG9mIHRoZSBtZXNzYWdlXG4gKiBAcGFyYW0gZGF0YVxuICogQHBhcmFtIHtJbnRlZ2VyfSBwYXJ0aW5kZXhcbiAqIEBwYXJhbSB7SW50ZWdlcn0gcGFydHRvdGFsXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBBcm1vcmVkIHRleHRcbiAqL1xuZnVuY3Rpb24gYXJtb3IobWVzc2FnZXR5cGUsIGRhdGEsIHBhcnRpbmRleCwgcGFydHRvdGFsKSB7XG5cdHZhciByZXN1bHQgPSBcIlwiO1xuXHRzd2l0Y2gobWVzc2FnZXR5cGUpIHtcblx0Y2FzZSAwOlxuXHRcdHJlc3VsdCArPSBcIi0tLS0tQkVHSU4gUEdQIE1FU1NBR0UsIFBBUlQgXCIrcGFydGluZGV4K1wiL1wiK3BhcnR0b3RhbCtcIi0tLS0tXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IGFybW9yX2FkZGhlYWRlcigpO1xuXHRcdHJlc3VsdCArPSBiYXNlNjQuZW5jb2RlKGRhdGEpO1xuXHRcdHJlc3VsdCArPSBcIlxcclxcbj1cIitnZXRDaGVja1N1bShkYXRhKStcIlxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBcIi0tLS0tRU5EIFBHUCBNRVNTQUdFLCBQQVJUIFwiK3BhcnRpbmRleCtcIi9cIitwYXJ0dG90YWwrXCItLS0tLVxcclxcblwiO1xuXHRcdGJyZWFrO1xuXHRjYXNlIDE6XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1CRUdJTiBQR1AgTUVTU0FHRSwgUEFSVCBcIitwYXJ0aW5kZXgrXCItLS0tLVxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBhcm1vcl9hZGRoZWFkZXIoKTtcblx0XHRyZXN1bHQgKz0gYmFzZTY0LmVuY29kZShkYXRhKTtcblx0XHRyZXN1bHQgKz0gXCJcXHJcXG49XCIrZ2V0Q2hlY2tTdW0oZGF0YSkrXCJcXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gXCItLS0tLUVORCBQR1AgTUVTU0FHRSwgUEFSVCBcIitwYXJ0aW5kZXgrXCItLS0tLVxcclxcblwiO1xuXHRcdGJyZWFrO1xuXHRjYXNlIDI6XG5cdFx0cmVzdWx0ICs9IFwiXFxyXFxuLS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLVxcclxcbkhhc2g6IFwiK2RhdGEuaGFzaCtcIlxcclxcblxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBkYXRhLnRleHQucmVwbGFjZSgvXFxuLS9nLFwiXFxuLSAtXCIpO1xuXHRcdHJlc3VsdCArPSBcIlxcclxcbi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IGFybW9yX2FkZGhlYWRlcigpO1xuXHRcdHJlc3VsdCArPSBiYXNlNjQuZW5jb2RlKGRhdGEub3BlbnBncCk7XG5cdFx0cmVzdWx0ICs9IFwiXFxyXFxuPVwiK2dldENoZWNrU3VtKGRhdGEub3BlbnBncCkrXCJcXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gXCItLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS1cXHJcXG5cIjtcblx0XHRicmVhaztcblx0Y2FzZSAzOlxuXHRcdHJlc3VsdCArPSBcIi0tLS0tQkVHSU4gUEdQIE1FU1NBR0UtLS0tLVxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBhcm1vcl9hZGRoZWFkZXIoKTtcblx0XHRyZXN1bHQgKz0gYmFzZTY0LmVuY29kZShkYXRhKTtcblx0XHRyZXN1bHQgKz0gXCJcXHJcXG49XCIrZ2V0Q2hlY2tTdW0oZGF0YSkrXCJcXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gXCItLS0tLUVORCBQR1AgTUVTU0FHRS0tLS0tXFxyXFxuXCI7XG5cdFx0YnJlYWs7XG5cdGNhc2UgNDpcblx0XHRyZXN1bHQgKz0gXCItLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS1cXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gYXJtb3JfYWRkaGVhZGVyKCk7XG5cdFx0cmVzdWx0ICs9IGJhc2U2NC5lbmNvZGUoZGF0YSk7XG5cdFx0cmVzdWx0ICs9IFwiXFxyXFxuPVwiK2dldENoZWNrU3VtKGRhdGEpK1wiXFxyXFxuXCI7XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLVxcclxcblxcclxcblwiO1xuXHRcdGJyZWFrO1xuXHRjYXNlIDU6XG5cdFx0cmVzdWx0ICs9IFwiLS0tLS1CRUdJTiBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLVxcclxcblwiO1xuXHRcdHJlc3VsdCArPSBhcm1vcl9hZGRoZWFkZXIoKTtcblx0XHRyZXN1bHQgKz0gYmFzZTY0LmVuY29kZShkYXRhKTtcblx0XHRyZXN1bHQgKz0gXCJcXHJcXG49XCIrZ2V0Q2hlY2tTdW0oZGF0YSkrXCJcXHJcXG5cIjtcblx0XHRyZXN1bHQgKz0gXCItLS0tLUVORCBQR1AgUFJJVkFURSBLRVkgQkxPQ0stLS0tLVxcclxcblwiO1xuXHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGVuY29kZTogYXJtb3IsXG5cdGRlY29kZTogZGVhcm1vclxufVxuIiwiLyogT3BlblBHUCByYWRpeC02NC9iYXNlNjQgc3RyaW5nIGVuY29kaW5nL2RlY29kaW5nXHJcbiAqIENvcHlyaWdodCAyMDA1IEhlcmJlcnQgSGFuZXdpbmtlbCwgd3d3LmhhbmVXSU4uZGVcclxuICogdmVyc2lvbiAxLjAsIGNoZWNrIHd3dy5oYW5lV0lOLmRlIGZvciB0aGUgbGF0ZXN0IHZlcnNpb25cclxuICpcclxuICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcywgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICBcclxuICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBvciBzZWxsIHRoaXMgc29mdHdhcmUsIHdpdGggb3JcclxuICogd2l0aG91dCBmZWUsIGZvciBhbnkgcHVycG9zZSBhbmQgYnkgYW55IGluZGl2aWR1YWwgb3Igb3JnYW5pemF0aW9uLCBpcyBoZXJlYnlcclxuICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXBwZWFyIFxyXG4gKiBpbiBhbGwgY29waWVzLiBEaXN0cmlidXRpb24gYXMgYSBwYXJ0IG9mIGFuIGFwcGxpY2F0aW9uIG9yIGJpbmFyeSBtdXN0XHJcbiAqIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFsc1xyXG4gKiBwcm92aWRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBvciBkaXN0cmlidXRpb24uXHJcbiAqL1xyXG5cclxudmFyIGI2NHMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XHJcblxyXG5mdW5jdGlvbiBzMnIodCkge1xyXG5cdHZhciBhLCBjLCBuO1xyXG5cdHZhciByID0gJycsIGwgPSAwLCBzID0gMDtcclxuXHR2YXIgdGwgPSB0Lmxlbmd0aDtcclxuXHJcblx0Zm9yIChuID0gMDsgbiA8IHRsOyBuKyspIHtcclxuXHRcdGMgPSB0LmNoYXJDb2RlQXQobik7XHJcblx0XHRpZiAocyA9PSAwKSB7XHJcblx0XHRcdHIgKz0gYjY0cy5jaGFyQXQoKGMgPj4gMikgJiA2Myk7XHJcblx0XHRcdGEgPSAoYyAmIDMpIDw8IDQ7XHJcblx0XHR9IGVsc2UgaWYgKHMgPT0gMSkge1xyXG5cdFx0XHRyICs9IGI2NHMuY2hhckF0KChhIHwgKGMgPj4gNCkgJiAxNSkpO1xyXG5cdFx0XHRhID0gKGMgJiAxNSkgPDwgMjtcclxuXHRcdH0gZWxzZSBpZiAocyA9PSAyKSB7XHJcblx0XHRcdHIgKz0gYjY0cy5jaGFyQXQoYSB8ICgoYyA+PiA2KSAmIDMpKTtcclxuXHRcdFx0bCArPSAxO1xyXG5cdFx0XHRpZiAoKGwgJSA2MCkgPT0gMClcclxuXHRcdFx0XHRyICs9IFwiXFxuXCI7XHJcblx0XHRcdHIgKz0gYjY0cy5jaGFyQXQoYyAmIDYzKTtcclxuXHRcdH1cclxuXHRcdGwgKz0gMTtcclxuXHRcdGlmICgobCAlIDYwKSA9PSAwKVxyXG5cdFx0XHRyICs9IFwiXFxuXCI7XHJcblxyXG5cdFx0cyArPSAxO1xyXG5cdFx0aWYgKHMgPT0gMylcclxuXHRcdFx0cyA9IDA7XHJcblx0fVxyXG5cdGlmIChzID4gMCkge1xyXG5cdFx0ciArPSBiNjRzLmNoYXJBdChhKTtcclxuXHRcdGwgKz0gMTtcclxuXHRcdGlmICgobCAlIDYwKSA9PSAwKVxyXG5cdFx0XHRyICs9IFwiXFxuXCI7XHJcblx0XHRyICs9ICc9JztcclxuXHRcdGwgKz0gMTtcclxuXHR9XHJcblx0aWYgKHMgPT0gMSkge1xyXG5cdFx0aWYgKChsICUgNjApID09IDApXHJcblx0XHRcdHIgKz0gXCJcXG5cIjtcclxuXHRcdHIgKz0gJz0nO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHIycyh0KSB7XHJcblx0dmFyIGMsIG47XHJcblx0dmFyIHIgPSAnJywgcyA9IDAsIGEgPSAwO1xyXG5cdHZhciB0bCA9IHQubGVuZ3RoO1xyXG5cclxuXHRmb3IgKG4gPSAwOyBuIDwgdGw7IG4rKykge1xyXG5cdFx0YyA9IGI2NHMuaW5kZXhPZih0LmNoYXJBdChuKSk7XHJcblx0XHRpZiAoYyA+PSAwKSB7XHJcblx0XHRcdGlmIChzKVxyXG5cdFx0XHRcdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhIHwgKGMgPj4gKDYgLSBzKSkgJiAyNTUpO1xyXG5cdFx0XHRzID0gKHMgKyAyKSAmIDc7XHJcblx0XHRcdGEgPSAoYyA8PCBzKSAmIDI1NTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHI7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdGVuY29kZTogczJyLFxyXG5cdGRlY29kZTogcjJzXHJcbn1cclxuIiwidmFyIGVudW1zID0ge1xuXG5cdC8qKiBBIHN0cmluZyB0byBrZXkgc3BlY2lmaWVyIHR5cGVcblx0ICogQGVudW0ge0ludGVnZXJ9XG5cdCAqL1xuXHRzMms6IHtcblx0XHRzaW1wbGU6IDAsXG5cdFx0c2FsdGVkOiAxLFxuXHRcdGl0ZXJhdGVkOiAzLFxuXHRcdGdudTogMTAxXG5cdH0sXG5cblx0LyoqIFJGQzQ4ODAsIHNlY3Rpb24gOS4xIFxuXHQgKiBAZW51bSB7U3RyaW5nfVxuXHQgKi9cblx0cHVibGljS2V5OiB7XG5cdFx0cnNhX2VuY3J5cHRfc2lnbjogMSxcblx0XHRyc2FfZW5jcnlwdDogMixcblx0XHRyc2Ffc2lnbjogMyxcblx0XHRlbGdhbWFsOiAxNixcblx0XHRkc2E6IDE3XG5cdH0sXG5cblx0LyoqIFJGQzQ4ODAsIHNlY3Rpb24gOS4yIFxuXHQgKiBAZW51bSB7U3RyaW5nfVxuXHQgKi9cblx0c3ltbWV0cmljOiB7XG5cdFx0cGxhaW50ZXh0OiAwLFxuXHRcdC8qKiBOb3QgaW1wbGVtZW50ZWQhICovXG5cdFx0aWRlYTogMSxcblx0XHR0cmlwbGVkZXM6IDIsXG5cdFx0Y2FzdDU6IDMsXG5cdFx0Ymxvd2Zpc2g6IDQsXG5cdFx0YWVzMTI4OiA3LFxuXHRcdGFlczE5MjogOCxcblx0XHRhZXMyNTY6IDksXG5cdFx0dHdvZmlzaDogMTBcblx0fSxcblxuXHQvKiogUkZDNDg4MCwgc2VjdGlvbiA5LjNcblx0ICogQGVudW0ge1N0cmluZ31cblx0ICovXG5cdGNvbXByZXNzaW9uOiB7XG5cdFx0dW5jb21wcmVzc2VkOiAwLFxuXHRcdC8qKiBSRkMxOTUxICovXG5cdFx0emlwOiAxLFxuXHRcdC8qKiBSRkMxOTUwICovXG5cdFx0emxpYjogMixcblx0XHRiemlwMjogM1xuXHR9LFxuXG5cdC8qKiBSRkM0ODgwLCBzZWN0aW9uIDkuNFxuXHQgKiBAZW51bSB7U3RyaW5nfVxuXHQgKi9cblx0aGFzaDoge1xuXHRcdG1kNTogMSxcblx0XHRzaGExOiAyLFxuXHRcdHJpcGVtZDogMyxcblx0XHRzaGEyNTY6IDgsXG5cdFx0c2hhMzg0OiA5LFxuXHRcdHNoYTUxMjogMTAsXG5cdFx0c2hhMjI0OiAxMVxuXHR9LFxuXG5cblx0LyoqXG5cdCAqIEBlbnVtIHtTdHJpbmd9XG5cdCAqIEEgbGlzdCBvZiBwYWNrZXQgdHlwZXMgYW5kIG51bWVyaWMgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlbS5cblx0ICovXG5cdHBhY2tldDoge1xuXHRcdHB1YmxpY19rZXlfZW5jcnlwdGVkX3Nlc3Npb25fa2V5OiAxLFxuXHRcdHNpZ25hdHVyZTogMixcblx0XHRzeW1fZW5jcnlwdGVkX3Nlc3Npb25fa2V5OiAzLFxuXHRcdG9uZV9wYXNzX3NpZ25hdHVyZTogNCxcblx0XHRzZWNyZXRfa2V5OiA1LFxuXHRcdHB1YmxpY19rZXk6IDYsXG5cdFx0c2VjcmV0X3N1YmtleTogNyxcblx0XHRjb21wcmVzc2VkOiA4LFxuXHRcdHN5bW1ldHJpY2FsbHlfZW5jcnlwdGVkOiA5LFxuXHRcdG1hcmtlcjogMTAsXG5cdFx0bGl0ZXJhbDogMTEsXG5cdFx0dHJ1c3Q6IDEyLFxuXHRcdHVzZXJpZDogMTMsXG5cdFx0cHVibGljX3N1YmtleTogMTQsXG5cdFx0dXNlcl9hdHRyaWJ1dGU6IDE3LFxuXHRcdHN5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZDogMTgsXG5cdFx0bW9kaWZpY2F0aW9uX2RldGVjdGlvbl9jb2RlOiAxOVxuXHR9LFxuXG5cblx0LyoqXG5cdCAqIERhdGEgdHlwZXMgaW4gdGhlIGxpdGVyYWwgcGFja2V0XG5cdCAqIEByZWFkb25seVxuXHQgKiBAZW51bSB7U3RyaW5nfVxuXHQgKi9cblx0bGl0ZXJhbDoge1xuXHRcdC8qKiBCaW5hcnkgZGF0YSAqL1xuXHRcdGJpbmFyeTogJ2InLmNoYXJDb2RlQXQoKSxcblx0XHQvKiogVGV4dCBkYXRhICovXG5cdFx0dGV4dDogJ3QnLmNoYXJDb2RlQXQoKSxcblx0XHQvKiogVXRmOCBkYXRhICovXG5cdFx0dXRmODogJ3UnLmNoYXJDb2RlQXQoKVxuXHR9LFxuXG5cblx0LyoqIE9uZSBwYXNzIHNpZ25hdHVyZSBwYWNrZXQgdHlwZVxuXHQgKiBAZW51bSB7U3RyaW5nfSAqL1xuXHRzaWduYXR1cmU6IHtcblx0XHQvKiogMHgwMDogU2lnbmF0dXJlIG9mIGEgYmluYXJ5IGRvY3VtZW50LiAqL1xuXHRcdGJpbmFyeTogMCxcblx0XHQvKiogMHgwMTogU2lnbmF0dXJlIG9mIGEgY2Fub25pY2FsIHRleHQgZG9jdW1lbnQuXG5cdFx0ICogQ2Fub25pY2FseXppbmcgdGhlIGRvY3VtZW50IGJ5IGNvbnZlcnRpbmcgbGluZSBlbmRpbmdzLiAqL1xuXHRcdHRleHQ6IDEsXG5cdFx0LyoqIDB4MDI6IFN0YW5kYWxvbmUgc2lnbmF0dXJlLlxuXHRcdCogVGhpcyBzaWduYXR1cmUgaXMgYSBzaWduYXR1cmUgb2Ygb25seSBpdHMgb3duIHN1YnBhY2tldCBjb250ZW50cy5cblx0XHQqIEl0IGlzIGNhbGN1bGF0ZWQgaWRlbnRpY2FsbHkgdG8gYSBzaWduYXR1cmUgb3ZlciBhIHplcm8tbGVuZ2hcblx0XHQqIGJpbmFyeSBkb2N1bWVudC4gIE5vdGUgdGhhdCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIFYzXG5cdFx0KiBzdGFuZGFsb25lIHNpZ25hdHVyZS4gKi9cblx0XHRzdGFuZGFsb25lOiAyLFxuXHRcdC8qKiAweDEwOiBHZW5lcmljIGNlcnRpZmljYXRpb24gb2YgYSBVc2VyIElEIGFuZCBQdWJsaWMtS2V5IHBhY2tldC5cblx0XHQqIFRoZSBpc3N1ZXIgb2YgdGhpcyBjZXJ0aWZpY2F0aW9uIGRvZXMgbm90IG1ha2UgYW55IHBhcnRpY3VsYXJcblx0XHQqIGFzc2VydGlvbiBhcyB0byBob3cgd2VsbCB0aGUgY2VydGlmaWVyIGhhcyBjaGVja2VkIHRoYXQgdGhlIG93bmVyXG5cdFx0KiBvZiB0aGUga2V5IGlzIGluIGZhY3QgdGhlIHBlcnNvbiBkZXNjcmliZWQgYnkgdGhlIFVzZXIgSUQuICovXG5cdFx0Y2VydF9nZW5lcmljOiAxNixcblx0XHQvKiogMHgxMTogUGVyc29uYSBjZXJ0aWZpY2F0aW9uIG9mIGEgVXNlciBJRCBhbmQgUHVibGljLUtleSBwYWNrZXQuXG5cdFx0KiBUaGUgaXNzdWVyIG9mIHRoaXMgY2VydGlmaWNhdGlvbiBoYXMgbm90IGRvbmUgYW55IHZlcmlmaWNhdGlvbiBvZlxuXHRcdCogdGhlIGNsYWltIHRoYXQgdGhlIG93bmVyIG9mIHRoaXMga2V5IGlzIHRoZSBVc2VyIElEIHNwZWNpZmllZC4gKi9cblx0XHRjZXJ0X3BlcnNvbmE6IDE3LFxuXHRcdC8qKiAweDEyOiBDYXN1YWwgY2VydGlmaWNhdGlvbiBvZiBhIFVzZXIgSUQgYW5kIFB1YmxpYy1LZXkgcGFja2V0LlxuXHRcdCogVGhlIGlzc3VlciBvZiB0aGlzIGNlcnRpZmljYXRpb24gaGFzIGRvbmUgc29tZSBjYXN1YWxcblx0XHQqIHZlcmlmaWNhdGlvbiBvZiB0aGUgY2xhaW0gb2YgaWRlbnRpdHkuICovXG5cdFx0Y2VydF9jYXN1YWw6IDE4LFxuXHRcdC8qKiAweDEzOiBQb3NpdGl2ZSBjZXJ0aWZpY2F0aW9uIG9mIGEgVXNlciBJRCBhbmQgUHVibGljLUtleSBwYWNrZXQuXG5cdFx0KiBUaGUgaXNzdWVyIG9mIHRoaXMgY2VydGlmaWNhdGlvbiBoYXMgZG9uZSBzdWJzdGFudGlhbFxuXHRcdCogdmVyaWZpY2F0aW9uIG9mIHRoZSBjbGFpbSBvZiBpZGVudGl0eS5cblx0XHQqIFxuXHRcdCogTW9zdCBPcGVuUEdQIGltcGxlbWVudGF0aW9ucyBtYWtlIHRoZWlyIFwia2V5IHNpZ25hdHVyZXNcIiBhcyAweDEwXG5cdFx0KiBjZXJ0aWZpY2F0aW9ucy4gIFNvbWUgaW1wbGVtZW50YXRpb25zIGNhbiBpc3N1ZSAweDExLTB4MTNcblx0XHQqIGNlcnRpZmljYXRpb25zLCBidXQgZmV3IGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgdHlwZXMuICovXG5cdFx0Y2VydF9wb3NpdGl2ZTogMTksXG5cdFx0LyoqIDB4MzA6IENlcnRpZmljYXRpb24gcmV2b2NhdGlvbiBzaWduYXR1cmVcblx0XHQqIFRoaXMgc2lnbmF0dXJlIHJldm9rZXMgYW4gZWFybGllciBVc2VyIElEIGNlcnRpZmljYXRpb24gc2lnbmF0dXJlXG5cdFx0KiAoc2lnbmF0dXJlIGNsYXNzIDB4MTAgdGhyb3VnaCAweDEzKSBvciBkaXJlY3Qta2V5IHNpZ25hdHVyZVxuXHRcdCogKDB4MUYpLiAgSXQgc2hvdWxkIGJlIGlzc3VlZCBieSB0aGUgc2FtZSBrZXkgdGhhdCBpc3N1ZWQgdGhlXG5cdFx0KiByZXZva2VkIHNpZ25hdHVyZSBvciBhbiBhdXRob3JpemVkIHJldm9jYXRpb24ga2V5LiAgVGhlIHNpZ25hdHVyZVxuXHRcdCogaXMgY29tcHV0ZWQgb3ZlciB0aGUgc2FtZSBkYXRhIGFzIHRoZSBjZXJ0aWZpY2F0ZSB0aGF0IGl0XG5cdFx0KiByZXZva2VzLCBhbmQgc2hvdWxkIGhhdmUgYSBsYXRlciBjcmVhdGlvbiBkYXRlIHRoYW4gdGhhdFxuXHRcdCogY2VydGlmaWNhdGUuICovXG5cdFx0Y2VydF9yZXZvY2F0aW9uOiA0OCxcblx0XHQvKiogMHgxODogU3Via2V5IEJpbmRpbmcgU2lnbmF0dXJlXG5cdFx0KiBUaGlzIHNpZ25hdHVyZSBpcyBhIHN0YXRlbWVudCBieSB0aGUgdG9wLWxldmVsIHNpZ25pbmcga2V5IHRoYXRcblx0XHQqIGluZGljYXRlcyB0aGF0IGl0IG93bnMgdGhlIHN1YmtleS4gIFRoaXMgc2lnbmF0dXJlIGlzIGNhbGN1bGF0ZWRcblx0XHQqIGRpcmVjdGx5IG9uIHRoZSBwcmltYXJ5IGtleSBhbmQgc3Via2V5LCBhbmQgbm90IG9uIGFueSBVc2VyIElEIG9yXG5cdFx0KiBvdGhlciBwYWNrZXRzLiAgQSBzaWduYXR1cmUgdGhhdCBiaW5kcyBhIHNpZ25pbmcgc3Via2V5IE1VU1QgaGF2ZVxuXHRcdCogYW4gRW1iZWRkZWQgU2lnbmF0dXJlIHN1YnBhY2tldCBpbiB0aGlzIGJpbmRpbmcgc2lnbmF0dXJlIHRoYXRcblx0XHQqIGNvbnRhaW5zIGEgMHgxOSBzaWduYXR1cmUgbWFkZSBieSB0aGUgc2lnbmluZyBzdWJrZXkgb24gdGhlXG5cdFx0KiBwcmltYXJ5IGtleSBhbmQgc3Via2V5LiAqL1xuXHRcdHN1YmtleV9iaW5kaW5nOiAyNCxcblx0XHQvKiogMHgxOTogUHJpbWFyeSBLZXkgQmluZGluZyBTaWduYXR1cmVcblx0XHQqIFRoaXMgc2lnbmF0dXJlIGlzIGEgc3RhdGVtZW50IGJ5IGEgc2lnbmluZyBzdWJrZXksIGluZGljYXRpbmdcblx0XHQqIHRoYXQgaXQgaXMgb3duZWQgYnkgdGhlIHByaW1hcnkga2V5IGFuZCBzdWJrZXkuICBUaGlzIHNpZ25hdHVyZVxuXHRcdCogaXMgY2FsY3VsYXRlZCB0aGUgc2FtZSB3YXkgYXMgYSAweDE4IHNpZ25hdHVyZTogZGlyZWN0bHkgb24gdGhlXG5cdFx0KiBwcmltYXJ5IGtleSBhbmQgc3Via2V5LCBhbmQgbm90IG9uIGFueSBVc2VyIElEIG9yIG90aGVyIHBhY2tldHMuXG5cdFx0XG5cdFx0KiBXaGVuIGEgc2lnbmF0dXJlIGlzIG1hZGUgb3ZlciBhIGtleSwgdGhlIGhhc2ggZGF0YSBzdGFydHMgd2l0aCB0aGVcblx0XHQqIG9jdGV0IDB4OTksIGZvbGxvd2VkIGJ5IGEgdHdvLW9jdGV0IGxlbmd0aCBvZiB0aGUga2V5LCBhbmQgdGhlbiBib2R5XG5cdFx0KiBvZiB0aGUga2V5IHBhY2tldC4gIChOb3RlIHRoYXQgdGhpcyBpcyBhbiBvbGQtc3R5bGUgcGFja2V0IGhlYWRlciBmb3Jcblx0XHQqIGEga2V5IHBhY2tldCB3aXRoIHR3by1vY3RldCBsZW5ndGguKSAgQSBzdWJrZXkgYmluZGluZyBzaWduYXR1cmVcblx0XHQqICh0eXBlIDB4MTgpIG9yIHByaW1hcnkga2V5IGJpbmRpbmcgc2lnbmF0dXJlICh0eXBlIDB4MTkpIHRoZW4gaGFzaGVzXG5cdFx0KiB0aGUgc3Via2V5IHVzaW5nIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgbWFpbiBrZXkgKGFsc28gdXNpbmcgMHg5OSBhc1xuXHRcdCogdGhlIGZpcnN0IG9jdGV0KS4gKi9cblx0XHRrZXlfYmluZGluZzogMjUsXG5cdFx0LyoqIDB4MUY6IFNpZ25hdHVyZSBkaXJlY3RseSBvbiBhIGtleVxuXHRcdCogVGhpcyBzaWduYXR1cmUgaXMgY2FsY3VsYXRlZCBkaXJlY3RseSBvbiBhIGtleS4gIEl0IGJpbmRzIHRoZVxuXHRcdCogaW5mb3JtYXRpb24gaW4gdGhlIFNpZ25hdHVyZSBzdWJwYWNrZXRzIHRvIHRoZSBrZXksIGFuZCBpc1xuXHRcdCogYXBwcm9wcmlhdGUgdG8gYmUgdXNlZCBmb3Igc3VicGFja2V0cyB0aGF0IHByb3ZpZGUgaW5mb3JtYXRpb25cblx0XHQqIGFib3V0IHRoZSBrZXksIHN1Y2ggYXMgdGhlIFJldm9jYXRpb24gS2V5IHN1YnBhY2tldC4gIEl0IGlzIGFsc29cblx0XHQqIGFwcHJvcHJpYXRlIGZvciBzdGF0ZW1lbnRzIHRoYXQgbm9uLXNlbGYgY2VydGlmaWVycyB3YW50IHRvIG1ha2Vcblx0XHQqIGFib3V0IHRoZSBrZXkgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgYmluZGluZyBiZXR3ZWVuIGEga2V5IGFuZCBhXG5cdFx0KiBuYW1lLiAqL1xuXHRcdGtleTogMzEsXG5cdFx0LyoqIDB4MjA6IEtleSByZXZvY2F0aW9uIHNpZ25hdHVyZVxuXHRcdCogVGhlIHNpZ25hdHVyZSBpcyBjYWxjdWxhdGVkIGRpcmVjdGx5IG9uIHRoZSBrZXkgYmVpbmcgcmV2b2tlZC4gIEFcblx0XHQqIHJldm9rZWQga2V5IGlzIG5vdCB0byBiZSB1c2VkLiAgT25seSByZXZvY2F0aW9uIHNpZ25hdHVyZXMgYnkgdGhlXG5cdFx0KiBrZXkgYmVpbmcgcmV2b2tlZCwgb3IgYnkgYW4gYXV0aG9yaXplZCByZXZvY2F0aW9uIGtleSwgc2hvdWxkIGJlXG5cdFx0KiBjb25zaWRlcmVkIHZhbGlkIHJldm9jYXRpb24gc2lnbmF0dXJlcy5hICovXG5cdFx0a2V5X3Jldm9jYXRpb246IDMyLFxuXHRcdC8qKiAweDI4OiBTdWJrZXkgcmV2b2NhdGlvbiBzaWduYXR1cmVcblx0XHQqIFRoZSBzaWduYXR1cmUgaXMgY2FsY3VsYXRlZCBkaXJlY3RseSBvbiB0aGUgc3Via2V5IGJlaW5nIHJldm9rZWQuXG5cdFx0KiBBIHJldm9rZWQgc3Via2V5IGlzIG5vdCB0byBiZSB1c2VkLiAgT25seSByZXZvY2F0aW9uIHNpZ25hdHVyZXNcblx0XHQqIGJ5IHRoZSB0b3AtbGV2ZWwgc2lnbmF0dXJlIGtleSB0aGF0IGlzIGJvdW5kIHRvIHRoaXMgc3Via2V5LCBvclxuXHRcdCogYnkgYW4gYXV0aG9yaXplZCByZXZvY2F0aW9uIGtleSwgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdmFsaWRcblx0XHQqIHJldm9jYXRpb24gc2lnbmF0dXJlcy5cblx0XHQqIEtleSByZXZvY2F0aW9uIHNpZ25hdHVyZXMgKHR5cGVzIDB4MjAgYW5kIDB4MjgpXG5cdFx0KiBoYXNoIG9ubHkgdGhlIGtleSBiZWluZyByZXZva2VkLiAqL1xuXHRcdHN1YmtleV9yZXZvY2F0aW9uOiA0MCxcblx0XHQvKiogMHg0MDogVGltZXN0YW1wIHNpZ25hdHVyZS5cblx0XHQqIFRoaXMgc2lnbmF0dXJlIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgdGhlIHRpbWVzdGFtcCBjb250YWluZWQgaW5cblx0XHQqIGl0LiAqL1xuXHRcdHRpbWVzdGFtcDogNjQsXG5cdFx0LyoqICAgIDB4NTA6IFRoaXJkLVBhcnR5IENvbmZpcm1hdGlvbiBzaWduYXR1cmUuXG5cdFx0KiBUaGlzIHNpZ25hdHVyZSBpcyBhIHNpZ25hdHVyZSBvdmVyIHNvbWUgb3RoZXIgT3BlblBHUCBTaWduYXR1cmVcblx0XHQqIHBhY2tldChzKS4gIEl0IGlzIGFuYWxvZ291cyB0byBhIG5vdGFyeSBzZWFsIG9uIHRoZSBzaWduZWQgZGF0YS5cblx0XHQqIEEgdGhpcmQtcGFydHkgc2lnbmF0dXJlIFNIT1VMRCBpbmNsdWRlIFNpZ25hdHVyZSBUYXJnZXRcblx0XHQqIHN1YnBhY2tldChzKSB0byBnaXZlIGVhc3kgaWRlbnRpZmljYXRpb24uICBOb3RlIHRoYXQgd2UgcmVhbGx5IGRvXG5cdFx0KiBtZWFuIFNIT1VMRC4gIFRoZXJlIGFyZSBwbGF1c2libGUgdXNlcyBmb3IgdGhpcyAoc3VjaCBhcyBhIGJsaW5kXG5cdFx0KiBwYXJ0eSB0aGF0IG9ubHkgc2VlcyB0aGUgc2lnbmF0dXJlLCBub3QgdGhlIGtleSBvciBzb3VyY2Vcblx0XHQqIGRvY3VtZW50KSB0aGF0IGNhbm5vdCBpbmNsdWRlIGEgdGFyZ2V0IHN1YnBhY2tldC4gKi9cblx0XHR0aGlyZF9wYXJ0eTogODBcblx0fSxcblxuXHQvLyBBc3NlcnRzIHZhbGlkaXR5IGFuZCBjb252ZXJ0cyBmcm9tIHN0cmluZy9pbnRlZ2VyIHRvIGludGVnZXIuXG5cdHdyaXRlOiBmdW5jdGlvbih0eXBlLCBlKSB7XG5cdFx0aWYodHlwZW9mIGUgPT0gJ251bWJlcicpIHtcblx0XHRcdGUgPSB0aGlzLnJlYWQodHlwZSwgZSk7XG5cdFx0fVxuXHRcdFxuXHRcdGlmKHR5cGVbZV0gIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdHlwZVtlXTtcblx0XHR9IGVsc2UgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVudW0gdmFsdWUuJyk7XG5cdH0sXG5cdC8vIENvbnZlcnRzIGZyb20gYW4gaW50ZWdlciB0byBzdHJpbmcuXG5cdHJlYWQ6IGZ1bmN0aW9uKHR5cGUsIGUpIHtcblx0XHRmb3IodmFyIGkgaW4gdHlwZSlcblx0XHRcdGlmKHR5cGVbaV0gPT0gZSkgcmV0dXJuIGk7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW51bSB2YWx1ZS4nKTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVudW1zO1xuIiwidmFyIGNyeXB0byA9IHJlcXVpcmUoJy4vY3J5cHRvJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9vcGVucGdwLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy51dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5tb2R1bGUuZXhwb3J0cy5wYWNrZXQgPSByZXF1aXJlKCcuL3BhY2tldCcpO1xubW9kdWxlLmV4cG9ydHMubXBpID0gcmVxdWlyZSgnLi90eXBlL21waS5qcycpO1xubW9kdWxlLmV4cG9ydHMuczJrID0gcmVxdWlyZSgnLi90eXBlL3Myay5qcycpO1xubW9kdWxlLmV4cG9ydHMua2V5aWQgPSByZXF1aXJlKCcuL3R5cGUva2V5aWQuanMnKTtcbm1vZHVsZS5leHBvcnRzLmFybW9yID0gcmVxdWlyZSgnLi9lbmNvZGluZy9hcm1vci5qcycpO1xubW9kdWxlLmV4cG9ydHMuZW51bXMgPSByZXF1aXJlKCcuL2VudW1zLmpzJyk7XG5cbmZvcih2YXIgaSBpbiBjcnlwdG8pXG5cdG1vZHVsZS5leHBvcnRzW2ldID0gY3J5cHRvW2ldO1xuXG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhlIG9wZW5wZ3AgYmFzZSBjbGFzcyBzaG91bGQgcHJvdmlkZSBhbGwgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgXG4gKiB0byBjb25zdW1lIHRoZSBvcGVucGdwLmpzIGxpYnJhcnkuIEFsbCBhZGRpdGlvbmFsIGNsYXNzZXMgYXJlIGRvY3VtZW50ZWQgXG4gKiBmb3IgZXh0ZW5kaW5nIGFuZCBkZXZlbG9waW5nIG9uIHRvcCBvZiB0aGUgYmFzZSBsaWJyYXJ5LlxuICovXG5cbnZhciBhcm1vciA9IHJlcXVpcmUoJy4vZW5jb2RpbmcvYXJtb3IuanMnKTtcbnZhciBwYWNrZXQgPSByZXF1aXJlKCcuL3BhY2tldCcpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLyoqXG4gKiBHUEc0QnJvd3NlcnMgQ29yZSBpbnRlcmZhY2UuIEEgc2luZ2xlIGluc3RhbmNlIGlzIGhvbGRcbiAqIGZyb20gdGhlIGJlZ2lubmluZy4gVG8gdXNlIHRoaXMgbGlicmFyeSBjYWxsIFwib3BlbnBncC5pbml0KClcIlxuICogQGFsaWFzIG9wZW5wZ3BcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBNYWluIE9wZW5wZ3AuanMgY2xhc3MuIFVzZSB0aGlzIHRvIGluaXRpYXRlIGFuZCBtYWtlIGFsbCBjYWxscyB0byB0aGlzIGxpYnJhcnkuXG4gKi9cbmZ1bmN0aW9uIF9vcGVucGdwICgpIHtcblx0dGhpcy50b3N0cmluZyA9IFwiXCI7XG5cdFxuXHQvKipcblx0ICogaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnk6XG5cdCAqIC0gcmVhZGluZyB0aGUga2V5cmluZyBmcm9tIGxvY2FsIHN0b3JhZ2Vcblx0ICogLSByZWFkaW5nIHRoZSBjb25maWcgZnJvbSBsb2NhbCBzdG9yYWdlXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0KCkge1xuXHRcdHRoaXMuY29uZmlnID0gbmV3IG9wZW5wZ3BfY29uZmlnKCk7XG5cdFx0dGhpcy5jb25maWcucmVhZCgpO1xuXHRcdHRoaXMua2V5cmluZyA9IG5ldyBvcGVucGdwX2tleXJpbmcoKTtcblx0XHR0aGlzLmtleXJpbmcuaW5pdCgpO1xuXHR9XG5cdFxuXHQvKipcblx0ICogcmVhZHMgc2V2ZXJhbCBwdWJsaWNLZXkgb2JqZWN0cyBmcm9tIGEgYXNjaWkgYXJtb3JlZFxuXHQgKiByZXByZXNlbnRhdGlvbiBhbiByZXR1cm5zIG9wZW5wZ3BfbXNnX3B1YmxpY2tleSBwYWNrZXRzXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBhcm1vcmVkVGV4dCBPcGVuUEdQIGFybW9yZWQgdGV4dCBjb250YWluaW5nXG5cdCAqIHRoZSBwdWJsaWMga2V5KHMpXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfbXNnX3B1YmxpY2tleVtdfSBvbiBlcnJvciB0aGUgZnVuY3Rpb25cblx0ICogcmV0dXJucyBudWxsXG5cdCAqL1xuXHRmdW5jdGlvbiByZWFkX3B1YmxpY0tleShhcm1vcmVkVGV4dCkge1xuXHRcdHZhciBteXBvcyA9IDA7XG5cdFx0dmFyIHB1YmxpY0tleXMgPSBbXTtcblx0XHR2YXIgcHVibGljS2V5Q291bnQgPSAwO1xuXHRcdHZhciBpbnB1dCA9IGFybW9yLmRlY29kZShhcm1vcmVkVGV4dC5yZXBsYWNlKC9cXHIvZywnJykpLm9wZW5wZ3A7XG5cdFx0dmFyIGwgPSBpbnB1dC5sZW5ndGg7XG5cdFx0d2hpbGUgKG15cG9zICE9IGlucHV0Lmxlbmd0aCkge1xuXHRcdFx0dmFyIGZpcnN0X3BhY2tldCA9IHBhY2tldC5pby5yZWFkKGlucHV0LCBteXBvcywgbCk7XG5cdFx0XHQvLyBwdWJsaWMga2V5IHBhcnNlclxuXHRcdFx0aWYgKGlucHV0W215cG9zXS5jaGFyQ29kZUF0KCkgPT0gMHg5OSB8fCBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSA2KSB7XG5cdFx0XHRcdHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdID0gbmV3IG9wZW5wZ3BfbXNnX3B1YmxpY2tleSgpO1x0XHRcdFx0XG5cdFx0XHRcdHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLmhlYWRlciA9IGlucHV0LnN1YnN0cmluZyhteXBvcyxteXBvcyszKTtcblx0XHRcdFx0aWYgKGlucHV0W215cG9zXS5jaGFyQ29kZUF0KCkgPT0gMHg5OSkge1xuXHRcdFx0XHRcdC8vIHBhcnNlIHRoZSBsZW5ndGggYW5kIHJlYWQgYSB0YWc2IHBhY2tldFxuXHRcdFx0XHRcdG15cG9zKys7XG5cdFx0XHRcdFx0dmFyIGwgPSAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDgpXG5cdFx0XHRcdFx0XHRcdHwgaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0XHRcdHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLnB1YmxpY0tleVBhY2tldCA9IG5ldyBvcGVucGdwX3BhY2tldF9rZXltYXRlcmlhbCgpO1xuXHRcdFx0XHRcdHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLnB1YmxpY0tleVBhY2tldC5oZWFkZXIgPSBwdWJsaWNLZXlzW3B1YmxpY0tleUNvdW50XS5oZWFkZXI7XG5cdFx0XHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0ucHVibGljS2V5UGFja2V0LnJlYWRfdGFnNihpbnB1dCwgbXlwb3MsIGwpO1xuXHRcdFx0XHRcdG15cG9zICs9IHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLnB1YmxpY0tleVBhY2tldC5wYWNrZXRMZW5ndGg7XG5cdFx0XHRcdFx0bXlwb3MgKz0gcHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0ucmVhZF9ub2RlcyhwdWJsaWNLZXlzW3B1YmxpY0tleUNvdW50XS5wdWJsaWNLZXlQYWNrZXQsIGlucHV0LCBteXBvcywgKGlucHV0Lmxlbmd0aCAtIG15cG9zKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0gPSBuZXcgb3BlbnBncF9tc2dfcHVibGlja2V5KCk7XG5cdFx0XHRcdFx0cHVibGljS2V5c1twdWJsaWNLZXlDb3VudF0ucHVibGljS2V5UGFja2V0ID0gZmlyc3RfcGFja2V0O1xuXHRcdFx0XHRcdG15cG9zICs9IGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGgrZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aDtcblx0XHRcdFx0XHRteXBvcyArPSBwdWJsaWNLZXlzW3B1YmxpY0tleUNvdW50XS5yZWFkX25vZGVzKGZpcnN0X3BhY2tldCwgaW5wdXQsIG15cG9zLCBpbnB1dC5sZW5ndGggLW15cG9zKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXRpbC5wcmludF9lcnJvcihcIm5vIHB1YmxpYyBrZXkgZm91bmQhXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHB1YmxpY0tleXNbcHVibGljS2V5Q291bnRdLmRhdGEgPSBpbnB1dC5zdWJzdHJpbmcoMCxteXBvcyk7XG5cdFx0XHRwdWJsaWNLZXlDb3VudCsrO1xuXHRcdH1cblx0XHRyZXR1cm4gcHVibGljS2V5cztcblx0fVxuXHRcblx0LyoqXG5cdCAqIHJlYWRzIHNldmVyYWwgcHJpdmF0ZUtleSBvYmplY3RzIGZyb20gYSBhc2NpaSBhcm1vcmVkXG5cdCAqIHJlcHJlc2VudGF0aW9uIGFuIHJldHVybnMgb3BlbnBncF9tc2dfcHJpdmF0ZWtleSBvYmplY3RzXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBhcm1vcmVkVGV4dCBPcGVuUEdQIGFybW9yZWQgdGV4dCBjb250YWluaW5nXG5cdCAqIHRoZSBwcml2YXRlIGtleShzKVxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX21zZ19wcml2YXRla2V5W119IG9uIGVycm9yIHRoZSBmdW5jdGlvblxuXHQgKiByZXR1cm5zIG51bGxcblx0ICovXG5cdGZ1bmN0aW9uIHJlYWRfcHJpdmF0ZUtleShhcm1vcmVkVGV4dCkge1xuXHRcdHZhciBwcml2YXRlS2V5cyA9IFtdO1xuXHRcdHZhciBwcml2YXRlS2V5Q291bnQgPSAwO1xuXHRcdHZhciBteXBvcyA9IDA7XG5cdFx0dmFyIGlucHV0ID0gYXJtb3IuZGVjb2RlKGFybW9yZWRUZXh0LnJlcGxhY2UoL1xcci9nLCcnKSkub3BlbnBncDtcblx0XHR2YXIgbCA9IGlucHV0Lmxlbmd0aDtcblx0XHR3aGlsZSAobXlwb3MgIT0gaW5wdXQubGVuZ3RoKSB7XG5cdFx0XHR2YXIgZmlyc3RfcGFja2V0ID0gcGFja2V0LmlvLnJlYWQoaW5wdXQsIG15cG9zLCBsKTtcblx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSA1KSB7XG5cdFx0XHRcdHByaXZhdGVLZXlzW3ByaXZhdGVLZXlzLmxlbmd0aF0gPSBuZXcgb3BlbnBncF9tc2dfcHJpdmF0ZWtleSgpO1xuXHRcdFx0XHRteXBvcyArPSBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoK2ZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGg7XG5cdFx0XHRcdG15cG9zICs9IHByaXZhdGVLZXlzW3ByaXZhdGVLZXlDb3VudF0ucmVhZF9ub2RlcyhmaXJzdF9wYWNrZXQsIGlucHV0LCBteXBvcywgbCk7XG5cdFx0XHQvLyBvdGhlciBibG9ja3NcdCAgICAgICAgICAgIFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXRpbC5wcmludF9lcnJvcignbm8gYmxvY2sgcGFja2V0IGZvdW5kIScpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHByaXZhdGVLZXlzW3ByaXZhdGVLZXlDb3VudF0uZGF0YSA9IGlucHV0LnN1YnN0cmluZygwLG15cG9zKTtcblx0XHRcdHByaXZhdGVLZXlDb3VudCsrO1xuXHRcdH1cblx0XHRyZXR1cm4gcHJpdmF0ZUtleXM7XHRcdFxuXHR9XG5cblx0LyoqXG5cdCAqIHJlYWRzIG1lc3NhZ2UgcGFja2V0cyBvdXQgb2YgYW4gT3BlblBHUCBhcm1vcmVkIHRleHQgYW5kXG5cdCAqIHJldHVybnMgYW4gYXJyYXkgb2YgbWVzc2FnZSBvYmplY3RzXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBhcm1vcmVkVGV4dCB0ZXh0IHRvIGJlIHBhcnNlZFxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX21zZ19tZXNzYWdlW119IG9uIGVycm9yIHRoZSBmdW5jdGlvblxuXHQgKiByZXR1cm5zIG51bGxcblx0ICovXG5cdGZ1bmN0aW9uIHJlYWRfbWVzc2FnZShhcm1vcmVkVGV4dCkge1xuXHRcdHZhciBkZWFybW9yZWQ7XG5cdFx0dHJ5e1xuICAgIFx0XHRkZWFybW9yZWQgPSBhcm1vci5kZWNvZGUoYXJtb3JlZFRleHQucmVwbGFjZSgvXFxyL2csJycpKTtcblx0XHR9XG5cdFx0Y2F0Y2goZSl7XG4gICAgXHRcdHV0aWwucHJpbnRfZXJyb3IoJ25vIG1lc3NhZ2UgZm91bmQhJyk7XG4gICAgXHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVhZF9tZXNzYWdlc19kZWFybW9yZWQoZGVhcm1vcmVkKTtcblx0XHR9XG5cdFx0XG5cdC8qKlxuXHQgKiByZWFkcyBtZXNzYWdlIHBhY2tldHMgb3V0IG9mIGFuIE9wZW5QR1AgYXJtb3JlZCB0ZXh0IGFuZFxuXHQgKiByZXR1cm5zIGFuIGFycmF5IG9mIG1lc3NhZ2Ugb2JqZWN0cy4gQ2FuIGJlIGNhbGxlZCBleHRlcm5hbGx5IG9yIGludGVybmFsbHkuXG5cdCAqIEV4dGVybmFsIGNhbGwgd2lsbCBwYXJzZSBhIGRlLWFybW9yZWQgbWVzc2FnZWQgYW5kIHJldHVybiBtZXNzYWdlcyBmb3VuZC5cblx0ICogSW50ZXJuYWwgd2lsbCBiZSBjYWxsZWQgdG8gcmVhZCBwYWNrZXRzIHdyYXBwZWQgaW4gb3RoZXIgcGFja2V0cyAoaS5lLiBjb21wcmVzc2VkKVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgZGVhcm1vcmVkIHRleHQgb2YgT3BlblBHUCBwYWNrZXRzLCB0byBiZSBwYXJzZWRcblx0ICogQHJldHVybiB7b3BlbnBncF9tc2dfbWVzc2FnZVtdfSBvbiBlcnJvciB0aGUgZnVuY3Rpb25cblx0ICogcmV0dXJucyBudWxsXG5cdCAqL1xuXHRmdW5jdGlvbiByZWFkX21lc3NhZ2VzX2RlYXJtb3JlZChpbnB1dCl7XG5cdFx0dmFyIG1lc3NhZ2VTdHJpbmcgPSBpbnB1dC5vcGVucGdwO1xuXHRcdHZhciBzaWduYXR1cmVUZXh0ID0gaW5wdXQudGV4dDsgLy90ZXh0IHRvIHZlcmlmeSBzaWduYXR1cmVzIGFnYWluc3QuIE1vZGlmaWVkIGJ5IFRhZzExLlxuXHRcdHZhciBtZXNzYWdlcyA9IFtdO1xuXHRcdHZhciBtZXNzYWdlQ291bnQgPSAwO1xuXHRcdHZhciBteXBvcyA9IDA7XG5cdFx0dmFyIGwgPSBtZXNzYWdlU3RyaW5nLmxlbmd0aDtcblx0XHR3aGlsZSAobXlwb3MgPCBtZXNzYWdlU3RyaW5nLmxlbmd0aCkge1xuXHRcdFx0dmFyIGZpcnN0X3BhY2tldCA9IHBhY2tldC5pby5yZWFkKG1lc3NhZ2VTdHJpbmcsIG15cG9zLCBsKTtcblx0XHRcdGlmICghZmlyc3RfcGFja2V0KSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Ly8gcHVibGljIGtleSBwYXJzZXIgKGRlZmluaXRpb24gZnJvbSB0aGUgc3RhbmRhcmQ6KVxuXHRcdFx0Ly8gT3BlblBHUCBNZXNzYWdlICAgICAgOi0gRW5jcnlwdGVkIE1lc3NhZ2UgfCBTaWduZWQgTWVzc2FnZSB8XG5cdFx0XHQvLyAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2VkIE1lc3NhZ2UgfCBMaXRlcmFsIE1lc3NhZ2UuXG5cdFx0XHQvLyBDb21wcmVzc2VkIE1lc3NhZ2UgICA6LSBDb21wcmVzc2VkIERhdGEgUGFja2V0LlxuXHRcdFx0Ly8gXG5cdFx0XHQvLyBMaXRlcmFsIE1lc3NhZ2UgICAgICA6LSBMaXRlcmFsIERhdGEgUGFja2V0LlxuXHRcdFx0Ly8gXG5cdFx0XHQvLyBFU0sgICAgICAgICAgICAgICAgICA6LSBQdWJsaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleSBQYWNrZXQgfFxuXHRcdFx0Ly8gICAgICAgICAgICAgICAgICAgICAgICAgU3ltbWV0cmljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgUGFja2V0LlxuXHRcdFx0Ly8gXG5cdFx0XHQvLyBFU0sgU2VxdWVuY2UgICAgICAgICA6LSBFU0sgfCBFU0sgU2VxdWVuY2UsIEVTSy5cblx0XHRcdC8vIFxuXHRcdFx0Ly8gRW5jcnlwdGVkIERhdGEgICAgICAgOi0gU3ltbWV0cmljYWxseSBFbmNyeXB0ZWQgRGF0YSBQYWNrZXQgfFxuXHRcdFx0Ly8gICAgICAgICAgICAgICAgICAgICAgICAgU3ltbWV0cmljYWxseSBFbmNyeXB0ZWQgSW50ZWdyaXR5IFByb3RlY3RlZCBEYXRhIFBhY2tldFxuXHRcdFx0Ly8gXG5cdFx0XHQvLyBFbmNyeXB0ZWQgTWVzc2FnZSAgICA6LSBFbmNyeXB0ZWQgRGF0YSB8IEVTSyBTZXF1ZW5jZSwgRW5jcnlwdGVkIERhdGEuXG5cdFx0XHQvLyBcblx0XHRcdC8vIE9uZS1QYXNzIFNpZ25lZCBNZXNzYWdlIDotIE9uZS1QYXNzIFNpZ25hdHVyZSBQYWNrZXQsXG5cdFx0XHQvLyAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuUEdQIE1lc3NhZ2UsIENvcnJlc3BvbmRpbmcgU2lnbmF0dXJlIFBhY2tldC5cblxuXHRcdFx0Ly8gU2lnbmVkIE1lc3NhZ2UgICAgICAgOi0gU2lnbmF0dXJlIFBhY2tldCwgT3BlblBHUCBNZXNzYWdlIHxcblx0XHRcdC8vICAgICAgICAgICAgICAgICAgICAgICAgIE9uZS1QYXNzIFNpZ25lZCBNZXNzYWdlLlxuXHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09ICAxIHx8XG4gICAgICAgICAgIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAyICYmIGZpcnN0X3BhY2tldC5zaWduYXR1cmVUeXBlIDwgMTYpIHx8XG4gICAgICAgICAgICAgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gIDMgfHxcbiAgICAgICAgIGZpcnN0X3BhY2tldC50YWdUeXBlID09ICA0IHx8XG5cdFx0XHRcdCBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAgOCB8fFxuXHRcdFx0XHQgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gIDkgfHxcblx0XHRcdFx0IGZpcnN0X3BhY2tldC50YWdUeXBlID09IDEwIHx8XG5cdFx0XHRcdCBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxMSB8fFxuXHRcdFx0XHQgZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMTggfHxcblx0XHRcdFx0IGZpcnN0X3BhY2tldC50YWdUeXBlID09IDE5KSB7XG5cdFx0XHRcdG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aF0gPSBuZXcgb3BlbnBncF9tc2dfbWVzc2FnZSgpO1xuXHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlQ291bnRdLm1lc3NhZ2VQYWNrZXQgPSBmaXJzdF9wYWNrZXQ7XG5cdFx0XHRcdG1lc3NhZ2VzW21lc3NhZ2VDb3VudF0udHlwZSA9IGlucHV0LnR5cGU7XG5cdFx0XHRcdC8vIEVuY3J5cHRlZCBNZXNzYWdlXG5cdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSA5IHx8XG5cdFx0XHRcdCAgICBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxIHx8XG5cdFx0XHRcdCAgICBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAzIHx8XG5cdFx0XHRcdCAgICBmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSAxOCkge1xuXHRcdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSA5KSB7XG5cdFx0XHRcdFx0XHR1dGlsLnByaW50X2Vycm9yKFwidW5leHBlY3RlZCBvcGVucGdwIHBhY2tldFwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMSkge1xuXHRcdFx0XHRcdFx0dXRpbC5wcmludF9kZWJ1ZyhcInNlc3Npb24ga2V5IGZvdW5kOlxcbiBcIitmaXJzdF9wYWNrZXQudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0XHR2YXIgaXNzZXNzaW9ua2V5ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdG1lc3NhZ2VzW21lc3NhZ2VDb3VudF0uc2Vzc2lvbktleXMgPSBuZXcgQXJyYXkoKTtcblx0XHRcdFx0XHRcdHZhciBzZXNzaW9uS2V5Q291bnQgPSAwO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGlzc2Vzc2lvbmtleSkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlc1ttZXNzYWdlQ291bnRdLnNlc3Npb25LZXlzW3Nlc3Npb25LZXlDb3VudF0gPSBmaXJzdF9wYWNrZXQ7XG5cdFx0XHRcdFx0XHRcdG15cG9zICs9IGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGggKyBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRsIC09IChmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdGZpcnN0X3BhY2tldCA9IHBhY2tldC5pby5yZWFkKG1lc3NhZ2VTdHJpbmcsIG15cG9zLCBsKTtcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSAhPSAxICYmIGZpcnN0X3BhY2tldC50YWdUeXBlICE9IDMpXG5cdFx0XHRcdFx0XHRcdFx0aXNzZXNzaW9ua2V5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdHNlc3Npb25LZXlDb3VudCsrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDE4IHx8IGZpcnN0X3BhY2tldC50YWdUeXBlID09IDkpIHtcblx0XHRcdFx0XHRcdFx0dXRpbC5wcmludF9kZWJ1ZyhcImVuY3J5cHRlZCBkYXRhIGZvdW5kOlxcbiBcIitmaXJzdF9wYWNrZXQudG9TdHJpbmcoKSk7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VzW21lc3NhZ2VDb3VudF0uZW5jcnlwdGVkRGF0YSA9IGZpcnN0X3BhY2tldDtcblx0XHRcdFx0XHRcdFx0bXlwb3MgKz0gZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCtmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRsIC09IChmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoK2ZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlQ291bnQrKztcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR1dGlsLnByaW50X2RlYnVnKFwic29tZXRoaW5nIGlzIHdyb25nOiBcIitmaXJzdF9wYWNrZXQudGFnVHlwZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDE4KSB7XG5cdFx0XHRcdFx0XHR1dGlsLnByaW50X2RlYnVnKFwic3ltbWV0cmljIGVuY3J5cHRlZCBkYXRhXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgXG5cdFx0XHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDIgJiYgZmlyc3RfcGFja2V0LnNpZ25hdHVyZVR5cGUgPCAzKSB7XG5cdFx0XHRcdFx0Ly8gU2lnbmVkIE1lc3NhZ2Vcblx0XHRcdFx0XHRcdG15cG9zICs9IGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGggKyBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoO1xuXHRcdFx0XHRcdFx0bCAtPSAoZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGgpO1xuXHRcdFx0XHRcdFx0bWVzc2FnZXNbbWVzc2FnZUNvdW50XS50ZXh0ID0gc2lnbmF0dXJlVGV4dDtcblx0XHRcdFx0XHRcdG1lc3NhZ2VzW21lc3NhZ2VDb3VudF0uc2lnbmF0dXJlID0gZmlyc3RfcGFja2V0O1xuICAgICAgICAgICAgbWVzc2FnZUNvdW50Kys7XG5cdFx0XHRcdH0gZWxzZSBcblx0XHRcdFx0XHQvLyBTaWduZWQgTWVzc2FnZVxuXHRcdFx0XHRcdGlmIChmaXJzdF9wYWNrZXQudGFnVHlwZSA9PSA0KSB7XG5cdFx0XHRcdFx0XHQvL1RPRE86IEltcGxlbWVudCBjaGVja1xuXHRcdFx0XHRcdFx0bXlwb3MgKz0gZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGg7XG5cdFx0XHRcdFx0XHRsIC09IChmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aCk7XG5cdFx0XHRcdH0gZWxzZSBcblx0XHRcdFx0XHRpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gOCkge1xuXHRcdFx0XHRcdC8vIENvbXByZXNzZWQgTWVzc2FnZVxuXHRcdFx0XHRcdFx0bXlwb3MgKz0gZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGg7XG5cdFx0XHRcdFx0XHRsIC09IChmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgZGVjb21wcmVzc2VkVGV4dCA9IGZpcnN0X3BhY2tldC5kZWNvbXByZXNzKCk7XG4gICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLmNvbmNhdChvcGVucGdwLnJlYWRfbWVzc2FnZXNfZGVhcm1vcmVkKHt0ZXh0OiBkZWNvbXByZXNzZWRUZXh0LCBvcGVucGdwOiBkZWNvbXByZXNzZWRUZXh0fSkpO1xuXHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHQvLyBNYXJrZXIgUGFja2V0IChPYnNvbGV0ZSBMaXRlcmFsIFBhY2tldCkgKFRhZyAxMClcblx0XHRcdFx0XHQvLyBcIlN1Y2ggYSBwYWNrZXQgTVVTVCBiZSBpZ25vcmVkIHdoZW4gcmVjZWl2ZWQuXCIgc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ4ODAjc2VjdGlvbi01Ljhcblx0XHRcdFx0XHRpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMTApIHtcblx0XHRcdFx0XHRcdC8vIHJlc2V0IG1lc3NhZ2VzXG5cdFx0XHRcdFx0XHRtZXNzYWdlcy5sZW5ndGggPSAwO1xuXHRcdFx0XHRcdFx0Ly8gY29udGludWUgd2l0aCBuZXh0IHBhY2tldFxuXHRcdFx0XHRcdFx0bXlwb3MgKz0gZmlyc3RfcGFja2V0LnBhY2tldExlbmd0aCArIGZpcnN0X3BhY2tldC5oZWFkZXJMZW5ndGg7XG5cdFx0XHRcdFx0XHRsIC09IChmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aCk7XG5cdFx0XHRcdH0gZWxzZSBcblx0XHRcdFx0XHRpZiAoZmlyc3RfcGFja2V0LnRhZ1R5cGUgPT0gMTEpIHtcblx0XHRcdFx0XHQvLyBMaXRlcmFsIE1lc3NhZ2UgLS0gd29yayBpcyBhbHJlYWR5IGRvbmUgaW4gcGFja2V0LmlvLnJlYWRcblx0XHRcdFx0XHRteXBvcyArPSBmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aDtcblx0XHRcdFx0XHRsIC09IChmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aCk7XG5cdFx0XHRcdFx0c2lnbmF0dXJlVGV4dCA9IGZpcnN0X3BhY2tldC5kYXRhO1xuXHRcdFx0XHRcdG1lc3NhZ2VzW21lc3NhZ2VDb3VudF0uZGF0YSA9IGZpcnN0X3BhY2tldC5kYXRhO1xuXHRcdFx0XHRcdG1lc3NhZ2VDb3VudCsrO1xuXHRcdFx0XHR9IGVsc2UgXG5cdFx0XHRcdFx0aWYgKGZpcnN0X3BhY2tldC50YWdUeXBlID09IDE5KSB7XG5cdFx0XHRcdFx0Ly8gTW9kaWZpY2F0aW9uIERldGVjdCBDb2RlXG5cdFx0XHRcdFx0XHRteXBvcyArPSBmaXJzdF9wYWNrZXQucGFja2V0TGVuZ3RoICsgZmlyc3RfcGFja2V0LmhlYWRlckxlbmd0aDtcblx0XHRcdFx0XHRcdGwgLT0gKGZpcnN0X3BhY2tldC5wYWNrZXRMZW5ndGggKyBmaXJzdF9wYWNrZXQuaGVhZGVyTGVuZ3RoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXRpbC5wcmludF9lcnJvcignbm8gbWVzc2FnZSBmb3VuZCEnKTtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdHJldHVybiBtZXNzYWdlcztcblx0fVxuXHRcblx0LyoqXG5cdCAqIGNyZWF0ZXMgYSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVuY3J5cHRlZCBhbmQgc2lnbmVkIG1lc3NhZ2UuXG5cdCAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgZW5jcnlwdGVkIHdpdGggdGhlIHB1YmxpYyBrZXlzIHNwZWNpZmllZCBhbmQgc2lnbmVkXG5cdCAqIHdpdGggdGhlIHNwZWNpZmllZCBwcml2YXRlIGtleS5cblx0ICogQHBhcmFtIHtPYmplY3R9IHByaXZhdGVrZXkge29iajogW29wZW5wZ3BfbXNnX3ByaXZhdGVrZXldfSBQcml2YXRlIGtleSBcblx0ICogdG8gYmUgdXNlZCB0byBzaWduIHRoZSBtZXNzYWdlXG5cdCAqIEBwYXJhbSB7T2JqZWN0W119IHB1YmxpY2tleXMgQW4gYXJyYWYgb2Yge29iajogW29wZW5wZ3BfbXNnX3B1YmxpY2tleV19XG5cdCAqIC0gcHVibGljIGtleXMgdG8gYmUgdXNlZCB0byBlbmNyeXB0IHRoZSBtZXNzYWdlIFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZXRleHQgbWVzc2FnZSB0ZXh0IHRvIGVuY3J5cHQgYW5kIHNpZ25cblx0ICogQHJldHVybiB7U3RyaW5nfSBhIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2Ugd2hpY2ggXG5cdCAqIGNhbiBiZSBPcGVuUEdQIGFybW9yZWRcblx0ICovXG5cdGZ1bmN0aW9uIHdyaXRlX3NpZ25lZF9hbmRfZW5jcnlwdGVkX21lc3NhZ2UocHJpdmF0ZWtleSwgcHVibGlja2V5cywgbWVzc2FnZXRleHQpIHtcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICB2YXIgaTtcblx0XHR2YXIgbGl0ZXJhbCA9IG5ldyBvcGVucGdwX3BhY2tldF9saXRlcmFsZGF0YSgpLndyaXRlX3BhY2tldChtZXNzYWdldGV4dC5yZXBsYWNlKC9cXHJcXG4vZyxcIlxcblwiKS5yZXBsYWNlKC9cXG4vZyxcIlxcclxcblwiKSk7XG5cdFx0dXRpbC5wcmludF9kZWJ1Z19oZXhzdHJfZHVtcChcImxpdGVyYWxfcGFja2V0OiB8XCIrbGl0ZXJhbCtcInxcXG5cIixsaXRlcmFsKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgcHVibGlja2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIG9uZXBhc3NzaWduYXR1cmUgPSBuZXcgb3BlbnBncF9wYWNrZXRfb25lcGFzc3NpZ25hdHVyZSgpO1xuXHRcdFx0dmFyIG9uZXBhc3NzaWdzdHIgPSBcIlwiO1xuXHRcdFx0aWYgKGkgPT09IDApXG5cdFx0XHRcdG9uZXBhc3NzaWdzdHIgPSBvbmVwYXNzc2lnbmF0dXJlLndyaXRlX3BhY2tldCgxLCBvcGVucGdwLmNvbmZpZy5jb25maWcucHJlZmVyX2hhc2hfYWxnb3JpdGhtLCAgcHJpdmF0ZWtleSwgZmFsc2UpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRvbmVwYXNzc2lnc3RyID0gb25lcGFzc3NpZ25hdHVyZS53cml0ZV9wYWNrZXQoMSwgb3BlbnBncC5jb25maWcuY29uZmlnLnByZWZlcl9oYXNoX2FsZ29yaXRobSwgIHByaXZhdGVrZXksIGZhbHNlKTtcblx0XHRcdHV0aWwucHJpbnRfZGVidWdfaGV4c3RyX2R1bXAoXCJvbmVwYXNzc2lnc3RyOiB8XCIrb25lcGFzc3NpZ3N0citcInxcXG5cIixvbmVwYXNzc2lnc3RyKTtcblx0XHRcdHZhciBkYXRhc2lnbmF0dXJlID0gbmV3IG9wZW5wZ3BfcGFja2V0X3NpZ25hdHVyZSgpLndyaXRlX21lc3NhZ2Vfc2lnbmF0dXJlKDEsIG1lc3NhZ2V0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLFwiXFxuXCIpLnJlcGxhY2UoL1xcbi9nLFwiXFxyXFxuXCIpLCBwcml2YXRla2V5KTtcblx0XHRcdHV0aWwucHJpbnRfZGVidWdfaGV4c3RyX2R1bXAoXCJkYXRhc2lnbmF0dXJlOiB8XCIrZGF0YXNpZ25hdHVyZS5vcGVucGdwK1wifFxcblwiLGRhdGFzaWduYXR1cmUub3BlbnBncCk7XG5cdFx0XHRpZiAoaSA9PT0gMCkge1xuXHRcdFx0XHRyZXN1bHQgPSBvbmVwYXNzc2lnc3RyK2xpdGVyYWwrZGF0YXNpZ25hdHVyZS5vcGVucGdwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0ID0gb25lcGFzc3NpZ3N0cityZXN1bHQrZGF0YXNpZ25hdHVyZS5vcGVucGdwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHR1dGlsLnByaW50X2RlYnVnX2hleHN0cl9kdW1wKFwic2lnbmVkIHBhY2tldDogfFwiK3Jlc3VsdCtcInxcXG5cIixyZXN1bHQpO1xuXHRcdC8vIHNpZ25hdHVyZXMgZG9uZS4uIG5vdyBlbmNyeXB0aW9uXG5cdFx0dmFyIHNlc3Npb25rZXkgPSBvcGVucGdwX2NyeXB0b19nZW5lcmF0ZVNlc3Npb25LZXkob3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyKTsgXG5cdFx0dmFyIHJlc3VsdDIgPSBcIlwiO1xuXHRcdFxuXHRcdC8vIGNyZWF0aW5nIHNlc3Npb24ga2V5cyBmb3IgZWFjaCByZWNpcGllbnRcblx0XHRmb3IgKGkgPSAwOyBpIDwgcHVibGlja2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHBrZXkgPSBwdWJsaWNrZXlzW2ldLmdldEVuY3J5cHRpb25LZXkoKTtcblx0XHRcdGlmIChwa2V5ID09PSBudWxsKSB7XG5cdFx0XHRcdHV0aWwucHJpbnRfZXJyb3IoXCJubyBlbmNyeXB0aW9uIGtleSBmb3VuZCEgS2V5IGlzIGZvciBzaWduaW5nIG9ubHkuXCIpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdHJlc3VsdDIgKz0gbmV3IG9wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZHNlc3Npb25rZXkoKS5cblx0XHRcdFx0XHR3cml0ZV9wdWJfa2V5X3BhY2tldChcblx0XHRcdFx0XHRcdHBrZXkuZ2V0S2V5SWQoKSxcblx0XHRcdFx0XHRcdHBrZXkuTVBJcyxcblx0XHRcdFx0XHRcdHBrZXkucHVibGljS2V5QWxnb3JpdGhtLFxuXHRcdFx0XHRcdFx0b3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyLFxuXHRcdFx0XHRcdFx0c2Vzc2lvbmtleSk7XG5cdFx0fVxuXHRcdGlmIChvcGVucGdwLmNvbmZpZy5jb25maWcuaW50ZWdyaXR5X3Byb3RlY3QpIHtcblx0XHRcdHJlc3VsdDIgKz0gbmV3IG9wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZGludGVncml0eXByb3RlY3RlZGRhdGEoKS53cml0ZV9wYWNrZXQob3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyLCBzZXNzaW9ua2V5LCByZXN1bHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQyICs9IG5ldyBvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhKCkud3JpdGVfcGFja2V0KG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5lbmNyeXB0aW9uX2NpcGhlciwgc2Vzc2lvbmtleSwgcmVzdWx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFybW9yLmVuY29kZSgzLHJlc3VsdDIsbnVsbCxudWxsKTtcblx0fVxuXHQvKipcblx0ICogY3JlYXRlcyBhIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gZW5jcnlwdGVkIG1lc3NhZ2UuXG5cdCAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgZW5jcnlwdGVkIHdpdGggdGhlIHB1YmxpYyBrZXlzIHNwZWNpZmllZCBcblx0ICogQHBhcmFtIHtPYmplY3RbXX0gcHVibGlja2V5cyBBbiBhcnJheSBvZiB7b2JqOiBbb3BlbnBncF9tc2dfcHVibGlja2V5XX1cblx0ICogLXB1YmxpYyBrZXlzIHRvIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgbWVzc2FnZSBcblx0ICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2V0ZXh0IG1lc3NhZ2UgdGV4dCB0byBlbmNyeXB0XG5cdCAqIEByZXR1cm4ge1N0cmluZ30gYSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlXG5cdCAqIHdoaWNoIGNhbiBiZSBPcGVuUEdQIGFybW9yZWRcblx0ICovXG5cdGZ1bmN0aW9uIHdyaXRlX2VuY3J5cHRlZF9tZXNzYWdlKHB1YmxpY2tleXMsIG1lc3NhZ2V0ZXh0KSB7XG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0dmFyIGxpdGVyYWwgPSBuZXcgb3BlbnBncF9wYWNrZXRfbGl0ZXJhbGRhdGEoKS53cml0ZV9wYWNrZXQobWVzc2FnZXRleHQucmVwbGFjZSgvXFxyXFxuL2csXCJcXG5cIikucmVwbGFjZSgvXFxuL2csXCJcXHJcXG5cIikpO1xuXHRcdHV0aWwucHJpbnRfZGVidWdfaGV4c3RyX2R1bXAoXCJsaXRlcmFsX3BhY2tldDogfFwiK2xpdGVyYWwrXCJ8XFxuXCIsbGl0ZXJhbCk7XG5cdFx0cmVzdWx0ID0gbGl0ZXJhbDtcblx0XHRcblx0XHQvLyBzaWduYXR1cmVzIGRvbmUuLiBub3cgZW5jcnlwdGlvblxuXHRcdHZhciBzZXNzaW9ua2V5ID0gb3BlbnBncF9jcnlwdG9fZ2VuZXJhdGVTZXNzaW9uS2V5KG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5lbmNyeXB0aW9uX2NpcGhlcik7IFxuXHRcdHZhciByZXN1bHQyID0gXCJcIjtcblx0XHRcblx0XHQvLyBjcmVhdGluZyBzZXNzaW9uIGtleXMgZm9yIGVhY2ggcmVjaXBpZW50XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwdWJsaWNrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcGtleSA9IHB1YmxpY2tleXNbaV0uZ2V0RW5jcnlwdGlvbktleSgpO1xuXHRcdFx0aWYgKHBrZXkgPT09IG51bGwpIHtcblx0XHRcdFx0dXRpbC5wcmludF9lcnJvcihcIm5vIGVuY3J5cHRpb24ga2V5IGZvdW5kISBLZXkgaXMgZm9yIHNpZ25pbmcgb25seS5cIik7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0cmVzdWx0MiArPSBuZXcgb3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkc2Vzc2lvbmtleSgpLlxuXHRcdFx0XHRcdHdyaXRlX3B1Yl9rZXlfcGFja2V0KFxuXHRcdFx0XHRcdFx0cGtleS5nZXRLZXlJZCgpLFxuXHRcdFx0XHRcdFx0cGtleS5NUElzLFxuXHRcdFx0XHRcdFx0cGtleS5wdWJsaWNLZXlBbGdvcml0aG0sXG5cdFx0XHRcdFx0XHRvcGVucGdwLmNvbmZpZy5jb25maWcuZW5jcnlwdGlvbl9jaXBoZXIsXG5cdFx0XHRcdFx0XHRzZXNzaW9ua2V5KTtcblx0XHR9XG5cdFx0aWYgKG9wZW5wZ3AuY29uZmlnLmNvbmZpZy5pbnRlZ3JpdHlfcHJvdGVjdCkge1xuXHRcdFx0cmVzdWx0MiArPSBuZXcgb3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkaW50ZWdyaXR5cHJvdGVjdGVkZGF0YSgpLndyaXRlX3BhY2tldChvcGVucGdwLmNvbmZpZy5jb25maWcuZW5jcnlwdGlvbl9jaXBoZXIsIHNlc3Npb25rZXksIHJlc3VsdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdDIgKz0gbmV3IG9wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZGRhdGEoKS53cml0ZV9wYWNrZXQob3BlbnBncC5jb25maWcuY29uZmlnLmVuY3J5cHRpb25fY2lwaGVyLCBzZXNzaW9ua2V5LCByZXN1bHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXJtb3IuZW5jb2RlKDMscmVzdWx0MixudWxsLG51bGwpO1xuXHR9XG5cdFxuXHQvKipcblx0ICogY3JlYXRlcyBhIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYSBzaWduZWQgbWVzc2FnZS5cblx0ICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBzaWduZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHByaXZhdGUga2V5LlxuXHQgKiBAcGFyYW0ge09iamVjdH0gcHJpdmF0ZWtleSB7b2JqOiBbb3BlbnBncF9tc2dfcHJpdmF0ZWtleV19XG5cdCAqIC0gdGhlIHByaXZhdGUga2V5IHRvIGJlIHVzZWQgdG8gc2lnbiB0aGUgbWVzc2FnZSBcblx0ICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2V0ZXh0IG1lc3NhZ2UgdGV4dCB0byBzaWduXG5cdCAqIEByZXR1cm4ge09iamVjdH0ge09iamVjdDogdGV4dCBbU3RyaW5nXX0sIG9wZW5wZ3A6IHtTdHJpbmd9IGEgYmluYXJ5XG5cdCAqICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2Ugd2hpY2ggY2FuIGJlIE9wZW5QR1Bcblx0ICogICBhcm1vcmVkKG9wZW5wZ3ApIGFuZCBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UgKHRleHQpLiBcblx0ICogVGhpcyBjYW4gYmUgZGlyZWN0bHkgdXNlZCB0byBPcGVuUEdQIGFybW9yIHRoZSBtZXNzYWdlXG5cdCAqL1xuXHRmdW5jdGlvbiB3cml0ZV9zaWduZWRfbWVzc2FnZShwcml2YXRla2V5LCBtZXNzYWdldGV4dCkge1xuXHRcdHZhciBzaWcgPSBuZXcgb3BlbnBncF9wYWNrZXRfc2lnbmF0dXJlKCkud3JpdGVfbWVzc2FnZV9zaWduYXR1cmUoMSwgbWVzc2FnZXRleHQucmVwbGFjZSgvXFxyXFxuL2csXCJcXG5cIikucmVwbGFjZSgvXFxuLyxcIlxcclxcblwiKSwgcHJpdmF0ZWtleSk7XG5cdFx0dmFyIHJlc3VsdCA9IHt0ZXh0OiBtZXNzYWdldGV4dC5yZXBsYWNlKC9cXHJcXG4vZyxcIlxcblwiKS5yZXBsYWNlKC9cXG4vLFwiXFxyXFxuXCIpLCBvcGVucGdwOiBzaWcub3BlbnBncCwgaGFzaDogc2lnLmhhc2h9O1xuXHRcdHJldHVybiBhcm1vci5lbmNvZGUoMixyZXN1bHQsIG51bGwsIG51bGwpO1xuXHR9XG5cdFxuXHQvKipcblx0ICogZ2VuZXJhdGVzIGEgbmV3IGtleSBwYWlyIGZvciBvcGVucGdwLiBCZXRhIHN0YWdlLiBDdXJyZW50bHkgb25seSBcblx0ICogc3VwcG9ydHMgUlNBIGtleXMsIGFuZCBubyBzdWJrZXlzLlxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGtleVR5cGUgdG8gaW5kaWNhdGUgd2hhdCB0eXBlIG9mIGtleSB0byBtYWtlLiBcblx0ICogUlNBIGlzIDEuIEZvbGxvd3MgYWxnb3JpdGhtcyBvdXRsaW5lZCBpbiBPcGVuUEdQLlxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IG51bUJpdHMgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBrZXkgY3JlYXRpb24uIChzaG91bGQgXG5cdCAqIGJlIDEwMjQrLCBnZW5lcmFsbHkpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB1c2VySWQgYXNzdW1lcyBhbHJlYWR5IGluIGZvcm0gb2YgXCJVc2VyIE5hbWUgXG5cdCAqIDx1c2VybmFtZUBlbWFpbC5jb20+XCJcblx0ICogQHBhcmFtIHtTdHJpbmd9IHBhc3NwaHJhc2UgVGhlIHBhc3NwaHJhc2UgdXNlZCB0byBlbmNyeXB0IHRoZSByZXN1bHRpbmcgcHJpdmF0ZSBrZXlcblx0ICogQHJldHVybiB7T2JqZWN0fSB7cHJpdmF0ZUtleTogW29wZW5wZ3BfbXNnX3ByaXZhdGVrZXldLCBcblx0ICogcHJpdmF0ZUtleUFybW9yZWQ6IFtzdHJpbmddLCBwdWJsaWNLZXlBcm1vcmVkOiBbc3RyaW5nXX1cblx0ICovXG5cdGZ1bmN0aW9uIGdlbmVyYXRlX2tleV9wYWlyKGtleVR5cGUsIG51bUJpdHMsIHVzZXJJZCwgcGFzc3BocmFzZSl7XG5cdFx0dmFyIHVzZXJJZFBhY2tldCA9IG5ldyBvcGVucGdwX3BhY2tldF91c2VyaWQoKTtcblx0XHR2YXIgdXNlcklkU3RyaW5nID0gdXNlcklkUGFja2V0LndyaXRlX3BhY2tldCh1c2VySWQpO1xuXHRcdFxuXHRcdHZhciBrZXlQYWlyID0gb3BlbnBncF9jcnlwdG9fZ2VuZXJhdGVLZXlQYWlyKGtleVR5cGUsbnVtQml0cywgcGFzc3BocmFzZSwgb3BlbnBncC5jb25maWcuY29uZmlnLnByZWZlcl9oYXNoX2FsZ29yaXRobSwgMyk7XG5cdFx0dmFyIHByaXZLZXlTdHJpbmcgPSBrZXlQYWlyLnByaXZhdGVLZXk7XG5cdFx0dmFyIHByaXZLZXlQYWNrZXQgPSBuZXcgb3BlbnBncF9wYWNrZXRfa2V5bWF0ZXJpYWwoKS5yZWFkX3ByaXZfa2V5KHByaXZLZXlTdHJpbmcuc3RyaW5nLDMscHJpdktleVN0cmluZy5zdHJpbmcubGVuZ3RoKTtcblx0XHRpZighcHJpdktleVBhY2tldC5kZWNyeXB0U2VjcmV0TVBJcyhwYXNzcGhyYXNlKSlcbiAgICAgIHV0aWwucHJpbnRfZXJyb3IoJ0lzc3VlIGNyZWF0aW5nIGtleS4gVW5hYmxlIHRvIHJlYWQgcmVzdWx0aW5nIHByaXZhdGUga2V5Jyk7XG5cdFx0dmFyIHByaXZLZXkgPSBuZXcgb3BlbnBncF9tc2dfcHJpdmF0ZWtleSgpO1xuXHRcdHByaXZLZXkucHJpdmF0ZUtleVBhY2tldCA9IHByaXZLZXlQYWNrZXQ7XG5cdFx0cHJpdktleS5nZXRQcmVmZXJyZWRTaWduYXR1cmVIYXNoQWxnb3JpdGhtID0gZnVuY3Rpb24oKXtyZXR1cm4gb3BlbnBncC5jb25maWcuY29uZmlnLnByZWZlcl9oYXNoX2FsZ29yaXRobX07Ly9uZWVkIHRvIG92ZXJyaWRlIHRoaXMgdG8gc29sdmUgY2F0Y2ggMjIgdG8gZ2VuZXJhdGUgc2lnbmF0dXJlLiA4IGlzIHZhbHVlIGZvciBTSEEyNTZcblx0XHRcblx0XHR2YXIgcHVibGljS2V5U3RyaW5nID0gcHJpdktleS5wcml2YXRlS2V5UGFja2V0LnB1YmxpY0tleS5kYXRhO1xuXHRcdHZhciBoYXNoRGF0YSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHg5OSkrIFN0cmluZy5mcm9tQ2hhckNvZGUoKChwdWJsaWNLZXlTdHJpbmcubGVuZ3RoKSA+PiA4KSAmIDB4RkYpIFxuXHRcdFx0KyBTdHJpbmcuZnJvbUNoYXJDb2RlKChwdWJsaWNLZXlTdHJpbmcubGVuZ3RoKSAmIDB4RkYpICtwdWJsaWNLZXlTdHJpbmcrU3RyaW5nLmZyb21DaGFyQ29kZSgweEI0KSArXG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCh1c2VySWQubGVuZ3RoKSA+PiAyNCkgK1N0cmluZy5mcm9tQ2hhckNvZGUoKCh1c2VySWQubGVuZ3RoKSA+PiAxNikgJiAweEZGKSBcblx0XHRcdCsgU3RyaW5nLmZyb21DaGFyQ29kZSgoKHVzZXJJZC5sZW5ndGgpID4+IDgpICYgMHhGRikgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKCh1c2VySWQubGVuZ3RoKSAmIDB4RkYpICsgdXNlcklkO1xuXHRcdHZhciBzaWduYXR1cmUgPSBuZXcgb3BlbnBncF9wYWNrZXRfc2lnbmF0dXJlKCk7XG5cdFx0c2lnbmF0dXJlID0gc2lnbmF0dXJlLndyaXRlX21lc3NhZ2Vfc2lnbmF0dXJlKDE2LGhhc2hEYXRhLCBwcml2S2V5KTtcblx0XHR2YXIgcHVibGljQXJtb3JlZCA9IGFybW9yLmVuY29kZSg0LCBrZXlQYWlyLnB1YmxpY0tleS5zdHJpbmcgKyB1c2VySWRTdHJpbmcgKyBzaWduYXR1cmUub3BlbnBncCApO1xuXG5cdFx0dmFyIHByaXZBcm1vcmVkID0gYXJtb3IuZW5jb2RlKDUscHJpdktleVN0cmluZy5zdHJpbmcrdXNlcklkU3RyaW5nK3NpZ25hdHVyZS5vcGVucGdwKTtcblx0XHRcblx0XHRyZXR1cm4ge3ByaXZhdGVLZXkgOiBwcml2S2V5LCBwcml2YXRlS2V5QXJtb3JlZDogcHJpdkFybW9yZWQsIHB1YmxpY0tleUFybW9yZWQ6IHB1YmxpY0FybW9yZWR9O1xuXHR9XG5cdFxuXHR0aGlzLmdlbmVyYXRlX2tleV9wYWlyID0gZ2VuZXJhdGVfa2V5X3BhaXI7XG5cdHRoaXMud3JpdGVfc2lnbmVkX21lc3NhZ2UgPSB3cml0ZV9zaWduZWRfbWVzc2FnZTsgXG5cdHRoaXMud3JpdGVfc2lnbmVkX2FuZF9lbmNyeXB0ZWRfbWVzc2FnZSA9IHdyaXRlX3NpZ25lZF9hbmRfZW5jcnlwdGVkX21lc3NhZ2U7XG5cdHRoaXMud3JpdGVfZW5jcnlwdGVkX21lc3NhZ2UgPSB3cml0ZV9lbmNyeXB0ZWRfbWVzc2FnZTtcblx0dGhpcy5yZWFkX21lc3NhZ2UgPSByZWFkX21lc3NhZ2U7XG5cdHRoaXMucmVhZF9tZXNzYWdlc19kZWFybW9yZWQgPSByZWFkX21lc3NhZ2VzX2RlYXJtb3JlZDtcblx0dGhpcy5yZWFkX3B1YmxpY0tleSA9IHJlYWRfcHVibGljS2V5O1xuXHR0aGlzLnJlYWRfcHJpdmF0ZUtleSA9IHJlYWRfcHJpdmF0ZUtleTtcblx0dGhpcy5pbml0ID0gaW5pdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgX29wZW5wZ3AoKTtcblxuIiwiXG52YXIgZW51bXMgPSByZXF1aXJlKCcuLi9lbnVtcy5qcycpO1xuXG4vLyBUaGlzIGlzIHByZXR0eSB1Z2x5LCBidXQgYnJvd3NlcmlmeSBuZWVkcyB0byBoYXZlIHRoZSByZXF1aXJlcyBleHBsaWNpdGx5IHdyaXR0ZW4uXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Y29tcHJlc3NlZDogcmVxdWlyZSgnLi9jb21wcmVzc2VkLmpzJyksXG5cdHN5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZDogcmVxdWlyZSgnLi9zeW1fZW5jcnlwdGVkX2ludGVncml0eV9wcm90ZWN0ZWQuanMnKSxcblx0cHVibGljX2tleV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXk6IHJlcXVpcmUoJy4vcHVibGljX2tleV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkuanMnKSxcblx0c3ltX2VuY3J5cHRlZF9zZXNzaW9uX2tleTogcmVxdWlyZSgnLi9zeW1fZW5jcnlwdGVkX3Nlc3Npb25fa2V5LmpzJyksXG5cdGxpdGVyYWw6IHJlcXVpcmUoJy4vbGl0ZXJhbC5qcycpLFxuXHRwdWJsaWNfa2V5OiByZXF1aXJlKCcuL3B1YmxpY19rZXkuanMnKSxcblx0c3ltbWV0cmljYWxseV9lbmNyeXB0ZWQ6IHJlcXVpcmUoJy4vc3ltbWV0cmljYWxseV9lbmNyeXB0ZWQuanMnKSxcblx0bWFya2VyOiByZXF1aXJlKCcuL21hcmtlci5qcycpLFxuXHRwdWJsaWNfc3Via2V5OiByZXF1aXJlKCcuL3B1YmxpY19zdWJrZXkuanMnKSxcblx0dXNlcl9hdHRyaWJ1dGU6IHJlcXVpcmUoJy4vdXNlcl9hdHRyaWJ1dGUuanMnKSxcblx0b25lX3Bhc3Nfc2lnbmF0dXJlOiByZXF1aXJlKCcuL29uZV9wYXNzX3NpZ25hdHVyZS5qcycpLFxuXHRzZWNyZXRfa2V5OiByZXF1aXJlKCcuL3NlY3JldF9rZXkuanMnKSxcblx0dXNlcmlkOiByZXF1aXJlKCcuL3VzZXJpZC5qcycpLFxuXHRzZWNyZXRfc3Via2V5OiByZXF1aXJlKCcuL3NlY3JldF9zdWJrZXkuanMnKSxcblx0c2lnbmF0dXJlOiByZXF1aXJlKCcuL3NpZ25hdHVyZS5qcycpLFxuXHR0cnVzdDogcmVxdWlyZSgnLi90cnVzdC5qcycpXG59XG5cbmZvcih2YXIgaSBpbiBlbnVtcy5wYWNrZXQpIHtcblx0dmFyIHBhY2tldENsYXNzID0gbW9kdWxlLmV4cG9ydHNbaV07XG5cblx0aWYocGFja2V0Q2xhc3MgIT0gdW5kZWZpbmVkKVxuXHRcdHBhY2tldENsYXNzLnByb3RvdHlwZS50YWcgPSBlbnVtcy5wYWNrZXRbaV07XG59XG4iLCJcbnZhciBlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRsaXN0OiByZXF1aXJlKCcuL3BhY2tldGxpc3QuanMnKSxcbiAgaW86IHJlcXVpcmUoJy4vcGFja2V0LmpzJylcbn07XG5cbnZhciBwYWNrZXRzID0gcmVxdWlyZSgnLi9hbGxfcGFja2V0cy5qcycpO1xuXG5mb3IodmFyIGkgaW4gcGFja2V0cylcblx0bW9kdWxlLmV4cG9ydHNbaV0gPSBwYWNrZXRzW2ldO1xuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIExpdGVyYWwgRGF0YSBQYWNrZXQgKFRhZyAxMSlcbiAqIFxuICogUkZDNDg4MCA1Ljk6IEEgTGl0ZXJhbCBEYXRhIHBhY2tldCBjb250YWlucyB0aGUgYm9keSBvZiBhIG1lc3NhZ2U7IGRhdGEgdGhhdFxuICogaXMgbm90IHRvIGJlIGZ1cnRoZXIgaW50ZXJwcmV0ZWQuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X2xpdGVyYWwoKSB7XG5cdHRoaXMuZm9ybWF0ID0gJ3V0ZjgnO1xuXHR0aGlzLmRhdGEgPSAnJztcblx0dGhpcy5kYXRlID0gbmV3IERhdGUoKTtcblxuXHRcblx0LyoqXG5cdCAqIFNldCB0aGUgcGFja2V0IGRhdGEgdG8gYSBqYXZhc2NyaXB0IG5hdGl2ZSBzdHJpbmcgb3IgYSBzcXVlbmNlIG9mIFxuXHQgKiBieXRlcy4gQ29udmVyc2lvbiB0byBhIHByb3BlciB1dGY4IGVuY29kaW5nIHRha2VzIHBsYWNlIHdoZW4gdGhlIFxuXHQgKiBwYWNrZXQgaXMgd3JpdHRlbi5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBBbnkgbmF0aXZlIGphdmFzY3JpcHQgc3RyaW5nXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9wYWNrZXRfbGl0ZXJhbGRhdGEuZm9ybWF0fSBmb3JtYXQgXG5cdCAqL1xuXHR0aGlzLnNldCA9IGZ1bmN0aW9uKHN0ciwgZm9ybWF0KSB7XG5cdFx0dGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG5cdFx0dGhpcy5kYXRhID0gc3RyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgcGFja2V0IGRhdGEgdG8gdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIHByb3ZpZGVkIHN0cmluZ1xuXHQgKiBvZiBieXRlcyB0b2dldGhlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIGZvcm1hdC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGJ5dGVzIFRoZSBzdHJpbmcgb2YgYnl0ZXNcblx0ICogQHBhcmFtIHtvcGVucGdwX3BhY2tldF9saXRlcmFsZGF0YS5mb3JtYXR9IGZvcm1hdFxuXHQgKi9cblx0dGhpcy5zZXRCeXRlcyA9IGZ1bmN0aW9uKGJ5dGVzLCBmb3JtYXQpIHtcblx0XHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblxuXHRcdGlmKGZvcm1hdCA9PSAndXRmOCcpXG5cdFx0XHRieXRlcyA9IHV0aWwuZGVjb2RlX3V0ZjgoYnl0ZXMpO1xuXG5cdFx0dGhpcy5kYXRhID0gYnl0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGUgbGl0ZXJhbCBwYWNrZXQgZGF0YVxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBBIHNlcXVlbmNlIG9mIGJ5dGVzXG5cdCAqL1xuXHR0aGlzLmdldEJ5dGVzID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYodGhpcy5mb3JtYXQgPT0gJ3V0ZjgnKVxuXHRcdFx0cmV0dXJuIHV0aWwuZW5jb2RlX3V0ZjgodGhpcy5kYXRhKTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhO1xuXHR9XG5cdFxuXHRcblxuXHQvKipcblx0ICogUGFyc2luZyBmdW5jdGlvbiBmb3IgYSBsaXRlcmFsIGRhdGEgcGFja2V0ICh0YWcgMTEpLlxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFBheWxvYWQgb2YgYSB0YWcgMTEgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb25cblx0ICogICAgICAgICAgICBQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmluZ1xuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlblxuXHQgKiAgICAgICAgICAgIExlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mXG5cdCAqICAgICAgICAgICAgaW5wdXQgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gb2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdC8vIC0gQSBvbmUtb2N0ZXQgZmllbGQgdGhhdCBkZXNjcmliZXMgaG93IHRoZSBkYXRhIGlzIGZvcm1hdHRlZC5cblxuXHRcdHZhciBmb3JtYXQgPSBlbnVtcy5yZWFkKGVudW1zLmxpdGVyYWwsIGJ5dGVzWzBdLmNoYXJDb2RlQXQoKSk7XG5cblx0XHR2YXIgZmlsZW5hbWVfbGVuID0gYnl0ZXMuY2hhckNvZGVBdCgxKTtcblx0XHR0aGlzLmZpbGVuYW1lID0gdXRpbC5kZWNvZGVfdXRmOChieXRlcy5zdWJzdHIoMiwgZmlsZW5hbWVfbGVuKSk7XG5cblx0XHR0aGlzLmRhdGUgPSB1dGlsLnJlYWREYXRlKGJ5dGVzLnN1YnN0cigyXG5cdFx0XHRcdCsgZmlsZW5hbWVfbGVuLCA0KSk7XG5cblx0XHR2YXIgZGF0YSA9IGJ5dGVzLnN1YnN0cmluZyg2ICsgZmlsZW5hbWVfbGVuKTtcblx0XG5cdFx0dGhpcy5zZXRCeXRlcyhkYXRhLCBmb3JtYXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhY2tldFxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYmUgaW5zZXJ0ZWQgYXMgYm9keVxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZy1yZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFja2V0XG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZpbGVuYW1lID0gdXRpbC5lbmNvZGVfdXRmOChcIm1zZy50eHRcIik7XG5cblx0XHR2YXIgZGF0YSA9IHRoaXMuZ2V0Qnl0ZXMoKTtcblxuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShlbnVtcy53cml0ZShlbnVtcy5saXRlcmFsLCB0aGlzLmZvcm1hdCkpO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZpbGVuYW1lLmxlbmd0aCk7XG5cdFx0cmVzdWx0ICs9IGZpbGVuYW1lO1xuXHRcdHJlc3VsdCArPSB1dGlsLndyaXRlRGF0ZSh0aGlzLmRhdGUpO1xuXHRcdHJlc3VsdCArPSBkYXRhO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHJhbmdlIFwiTWFya2VyIHBhY2tldFwiIChUYWcgMTApXG4gKiBcbiAqIFJGQzQ4ODAgNS44OiBBbiBleHBlcmltZW50YWwgdmVyc2lvbiBvZiBQR1AgdXNlZCB0aGlzIHBhY2tldCBhcyB0aGUgTGl0ZXJhbFxuICogcGFja2V0LCBidXQgbm8gcmVsZWFzZWQgdmVyc2lvbiBvZiBQR1AgZ2VuZXJhdGVkIExpdGVyYWwgcGFja2V0cyB3aXRoIHRoaXNcbiAqIHRhZy4gV2l0aCBQR1AgNS54LCB0aGlzIHBhY2tldCBoYXMgYmVlbiByZWFzc2lnbmVkIGFuZCBpcyByZXNlcnZlZCBmb3IgdXNlIGFzXG4gKiB0aGUgTWFya2VyIHBhY2tldC5cbiAqIFxuICogU3VjaCBhIHBhY2tldCBNVVNUIGJlIGlnbm9yZWQgd2hlbiByZWNlaXZlZC5cbiAqL1xuZnVuY3Rpb24gcGFja2V0X21hcmtlcigpIHtcblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgbGl0ZXJhbCBkYXRhIHBhY2tldCAodGFnIDEwKS5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBQYXlsb2FkIG9mIGEgdGFnIDEwIHBhY2tldFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHBvc2l0aW9uXG5cdCAqICAgICAgICAgICAgUG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5cblx0ICogICAgICAgICAgICBMZW5ndGggb2YgdGhlIHBhY2tldCBvciB0aGUgcmVtYWluaW5nIGxlbmd0aCBvZlxuXHQgKiAgICAgICAgICAgIGlucHV0IGF0IHBvc2l0aW9uXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfcGFja2V0X2VuY3J5cHRlZGRhdGF9IE9iamVjdCByZXByZXNlbnRhdGlvblxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHRpZiAoYnl0ZXNbMF0uY2hhckNvZGVBdCgpID09IDB4NTAgJiYgLy8gUFxuXHRcdFx0XHRieXRlc1sxXS5jaGFyQ29kZUF0KCkgPT0gMHg0NyAmJiAvLyBHXG5cdFx0XHRcdGJ5dGVzWzJdLmNoYXJDb2RlQXQoKSA9PSAweDUwKSAvLyBQXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHQvLyBtYXJrZXIgcGFja2V0IGRvZXMgbm90IGNvbnRhaW4gXCJQR1BcIlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhY2tldF9tYXJrZXI7XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT25lLVBhc3MgU2lnbmF0dXJlIFBhY2tldHMgKFRhZyA0KVxuICogXG4gKiBSRkM0ODgwIDUuNDpcbiAqIFRoZSBPbmUtUGFzcyBTaWduYXR1cmUgcGFja2V0IHByZWNlZGVzIHRoZSBzaWduZWQgZGF0YSBhbmQgY29udGFpbnNcbiAqIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbGxvdyB0aGUgcmVjZWl2ZXIgdG8gYmVnaW4gY2FsY3VsYXRpbmcgYW55XG4gKiBoYXNoZXMgbmVlZGVkIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiAgSXQgYWxsb3dzIHRoZSBTaWduYXR1cmVcbiAqIHBhY2tldCB0byBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSwgc28gdGhhdCB0aGUgc2lnbmVyXG4gKiBjYW4gY29tcHV0ZSB0aGUgZW50aXJlIHNpZ25lZCBtZXNzYWdlIGluIG9uZSBwYXNzLlxuICovXG5cbnZhciBlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdHR5cGVfa2V5aWQgPSByZXF1aXJlKCcuLi90eXBlL2tleWlkLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X29uZV9wYXNzX3NpZ25hdHVyZSgpIHtcblx0dGhpcy52ZXJzaW9uID0gbnVsbDsgLy8gQSBvbmUtb2N0ZXQgdmVyc2lvbiBudW1iZXIuICBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIDMuXG5cdHRoaXMudHlwZSA9IG51bGw7IFx0IC8vIEEgb25lLW9jdGV0IHNpZ25hdHVyZSB0eXBlLiAgU2lnbmF0dXJlIHR5cGVzIGFyZSBkZXNjcmliZWQgaW4gUkZDNDg4MCBTZWN0aW9uIDUuMi4xLlxuXHR0aGlzLmhhc2hBbGdvcml0aG0gPSBudWxsOyBcdCAgIC8vIEEgb25lLW9jdGV0IG51bWJlciBkZXNjcmliaW5nIHRoZSBoYXNoIGFsZ29yaXRobSB1c2VkLiAoU2VlIFJGQzQ4ODAgOS40KVxuXHR0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9IG51bGw7XHQgICAgIC8vIEEgb25lLW9jdGV0IG51bWJlciBkZXNjcmliaW5nIHRoZSBwdWJsaWMta2V5IGFsZ29yaXRobSB1c2VkLiAoU2VlIFJGQzQ4ODAgOS4xKVxuXHR0aGlzLnNpZ25pbmdLZXlJZCA9IG51bGw7IC8vIEFuIGVpZ2h0LW9jdGV0IG51bWJlciBob2xkaW5nIHRoZSBLZXkgSUQgb2YgdGhlIHNpZ25pbmcga2V5LlxuXHR0aGlzLmZsYWdzID0gbnVsbDsgXHQvLyAgQSBvbmUtb2N0ZXQgbnVtYmVyIGhvbGRpbmcgYSBmbGFnIHNob3dpbmcgd2hldGhlciB0aGUgc2lnbmF0dXJlIGlzIG5lc3RlZC4gIEEgemVybyB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbmV4dCBwYWNrZXQgaXMgYW5vdGhlciBPbmUtUGFzcyBTaWduYXR1cmUgcGFja2V0IHRoYXQgZGVzY3JpYmVzIGFub3RoZXIgc2lnbmF0dXJlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNhbWUgbWVzc2FnZSBkYXRhLlxuXG5cdC8qKlxuXHQgKiBwYXJzaW5nIGZ1bmN0aW9uIGZvciBhIG9uZS1wYXNzIHNpZ25hdHVyZSBwYWNrZXQgKHRhZyA0KS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGJ5dGVzIHBheWxvYWQgb2YgYSB0YWcgNCBwYWNrZXRcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBwb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGJ5dGVzIHN0cmluZ1xuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlbiBsZW5ndGggb2YgdGhlIHBhY2tldCBvciB0aGUgcmVtYWluaW5nIGxlbmd0aCBvZiBieXRlcyBhdCBwb3NpdGlvblxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhfSBvYmplY3QgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0dmFyIG15cG9zID0gMDtcblx0XHQvLyBBIG9uZS1vY3RldCB2ZXJzaW9uIG51bWJlci4gIFRoZSBjdXJyZW50IHZlcnNpb24gaXMgMy5cblx0XHR0aGlzLnZlcnNpb24gPSBieXRlcy5jaGFyQ29kZUF0KG15cG9zKyspO1xuXG5cdCAgICAgLy8gQSBvbmUtb2N0ZXQgc2lnbmF0dXJlIHR5cGUuICBTaWduYXR1cmUgdHlwZXMgYXJlIGRlc2NyaWJlZCBpblxuXHQgICAgIC8vICAgU2VjdGlvbiA1LjIuMS5cblx0XHR0aGlzLnR5cGUgPSBlbnVtcy5yZWFkKGVudW1zLnNpZ25hdHVyZSwgYnl0ZXMuY2hhckNvZGVBdChteXBvcysrKSk7XG5cblx0ICAgICAvLyBBIG9uZS1vY3RldCBudW1iZXIgZGVzY3JpYmluZyB0aGUgaGFzaCBhbGdvcml0aG0gdXNlZC5cblx0XHR0aGlzLmhhc2hBbGdvcml0aG0gPSBlbnVtcy5yZWFkKGVudW1zLmhhc2gsIGJ5dGVzLmNoYXJDb2RlQXQobXlwb3MrKykpO1xuXG5cdCAgICAgLy8gQSBvbmUtb2N0ZXQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIHB1YmxpYy1rZXkgYWxnb3JpdGhtIHVzZWQuXG5cdFx0dGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBlbnVtcy5yZWFkKGVudW1zLnB1YmxpY0tleSwgYnl0ZXMuY2hhckNvZGVBdChteXBvcysrKSk7XG5cblx0ICAgICAvLyBBbiBlaWdodC1vY3RldCBudW1iZXIgaG9sZGluZyB0aGUgS2V5IElEIG9mIHRoZSBzaWduaW5nIGtleS5cblx0XHR0aGlzLnNpZ25pbmdLZXlJZCA9IG5ldyB0eXBlX2tleWlkKCk7XG5cdFx0dGhpcy5zaWduaW5nS2V5SWQucmVhZChieXRlcy5zdWJzdHIobXlwb3MpKTtcblx0XHRteXBvcyArPSA4O1xuXHRcdFxuXHQgICAgIC8vIEEgb25lLW9jdGV0IG51bWJlciBob2xkaW5nIGEgZmxhZyBzaG93aW5nIHdoZXRoZXIgdGhlIHNpZ25hdHVyZVxuXHQgICAgIC8vICAgaXMgbmVzdGVkLiAgQSB6ZXJvIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBuZXh0IHBhY2tldCBpc1xuXHQgICAgIC8vICAgYW5vdGhlciBPbmUtUGFzcyBTaWduYXR1cmUgcGFja2V0IHRoYXQgZGVzY3JpYmVzIGFub3RoZXJcblx0ICAgICAvLyAgIHNpZ25hdHVyZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBzYW1lIG1lc3NhZ2UgZGF0YS5cblx0XHR0aGlzLmZsYWdzID0gYnl0ZXMuY2hhckNvZGVBdChteXBvcysrKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBjcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgb25lLXBhc3Mgc2lnbmF0dXJlIHBhY2tldFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHR5cGUgU2lnbmF0dXJlIHR5cGVzIGFzIGRlc2NyaWJlZCBpbiBSRkM0ODgwIFNlY3Rpb24gNS4yLjEuXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gaGFzaGFsZ29yaXRobSB0aGUgaGFzaCBhbGdvcml0aG0gdXNlZCB3aXRoaW4gdGhlIHNpZ25hdHVyZVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXl9IHByaXZhdGVrZXkgdGhlIHByaXZhdGUga2V5IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNpZ25hdHVyZVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlbmd0aCBsZW5ndGggb2YgZGF0YSB0byBiZSBzaWduZWRcblx0ICogQHBhcmFtIHtib29sZWFufSBuZXN0ZWQgYm9vbGVhbiBzaG93aW5nIHdoZXRoZXIgdGhlIHNpZ25hdHVyZSBpcyBuZXN0ZWQuIFxuXHQgKiAgXCJ0cnVlXCIgaW5kaWNhdGVzIHRoYXQgdGhlIG5leHQgcGFja2V0IGlzIGFub3RoZXIgT25lLVBhc3MgU2lnbmF0dXJlIHBhY2tldFxuXHQgKiAgIHRoYXQgZGVzY3JpYmVzIGFub3RoZXIgc2lnbmF0dXJlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHNhbWUgbWVzc2FnZSBkYXRhLiBcblx0ICogQHJldHVybiB7U3RyaW5nfSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG9uZS1wYXNzIHNpZ25hdHVyZSBwYWNrZXRcblx0ICovXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbih0eXBlLCBoYXNoYWxnb3JpdGhtLCBwcml2YXRla2V5LCBsZW5ndGgsIG5lc3RlZCkge1xuXHRcdHZhciByZXN1bHQgPVwiXCI7IFxuXHRcdFxuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDMpO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLnNpZ25hdHVyZSwgdHlwZSkpO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLmhhc2gsIHRoaXMuaGFzaEFsZ29yaXRobSkpO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLnB1YmxpY0tleSwgcHJpdmF0ZWtleS5hbGdvcml0aG0pKTtcblx0XHRyZXN1bHQgKz0gcHJpdmF0ZWtleS5nZXRLZXlJZCgpO1xuXHRcdGlmIChuZXN0ZWQpXG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTtcblx0XHRlbHNlXG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgxKTtcblx0XHRcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59O1xuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKSxcblx0dXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVhZFNpbXBsZUxlbmd0aDogZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgbGVuID0gMCxcblx0XHRcdG9mZnNldCxcblx0XHRcdHR5cGUgPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cblxuXHRcdGlmICh0eXBlIDwgMTkyKSB7XG5cdFx0XHRsZW4gPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHRvZmZzZXQgPSAxO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA8IDI1NSkge1xuXHRcdFx0bGVuID0gKChieXRlc1swXS5jaGFyQ29kZUF0KCkgLSAxOTIpIDw8IDgpICsgKGJ5dGVzWzFdLmNoYXJDb2RlQXQoKSkgKyAxOTI7XG5cdFx0XHRvZmZzZXQgPSAyO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PSAyNTUpIHtcblx0XHRcdGxlbiA9IHV0aWwucmVhZE51bWJlcihieXRlcy5zdWJzdHIoMSwgNCkpO1xuXHRcdFx0b2Zmc2V0ID0gNTtcblx0XHR9XG5cblx0XHRyZXR1cm4geyBsZW46IGxlbiwgb2Zmc2V0OiBvZmZzZXQgfTtcblx0fSxcblxuXHQvKipcblx0ICogRW5jb2RlcyBhIGdpdmVuIGludGVnZXIgb2YgbGVuZ3RoIHRvIHRoZSBvcGVucGdwIGxlbmd0aCBzcGVjaWZpZXIgdG8gYVxuXHQgKiBzdHJpbmdcblx0ICogXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIFRoZSBsZW5ndGggdG8gZW5jb2RlXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIHdpdGggb3BlbnBncCBsZW5ndGggcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHdyaXRlU2ltcGxlTGVuZ3RoOiBmdW5jdGlvbihsZW5ndGgpIHtcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcblx0XHRpZiAobGVuZ3RoIDwgMTkyKSB7XG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW5ndGgpO1xuXHRcdH0gZWxzZSBpZiAobGVuZ3RoID4gMTkxICYmIGxlbmd0aCA8IDgzODQpIHtcblx0XHRcdC8qXG5cdFx0XHQgKiBsZXQgYSA9ICh0b3RhbCBkYXRhIHBhY2tldCBsZW5ndGgpIC0gMTkyIGxldCBiYyA9IHR3byBvY3RldFxuXHRcdFx0ICogcmVwcmVzZW50YXRpb24gb2YgYSBsZXQgZCA9IGIgKyAxOTJcblx0XHRcdCAqL1xuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChsZW5ndGggLSAxOTIpID4+IDgpICsgMTkyKTtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChsZW5ndGggLSAxOTIpICYgMHhGRik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSk7XG5cdFx0XHRyZXN1bHQgKz0gdXRpbC53cml0ZU51bWJlcihsZW5ndGgsIDQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBXcml0ZXMgYSBwYWNrZXQgaGVhZGVyIHZlcnNpb24gNCB3aXRoIHRoZSBnaXZlbiB0YWdfdHlwZSBhbmQgbGVuZ3RoIHRvIGFcblx0ICogc3RyaW5nXG5cdCAqIFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHRhZ190eXBlIFRhZyB0eXBlXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFN0cmluZyBvZiB0aGUgaGVhZGVyXG5cdCAqL1xuXHR3cml0ZUhlYWRlcjogZnVuY3Rpb24odGFnX3R5cGUsIGxlbmd0aCkge1xuXHRcdC8qIHdlJ3JlIG9ubHkgZ2VuZXJhdGluZyB2NCBwYWNrZXQgaGVhZGVycyBoZXJlICovXG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhDMCB8IHRhZ190eXBlKTtcblx0XHRyZXN1bHQgKz0gdGhpcy53cml0ZVNpbXBsZUxlbmd0aChsZW5ndGgpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFdyaXRlcyBhIHBhY2tldCBoZWFkZXIgVmVyc2lvbiAzIHdpdGggdGhlIGdpdmVuIHRhZ190eXBlIGFuZCBsZW5ndGggdG8gYVxuXHQgKiBzdHJpbmdcblx0ICogXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gdGFnX3R5cGUgVGFnIHR5cGVcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBwYXlsb2FkXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIG9mIHRoZSBoZWFkZXJcblx0ICovXG5cdHdyaXRlT2xkSGVhZGVyOiBmdW5jdGlvbih0YWdfdHlwZSwgbGVuZ3RoKSB7XG5cdFx0dmFyIHJlc3VsdCA9IFwiXCI7XG5cdFx0aWYgKGxlbmd0aCA8IDI1Nikge1xuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHg4MCB8ICh0YWdfdHlwZSA8PCAyKSk7XG5cdFx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW5ndGgpO1xuXHRcdH0gZWxzZSBpZiAobGVuZ3RoIDwgNjU1MzYpIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAodGFnX3R5cGUgPDwgMikgfCAxKTtcblx0XHRcdHJlc3VsdCArPSB1dGlsLndyaXRlTnVtYmVyKGxlbmd0aCwgMik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAodGFnX3R5cGUgPDwgMikgfCAyKTtcblx0XHRcdHJlc3VsdCArPSB1dGlsLndyaXRlTnVtYmVyKGxlbmd0aCwgNCk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdlbmVyaWMgc3RhdGljIFBhY2tldCBQYXJzZXIgZnVuY3Rpb25cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBJbnB1dCBzdHJlYW0gYXMgc3RyaW5nXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gdG8gc3RhcnQgcGFyc2luZ1xuXHQgKiBAcGFyYW0ge2ludGVnZXJ9IGxlbiBMZW5ndGggb2YgdGhlIGlucHV0IGZyb20gcG9zaXRpb24gb25cblx0ICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGEgcGFyc2VkIG9wZW5wZ3BfcGFja2V0XG5cdCAqL1xuXHRyZWFkOiBmdW5jdGlvbihpbnB1dCwgcG9zaXRpb24sIGxlbikge1xuXHRcdC8vIHNvbWUgc2FuaXR5IGNoZWNrc1xuXHRcdGlmIChpbnB1dCA9PSBudWxsIHx8IGlucHV0Lmxlbmd0aCA8PSBwb3NpdGlvblxuXHRcdFx0XHR8fCBpbnB1dC5zdWJzdHJpbmcocG9zaXRpb24pLmxlbmd0aCA8IDJcblx0XHRcdFx0fHwgKGlucHV0W3Bvc2l0aW9uXS5jaGFyQ29kZUF0KCkgJiAweDgwKSA9PSAwKSB7XG5cdFx0XHR1dGlsXG5cdFx0XHRcdFx0LnByaW50X2Vycm9yKFwiRXJyb3IgZHVyaW5nIHBhcnNpbmcuIFRoaXMgbWVzc2FnZSAvIGtleSBpcyBwcm9iYWJseSBub3QgY29udGFpbmluZyBhIHZhbGlkIE9wZW5QR1AgZm9ybWF0LlwiKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHR2YXIgbXlwb3MgPSBwb3NpdGlvbjtcblx0XHR2YXIgdGFnID0gLTE7XG5cdFx0dmFyIGZvcm1hdCA9IC0xO1xuXHRcdHZhciBwYWNrZXRfbGVuZ3RoO1xuXG5cdFx0Zm9ybWF0ID0gMDsgLy8gMCA9IG9sZCBmb3JtYXQ7IDEgPSBuZXcgZm9ybWF0XG5cdFx0aWYgKChpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpICYgMHg0MCkgIT0gMCkge1xuXHRcdFx0Zm9ybWF0ID0gMTtcblx0XHR9XG5cblx0XHR2YXIgcGFja2V0X2xlbmd0aF90eXBlO1xuXHRcdGlmIChmb3JtYXQpIHtcblx0XHRcdC8vIG5ldyBmb3JtYXQgaGVhZGVyXG5cdFx0XHR0YWcgPSBpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpICYgMHgzRjsgLy8gYml0IDUtMFxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBvbGQgZm9ybWF0IGhlYWRlclxuXHRcdFx0dGFnID0gKGlucHV0W215cG9zXS5jaGFyQ29kZUF0KCkgJiAweDNGKSA+PiAyOyAvLyBiaXQgNS0yXG5cdFx0XHRwYWNrZXRfbGVuZ3RoX3R5cGUgPSBpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpICYgMHgwMzsgLy8gYml0IDEtMFxuXHRcdH1cblxuXHRcdC8vIGhlYWRlciBvY3RldCBwYXJzaW5nIGRvbmVcblx0XHRteXBvcysrO1xuXG5cdFx0Ly8gcGFyc2VkIGxlbmd0aCBmcm9tIGxlbmd0aCBmaWVsZFxuXHRcdHZhciBib2R5ZGF0YSA9IG51bGw7XG5cblx0XHQvLyB1c2VkIGZvciBwYXJ0aWFsIGJvZHkgbGVuZ3Roc1xuXHRcdHZhciByZWFsX3BhY2tldF9sZW5ndGggPSAtMTtcblx0XHRpZiAoIWZvcm1hdCkge1xuXHRcdFx0Ly8gNC4yLjEuIE9sZCBGb3JtYXQgUGFja2V0IExlbmd0aHNcblx0XHRcdHN3aXRjaCAocGFja2V0X2xlbmd0aF90eXBlKSB7XG5cdFx0XHRjYXNlIDA6IC8vIFRoZSBwYWNrZXQgaGFzIGEgb25lLW9jdGV0IGxlbmd0aC4gVGhlIGhlYWRlciBpcyAyIG9jdGV0c1xuXHRcdFx0XHQvLyBsb25nLlxuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTogLy8gVGhlIHBhY2tldCBoYXMgYSB0d28tb2N0ZXQgbGVuZ3RoLiBUaGUgaGVhZGVyIGlzIDMgb2N0ZXRzXG5cdFx0XHRcdC8vIGxvbmcuXG5cdFx0XHRcdHBhY2tldF9sZW5ndGggPSAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDgpXG5cdFx0XHRcdFx0XHR8IGlucHV0W215cG9zKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDI6IC8vIFRoZSBwYWNrZXQgaGFzIGEgZm91ci1vY3RldCBsZW5ndGguIFRoZSBoZWFkZXIgaXMgNVxuXHRcdFx0XHQvLyBvY3RldHMgbG9uZy5cblx0XHRcdFx0cGFja2V0X2xlbmd0aCA9IChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgPDwgMjQpXG5cdFx0XHRcdFx0XHR8IChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgPDwgMTYpXG5cdFx0XHRcdFx0XHR8IChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgPDwgOClcblx0XHRcdFx0XHRcdHwgaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIDMgLSBUaGUgcGFja2V0IGlzIG9mIGluZGV0ZXJtaW5hdGUgbGVuZ3RoLiBUaGUgaGVhZGVyIGlzIDFcblx0XHRcdFx0Ly8gb2N0ZXQgbG9uZywgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGRldGVybWluZSBob3cgbG9uZ1xuXHRcdFx0XHQvLyB0aGUgcGFja2V0IGlzLiBJZiB0aGUgcGFja2V0IGlzIGluIGEgZmlsZSwgdGhpcyBtZWFucyB0aGF0XG5cdFx0XHRcdC8vIHRoZSBwYWNrZXQgZXh0ZW5kcyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBJbiBnZW5lcmFsLCBcblx0XHRcdFx0Ly8gYW4gaW1wbGVtZW50YXRpb24gU0hPVUxEIE5PVCB1c2UgaW5kZXRlcm1pbmF0ZS1sZW5ndGggXG5cdFx0XHRcdC8vIHBhY2tldHMgZXhjZXB0IHdoZXJlIHRoZSBlbmQgb2YgdGhlIGRhdGEgd2lsbCBiZSBjbGVhciBcblx0XHRcdFx0Ly8gZnJvbSB0aGUgY29udGV4dCwgYW5kIGV2ZW4gdGhlbiBpdCBpcyBiZXR0ZXIgdG8gdXNlIGEgXG5cdFx0XHRcdC8vIGRlZmluaXRlIGxlbmd0aCwgb3IgYSBuZXcgZm9ybWF0IGhlYWRlci4gVGhlIG5ldyBmb3JtYXQgXG5cdFx0XHRcdC8vIGhlYWRlcnMgZGVzY3JpYmVkIGJlbG93IGhhdmUgYSBtZWNoYW5pc20gZm9yIHByZWNpc2VseVxuXHRcdFx0XHQvLyBlbmNvZGluZyBkYXRhIG9mIGluZGV0ZXJtaW5hdGUgbGVuZ3RoLlxuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gbGVuO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdH0gZWxzZSAvLyA0LjIuMi4gTmV3IEZvcm1hdCBQYWNrZXQgTGVuZ3Roc1xuXHRcdHtcblxuXHRcdFx0Ly8gNC4yLjIuMS4gT25lLU9jdGV0IExlbmd0aHNcblx0XHRcdGlmIChpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpIDwgMTkyKSB7XG5cdFx0XHRcdHBhY2tldF9sZW5ndGggPSBpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHRcdHV0aWwucHJpbnRfZGVidWcoXCIxIGJ5dGUgbGVuZ3RoOlwiICsgcGFja2V0X2xlbmd0aCk7XG5cdFx0XHRcdC8vIDQuMi4yLjIuIFR3by1PY3RldCBMZW5ndGhzXG5cdFx0XHR9IGVsc2UgaWYgKGlucHV0W215cG9zXS5jaGFyQ29kZUF0KCkgPj0gMTkyXG5cdFx0XHRcdFx0JiYgaW5wdXRbbXlwb3NdLmNoYXJDb2RlQXQoKSA8IDIyNCkge1xuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gKChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkgLSAxOTIpIDw8IDgpXG5cdFx0XHRcdFx0XHQrIChpbnB1dFtteXBvcysrXS5jaGFyQ29kZUF0KCkpICsgMTkyO1xuXHRcdFx0XHR1dGlsLnByaW50X2RlYnVnKFwiMiBieXRlIGxlbmd0aDpcIiArIHBhY2tldF9sZW5ndGgpO1xuXHRcdFx0XHQvLyA0LjIuMi40LiBQYXJ0aWFsIEJvZHkgTGVuZ3Roc1xuXHRcdFx0fSBlbHNlIGlmIChpbnB1dFtteXBvc10uY2hhckNvZGVBdCgpID4gMjIzXG5cdFx0XHRcdFx0JiYgaW5wdXRbbXlwb3NdLmNoYXJDb2RlQXQoKSA8IDI1NSkge1xuXHRcdFx0XHRwYWNrZXRfbGVuZ3RoID0gMSA8PCAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpICYgMHgxRik7XG5cdFx0XHRcdHV0aWwucHJpbnRfZGVidWcoXCI0IGJ5dGUgbGVuZ3RoOlwiICsgcGFja2V0X2xlbmd0aCk7XG5cdFx0XHRcdC8vIEVFRUssIHdlJ3JlIHJlYWRpbmcgdGhlIGZ1bGwgZGF0YSBoZXJlLi4uXG5cdFx0XHRcdHZhciBteXBvczIgPSBteXBvcyArIHBhY2tldF9sZW5ndGg7XG5cdFx0XHRcdGJvZHlkYXRhID0gaW5wdXQuc3Vic3RyaW5nKG15cG9zLCBteXBvcyArIHBhY2tldF9sZW5ndGgpO1xuXHRcdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRcdGlmIChpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA8IDE5Mikge1xuXHRcdFx0XHRcdFx0dmFyIHRtcGxlbiA9IGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHRcdFx0XHRwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcblx0XHRcdFx0XHRcdGJvZHlkYXRhICs9IGlucHV0LnN1YnN0cmluZyhteXBvczIsIG15cG9zMiArIHRtcGxlbik7XG5cdFx0XHRcdFx0XHRteXBvczIgKz0gdG1wbGVuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA+PSAxOTJcblx0XHRcdFx0XHRcdFx0JiYgaW5wdXRbbXlwb3MyXS5jaGFyQ29kZUF0KCkgPCAyMjQpIHtcblx0XHRcdFx0XHRcdHZhciB0bXBsZW4gPSAoKGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCkgLSAxOTIpIDw8IDgpXG5cdFx0XHRcdFx0XHRcdFx0KyAoaW5wdXRbbXlwb3MyKytdLmNoYXJDb2RlQXQoKSkgKyAxOTI7XG5cdFx0XHRcdFx0XHRwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcblx0XHRcdFx0XHRcdGJvZHlkYXRhICs9IGlucHV0LnN1YnN0cmluZyhteXBvczIsIG15cG9zMiArIHRtcGxlbik7XG5cdFx0XHRcdFx0XHRteXBvczIgKz0gdG1wbGVuO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA+IDIyM1xuXHRcdFx0XHRcdFx0XHQmJiBpbnB1dFtteXBvczJdLmNoYXJDb2RlQXQoKSA8IDI1NSkge1xuXHRcdFx0XHRcdFx0dmFyIHRtcGxlbiA9IDEgPDwgKGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCkgJiAweDFGKTtcblx0XHRcdFx0XHRcdHBhY2tldF9sZW5ndGggKz0gdG1wbGVuO1xuXHRcdFx0XHRcdFx0Ym9keWRhdGEgKz0gaW5wdXQuc3Vic3RyaW5nKG15cG9zMiwgbXlwb3MyICsgdG1wbGVuKTtcblx0XHRcdFx0XHRcdG15cG9zMiArPSB0bXBsZW47XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG15cG9zMisrO1xuXHRcdFx0XHRcdFx0dmFyIHRtcGxlbiA9IChpbnB1dFtteXBvczIrK10uY2hhckNvZGVBdCgpIDw8IDI0KVxuXHRcdFx0XHRcdFx0XHRcdHwgKGlucHV0W215cG9zMisrXS5jaGFyQ29kZUF0KCkgPDwgMTYpXG5cdFx0XHRcdFx0XHRcdFx0fCAoaW5wdXRbbXlwb3MyKytdLmNoYXJDb2RlQXQoKSA8PCA4KVxuXHRcdFx0XHRcdFx0XHRcdHwgaW5wdXRbbXlwb3MyKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdFx0XHRcdGJvZHlkYXRhICs9IGlucHV0LnN1YnN0cmluZyhteXBvczIsIG15cG9zMiArIHRtcGxlbik7XG5cdFx0XHRcdFx0XHRwYWNrZXRfbGVuZ3RoICs9IHRtcGxlbjtcblx0XHRcdFx0XHRcdG15cG9zMiArPSB0bXBsZW47XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmVhbF9wYWNrZXRfbGVuZ3RoID0gbXlwb3MyO1xuXHRcdFx0XHQvLyA0LjIuMi4zLiBGaXZlLU9jdGV0IExlbmd0aHNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG15cG9zKys7XG5cdFx0XHRcdHBhY2tldF9sZW5ndGggPSAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDI0KVxuXHRcdFx0XHRcdFx0fCAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDE2KVxuXHRcdFx0XHRcdFx0fCAoaW5wdXRbbXlwb3MrK10uY2hhckNvZGVBdCgpIDw8IDgpXG5cdFx0XHRcdFx0XHR8IGlucHV0W215cG9zKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBpZiB0aGVyZSB3YXMnbnQgYSBwYXJ0aWFsIGJvZHkgbGVuZ3RoOiB1c2UgdGhlIHNwZWNpZmllZFxuXHRcdC8vIHBhY2tldF9sZW5ndGhcblx0XHRpZiAocmVhbF9wYWNrZXRfbGVuZ3RoID09IC0xKSB7XG5cdFx0XHRyZWFsX3BhY2tldF9sZW5ndGggPSBwYWNrZXRfbGVuZ3RoO1xuXHRcdH1cblxuXHRcdGlmIChib2R5ZGF0YSA9PSBudWxsKSB7XG5cdFx0XHRib2R5ZGF0YSA9IGlucHV0LnN1YnN0cmluZyhteXBvcywgbXlwb3MgKyByZWFsX3BhY2tldF9sZW5ndGgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7IFxuXHRcdFx0dGFnOiB0YWcsXG5cdFx0XHRwYWNrZXQ6IGJvZHlkYXRhLFxuXHRcdFx0b2Zmc2V0OiBteXBvcyArIHJlYWxfcGFja2V0X2xlbmd0aFxuXHRcdH07XG5cdH1cbn1cblxuIiwiXG5cbnZhciBwYWNrZXRQYXJzZXIgPSByZXF1aXJlKCcuL3BhY2tldC5qcycpLFxuXHRwYWNrZXRzID0gcmVxdWlyZSgnLi9hbGxfcGFja2V0cy5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGxpc3Qgb2Ygb3BlbnBncCBwYWNrZXRzLlxuICogVGFrZSBjYXJlIHdoZW4gaXRlcmF0aW5nIG92ZXIgaXQgLSB0aGUgcGFja2V0cyB0aGVtc2VsdmVzXG4gKiBhcmUgc3RvcmVkIGFzIG51bWVyaWNhbCBpbmRpY2VzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldGxpc3QoKSB7XG5cdC8qKiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgY29udGFpbmVkIHdpdGhpbiB0aGUgbGlzdC5cblx0ICogQHJlYWRvbmx5XG5cdCAqIEB0eXBlIHtJbnRlZ2VyfSAqL1xuXHR0aGlzLmxlbmd0aCA9IDA7XG5cblxuXG5cdC8qKlxuXHQgKiBSZWFkcyBhIHN0cmVhbSBvZiBiaW5hcnkgZGF0YSBhbmQgaW50ZXJwcmVudHMgaXQgYXMgYSBsaXN0IG9mIHBhY2tldHMuXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9ieXRlYXJyYXl9IEFuIGFycmF5IG9mIGJ5dGVzLlxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgaSA9IDA7XG5cblx0XHR3aGlsZShpIDwgYnl0ZXMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgcGFyc2VkID0gcGFja2V0UGFyc2VyLnJlYWQoYnl0ZXMsIGksIGJ5dGVzLmxlbmd0aCAtIGkpO1xuXHRcdFx0aSA9IHBhcnNlZC5vZmZzZXQ7XG5cblx0XHRcdHZhciB0YWcgPSBlbnVtcy5yZWFkKGVudW1zLnBhY2tldCwgcGFyc2VkLnRhZyk7XG5cdFx0XHR2YXIgcGFja2V0ID0gbmV3IHBhY2tldHNbdGFnXSgpO1xuXG5cdFx0XHR0aGlzLnB1c2gocGFja2V0KTtcblxuXHRcdFx0cGFja2V0LnJlYWQocGFyc2VkLnBhY2tldCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Ygb3BlbnBncCBvYmplY3RzIGNvbnRhaW5lZCB3aXRoaW4gdGhlXG5cdCAqIGNsYXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyB7b3BlbnBncF9ieXRlYXJyYXl9IEFuIGFycmF5IG9mIGJ5dGVzIGNvbnRhaW5pbmcgdmFsaWQgb3BlbnBncCBwYWNrZXRzLlxuXHQgKi9cblx0dGhpcy53cml0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBieXRlcyA9ICcnO1xuXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBwYWNrZXRieXRlcyA9IHRoaXNbaV0ud3JpdGUoKTtcblx0XHRcdGJ5dGVzICs9IHBhY2tldFBhcnNlci53cml0ZUhlYWRlcih0aGlzW2ldLnRhZywgcGFja2V0Ynl0ZXMubGVuZ3RoKTtcblx0XHRcdGJ5dGVzICs9IHBhY2tldGJ5dGVzO1xuXHRcdH1cblx0XHRcblx0XHRyZXR1cm4gYnl0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIHBhY2tldCB0byB0aGUgbGlzdC4gVGhpcyBpcyB0aGUgb25seSBzdXBwb3J0ZWQgbWV0aG9kIG9mIGRvaW5nIHNvO1xuXHQgKiB3cml0aW5nIHRvIHBhY2tldGxpc3RbaV0gZGlyZWN0bHkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG5cdCAqL1xuXHR0aGlzLnB1c2ggPSBmdW5jdGlvbihwYWNrZXQpIHtcblx0XHRwYWNrZXQucGFja2V0cyA9IG5ldyBwYWNrZXRsaXN0KCk7XG5cblx0XHR0aGlzW3RoaXMubGVuZ3RoXSA9IHBhY2tldDtcblx0XHR0aGlzLmxlbmd0aCsrO1xuXHR9XG5cbn1cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpLFxuXHR0eXBlX21waSA9IHJlcXVpcmUoJy4uL3R5cGUvbXBpLmpzJyksXG5cdGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKSxcblx0Y3J5cHRvID0gcmVxdWlyZSgnLi4vY3J5cHRvJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBLZXkgTWF0ZXJpYWwgUGFja2V0IChUYWcgNSw2LDcsMTQpXG4gKiAgIFxuICogUkZDNDQ4MCA1LjU6XG4gKiBBIGtleSBtYXRlcmlhbCBwYWNrZXQgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHB1YmxpYyBvclxuICogcHJpdmF0ZSBrZXkuICBUaGVyZSBhcmUgZm91ciB2YXJpYW50cyBvZiB0aGlzIHBhY2tldCB0eXBlLCBhbmQgdHdvXG4gKiBtYWpvciB2ZXJzaW9ucy4gIENvbnNlcXVlbnRseSwgdGhpcyBzZWN0aW9uIGlzIGNvbXBsZXguXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3B1YmxpY19rZXkoKSB7XG5cdC8qKiBLZXkgY3JlYXRpb24gZGF0ZS5cblx0ICogQHR5cGUge0RhdGV9ICovXG5cdHRoaXMuY3JlYXRlZCA9IG5ldyBEYXRlKCk7XG5cdC8qKiBBIGxpc3Qgb2YgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnNcblx0ICogQHR5cGUge29wZW5wZ3BfdHlwZV9tcGl9ICovXG5cdHRoaXMubXBpID0gW107XG5cdC8qKiBQdWJsaWMga2V5IGFsZ29yaXRobVxuXHQgKiBAdHlwZSB7b3BlbnBncC5wdWJsaWNrZXl9ICovXG5cdHRoaXMuYWxnb3JpdGhtID0gJ3JzYV9zaWduJztcblxuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBQYXJzZXIgZm9yIHB1YmxpYyBrZXlzIGFzIHNwZWNpZmllZCBpbiBSRkMgNDg4MCBzZWN0aW9uIFxuXHQgKiA1LjUuMiBQdWJsaWMtS2V5IFBhY2tldCBGb3JtYXRzXG5cdCAqIGNhbGxlZCBieSByZWFkX3RhZyZsdDtudW0mZ3Q7XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBJbnB1dCBzdHJpbmcgdG8gcmVhZCB0aGUgcGFja2V0IGZyb21cblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBTdGFydCBwb3NpdGlvbiBmb3IgdGhlIHBhcnNlclxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlbiBMZW5ndGggb2YgdGhlIHBhY2tldCBvciByZW1haW5pbmcgbGVuZ3RoIG9mIGlucHV0XG5cdCAqIEByZXR1cm4ge09iamVjdH0gVGhpcyBvYmplY3Qgd2l0aCBhdHRyaWJ1dGVzIHNldCBieSB0aGUgcGFyc2VyXG5cdCAqLyAgXG5cdHRoaXMucmVhZFB1YmxpY0tleSA9IHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0Ly8gQSBvbmUtb2N0ZXQgdmVyc2lvbiBudW1iZXIgKDMgb3IgNCkuXG5cdFx0dmFyIHZlcnNpb24gPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cblx0XHRpZiAodmVyc2lvbiA9PSA0KSB7XG5cdFx0XHQvLyAtIEEgZm91ci1vY3RldCBudW1iZXIgZGVub3RpbmcgdGhlIHRpbWUgdGhhdCB0aGUga2V5IHdhcyBjcmVhdGVkLlxuXHRcdFx0dGhpcy5jcmVhdGVkID0gdXRpbC5yZWFkRGF0ZShieXRlcy5zdWJzdHIoMSwgNCkpO1xuXHRcdFx0XG5cdFx0XHQvLyAtIEEgb25lLW9jdGV0IG51bWJlciBkZW5vdGluZyB0aGUgcHVibGljLWtleSBhbGdvcml0aG0gb2YgdGhpcyBrZXkuXG5cdFx0XHR0aGlzLmFsZ29yaXRobSA9IGVudW1zLnJlYWQoZW51bXMucHVibGljS2V5LCBieXRlc1s1XS5jaGFyQ29kZUF0KCkpO1xuXG5cdFx0XHR2YXIgbXBpY291bnQgPSBjcnlwdG8uZ2V0UHVibGljTXBpQ291bnQodGhpcy5hbGdvcml0aG0pO1xuXHRcdFx0dGhpcy5tcGkgPSBbXTtcblxuXHRcdFx0dmFyIGJtcGkgPSBieXRlcy5zdWJzdHIoNik7XG5cdFx0XHR2YXIgcCA9IDA7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBcblx0XHRcdFx0aSA8IG1waWNvdW50ICYmIHAgPCBibXBpLmxlbmd0aDsgXG5cdFx0XHRcdGkrKykge1xuXG5cdFx0XHRcdHRoaXMubXBpW2ldID0gbmV3IHR5cGVfbXBpKCk7XG5cblx0XHRcdFx0cCArPSB0aGlzLm1waVtpXS5yZWFkKGJtcGkuc3Vic3RyKHApKVxuXG5cdFx0XHRcdGlmKHAgPiBibXBpLmxlbmd0aClcblx0XHRcdFx0XHR1dGlsLnByaW50X2Vycm9yKFwib3BlbnBncC5wYWNrZXQua2V5bWF0ZXJpYWwuanNcXG5cIlxuXHRcdFx0XHRcdFx0KydlcnJvciByZWFkaW5nIE1QSSBAOicrcCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBwICsgNjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdWZXJzaW9uICcgKyB2ZXJzaW9uICsgJyBvZiB0aGUga2V5IHBhY2tldCBpcyB1bnN1cHBvcnRlZC4nKTtcblx0XHR9XG5cdH1cblxuXHQvKlxuICAgICAqIFNhbWUgYXMgd3JpdGVfcHJpdmF0ZV9rZXksIGJ1dCBoYXMgbGVzcyBpbmZvcm1hdGlvbiBiZWNhdXNlIG9mIFxuXHQgKiBwdWJsaWMga2V5LlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0ga2V5VHlwZSBGb2xsb3dzIHRoZSBPcGVuUEdQIGFsZ29yaXRobSBzdGFuZGFyZCwgXG5cdCAqIElFIDEgY29ycmVzcG9uZHMgdG8gUlNBLlxuICAgICAqIEBwYXJhbSB7UlNBLmtleU9iamVjdH0ga2V5XG4gICAgICogQHBhcmFtIHRpbWVQYWNrZXRcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHtib2R5OiBbc3RyaW5nXU9wZW5QR1AgcGFja2V0IGJvZHkgY29udGVudHMsIFxuXHQgKiBoZWFkZXI6IFtzdHJpbmddIE9wZW5QR1AgcGFja2V0IGhlYWRlciwgc3RyaW5nOiBbc3RyaW5nXSBoZWFkZXIrYm9keX1cbiAgICAgKi9cbiAgICB0aGlzLndyaXRlUHVibGljS2V5ID0gdGhpcy53cml0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFZlcnNpb25cblx0XHR2YXIgcmVzdWx0ID0gU3RyaW5nLmZyb21DaGFyQ29kZSg0KTtcbiAgICAgICAgcmVzdWx0ICs9IHV0aWwud3JpdGVEYXRlKHRoaXMuY3JlYXRlZCk7XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZW51bXMud3JpdGUoZW51bXMucHVibGljS2V5LCB0aGlzLmFsZ29yaXRobSkpO1xuXG5cdFx0dmFyIG1waWNvdW50ID0gY3J5cHRvLmdldFB1YmxpY01waUNvdW50KHRoaXMuYWxnb3JpdGhtKTtcblxuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtcGljb3VudDsgaSsrKSB7XG5cdFx0XHRyZXN1bHQgKz0gdGhpcy5tcGlbaV0ud3JpdGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Ly8gV3JpdGUgYW4gb2xkIHZlcnNpb24gcGFja2V0IC0gaXQncyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGludGVybmFsIHJvdXRpbmVzLlxuXHR0aGlzLndyaXRlT2xkID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGJ5dGVzID0gdGhpcy53cml0ZVB1YmxpY0tleSgpO1xuXG5cdFx0cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMHg5OSkgK1xuXHRcdFx0dXRpbC53cml0ZU51bWJlcihieXRlcy5sZW5ndGgsIDIpICtcblx0XHRcdGJ5dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGtleSBpZCBvZiB0aGUga2V5IFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEEgOCBieXRlIGtleSBpZFxuXHQgKi9cblx0dGhpcy5nZXRLZXlJZCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEZpbmdlcnByaW50KCkuc3Vic3RyKDEyLCA4KTtcblx0fVxuXHRcblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBrZXlcblx0ICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaW5nZXJwcmludFxuXHQgKi9cblx0dGhpcy5nZXRGaW5nZXJwcmludCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB0b0hhc2ggPSB0aGlzLndyaXRlT2xkKCk7XG5cdFx0cmV0dXJuIGNyeXB0by5oYXNoLnNoYTEodG9IYXNoLCB0b0hhc2gubGVuZ3RoKTtcblx0fVxuXG59XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgdHlwZV9rZXlpZCA9IHJlcXVpcmUoJy4uL3R5cGUva2V5aWQuanMnKSxcblx0dXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKSxcblx0dHlwZV9tcGkgPSByZXF1aXJlKCcuLi90eXBlL21waS5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpO1xuXHRcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgUHVibGljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgUGFja2V0cyAoVGFnIDEpXG4gKiBcbiAqIFJGQzQ4ODAgNS4xOiBBIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5IHBhY2tldCBob2xkcyB0aGUgc2Vzc2lvbiBrZXlcbiAqIHVzZWQgdG8gZW5jcnlwdCBhIG1lc3NhZ2UuIFplcm8gb3IgbW9yZSBQdWJsaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleVxuICogcGFja2V0cyBhbmQvb3IgU3ltbWV0cmljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0cyBtYXkgcHJlY2VkZSBhXG4gKiBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCwgd2hpY2ggaG9sZHMgYW4gZW5jcnlwdGVkIG1lc3NhZ2UuIFRoZVxuICogbWVzc2FnZSBpcyBlbmNyeXB0ZWQgd2l0aCB0aGUgc2Vzc2lvbiBrZXksIGFuZCB0aGUgc2Vzc2lvbiBrZXkgaXMgaXRzZWxmXG4gKiBlbmNyeXB0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgRW5jcnlwdGVkIFNlc3Npb24gS2V5IHBhY2tldChzKS4gVGhlXG4gKiBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIFBhY2tldCBpcyBwcmVjZWRlZCBieSBvbmUgUHVibGljLUtleSBFbmNyeXB0ZWRcbiAqIFNlc3Npb24gS2V5IHBhY2tldCBmb3IgZWFjaCBPcGVuUEdQIGtleSB0byB3aGljaCB0aGUgbWVzc2FnZSBpcyBlbmNyeXB0ZWQuXG4gKiBUaGUgcmVjaXBpZW50IG9mIHRoZSBtZXNzYWdlIGZpbmRzIGEgc2Vzc2lvbiBrZXkgdGhhdCBpcyBlbmNyeXB0ZWQgdG8gdGhlaXJcbiAqIHB1YmxpYyBrZXksIGRlY3J5cHRzIHRoZSBzZXNzaW9uIGtleSwgYW5kIHRoZW4gdXNlcyB0aGUgc2Vzc2lvbiBrZXkgdG9cbiAqIGRlY3J5cHQgdGhlIG1lc3NhZ2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3B1YmxpY19rZXlfZW5jcnlwdGVkX3Nlc3Npb25fa2V5KCkge1xuXHR0aGlzLnZlcnNpb24gPSAzO1xuXG5cdHRoaXMucHVibGljS2V5SWQgPSBuZXcgdHlwZV9rZXlpZCgpO1xuXHR0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9ICdyc2FfZW5jcnlwdCc7XG5cblx0dGhpcy5zZXNzaW9uS2V5ID0gbnVsbDtcblx0dGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtID0gJ2FlczI1Nic7XG5cblx0LyoqIEB0eXBlIHtvcGVucGdwX3R5cGVfbXBpW119ICovXG5cdHRoaXMuZW5jcnlwdGVkID0gW107XG5cblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgcHVibGlja2V5IGVuY3J5cHRlZCBzZXNzaW9uIGtleSBwYWNrZXQgKHRhZyAxKS5cblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBQYXlsb2FkIG9mIGEgdGFnIDEgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gTGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2Zcblx0ICogICAgICAgICAgICBpbnB1dCBhdCBwb3NpdGlvblxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhfSBPYmplY3QgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cblx0XHR0aGlzLnZlcnNpb24gPSBieXRlc1swXS5jaGFyQ29kZUF0KCk7XG5cdFx0dGhpcy5wdWJsaWNLZXlJZC5yZWFkKGJ5dGVzLnN1YnN0cigxKSk7XG5cdFx0dGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBlbnVtcy5yZWFkKGVudW1zLnB1YmxpY0tleSwgYnl0ZXNbOV0uY2hhckNvZGVBdCgpKTtcblxuXHRcdHZhciBpID0gMTA7XG5cblx0XHR2YXIgaW50ZWdlckNvdW50ID0gKGZ1bmN0aW9uKGFsZ28pIHtcblx0XHRcdHN3aXRjaCAoYWxnbykge1xuXHRcdFx0Y2FzZSAncnNhX2VuY3J5cHQnOlxuXHRcdFx0Y2FzZSAncnNhX2VuY3J5cHRfc2lnbic6XG5cdFx0XHRcdHJldHVybiAxO1xuXG5cdFx0XHRjYXNlICdlbGdhbWFsJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYWxnb3JpdGhtLlwiKTtcblx0XHRcdH1cblx0XHR9KSh0aGlzLnB1YmxpY0tleUFsZ29yaXRobSk7XG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IFtdO1xuXG5cdFx0Zm9yKHZhciBqID0gMDsgaiA8IGludGVnZXJDb3VudDsgaisrKSB7XG5cdFx0XHR2YXIgbXBpID0gbmV3IHR5cGVfbXBpKCk7XG5cdFx0XHRpICs9IG1waS5yZWFkKGJ5dGVzLnN1YnN0cihpKSk7XG5cdFx0XHR0aGlzLmVuY3J5cHRlZC5wdXNoKG1waSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRhZyAxIHBhY2tldFxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IHB1YmxpY0tleUlkXG5cdCAqICAgICAgICAgICAgIFRoZSBwdWJsaWMga2V5IGlkIGNvcnJlc3BvbmRpbmcgdG8gcHVibGljTVBJcyBrZXkgYXMgc3RyaW5nXG5cdCAqIEBwYXJhbSB7b3BlbnBncF90eXBlX21waVtdfSBwdWJsaWNNUElzXG5cdCAqICAgICAgICAgICAgTXVsdGlwcmVjaXNpb24gaW50ZWdlciBvYmplY3RzIGRlc2NyaWJpbmcgdGhlIHB1YmxpYyBrZXlcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwdWJhbGdvXG5cdCAqICAgICAgICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBhbGdvcml0aG0gLy8gU2VlIFJGQzQ4ODAgOS4xXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gc3ltbWFsZ29cblx0ICogICAgICAgICAgICBUaGUgc3ltbWV0cmljIGNpcGhlciBhbGdvcml0aG0gdXNlZCB0byBlbmNyeXB0IHRoZSBkYXRhIFxuXHQgKiAgICAgICAgICAgIHdpdGhpbiBhbiBlbmNyeXB0ZWRkYXRhcGFja2V0IG9yIGVuY3J5cHRlZGludGVncml0eS1cblx0ICogICAgICAgICAgICBwcm90ZWN0ZWRkYXRhcGFja2V0IFxuXHQgKiAgICAgICAgICAgIGZvbGxvd2luZyB0aGlzIHBhY2tldCAvL1NlZSBSRkM0ODgwIDkuMlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc2Vzc2lvbmtleVxuXHQgKiAgICAgICAgICAgIEEgc3RyaW5nIG9mIHJhbmRvbWJ5dGVzIHJlcHJlc2VudGluZyB0aGUgc2Vzc2lvbiBrZXlcblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnZlcnNpb24pO1xuXHRcdHJlc3VsdCArPSB0aGlzLnB1YmxpY0tleUlkLndyaXRlKCk7XG5cdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG5cdFx0XHRlbnVtcy53cml0ZShlbnVtcy5wdWJsaWNLZXksIHRoaXMucHVibGljS2V5QWxnb3JpdGhtKSk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmVuY3J5cHRlZC5sZW5ndGg7IGkrKykge1xuXHRcdFx0cmVzdWx0ICs9IHRoaXMuZW5jcnlwdGVkW2ldLndyaXRlKClcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oa2V5KSB7XG5cdFx0dmFyIGRhdGEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuXHRcdFx0ZW51bXMud3JpdGUoZW51bXMuc3ltbWV0cmljLCB0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0pKTtcblxuXHRcdGRhdGEgKz0gdGhpcy5zZXNzaW9uS2V5O1xuXHRcdHZhciBjaGVja3N1bSA9IHV0aWwuY2FsY19jaGVja3N1bSh0aGlzLnNlc3Npb25LZXkpO1xuXHRcdGRhdGEgKz0gdXRpbC53cml0ZU51bWJlcihjaGVja3N1bSwgMik7XG5cblx0XHR2YXIgbXBpID0gbmV3IHR5cGVfbXBpKCk7XG5cdFx0bXBpLmZyb21CeXRlcyhjcnlwdG8ucGtjczEuZW1lLmVuY29kZShcblx0XHRcdGRhdGEsXG5cdFx0XHRrZXkubXBpWzBdLmJ5dGVMZW5ndGgoKSkpO1xuXG5cdFx0dGhpcy5lbmNyeXB0ZWQgPSBjcnlwdG8ucHVibGljS2V5RW5jcnlwdChcblx0XHRcdHRoaXMucHVibGljS2V5QWxnb3JpdGhtLCBcblx0XHRcdGtleS5tcGksXG5cdFx0XHRtcGkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY3J5cHRzIHRoZSBzZXNzaW9uIGtleSAob25seSBmb3IgcHVibGljIGtleSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXlcblx0ICogcGFja2V0cyAodGFnIDEpXG5cdCAqIFxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX21lc3NhZ2V9IG1zZ1xuXHQgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIG9iamVjdCAod2l0aCBtZW1iZXIgZW5jcnlwdGVkRGF0YVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXl9IGtleVxuXHQgKiAgICAgICAgICAgIFByaXZhdGUga2V5IHdpdGggc2VjTVBJcyB1bmxvY2tlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1bmVuY3J5cHRlZCBzZXNzaW9uIGtleVxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24oa2V5KSB7XG5cdFx0dmFyIHJlc3VsdCA9IGNyeXB0by5wdWJsaWNLZXlEZWNyeXB0KFxuXHRcdFx0XHR0aGlzLnB1YmxpY0tleUFsZ29yaXRobSxcblx0XHRcdFx0a2V5Lm1waSxcblx0XHRcdFx0dGhpcy5lbmNyeXB0ZWQpLnRvQnl0ZXMoKTtcblxuXHRcdHZhciBjaGVja3N1bSA9IHV0aWwucmVhZE51bWJlcihyZXN1bHQuc3Vic3RyKHJlc3VsdC5sZW5ndGggLSAyKSk7XG5cblx0XHR2YXIgZGVjb2RlZCA9IGNyeXB0by5wa2NzMS5lbWUuZGVjb2RlKFxuXHRcdFx0cmVzdWx0LFxuXHRcdFx0a2V5Lm1waVswXS5ieXRlTGVuZ3RoKCkpO1xuXG5cdFx0dmFyIGtleSA9IGRlY29kZWQuc3Vic3RyaW5nKDEsIGRlY29kZWQubGVuZ3RoIC0gMik7XG5cblx0XHRpZihjaGVja3N1bSAhPSB1dGlsLmNhbGNfY2hlY2tzdW0oa2V5KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDaGVja3N1bSBtaXNtYXRjaCcpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc2Vzc2lvbktleSA9IGtleTtcblx0XHRcdHRoaXMuc2Vzc2lvbktleUFsZ29yaXRobSA9IFxuXHRcdFx0XHRlbnVtcy5yZWFkKGVudW1zLnN5bW1ldHJpYywgZGVjb2RlZC5jaGFyQ29kZUF0KDApKTtcblx0XHR9XG5cdH1cbn07XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBwdWJsaWNfa2V5ID0gcmVxdWlyZSgnLi9wdWJsaWNfa2V5LmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHVibGljX3N1YmtleSgpIHtcblx0cHVibGljX2tleS5jYWxsKHRoaXMpO1xufVxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIHB1YmxpY0tleSA9IHJlcXVpcmUoJy4vcHVibGljX2tleS5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpLFxuXHR0eXBlX21waSA9IHJlcXVpcmUoJy4uL3R5cGUvbXBpLmpzJyksXG5cdHR5cGVfczJrID0gcmVxdWlyZSgnLi4vdHlwZS9zMmsuanMnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIEtleSBNYXRlcmlhbCBQYWNrZXQgKFRhZyA1LDYsNywxNClcbiAqICAgXG4gKiBSRkM0NDgwIDUuNTpcbiAqIEEga2V5IG1hdGVyaWFsIHBhY2tldCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHVibGljIG9yXG4gKiBwcml2YXRlIGtleS4gIFRoZXJlIGFyZSBmb3VyIHZhcmlhbnRzIG9mIHRoaXMgcGFja2V0IHR5cGUsIGFuZCB0d29cbiAqIG1ham9yIHZlcnNpb25zLiAgQ29uc2VxdWVudGx5LCB0aGlzIHNlY3Rpb24gaXMgY29tcGxleC5cbiAqL1xuZnVuY3Rpb24gcGFja2V0X3NlY3JldF9rZXkoKSB7XG5cdHB1YmxpY0tleS5jYWxsKHRoaXMpO1xuXG5cdHRoaXMuZW5jcnlwdGVkID0gbnVsbDtcblxuXG5cdGZ1bmN0aW9uIGdldF9oYXNoX2xlbihoYXNoKSB7XG5cdFx0aWYoaGFzaCA9PSAnc2hhMScpXG5cdFx0XHRyZXR1cm4gMjA7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRfaGFzaF9mbihoYXNoKSB7XG5cdFx0aWYoaGFzaCA9PSAnc2hhMScpXG5cdFx0XHRyZXR1cm4gY3J5cHRvLmhhc2guc2hhMTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oYykge1xuXHRcdFx0XHRcdHJldHVybiB1dGlsLndyaXRlTnVtYmVyKHV0aWwuY2FsY19jaGVja3N1bShjKSwgMik7XG5cdFx0XHRcdH1cblx0fVxuXG5cdC8vIEhlbHBlciBmdW5jdGlvblxuXHRmdW5jdGlvbiBwYXJzZV9jbGVhcnRleHRfbXBpKGhhc2hfYWxnb3JpdGhtLCBjbGVhcnRleHQsIGFsZ29yaXRobSkge1xuXHRcdHZhciBoYXNobGVuID0gZ2V0X2hhc2hfbGVuKGhhc2hfYWxnb3JpdGhtKSxcblx0XHRcdGhhc2hmbiA9IGdldF9oYXNoX2ZuKGhhc2hfYWxnb3JpdGhtKTtcblxuXHRcdHZhciBoYXNodGV4dCA9IGNsZWFydGV4dC5zdWJzdHIoY2xlYXJ0ZXh0Lmxlbmd0aCAtIGhhc2hsZW4pO1xuXHRcdGNsZWFydGV4dCA9IGNsZWFydGV4dC5zdWJzdHIoMCwgY2xlYXJ0ZXh0Lmxlbmd0aCAtIGhhc2hsZW4pO1xuXG5cdFx0dmFyIGhhc2ggPSBoYXNoZm4oY2xlYXJ0ZXh0KTtcblxuXHRcdGlmKGhhc2ggIT0gaGFzaHRleHQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJIYXNoIG1pc21hdGNoLlwiKTtcblxuXHRcdHZhciBtcGlzID0gY3J5cHRvLmdldFByaXZhdGVNcGlDb3VudChhbGdvcml0aG0pO1xuXG5cdFx0dmFyIGogPSAwO1xuXHRcdHZhciBtcGkgPSBbXTtcblxuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtcGlzICYmIGogPCBjbGVhcnRleHQubGVuZ3RoOyBpKyspIHtcblx0XHRcdG1waVtpXSA9IG5ldyB0eXBlX21waSgpO1xuXHRcdFx0aiArPSBtcGlbaV0ucmVhZChjbGVhcnRleHQuc3Vic3RyKGopKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbXBpO1xuXHR9XG5cblx0ZnVuY3Rpb24gd3JpdGVfY2xlYXJ0ZXh0X21waShoYXNoX2FsZ29yaXRobSwgYWxnb3JpdGhtLCBtcGkpIHtcblx0XHR2YXIgYnl0ZXM9ICcnO1xuXHRcdHZhciBkaXNjYXJkID0gY3J5cHRvLmdldFB1YmxpY01waUNvdW50KGFsZ29yaXRobSk7XG5cblx0XHRmb3IodmFyIGkgPSBkaXNjYXJkOyBpIDwgbXBpLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRieXRlcyArPSBtcGlbaV0ud3JpdGUoKTtcblx0XHR9XG5cblxuXHRcdGJ5dGVzICs9IGdldF9oYXNoX2ZuKGhhc2hfYWxnb3JpdGhtKShieXRlcyk7XG5cdFx0XG5cdFx0cmV0dXJuIGJ5dGVzO1xuXHR9XG5cdFx0XG5cblx0Ly8gNS41LjMuICBTZWNyZXQtS2V5IFBhY2tldCBGb3JtYXRzXG5cdFxuXHQvKipcblx0ICogSW50ZXJuYWwgcGFyc2VyIGZvciBwcml2YXRlIGtleXMgYXMgc3BlY2lmaWVkIGluIFJGQyA0ODgwIHNlY3Rpb24gNS41LjNcblx0ICogQHBhcmFtIHtTdHJpbmd9IGJ5dGVzIElucHV0IHN0cmluZyB0byByZWFkIHRoZSBwYWNrZXQgZnJvbVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHBvc2l0aW9uIFN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgcGFyc2VyXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuIExlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHJlbWFpbmluZyBsZW5ndGggb2YgYnl0ZXNcblx0ICogQHJldHVybiB7T2JqZWN0fSBUaGlzIG9iamVjdCB3aXRoIGF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBwYXJzZXJcblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdCAgICAvLyAtIEEgUHVibGljLUtleSBvciBQdWJsaWMtU3Via2V5IHBhY2tldCwgYXMgZGVzY3JpYmVkIGFib3ZlLlxuXHRcdHZhciBsZW4gPSB0aGlzLnJlYWRQdWJsaWNLZXkoYnl0ZXMpO1xuXG5cdCAgICBieXRlcyA9IGJ5dGVzLnN1YnN0cihsZW4pO1xuXG5cdFx0XG5cdCAgICAvLyAtIE9uZSBvY3RldCBpbmRpY2F0aW5nIHN0cmluZy10by1rZXkgdXNhZ2UgY29udmVudGlvbnMuICBaZXJvXG5cdCAgICAvLyAgIGluZGljYXRlcyB0aGF0IHRoZSBzZWNyZXQta2V5IGRhdGEgaXMgbm90IGVuY3J5cHRlZC4gIDI1NSBvciAyNTRcblx0ICAgIC8vICAgaW5kaWNhdGVzIHRoYXQgYSBzdHJpbmctdG8ta2V5IHNwZWNpZmllciBpcyBiZWluZyBnaXZlbi4gIEFueVxuXHQgICAgLy8gICBvdGhlciB2YWx1ZSBpcyBhIHN5bW1ldHJpYy1rZXkgZW5jcnlwdGlvbiBhbGdvcml0aG0gaWRlbnRpZmllci5cblx0ICAgIHZhciBpc0VuY3J5cHRlZCA9IGJ5dGVzWzBdLmNoYXJDb2RlQXQoKTtcblxuXHRcdGlmKGlzRW5jcnlwdGVkKSB7XG5cdFx0XHR0aGlzLmVuY3J5cHRlZCA9IGJ5dGVzO1xuXHRcdH0gZWxzZSB7XG5cdFxuXHRcdFx0Ly8gLSBQbGFpbiBvciBlbmNyeXB0ZWQgbXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgY29tcHJpc2luZyB0aGUgc2VjcmV0XG5cdFx0XHQvLyAgIGtleSBkYXRhLiAgVGhlc2UgYWxnb3JpdGhtLXNwZWNpZmljIGZpZWxkcyBhcmUgYXMgZGVzY3JpYmVkXG5cdFx0XHQvLyAgIGJlbG93LlxuXG5cdFx0XHR0aGlzLm1waSA9IHRoaXMubXBpLmNvbmNhdChwYXJzZV9jbGVhcnRleHRfbXBpKCdtb2QnLCBieXRlcy5zdWJzdHIoMSksXG5cdFx0XHRcdHRoaXMuYWxnb3JpdGhtKSk7XG5cdFx0fSAgICBcblxuXHR9XG5cdFxuXHQvKlxuICAgICAqIENyZWF0ZXMgYW4gT3BlblBHUCBrZXkgcGFja2V0IGZvciB0aGUgZ2l2ZW4ga2V5LiBtdWNoIFxuXHQgKiBUT0RPIGluIHJlZ2FyZHMgdG8gczJrLCBzdWJrZXlzLlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0ga2V5VHlwZSBGb2xsb3dzIHRoZSBPcGVuUEdQIGFsZ29yaXRobSBzdGFuZGFyZCwgXG5cdCAqIElFIDEgY29ycmVzcG9uZHMgdG8gUlNBLlxuICAgICAqIEBwYXJhbSB7UlNBLmtleU9iamVjdH0ga2V5XG4gICAgICogQHBhcmFtIHBhc3NwaHJhc2VcbiAgICAgKiBAcGFyYW0gczJrSGFzaFxuICAgICAqIEBwYXJhbSBzeW1tZXRyaWNFbmNyeXB0aW9uQWxnb3JpdGhtXG4gICAgICogQHBhcmFtIHRpbWVQYWNrZXRcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHtib2R5OiBbc3RyaW5nXU9wZW5QR1AgcGFja2V0IGJvZHkgY29udGVudHMsIFxuXHRcdGhlYWRlcjogW3N0cmluZ10gT3BlblBHUCBwYWNrZXQgaGVhZGVyLCBzdHJpbmc6IFtzdHJpbmddIGhlYWRlcitib2R5fVxuICAgICAqL1xuICAgIHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgYnl0ZXMgPSB0aGlzLndyaXRlUHVibGljS2V5KCk7XG5cblx0XHRpZighdGhpcy5lbmNyeXB0ZWQpIHtcblx0XHRcdGJ5dGVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XG5cdFx0XHRcblx0XHRcdGJ5dGVzICs9IHdyaXRlX2NsZWFydGV4dF9tcGkoJ21vZCcsIHRoaXMuYWxnb3JpdGhtLCB0aGlzLm1waSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJ5dGVzICs9IHRoaXMuZW5jcnlwdGVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBieXRlcztcblx0fVxuXHRcdFx0XG5cblxuXG5cdC8qKiBFbmNyeXB0IHRoZSBwYXlsb2FkLiBCeSBkZWZhdWx0LCB3ZSB1c2UgYWVzMjU2IGFuZCBpdGVyYXRlZCwgc2FsdGVkIHN0cmluZ1xuXHQgKiB0byBrZXkgc3BlY2lmaWVyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzcGhyYXNlXG5cdCAqL1xuICAgIHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uKHBhc3NwaHJhc2UpIHtcblxuXHRcdHZhciBzMmsgPSBuZXcgdHlwZV9zMmsoKSxcblx0XHRcdHN5bW1ldHJpYyA9ICdhZXMyNTYnLFxuXHRcdFx0Y2xlYXJ0ZXh0ID0gd3JpdGVfY2xlYXJ0ZXh0X21waSgnc2hhMScsIHRoaXMuYWxnb3JpdGhtLCB0aGlzLm1waSksXG5cdFx0XHRrZXkgPSBwcm9kdWNlRW5jcnlwdGlvbktleShzMmssIHBhc3NwaHJhc2UsIHN5bW1ldHJpYyksXG5cdFx0XHRibG9ja0xlbiA9IGNyeXB0by5jaXBoZXJbc3ltbWV0cmljXS5ibG9ja1NpemUsXG5cdFx0XHRpdiA9IGNyeXB0by5yYW5kb20uZ2V0UmFuZG9tQnl0ZXMoYmxvY2tMZW4pO1xuXG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9ICcnO1xuXHRcdHRoaXMuZW5jcnlwdGVkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjU0KTtcblx0XHR0aGlzLmVuY3J5cHRlZCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLnN5bW1ldHJpYywgc3ltbWV0cmljKSk7XG5cdFx0dGhpcy5lbmNyeXB0ZWQgKz0gczJrLndyaXRlKCk7XG5cdFx0dGhpcy5lbmNyeXB0ZWQgKz0gaXY7XG5cblxuXG5cdFx0dGhpcy5lbmNyeXB0ZWQgKz0gY3J5cHRvLmNmYi5ub3JtYWxFbmNyeXB0KHN5bW1ldHJpYywga2V5LCBjbGVhcnRleHQsIGl2KTtcbiAgICB9XG5cblx0ZnVuY3Rpb24gcHJvZHVjZUVuY3J5cHRpb25LZXkoczJrLCBwYXNzcGhyYXNlLCBhbGdvcml0aG0pIHtcblx0XHRyZXR1cm4gczJrLnByb2R1Y2Vfa2V5KHBhc3NwaHJhc2UsXG5cdFx0XHRjcnlwdG8uY2lwaGVyW2FsZ29yaXRobV0ua2V5U2l6ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRGVjcnlwdHMgdGhlIHByaXZhdGUga2V5IE1QSXMgd2hpY2ggYXJlIG5lZWRlZCB0byB1c2UgdGhlIGtleS5cblx0ICogb3BlbnBncF9wYWNrZXRfa2V5bWF0ZXJpYWwuaGFzVW5lbmNyeXB0ZWRTZWNyZXRLZXlEYXRhIHNob3VsZCBiZSBcblx0ICogZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWRcblx0ICogXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJfcGFzc3BocmFzZSBUaGUgcGFzc3BocmFzZSBmb3IgdGhpcyBwcml2YXRlIGtleSBcblx0ICogYXMgc3RyaW5nXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHBhc3NwaHJhc2Ugd2FzIGNvcnJlY3Q7IGZhbHNlIGlmIG5vdFxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24ocGFzc3BocmFzZSkge1xuXHRcdGlmICghdGhpcy5lbmNyeXB0ZWQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRzeW1tZXRyaWMsXG5cdFx0XHRrZXk7XG5cblx0XHR2YXIgczJrX3VzYWdlID0gdGhpcy5lbmNyeXB0ZWRbaSsrXS5jaGFyQ29kZUF0KCk7XG5cblx0ICAgIC8vIC0gW09wdGlvbmFsXSBJZiBzdHJpbmctdG8ta2V5IHVzYWdlIG9jdGV0IHdhcyAyNTUgb3IgMjU0LCBhIG9uZS1cblx0ICAgIC8vICAgb2N0ZXQgc3ltbWV0cmljIGVuY3J5cHRpb24gYWxnb3JpdGhtLlxuXHQgICAgaWYgKHMya191c2FnZSA9PSAyNTUgfHwgczJrX3VzYWdlID09IDI1NCkge1xuXHQgICAgXHRzeW1tZXRyaWMgPSB0aGlzLmVuY3J5cHRlZFtpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdHN5bW1ldHJpYyA9IGVudW1zLnJlYWQoZW51bXMuc3ltbWV0cmljLCBzeW1tZXRyaWMpO1xuXHQgICAgIFxuXHRcdFx0Ly8gLSBbT3B0aW9uYWxdIElmIHN0cmluZy10by1rZXkgdXNhZ2Ugb2N0ZXQgd2FzIDI1NSBvciAyNTQsIGFcblx0XHRcdC8vICAgc3RyaW5nLXRvLWtleSBzcGVjaWZpZXIuICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmctdG8ta2V5XG5cdFx0XHQvLyAgIHNwZWNpZmllciBpcyBpbXBsaWVkIGJ5IGl0cyB0eXBlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cdCAgICBcdHZhciBzMmsgPSBuZXcgdHlwZV9zMmsoKTtcblx0ICAgIFx0aSArPSBzMmsucmVhZCh0aGlzLmVuY3J5cHRlZC5zdWJzdHIoaSkpO1xuXG5cdFx0XHRrZXkgPSBwcm9kdWNlRW5jcnlwdGlvbktleShzMmssIHBhc3NwaHJhc2UsIHN5bW1ldHJpYyk7XG5cdCAgICB9IGVsc2Uge1xuXHRcdFx0c3ltbWV0cmljID0gczJrX3VzYWdlO1xuXHRcdFx0c3ltbWV0cmljID0gZW51bXMucmVhZChlbnVtcy5zeW1tZXRyaWMsIHN5bW1ldHJpYyk7XG5cdFx0XHRrZXkgPSBjcnlwdG8uaGFzaC5tZDUocGFzc3BocmFzZSk7XG5cdFx0fVxuXG5cdCAgICBcblx0ICAgIC8vIC0gW09wdGlvbmFsXSBJZiBzZWNyZXQgZGF0YSBpcyBlbmNyeXB0ZWQgKHN0cmluZy10by1rZXkgdXNhZ2Ugb2N0ZXRcblx0ICAgIC8vICAgbm90IHplcm8pLCBhbiBJbml0aWFsIFZlY3RvciAoSVYpIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGVcblx0ICAgIC8vICAgY2lwaGVyJ3MgYmxvY2sgc2l6ZS5cblx0XHR2YXIgaXYgPSB0aGlzLmVuY3J5cHRlZC5zdWJzdHIoaSwgXG5cdFx0XHRjcnlwdG8uY2lwaGVyW3N5bW1ldHJpY10uYmxvY2tTaXplKTtcblxuXHRcdGkgKz0gaXYubGVuZ3RoO1xuXG5cdFx0dmFyIGNsZWFydGV4dCxcblx0XHRcdGNpcGhlcnRleHQgPSB0aGlzLmVuY3J5cHRlZC5zdWJzdHIoaSk7XG5cbiBcdFx0Y2xlYXJ0ZXh0ID0gY3J5cHRvLmNmYi5ub3JtYWxEZWNyeXB0KHN5bW1ldHJpYywga2V5LCBjaXBoZXJ0ZXh0LCBpdik7XG5cblx0XHR2YXIgaGFzaCA9IHMya191c2FnZSA9PSAyNTQgP1xuXHRcdFx0J3NoYTEnIDpcblx0XHRcdCdtb2QnO1xuXG4gICBcdFxuXHRcdHRoaXMubXBpID0gdGhpcy5tcGkuY29uY2F0KHBhcnNlX2NsZWFydGV4dF9tcGkoaGFzaCwgY2xlYXJ0ZXh0LFxuXHRcdFx0dGhpcy5hbGdvcml0aG0pKTtcblx0fVxuXG5cdHRoaXMuZ2VuZXJhdGUgPSBmdW5jdGlvbihiaXRzKSB7XG5cblx0fVxuXHRcbn1cblxucGFja2V0X3NlY3JldF9rZXkucHJvdG90eXBlID0gbmV3IHB1YmxpY0tleTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYWNrZXRfc2VjcmV0X2tleTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBzZWNyZXRfa2V5ID0gcmVxdWlyZSgnLi9zZWNyZXRfa2V5LmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2VjcmV0X3N1YmtleSgpIHtcblx0c2VjcmV0X2tleS5jYWxsKHRoaXMpO1xufVxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdHBhY2tldCA9IHJlcXVpcmUoJy4vcGFja2V0LmpzJyksXG5cdGVudW1zID0gcmVxdWlyZSgnLi4vZW51bXMuanMnKSxcblx0Y3J5cHRvID0gcmVxdWlyZSgnLi4vY3J5cHRvJyksXG5cdHR5cGVfbXBpID0gcmVxdWlyZSgnLi4vdHlwZS9tcGkuanMnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFNpZ25hdHVyZSBQYWNrZXQgKFRhZyAyKVxuICogXG4gKiBSRkM0NDgwIDUuMjpcbiAqIEEgU2lnbmF0dXJlIHBhY2tldCBkZXNjcmliZXMgYSBiaW5kaW5nIGJldHdlZW4gc29tZSBwdWJsaWMga2V5IGFuZFxuICogc29tZSBkYXRhLiAgVGhlIG1vc3QgY29tbW9uIHNpZ25hdHVyZXMgYXJlIGEgc2lnbmF0dXJlIG9mIGEgZmlsZSBvciBhXG4gKiBibG9jayBvZiB0ZXh0LCBhbmQgYSBzaWduYXR1cmUgdGhhdCBpcyBhIGNlcnRpZmljYXRpb24gb2YgYSBVc2VyIElELlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldF9zaWduYXR1cmUoKSB7XG5cblx0dGhpcy5zaWduYXR1cmVUeXBlID0gbnVsbDtcblx0dGhpcy5oYXNoQWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5wdWJsaWNLZXlBbGdvcml0aG0gPSBudWxsOyBcblxuXHR0aGlzLnNpZ25hdHVyZURhdGEgPSBudWxsO1xuXHR0aGlzLnNpZ25lZEhhc2hWYWx1ZSA9IG51bGw7XG5cdHRoaXMubXBpID0gbnVsbDtcblxuXHR0aGlzLmNyZWF0ZWQgPSBudWxsO1xuXHR0aGlzLnNpZ25hdHVyZUV4cGlyYXRpb25UaW1lID0gbnVsbDtcblx0dGhpcy5zaWduYXR1cmVOZXZlckV4cGlyZXMgPSBudWxsO1xuXHR0aGlzLmV4cG9ydGFibGUgPSBudWxsO1xuXHR0aGlzLnRydXN0TGV2ZWwgPSBudWxsO1xuXHR0aGlzLnRydXN0QW1vdW50ID0gbnVsbDtcblx0dGhpcy5yZWd1bGFyRXhwcmVzc2lvbiA9IG51bGw7XG5cdHRoaXMucmV2b2NhYmxlID0gbnVsbDtcblx0dGhpcy5rZXlFeHBpcmF0aW9uVGltZSA9IG51bGw7XG5cdHRoaXMua2V5TmV2ZXJFeHBpcmVzID0gbnVsbDtcblx0dGhpcy5wcmVmZXJyZWRTeW1tZXRyaWNBbGdvcml0aG1zID0gbnVsbDtcblx0dGhpcy5yZXZvY2F0aW9uS2V5Q2xhc3MgPSBudWxsO1xuXHR0aGlzLnJldm9jYXRpb25LZXlBbGdvcml0aG0gPSBudWxsO1xuXHR0aGlzLnJldm9jYXRpb25LZXlGaW5nZXJwcmludCA9IG51bGw7XG5cdHRoaXMuaXNzdWVyS2V5SWQgPSBudWxsO1xuXHR0aGlzLm5vdGF0aW9uID0ge307XG5cdHRoaXMucHJlZmVycmVkSGFzaEFsZ29yaXRobXMgPSBudWxsO1xuXHR0aGlzLnByZWZlcnJlZENvbXByZXNzaW9uQWxnb3JpdGhtcyA9IG51bGw7XG5cdHRoaXMua2V5U2VydmVyUHJlZmVyZW5jZXMgPSBudWxsO1xuXHR0aGlzLnByZWZlcnJlZEtleVNlcnZlciA9IG51bGw7XG5cdHRoaXMuaXNQcmltYXJ5VXNlcklEID0gbnVsbDtcblx0dGhpcy5wb2xpY3lVUkkgPSBudWxsO1xuXHR0aGlzLmtleUZsYWdzID0gbnVsbDtcblx0dGhpcy5zaWduZXJzVXNlcklkID0gbnVsbDtcblx0dGhpcy5yZWFzb25Gb3JSZXZvY2F0aW9uRmxhZyA9IG51bGw7XG5cdHRoaXMucmVhc29uRm9yUmV2b2NhdGlvblN0cmluZyA9IG51bGw7XG5cdHRoaXMuc2lnbmF0dXJlVGFyZ2V0UHVibGljS2V5QWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoQWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoID0gbnVsbDtcblx0dGhpcy5lbWJlZGRlZFNpZ25hdHVyZSA9IG51bGw7XG5cblx0dGhpcy52ZXJpZmllZCA9IGZhbHNlO1xuXHRcblxuXHQvKipcblx0ICogcGFyc2luZyBmdW5jdGlvbiBmb3IgYSBzaWduYXR1cmUgcGFja2V0ICh0YWcgMikuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBieXRlcyBwYXlsb2FkIG9mIGEgdGFnIDIgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gcG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBieXRlcyBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgYnl0ZXMgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gb2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdHZhciBpID0gMDtcblxuXHRcdHZhciB2ZXJzaW9uID0gYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCk7XG5cdFx0Ly8gc3dpdGNoIG9uIHZlcnNpb24gKDMgYW5kIDQpXG5cdFx0c3dpdGNoICh2ZXJzaW9uKSB7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0Ly8gT25lLW9jdGV0IGxlbmd0aCBvZiBmb2xsb3dpbmcgaGFzaGVkIG1hdGVyaWFsLiBNVVNUIGJlIDUuXG5cdFx0XHRpZiAoYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCkgIT0gNSlcblx0XHRcdFx0dXRpbC5wcmludF9kZWJ1ZyhcIm9wZW5wZ3AucGFja2V0LnNpZ25hdHVyZS5qc1xcblwiK1xuXHRcdFx0XHRcdCdpbnZhbGlkIE9uZS1vY3RldCBsZW5ndGggb2YgZm9sbG93aW5nIGhhc2hlZCBtYXRlcmlhbC4nICtcblx0XHRcdFx0XHQnTVVTVCBiZSA1LiBAOicrKGktMSkpO1xuXG5cdFx0XHR2YXIgc2lncG9zID0gaTtcblx0XHRcdC8vIE9uZS1vY3RldCBzaWduYXR1cmUgdHlwZS5cblx0XHRcdHRoaXMuc2lnbmF0dXJlVHlwZSA9IGJ5dGVzW2krK10uY2hhckNvZGVBdCgpO1xuXG5cdFx0XHQvLyBGb3VyLW9jdGV0IGNyZWF0aW9uIHRpbWUuXG5cdFx0XHR0aGlzLmNyZWF0ZWQgPSB1dGlsLnJlYWREYXRlKGJ5dGVzLnN1YnN0cihpLCA0KSk7XG5cdFx0XHRpICs9IDQ7XG5cdFx0XHRcblx0XHRcdC8vIHN0b3JpbmcgZGF0YSBhcHBlbmRlZCB0byBkYXRhIHdoaWNoIGdldHMgdmVyaWZpZWRcblx0XHRcdHRoaXMuc2lnbmF0dXJlRGF0YSA9IGJ5dGVzLnN1YnN0cmluZyhwb3NpdGlvbiwgaSk7XG5cdFx0XHRcblx0XHRcdC8vIEVpZ2h0LW9jdGV0IEtleSBJRCBvZiBzaWduZXIuXG5cdFx0XHR0aGlzLmlzc3VlcktleUlkID0gYnl0ZXMuc3Vic3RyaW5nKGksIGkgKzgpO1xuXHRcdFx0aSArPSA4O1xuXG5cdFx0XHQvLyBPbmUtb2N0ZXQgcHVibGljLWtleSBhbGdvcml0aG0uXG5cdFx0XHR0aGlzLnB1YmxpY0tleUFsZ29yaXRobSA9IGJ5dGVzW2krK10uY2hhckNvZGVBdCgpO1xuXG5cdFx0XHQvLyBPbmUtb2N0ZXQgaGFzaCBhbGdvcml0aG0uXG5cdFx0XHR0aGlzLmhhc2hBbGdvcml0aG0gPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRicmVhaztcblx0XHRjYXNlIDQ6XG5cdFx0XHR0aGlzLnNpZ25hdHVyZVR5cGUgPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdHRoaXMucHVibGljS2V5QWxnb3JpdGhtID0gYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHR0aGlzLmhhc2hBbGdvcml0aG0gPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblxuXG5cdFx0XHRmdW5jdGlvbiBzdWJwYWNrZXRzKGJ5dGVzLCBzaWduZWQpIHtcblx0XHRcdFx0Ly8gVHdvLW9jdGV0IHNjYWxhciBvY3RldCBjb3VudCBmb3IgZm9sbG93aW5nIGhhc2hlZCBzdWJwYWNrZXRcblx0XHRcdFx0Ly8gZGF0YS5cblx0XHRcdFx0dmFyIHN1YnBhY2tldF9sZW5ndGggPSB1dGlsLnJlYWROdW1iZXIoXG5cdFx0XHRcdFx0Ynl0ZXMuc3Vic3RyKDAsIDIpKTtcblxuXHRcdFx0XHR2YXIgaSA9IDI7XG5cblx0XHRcdFx0Ly8gSGFzaGVkIHN1YnBhY2tldCBkYXRhIHNldCAoemVybyBvciBtb3JlIHN1YnBhY2tldHMpXG5cdFx0XHRcdHZhciBzdWJwYWNrZWRfcmVhZCA9IDA7XG5cdFx0XHRcdHdoaWxlIChpIDwgMiArIHN1YnBhY2tldF9sZW5ndGgpIHtcblxuXHRcdFx0XHRcdHZhciBsZW4gPSBwYWNrZXQucmVhZFNpbXBsZUxlbmd0aChieXRlcy5zdWJzdHIoaSkpO1xuXHRcdFx0XHRcdGkgKz0gbGVuLm9mZnNldDtcblxuXHRcdFx0XHRcdC8vIFNpbmNlIGl0IGlzIHRyaXZpYWwgdG8gYWRkIGRhdGEgdG8gdGhlIHVuaGFzaGVkIHBvcnRpb24gb2YgXG5cdFx0XHRcdFx0Ly8gdGhlIHBhY2tldCB3ZSBzaW1wbHkgaWdub3JlIGFsbCB1bmF1dGhlbnRpY2F0ZWQgZGF0YS5cblx0XHRcdFx0XHRpZihzaWduZWQpXG5cdFx0XHRcdFx0XHR0aGlzLnJlYWRfc3ViX3BhY2tldChieXRlcy5zdWJzdHIoaSwgbGVuLmxlbikpO1xuXG5cdFx0XHRcdFx0aSArPSBsZW4ubGVuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0aSArPSBzdWJwYWNrZXRzLmNhbGwodGhpcywgYnl0ZXMuc3Vic3RyKGkpLCB0cnVlKTtcblxuXHRcdFx0Ly8gQSBWNCBzaWduYXR1cmUgaGFzaGVzIHRoZSBwYWNrZXQgYm9keVxuXHRcdFx0Ly8gc3RhcnRpbmcgZnJvbSBpdHMgZmlyc3QgZmllbGQsIHRoZSB2ZXJzaW9uIG51bWJlciwgdGhyb3VnaCB0aGUgZW5kXG5cdFx0XHQvLyBvZiB0aGUgaGFzaGVkIHN1YnBhY2tldCBkYXRhLiAgVGh1cywgdGhlIGZpZWxkcyBoYXNoZWQgYXJlIHRoZVxuXHRcdFx0Ly8gc2lnbmF0dXJlIHZlcnNpb24sIHRoZSBzaWduYXR1cmUgdHlwZSwgdGhlIHB1YmxpYy1rZXkgYWxnb3JpdGhtLCB0aGVcblx0XHRcdC8vIGhhc2ggYWxnb3JpdGhtLCB0aGUgaGFzaGVkIHN1YnBhY2tldCBsZW5ndGgsIGFuZCB0aGUgaGFzaGVkXG5cdFx0XHQvLyBzdWJwYWNrZXQgYm9keS5cblx0XHRcdHRoaXMuc2lnbmF0dXJlRGF0YSA9IGJ5dGVzLnN1YnN0cigwLCBpKTtcblxuXHRcdFx0aSArPSBzdWJwYWNrZXRzLmNhbGwodGhpcywgYnl0ZXMuc3Vic3RyKGkpLCBmYWxzZSk7XG5cblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1ZlcnNpb24gJyArIHZlcnNpb24gKyAnIG9mIHRoZSBzaWduYXR1cmUgaXMgdW5zdXBwb3J0ZWQuJyk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBUd28tb2N0ZXQgZmllbGQgaG9sZGluZyBsZWZ0IDE2IGJpdHMgb2Ygc2lnbmVkIGhhc2ggdmFsdWUuXG5cdFx0dGhpcy5zaWduZWRIYXNoVmFsdWUgPSBieXRlcy5zdWJzdHIoaSwgMik7XG5cdFx0aSArPSAyO1xuXG5cdFx0dGhpcy5zaWduYXR1cmUgPSBieXRlcy5zdWJzdHIoaSk7XG5cdH1cblxuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2lnbmF0dXJlRGF0YSArIFxuXHRcdFx0dXRpbC53cml0ZU51bWJlcigwLCAyKSArIC8vIE51bWJlciBvZiB1bnNpZ25lZCBzdWJwYWNrZXRzLlxuXHRcdFx0dGhpcy5zaWduZWRIYXNoVmFsdWUgK1xuXHRcdFx0dGhpcy5zaWduYXR1cmU7XG5cdH1cblxuXHQvKipcblx0ICogU2lnbnMgcHJvdmlkZWQgZGF0YS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIHByaW9yIHRvIHNlcmlhbGl6YXRpb24uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIENvbnRhaW5zIHBhY2tldHMgdG8gYmUgc2lnbmVkLlxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXl9IHByaXZhdGVrZXkgcHJpdmF0ZSBrZXkgdXNlZCB0byBzaWduIHRoZSBtZXNzYWdlLiBcblx0ICovXG5cdHRoaXMuc2lnbiA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xuXHRcdHZhciBzaWduYXR1cmVUeXBlID0gZW51bXMud3JpdGUoZW51bXMuc2lnbmF0dXJlLCB0aGlzLnNpZ25hdHVyZVR5cGUpLFxuXHRcdFx0cHVibGljS2V5QWxnb3JpdGhtID0gZW51bXMud3JpdGUoZW51bXMucHVibGljS2V5LCB0aGlzLnB1YmxpY0tleUFsZ29yaXRobSksXG5cdFx0XHRoYXNoQWxnb3JpdGhtID0gZW51bXMud3JpdGUoZW51bXMuaGFzaCwgdGhpcy5oYXNoQWxnb3JpdGhtKTtcblxuXHRcdHZhciByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDQpOyBcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShzaWduYXR1cmVUeXBlKTtcblx0XHRyZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwdWJsaWNLZXlBbGdvcml0aG0pO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGhhc2hBbGdvcml0aG0pO1xuXG5cblx0XHQvLyBBZGQgc3VicGFja2V0cyBoZXJlXG5cdFx0cmVzdWx0ICs9IHV0aWwud3JpdGVOdW1iZXIoMCwgMik7XG5cblxuXHRcdHRoaXMuc2lnbmF0dXJlRGF0YSA9IHJlc3VsdDtcblxuXHRcdHZhciB0cmFpbGVyID0gdGhpcy5jYWxjdWxhdGVUcmFpbGVyKCk7XG5cdFx0XG5cdFx0dmFyIHRvSGFzaCA9IHRoaXMudG9TaWduKHNpZ25hdHVyZVR5cGUsIGRhdGEpICsgXG5cdFx0XHR0aGlzLnNpZ25hdHVyZURhdGEgKyB0cmFpbGVyO1xuXG5cdFx0dmFyIGhhc2ggPSBjcnlwdG8uaGFzaC5kaWdlc3QoaGFzaEFsZ29yaXRobSwgdG9IYXNoKTtcblx0XHRcblx0XHR0aGlzLnNpZ25lZEhhc2hWYWx1ZSA9IGhhc2guc3Vic3RyKDAsIDIpO1xuXG5cblx0XHR0aGlzLnNpZ25hdHVyZSA9IGNyeXB0by5zaWduYXR1cmUuc2lnbihoYXNoQWxnb3JpdGhtLCBcblx0XHRcdHB1YmxpY0tleUFsZ29yaXRobSwga2V5Lm1waSwgdG9IYXNoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBjcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc3ViIHNpZ25hdHVyZSBwYWNrZXQgKFNlZSBSRkMgNDg4MCA1LjIuMy4xKVxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHR5cGUgc3VicGFja2V0IHNpZ25hdHVyZSB0eXBlLiBTaWduYXR1cmUgdHlwZXMgYXMgZGVzY3JpYmVkIFxuXHQgKiBpbiBSRkM0ODgwIFNlY3Rpb24gNS4yLjMuMlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZGF0YSBkYXRhIHRvIGJlIGluY2x1ZGVkXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gYSBzdHJpbmctcmVwcmVzZW50YXRpb24gb2YgYSBzdWIgc2lnbmF0dXJlIHBhY2tldCAoU2VlIFJGQyA0ODgwIDUuMi4zLjEpXG5cdCAqL1xuXHRmdW5jdGlvbiB3cml0ZV9zdWJfcGFja2V0KHR5cGUsIGRhdGEpIHtcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcblx0XHRyZXN1bHQgKz0gcGFja2V0LndyaXRlU2ltcGxlTGVuZ3RoKGRhdGEubGVuZ3RoKzEpO1xuXHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHR5cGUpO1xuXHRcdHJlc3VsdCArPSBkYXRhO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblx0XG5cdC8vIFY0IHNpZ25hdHVyZSBzdWIgcGFja2V0c1xuXHRcblx0dGhpcy5yZWFkX3N1Yl9wYWNrZXQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdHZhciBteXBvcyA9IDA7XG5cblx0XHRmdW5jdGlvbiByZWFkX2FycmF5KHByb3AsIGJ5dGVzKSB7XG5cdFx0XHR0aGlzW3Byb3BdID0gW107XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dGhpc1twcm9wXS5wdXNoKGJ5dGVzW2ldLmNoYXJDb2RlQXQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdC8vIFRoZSBsZWZ0d29zdCBiaXQgZGVub3RlcyBhIFwiY3JpdGljYWxcIiBwYWNrZXQsIGJ1dCB3ZSBpZ25vcmUgaXQuXG5cdFx0dmFyIHR5cGUgPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCkgJiAweDdGO1xuXG5cdFx0Ly8gc3VicGFja2V0IHR5cGVcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRjYXNlIDI6IC8vIFNpZ25hdHVyZSBDcmVhdGlvbiBUaW1lXG5cdFx0XHR0aGlzLmNyZWF0ZWQgPSB1dGlsLnJlYWREYXRlKGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzOiAvLyBTaWduYXR1cmUgRXhwaXJhdGlvbiBUaW1lXG5cdFx0XHR2YXIgdGltZSA9IHV0aWwucmVhZERhdGUoYnl0ZXMuc3Vic3RyKG15cG9zKSk7XG5cblx0XHRcdHRoaXMuc2lnbmF0dXJlTmV2ZXJFeHBpcmVzID0gdGltZS5nZXRUaW1lKCkgPT0gMDtcblx0XHRcdHRoaXMuc2lnbmF0dXJlRXhwaXJhdGlvblRpbWUgPSB0aW1lO1xuXHRcdFx0XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDQ6IC8vIEV4cG9ydGFibGUgQ2VydGlmaWNhdGlvblxuXHRcdFx0dGhpcy5leHBvcnRhYmxlID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpID09IDE7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDU6IC8vIFRydXN0IFNpZ25hdHVyZVxuXHRcdFx0dGhpcy50cnVzdExldmVsID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0dGhpcy50cnVzdEFtb3VudCA9IGJ5dGVzW215cG9zKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgNjogLy8gUmVndWxhciBFeHByZXNzaW9uXG5cdFx0XHR0aGlzLnJlZ3VsYXJFeHByZXNzaW9uID0gYnl0ZXMuc3Vic3RyKG15cG9zKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgNzogLy8gUmV2b2NhYmxlXG5cdFx0XHR0aGlzLnJldm9jYWJsZSA9IGJ5dGVzW215cG9zKytdLmNoYXJDb2RlQXQoKSA9PSAxO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSA5OiAvLyBLZXkgRXhwaXJhdGlvbiBUaW1lXG5cdFx0XHR2YXIgdGltZSA9IHV0aWwucmVhZERhdGUoYnl0ZXMuc3Vic3RyKG15cG9zKSk7XG5cblx0XHRcdHRoaXMua2V5RXhwaXJhdGlvblRpbWUgPSB0aW1lO1xuXHRcdFx0dGhpcy5rZXlOZXZlckV4cGlyZXMgPSB0aW1lLmdldFRpbWUoKSA9PSAwO1xuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDExOiAvLyBQcmVmZXJyZWQgU3ltbWV0cmljIEFsZ29yaXRobXNcblx0XHRcdHRoaXMucHJlZmVycmVkU3ltbWV0cmljQWxnb3JpdGhtcyA9IFtdO1xuXG5cdFx0XHR3aGlsZShteXBvcyAhPSBieXRlcy5sZW5ndGgpIHtcblx0XHRcdFx0dGhpcy5wcmVmZXJyZWRTeW1tZXRyaWNBbGdvcml0aG1zLnB1c2goYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpKTtcblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAxMjogLy8gUmV2b2NhdGlvbiBLZXlcblx0XHRcdC8vICgxIG9jdGV0IG9mIGNsYXNzLCAxIG9jdGV0IG9mIHB1YmxpYy1rZXkgYWxnb3JpdGhtIElELCAyMFxuXHRcdFx0Ly8gb2N0ZXRzIG9mXG5cdFx0XHQvLyBmaW5nZXJwcmludClcblx0XHRcdHRoaXMucmV2b2NhdGlvbktleUNsYXNzID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0dGhpcy5yZXZvY2F0aW9uS2V5QWxnb3JpdGhtID0gYnl0ZXNbbXlwb3MrK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0dGhpcy5yZXZvY2F0aW9uS2V5RmluZ2VycHJpbnQgPSBieXRlcy5zdWJzdHIobXlwb3MsIDIwKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAxNjogLy8gSXNzdWVyXG5cdFx0XHR0aGlzLmlzc3VlcktleUlkID0gYnl0ZXMuc3Vic3RyKG15cG9zLCA4KTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAyMDogLy8gTm90YXRpb24gRGF0YVxuXHRcdFx0Ly8gV2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGFueXRoaW5nIGJ1dCBhIHRleHQgZmxhZ2dlZCBkYXRhLlxuXHRcdFx0aWYoYnl0ZXNbbXlwb3NdLmNoYXJDb2RlQXQoKSA9PSAweDgwKSB7XG5cblx0XHRcdFx0Ly8gV2UgZXh0cmFjdCBrZXkvdmFsdWUgdHVwbGUgZnJvbSB0aGUgYnl0ZSBzdHJlYW0uXG5cdFx0XHRcdG15cG9zICs9IDQ7XG5cdFx0XHRcdHZhciBtID0gdXRpbC53cml0ZU51bWJlcihieXRlcy5zdWJzdHIobXlwb3MsIDIpKTtcblx0XHRcdFx0bXlwb3MgKz0gMlxuXHRcdFx0XHR2YXIgbiA9IHV0aWwud3JpdGVOdW1iZXIoYnl0ZXMuc3Vic3RyKG15cG9zLCAyKSk7XG5cdFx0XHRcdG15cG9zICs9IDJcblxuXHRcdFx0XHR2YXIgbmFtZSA9IGJ5dGVzLnN1YnN0cihteXBvcywgbSksXG5cdFx0XHRcdFx0dmFsdWUgPSBieXRlcy5zdWJzdHIobXlwb3MgKyBtLCBuKTtcblxuXHRcdFx0XHR0aGlzLm5vdGF0aW9uW25hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIG5vdGF0aW9uIGZsYWcuXCIpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMTogLy8gUHJlZmVycmVkIEhhc2ggQWxnb3JpdGhtc1xuXHRcdFx0cmVhZF9hcnJheS5jYWxsKHRoaXMsICdwcmVmZXJyZWRIYXNoQWxnb3JpdGhtcycsIGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMjogLy8gUHJlZmVycmVkIENvbXByZXNzaW9uIEFsZ29yaXRobXNcblx0XHRcdHJlYWRfYXJyYXkuY2FsbCh0aGlzLCAncHJlZmVycmVkQ29tcHJlc3Npb25BbGdvcml0aG1zICcsIGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyMzogLy8gS2V5IFNlcnZlciBQcmVmZXJlbmNlc1xuXHRcdFx0cmVhZF9hcnJheS5jYWxsKHRoaXMsICdrZXlTZXJ2ZXJQcmVmZXJlbmNlc3MnLCBieXRlcy5zdWJzdHIobXlwb3MpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjQ6IC8vIFByZWZlcnJlZCBLZXkgU2VydmVyXG5cdFx0XHR0aGlzLnByZWZlcnJlZEtleVNlcnZlciA9IGJ5dGVzLnN1YnN0cihteXBvcyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDI1OiAvLyBQcmltYXJ5IFVzZXIgSURcblx0XHRcdHRoaXMuaXNQcmltYXJ5VXNlcklEID0gYnl0ZXNbbXlwb3MrK10gIT0gMDtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjY6IC8vIFBvbGljeSBVUklcblx0XHRcdHRoaXMucG9saWN5VVJJID0gYnl0ZXMuc3Vic3RyKG15cG9zKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMjc6IC8vIEtleSBGbGFnc1xuXHRcdFx0cmVhZF9hcnJheS5jYWxsKHRoaXMsICdrZXlGbGFncycsIGJ5dGVzLnN1YnN0cihteXBvcykpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAyODogLy8gU2lnbmVyJ3MgVXNlciBJRFxuXHRcdFx0dGhpcy5zaWduZXJzVXNlcklkICs9IGJ5dGVzLnN1YnN0cihteXBvcyk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIDI5OiAvLyBSZWFzb24gZm9yIFJldm9jYXRpb25cblx0XHRcdHRoaXMucmVhc29uRm9yUmV2b2NhdGlvbkZsYWcgPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHR0aGlzLnJlYXNvbkZvclJldm9jYXRpb25TdHJpbmcgPSBieXRlcy5zdWJzdHIobXlwb3MpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzMDogLy8gRmVhdHVyZXNcblx0XHRcdHJlYWRfYXJyYXkuY2FsbCh0aGlzLCAnZmVhdHVyZXMnLCBieXRlcy5zdWJzdHIobXlwb3MpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgMzE6IC8vIFNpZ25hdHVyZSBUYXJnZXRcblx0XHRcdC8vICgxIG9jdGV0IHB1YmxpYy1rZXkgYWxnb3JpdGhtLCAxIG9jdGV0IGhhc2ggYWxnb3JpdGhtLCBOIG9jdGV0cyBoYXNoKVxuXHRcdFx0dGhpcy5zaWduYXR1cmVUYXJnZXRQdWJsaWNLZXlBbGdvcml0aG0gPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cdFx0XHR0aGlzLnNpZ25hdHVyZVRhcmdldEhhc2hBbGdvcml0aG0gPSBieXRlc1tteXBvcysrXS5jaGFyQ29kZUF0KCk7XG5cblx0XHRcdHZhciBsZW4gPSBjcnlwdG8uZ2V0SGFzaEJ5dGVMZW5ndGgodGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoQWxnb3JpdGhtKTtcblxuXHRcdFx0dGhpcy5zaWduYXR1cmVUYXJnZXRIYXNoID0gYnl0ZXMuc3Vic3RyKG15cG9zLCBsZW4pO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAzMjogLy8gRW1iZWRkZWQgU2lnbmF0dXJlXG5cdFx0XHR0aGlzLmVtYmVkZGVkU2lnbmF0dXJlID0gbmV3IHBhY2tldF9zaWduYXR1cmUoKTtcblx0XHRcdHRoaXMuZW1iZWRkZWRTaWduYXR1cmUucmVhZChieXRlcy5zdWJzdHIobXlwb3MpKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR1dGlsLnByaW50X2Vycm9yKFwib3BlbnBncC5wYWNrZXQuc2lnbmF0dXJlLmpzXFxuXCIrXG5cdFx0XHRcdCd1bmtub3duIHNpZ25hdHVyZSBzdWJwYWNrZXQgdHlwZSAnK3R5cGUrXCIgQDpcIitteXBvcytcblx0XHRcdFx0XCIgc3VicGxlbjpcIitzdWJwbGVuK1wiIGxlbjpcIitsZW4pO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIFByb2R1Y2VzIGRhdGEgdG8gcHJvZHVjZSBzaWduYXR1cmUgb25cblx0dGhpcy50b1NpZ24gPSBmdW5jdGlvbih0eXBlLCBkYXRhKSB7XG5cdFx0dmFyIHQgPSBlbnVtcy5zaWduYXR1cmVcblxuXHRcdHN3aXRjaCh0eXBlKSB7XG5cdFx0Y2FzZSB0LmJpbmFyeTpcblx0XHRcdHJldHVybiBkYXRhLmxpdGVyYWwuZ2V0Qnl0ZXMoKTtcblxuXHRcdGNhc2UgdC50ZXh0OlxuXHRcdFx0cmV0dXJuIHRoaXMudG9TaWduKHQuYmluYXJ5LCBkYXRhKVxuXHRcdFx0XHQucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKVxuXHRcdFx0XHQucmVwbGFjZSgvXFxuL2csICdcXHJcXG4nKTtcblx0XHRcdFx0XG5cdFx0Y2FzZSB0LnN0YW5kYWxvbmU6XG5cdFx0XHRyZXR1cm4gJydcblxuXHRcdGNhc2UgdC5jZXJ0X2dlbmVyaWM6XG5cdFx0Y2FzZSB0LmNlcnRfcGVyc29uYTpcblx0XHRjYXNlIHQuY2VydF9jYXN1YWw6XG5cdFx0Y2FzZSB0LmNlcnRfcG9zaXRpdmU6XG5cdFx0Y2FzZSB0LmNlcnRfcmV2b2NhdGlvbjpcblx0XHR7XG5cdFx0XHR2YXIgcGFja2V0LCB0YWc7XG5cblx0XHRcdGlmKGRhdGEudXNlcmlkICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0YWcgPSAweEI0O1xuXHRcdFx0XHRwYWNrZXQgPSBkYXRhLnVzZXJpZDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYoZGF0YS51c2VyYXR0cmlidXRlICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0YWcgPSAweEQxXG5cdFx0XHRcdHBhY2tldCA9IGRhdGEudXNlcmF0dHJpYnV0ZTtcblx0XHRcdH1cblx0XHRcdGVsc2UgdGhyb3cgbmV3IEVycm9yKCdFaXRoZXIgYSB1c2VyaWQgb3IgdXNlcmF0dHJpYnV0ZSBwYWNrZXQgbmVlZHMgdG8gYmUgJyArXG5cdFx0XHRcdCdzdXBwbGllZCBmb3IgY2VydGlmaWNhdGlvbi4nKTtcblxuXG5cdFx0XHR2YXIgYnl0ZXMgPSBwYWNrZXQud3JpdGUoKTtcblxuXHRcdFx0XG5cdFx0XHRyZXR1cm4gdGhpcy50b1NpZ24odC5rZXksIGRhdGEpICtcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSh0YWcpICtcblx0XHRcdFx0dXRpbC53cml0ZU51bWJlcihieXRlcy5sZW5ndGgsIDQpICtcblx0XHRcdFx0Ynl0ZXM7XG5cdFx0fVxuXHRcdGNhc2UgdC5zdWJrZXlfYmluZGluZzpcblx0XHRjYXNlIHQua2V5X2JpbmRpbmc6XG5cdFx0e1xuXHRcdFx0cmV0dXJuIHRoaXMudG9TaWduKHQua2V5LCBkYXRhKSArIHRoaXMudG9TaWduKHQua2V5LCB7IGtleTogZGF0YS5iaW5kIH0pO1xuXHRcdH1cblx0XHRjYXNlIHQua2V5OlxuXHRcdHtcblx0XHRcdGlmKGRhdGEua2V5ID09IHVuZGVmaW5lZClcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdLZXkgcGFja2V0IGlzIHJlcXVpcmVkIGZvciB0aGlzIHNpZ3RhdHVyZS4nKTtcblx0XHRcdFxuXHRcdFx0cmV0dXJuIGRhdGEua2V5LndyaXRlT2xkKCk7XG5cdFx0fVxuXHRcdGNhc2UgdC5rZXlfcmV2b2NhdGlvbjpcblx0XHRjYXNlIHQuc3Via2V5X3Jldm9jYXRpb246XG5cdFx0XHRyZXR1cm4gdGhpcy50b1NpZ24odC5rZXksIGRhdGEpO1xuXHRcdGNhc2UgdC50aW1lc3RhbXA6XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0Y2FzZSB0LnRocmlkX3BhcnR5OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gc2lnbmF0dXJlIHR5cGUuJylcblx0XHR9XG5cdH1cblxuXHRcblx0dGhpcy5jYWxjdWxhdGVUcmFpbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gY2FsY3VsYXRpbmcgdGhlIHRyYWlsZXJcblx0XHR2YXIgdHJhaWxlciA9ICcnO1xuXHRcdHRyYWlsZXIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg0KTsgLy8gVmVyc2lvblxuXHRcdHRyYWlsZXIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEZGKTtcblx0XHR0cmFpbGVyICs9IHV0aWwud3JpdGVOdW1iZXIodGhpcy5zaWduYXR1cmVEYXRhLmxlbmd0aCwgNCk7XG5cdFx0cmV0dXJuIHRyYWlsZXJcblx0fVxuXG5cblx0LyoqXG5cdCAqIHZlcmlmeXMgdGhlIHNpZ25hdHVyZSBwYWNrZXQuIE5vdGU6IG5vdCBzaWduYXR1cmUgdHlwZXMgYXJlIGltcGxlbWVudGVkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIGRhdGEgd2hpY2ggb24gdGhlIHNpZ25hdHVyZSBhcHBsaWVzXG5cdCAqIEBwYXJhbSB7b3BlbnBncF9tc2dfcHJpdmF0ZWtleX0ga2V5IHRoZSBwdWJsaWMga2V5IHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbWVzc2FnZSBpcyB2ZXJpZmllZCwgZWxzZSBmYWxzZS5cblx0ICovXG5cdHRoaXMudmVyaWZ5ID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XG5cdFx0dmFyIHNpZ25hdHVyZVR5cGUgPSBlbnVtcy53cml0ZShlbnVtcy5zaWduYXR1cmUsIHRoaXMuc2lnbmF0dXJlVHlwZSksXG5cdFx0XHRwdWJsaWNLZXlBbGdvcml0aG0gPSBlbnVtcy53cml0ZShlbnVtcy5wdWJsaWNLZXksIHRoaXMucHVibGljS2V5QWxnb3JpdGhtKSxcblx0XHRcdGhhc2hBbGdvcml0aG0gPSBlbnVtcy53cml0ZShlbnVtcy5oYXNoLCB0aGlzLmhhc2hBbGdvcml0aG0pO1xuXG5cdFx0dmFyIGJ5dGVzID0gdGhpcy50b1NpZ24oc2lnbmF0dXJlVHlwZSwgZGF0YSksXG5cdFx0XHR0cmFpbGVyID0gdGhpcy5jYWxjdWxhdGVUcmFpbGVyKCk7XG5cblxuXHRcdHZhciBtcGljb3VudCA9IDA7XG5cdFx0Ly8gQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgUlNBIHNpZ25hdHVyZXM6XG5cdFx0Ly8gXHQgICAgLSBtdWx0aXByZWNpc2lvbiBudW1iZXIgKE1QSSkgb2YgUlNBIHNpZ25hdHVyZSB2YWx1ZSBtKipkIG1vZCBuLlxuXHRcdGlmIChwdWJsaWNLZXlBbGdvcml0aG0gPiAwICYmIHB1YmxpY0tleUFsZ29yaXRobSA8IDQpXG5cdFx0XHRtcGljb3VudCA9IDE7XG5cdFx0Ly8gICAgQWxnb3JpdGhtLVNwZWNpZmljIEZpZWxkcyBmb3IgRFNBIHNpZ25hdHVyZXM6XG5cdFx0Ly8gICAgICAtIE1QSSBvZiBEU0EgdmFsdWUgci5cblx0XHQvLyAgICAgIC0gTVBJIG9mIERTQSB2YWx1ZSBzLlxuXHRcdGVsc2UgaWYgKHB1YmxpY0tleUFsZ29yaXRobSA9PSAxNylcblx0XHRcdG1waWNvdW50ID0gMjtcblx0XHRcblx0XHR2YXIgbXBpID0gW10sIGkgPSAwO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgbXBpY291bnQ7IGorKykge1xuXHRcdFx0bXBpW2pdID0gbmV3IHR5cGVfbXBpKCk7XG5cdFx0XHRpICs9IG1waVtqXS5yZWFkKHRoaXMuc2lnbmF0dXJlLnN1YnN0cihpKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy52ZXJpZmllZCA9IGNyeXB0by5zaWduYXR1cmUudmVyaWZ5KHB1YmxpY0tleUFsZ29yaXRobSwgXG5cdFx0XHRoYXNoQWxnb3JpdGhtLCBtcGksIGtleS5tcGksIFxuXHRcdFx0Ynl0ZXMgKyB0aGlzLnNpZ25hdHVyZURhdGEgKyB0cmFpbGVyKTtcblxuXHRcdHJldHVybiB0aGlzLnZlcmlmaWVkO1xuXHR9XG59XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpLFxuXHRjcnlwdG8gPSByZXF1aXJlKCcuLi9jcnlwdG8nKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bS4gRW5jcnlwdGVkIEludGVncml0eSBQcm90ZWN0ZWQgRGF0YSBcbiAqIFBhY2tldCAoVGFnIDE4KVxuICogXG4gKiBSRkM0ODgwIDUuMTM6IFRoZSBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBJbnRlZ3JpdHkgUHJvdGVjdGVkIERhdGEgcGFja2V0IGlzXG4gKiBhIHZhcmlhbnQgb2YgdGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgcGFja2V0LiBJdCBpcyBhIG5ldyBmZWF0dXJlXG4gKiBjcmVhdGVkIGZvciBPcGVuUEdQIHRoYXQgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIG9mIGRldGVjdGluZyBhIG1vZGlmaWNhdGlvbiB0b1xuICogZW5jcnlwdGVkIGRhdGEuIEl0IGlzIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhIE1vZGlmaWNhdGlvbiBEZXRlY3Rpb24gQ29kZVxuICogcGFja2V0LlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3N5bV9lbmNyeXB0ZWRfaW50ZWdyaXR5X3Byb3RlY3RlZCgpIHtcblx0LyoqIFRoZSBlbmNyeXB0ZWQgcGF5bG9hZC4gKi9cblx0dGhpcy5lbmNyeXB0ZWQgPSBudWxsOyAvLyBzdHJpbmdcblx0LyoqIEB0eXBlIHtCb29sZWFufVxuXHQgKiBJZiBhZnRlciBkZWNyeXB0aW5nIHRoZSBwYWNrZXQgdGhpcyBpcyBzZXQgdG8gdHJ1ZSxcblx0ICogYSBtb2RpZmljYXRpb24gaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIHRodXMgdGhlIGNvbnRlbnRzXG5cdCAqIHNob3VsZCBiZSBkaXNjYXJkZWQuXG5cdCAqL1xuXHR0aGlzLm1vZGlmaWNhdGlvbiA9IGZhbHNlO1xuXHR0aGlzLnBhY2tldHM7XG5cblxuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdC8vIC0gQSBvbmUtb2N0ZXQgdmVyc2lvbiBudW1iZXIuIFRoZSBvbmx5IGN1cnJlbnRseSBkZWZpbmVkIHZhbHVlIGlzXG5cdFx0Ly8gMS5cblx0XHR2YXIgdmVyc2lvbiA9IGJ5dGVzWzBdLmNoYXJDb2RlQXQoKTtcblxuXHRcdGlmICh2ZXJzaW9uICE9IDEpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYWNrZXQgdmVyc2lvbi4nKTtcblx0XHR9XG5cblx0XHQvLyAtIEVuY3J5cHRlZCBkYXRhLCB0aGUgb3V0cHV0IG9mIHRoZSBzZWxlY3RlZCBzeW1tZXRyaWMta2V5IGNpcGhlclxuXHRcdC8vICAgb3BlcmF0aW5nIGluIENpcGhlciBGZWVkYmFjayBtb2RlIHdpdGggc2hpZnQgYW1vdW50IGVxdWFsIHRvIHRoZVxuXHRcdC8vICAgYmxvY2sgc2l6ZSBvZiB0aGUgY2lwaGVyIChDRkItbiB3aGVyZSBuIGlzIHRoZSBibG9jayBzaXplKS5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IGJ5dGVzLnN1YnN0cigxKTtcblx0fVxuXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRcblx0XHRyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgxKSAvLyBWZXJzaW9uXG5cdFx0XHQrIHRoaXMuZW5jcnlwdGVkO1xuXHR9XG5cblx0dGhpcy5lbmNyeXB0ID0gZnVuY3Rpb24oc2Vzc2lvbktleUFsZ29yaXRobSwga2V5KSB7XG5cdFx0dmFyIGJ5dGVzID0gdGhpcy5wYWNrZXRzLndyaXRlKClcblx0XHRcblx0XHR2YXIgcHJlZml4cmFuZG9tID0gY3J5cHRvLmdldFByZWZpeFJhbmRvbShzZXNzaW9uS2V5QWxnb3JpdGhtKTtcblx0XHR2YXIgcHJlZml4ID0gcHJlZml4cmFuZG9tXG5cdFx0XHRcdCsgcHJlZml4cmFuZG9tLmNoYXJBdChwcmVmaXhyYW5kb20ubGVuZ3RoIC0gMilcblx0XHRcdFx0KyBwcmVmaXhyYW5kb20uY2hhckF0KHByZWZpeHJhbmRvbS5sZW5ndGggLSAxKVxuXG5cdFx0dmFyIHRvaGFzaCA9IGJ5dGVzO1xuXG5cblx0XHQvLyBNb2RpZmljYXRpb24gZGV0ZWN0aW9uIGNvZGUgcGFja2V0LlxuXHRcdHRvaGFzaCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDMpO1xuXHRcdHRvaGFzaCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MTQpO1xuXG5cblx0XHR0b2hhc2ggKz0gY3J5cHRvLmhhc2guc2hhMShwcmVmaXggKyB0b2hhc2gpO1xuXG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IGNyeXB0by5jZmIuZW5jcnlwdChwcmVmaXhyYW5kb20sXG5cdFx0XHRcdHNlc3Npb25LZXlBbGdvcml0aG0sIHRvaGFzaCwga2V5LCBmYWxzZSkuc3Vic3RyaW5nKDAsXG5cdFx0XHRcdHByZWZpeC5sZW5ndGggKyB0b2hhc2gubGVuZ3RoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNyeXB0cyB0aGUgZW5jcnlwdGVkIGRhdGEgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0IHJlYWRfcGFja2V0IG11c3Rcblx0ICogaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmVcblx0ICogXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gc2Vzc2lvbktleUFsZ29yaXRobVxuXHQgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZCBzeW1tZXRyaWMgZW5jcnlwdGlvbiBhbGdvcml0aG0gdG8gYmUgdXNlZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSBrZXkgb2YgY2lwaGVyIGJsb2Nrc2l6ZSBsZW5ndGggdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBkZWNyeXB0ZWQgZGF0YSBvZiB0aGlzIHBhY2tldFxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24oc2Vzc2lvbktleUFsZ29yaXRobSwga2V5KSB7XG5cdFx0dmFyIGRlY3J5cHRlZCA9IGNyeXB0by5jZmIuZGVjcnlwdChcblx0XHRcdFx0c2Vzc2lvbktleUFsZ29yaXRobSwga2V5LCB0aGlzLmVuY3J5cHRlZCwgZmFsc2UpO1xuXG5cblx0XHQvLyB0aGVyZSBtdXN0IGJlIGEgbW9kaWZpY2F0aW9uIGRldGVjdGlvbiBjb2RlIHBhY2tldCBhcyB0aGVcblx0XHQvLyBsYXN0IHBhY2tldCBhbmQgZXZlcnl0aGluZyBnZXRzIGhhc2hlZCBleGNlcHQgdGhlIGhhc2ggaXRzZWxmXG5cdFx0dGhpcy5oYXNoID0gY3J5cHRvLmhhc2guc2hhMShcblx0XHRcdGNyeXB0by5jZmIubWRjKHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQpXG5cdFx0XHQrIGRlY3J5cHRlZC5zdWJzdHJpbmcoMCwgZGVjcnlwdGVkLmxlbmd0aCAtIDIwKSk7XG5cblxuXHRcdHZhciBtZGMgPSBkZWNyeXB0ZWQuc3Vic3RyKGRlY3J5cHRlZC5sZW5ndGggLSAyMCwgMjApO1xuXG5cdFx0aWYodGhpcy5oYXNoICE9IG1kYykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNb2RpZmljYXRpb24gZGV0ZWN0ZWQuJyk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMucGFja2V0cy5yZWFkKGRlY3J5cHRlZC5zdWJzdHIoMCwgZGVjcnlwdGVkLmxlbmd0aCAtIDIyKSk7XG5cdH1cbn07XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgdHlwZV9zMmsgPSByZXF1aXJlKCcuLi90eXBlL3Myay5qcycpLFxuXHRlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpO1xuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBQdWJsaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleSBQYWNrZXRzIChUYWcgMSlcbiAqIFxuICogUkZDNDg4MCA1LjE6IEEgUHVibGljLUtleSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0IGhvbGRzIHRoZSBzZXNzaW9uIGtleVxuICogdXNlZCB0byBlbmNyeXB0IGEgbWVzc2FnZS4gWmVybyBvciBtb3JlIFB1YmxpYy1LZXkgRW5jcnlwdGVkIFNlc3Npb24gS2V5XG4gKiBwYWNrZXRzIGFuZC9vciBTeW1tZXRyaWMtS2V5IEVuY3J5cHRlZCBTZXNzaW9uIEtleSBwYWNrZXRzIG1heSBwcmVjZWRlIGFcbiAqIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0LCB3aGljaCBob2xkcyBhbiBlbmNyeXB0ZWQgbWVzc2FnZS4gVGhlXG4gKiBtZXNzYWdlIGlzIGVuY3J5cHRlZCB3aXRoIHRoZSBzZXNzaW9uIGtleSwgYW5kIHRoZSBzZXNzaW9uIGtleSBpcyBpdHNlbGZcbiAqIGVuY3J5cHRlZCBhbmQgc3RvcmVkIGluIHRoZSBFbmNyeXB0ZWQgU2Vzc2lvbiBLZXkgcGFja2V0KHMpLiBUaGVcbiAqIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0IGlzIHByZWNlZGVkIGJ5IG9uZSBQdWJsaWMtS2V5IEVuY3J5cHRlZFxuICogU2Vzc2lvbiBLZXkgcGFja2V0IGZvciBlYWNoIE9wZW5QR1Aga2V5IHRvIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGVuY3J5cHRlZC5cbiAqIFRoZSByZWNpcGllbnQgb2YgdGhlIG1lc3NhZ2UgZmluZHMgYSBzZXNzaW9uIGtleSB0aGF0IGlzIGVuY3J5cHRlZCB0byB0aGVpclxuICogcHVibGljIGtleSwgZGVjcnlwdHMgdGhlIHNlc3Npb24ga2V5LCBhbmQgdGhlbiB1c2VzIHRoZSBzZXNzaW9uIGtleSB0b1xuICogZGVjcnlwdCB0aGUgbWVzc2FnZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrZXRfc3ltX2VuY3J5cHRlZF9zZXNzaW9uX2tleSgpIHtcblx0dGhpcy50YWcgPSAzO1xuXHR0aGlzLnNlc3Npb25LZXlFbmNyeXB0aW9uQWxnb3JpdGhtID0gbnVsbDtcblx0dGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtID0gJ2FlczI1Nic7XG5cdHRoaXMuZW5jcnlwdGVkID0gbnVsbDtcblx0dGhpcy5zMmsgPSBuZXcgdHlwZV9zMmsoKTtcblxuXHQvKipcblx0ICogUGFyc2luZyBmdW5jdGlvbiBmb3IgYSBzeW1tZXRyaWMgZW5jcnlwdGVkIHNlc3Npb24ga2V5IHBhY2tldCAodGFnIDMpLlxuXHQgKiBcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFBheWxvYWQgb2YgYSB0YWcgMSBwYWNrZXRcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmluZ1xuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGxlblxuXHQgKiAgICAgICAgICAgIExlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mXG5cdCAqICAgICAgICAgICAgaW5wdXQgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gT2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdC8vIEEgb25lLW9jdGV0IHZlcnNpb24gbnVtYmVyLiBUaGUgb25seSBjdXJyZW50bHkgZGVmaW5lZCB2ZXJzaW9uIGlzIDQuXG5cdFx0dGhpcy52ZXJzaW9uID0gYnl0ZXNbMF0uY2hhckNvZGVBdCgpO1xuXG5cdFx0Ly8gQSBvbmUtb2N0ZXQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIHN5bW1ldHJpYyBhbGdvcml0aG0gdXNlZC5cblx0XHR2YXIgYWxnbyA9IGVudW1zLnJlYWQoZW51bXMuc3ltbWV0cmljLCBieXRlc1sxXS5jaGFyQ29kZUF0KCkpO1xuXG5cdFx0Ly8gQSBzdHJpbmctdG8ta2V5IChTMkspIHNwZWNpZmllciwgbGVuZ3RoIGFzIGRlZmluZWQgYWJvdmUuXG5cdFx0dmFyIHMya2xlbmd0aCA9IHRoaXMuczJrLnJlYWQoYnl0ZXMuc3Vic3RyKDIpKTtcblxuXHRcdC8vIE9wdGlvbmFsbHksIHRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgaXRzZWxmLCB3aGljaCBpcyBkZWNyeXB0ZWRcblx0XHQvLyB3aXRoIHRoZSBzdHJpbmctdG8ta2V5IG9iamVjdC5cblx0XHR2YXIgZG9uZSA9IHMya2xlbmd0aCArIDI7XG5cblx0XHRpZihkb25lIDwgYnl0ZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmVuY3J5cHRlZCA9IGJ5dGVzLnN1YnN0cihkb25lKTtcblx0XHRcdHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0gPSBhbGdvXG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2Vzc2lvbktleUFsZ29yaXRobSA9IGFsZ287XG5cdH1cblxuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGFsZ28gPSB0aGlzLmVuY3J5cHRlZCA9PSBudWxsID8gXG5cdFx0XHR0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0gOlxuXHRcdFx0dGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobTtcblxuXHRcdHZhciBieXRlcyA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy52ZXJzaW9uKSArXG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKGVudW1zLndyaXRlKGVudW1zLnN5bW1ldHJpYywgYWxnbykpICtcblx0XHRcdHRoaXMuczJrLndyaXRlKCk7XG5cblx0XHRpZih0aGlzLmVuY3J5cHRlZCAhPSBudWxsKVxuXHRcdFx0Ynl0ZXMgKz0gdGhpcy5lbmNyeXB0ZWQ7XG5cdFx0cmV0dXJuIGJ5dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY3J5cHRzIHRoZSBzZXNzaW9uIGtleSAob25seSBmb3IgcHVibGljIGtleSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXlcblx0ICogcGFja2V0cyAodGFnIDEpXG5cdCAqIFxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX21lc3NhZ2V9IG1zZ1xuXHQgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIG9iamVjdCAod2l0aCBtZW1iZXIgZW5jcnlwdGVkRGF0YVxuXHQgKiBAcGFyYW0ge29wZW5wZ3BfbXNnX3ByaXZhdGVrZXl9IGtleVxuXHQgKiAgICAgICAgICAgIFByaXZhdGUga2V5IHdpdGggc2VjTVBJcyB1bmxvY2tlZFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1bmVuY3J5cHRlZCBzZXNzaW9uIGtleVxuXHQgKi9cblx0dGhpcy5kZWNyeXB0ID0gZnVuY3Rpb24ocGFzc3BocmFzZSkge1xuXHRcdHZhciBhbGdvID0gdGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSAhPSBudWxsID9cblx0XHRcdHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0gOlxuXHRcdFx0dGhpcy5zZXNzaW9uS2V5QWxnb3JpdGhtO1xuXG5cblx0XHR2YXIgbGVuZ3RoID0gY3J5cHRvLmNpcGhlclthbGdvXS5rZXlTaXplO1xuXHRcdHZhciBrZXkgPSB0aGlzLnMyay5wcm9kdWNlX2tleShwYXNzcGhyYXNlLCBsZW5ndGgpO1xuXG5cdFx0aWYodGhpcy5lbmNyeXB0ZWQgPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5zZXNzaW9uS2V5ID0ga2V5O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBkZWNyeXB0ZWQgPSBjcnlwdG8uY2ZiLmRlY3J5cHQoXG5cdFx0XHRcdHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQsIHRydWUpO1xuXG5cdFx0XHR0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0gPSBlbnVtcy5yZWFkKGVudW1zLnN5bW1ldHJpYyxcblx0XHRcdFx0ZGVjcnlwdGVkWzBdLmtleUNvZGVBdCgpKTtcblxuXHRcdFx0dGhpcy5zZXNzaW9uS2V5ID0gZGVjcnlwdGVkLnN1YnN0cigxKTtcblx0XHR9XG5cdH1cblxuXHR0aGlzLmVuY3J5cHQgPSBmdW5jdGlvbihwYXNzcGhyYXNlKSB7XG5cdFx0dmFyIGxlbmd0aCA9IGNyeXB0by5nZXRLZXlMZW5ndGgodGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSk7XG5cdFx0dmFyIGtleSA9IHRoaXMuczJrLnByb2R1Y2Vfa2V5KHBhc3NwaHJhc2UsIGxlbmd0aCk7XG5cblx0XHR2YXIgcHJpdmF0ZV9rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuXHRcdFx0ZW51bXMud3JpdGUoZW51bXMuc3ltbWV0cmljLCB0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0pKSArXG5cblx0XHRcdGNyeXB0by5nZXRSYW5kb21CeXRlcyhcblx0XHRcdFx0Y3J5cHRvLmdldEtleUxlbmd0aCh0aGlzLnNlc3Npb25LZXlBbGdvcml0aG0pKTtcblxuXHRcdHRoaXMuZW5jcnlwdGVkID0gY3J5cHRvLmNmYi5lbmNyeXB0KFxuXHRcdFx0XHRjcnlwdG8uZ2V0UHJlZml4UmFuZG9tKHRoaXMuc2Vzc2lvbktleUVuY3J5cHRpb25BbGdvcml0aG0pLCBcblx0XHRcdFx0dGhpcy5zZXNzaW9uS2V5RW5jcnlwdGlvbkFsZ29yaXRobSwga2V5LCBwcml2YXRlX2tleSwgdHJ1ZSk7XG5cdH1cbn07XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBjcnlwdG8gPSByZXF1aXJlKCcuLi9jcnlwdG8nKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgUGFja2V0IChUYWcgOSlcbiAqIFxuICogUkZDNDg4MCA1Ljc6IFRoZSBTeW1tZXRyaWNhbGx5IEVuY3J5cHRlZCBEYXRhIHBhY2tldCBjb250YWlucyBkYXRhIGVuY3J5cHRlZFxuICogd2l0aCBhIHN5bW1ldHJpYy1rZXkgYWxnb3JpdGhtLiBXaGVuIGl0IGhhcyBiZWVuIGRlY3J5cHRlZCwgaXQgY29udGFpbnMgb3RoZXJcbiAqIHBhY2tldHMgKHVzdWFsbHkgYSBsaXRlcmFsIGRhdGEgcGFja2V0IG9yIGNvbXByZXNzZWQgZGF0YSBwYWNrZXQsIGJ1dCBpblxuICogdGhlb3J5IG90aGVyIFN5bW1ldHJpY2FsbHkgRW5jcnlwdGVkIERhdGEgcGFja2V0cyBvciBzZXF1ZW5jZXMgb2YgcGFja2V0c1xuICogdGhhdCBmb3JtIHdob2xlIE9wZW5QR1AgbWVzc2FnZXMpLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFja2V0X3N5bW1ldHJpY2FsbHlfZW5jcnlwdGVkKCkge1xuXHR0aGlzLmVuY3J5cHRlZCA9IG51bGw7XG5cdC8qKiBEZWNyeXB0ZWQgcGFja2V0cyBjb250YWluZWQgd2l0aGluLiBcblx0ICogQHR5cGUge29wZW5wZ3BfcGFja2V0bGlzdH0gKi9cblx0dGhpcy5wYWNrZXRzO1xuXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0dGhpcy5lbmNyeXB0ZWQgPSBieXRlcztcblx0fVxuXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lbmNyeXB0ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogU3ltbWV0cmljYWxseSBkZWNyeXB0IHRoZSBwYWNrZXQgZGF0YVxuXHQgKiBcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBzZXNzaW9uS2V5QWxnb3JpdGhtXG5cdCAqICAgICAgICAgICAgIFN5bW1ldHJpYyBrZXkgYWxnb3JpdGhtIHRvIHVzZSAvLyBTZWUgUkZDNDg4MCA5LjJcblx0ICogQHBhcmFtIHtTdHJpbmd9IGtleVxuXHQgKiAgICAgICAgICAgICBLZXkgYXMgc3RyaW5nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbGVuZ3RoIHRvIHRoZVxuXHQgKiAgICAgICAgICAgIGFsZ29yaXRobVxuXHQgKiBAcmV0dXJuIFRoZSBkZWNyeXB0ZWQgZGF0YTtcblx0ICovXG5cdHRoaXMuZGVjcnlwdCA9IGZ1bmN0aW9uKHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSkge1xuXHRcdHZhciBkZWNyeXB0ZWQgPSBjcnlwdG8uY2ZiLmRlY3J5cHQoXG5cdFx0XHRcdHNlc3Npb25LZXlBbGdvcml0aG0sIGtleSwgdGhpcy5lbmNyeXB0ZWQsIHRydWUpO1xuXG5cdFx0dGhpcy5wYWNrZXRzLnJlYWQoZGVjcnlwdGVkKTtcblx0fVxuXG5cdHRoaXMuZW5jcnlwdCA9IGZ1bmN0aW9uKGFsZ28sIGtleSkge1xuXHRcdHZhciBkYXRhID0gdGhpcy5wYWNrZXRzLndyaXRlKCk7XG5cblx0XHR0aGlzLmVuY3J5cHRlZCA9IGNyeXB0by5jZmIuZW5jcnlwdChcblx0XHRcdFx0Y3J5cHRvLmdldFByZWZpeFJhbmRvbShhbGdvKSwgYWxnbywgZGF0YSwga2V5LCB0cnVlKTtcblx0fVxufTtcbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrZXRfdHJ1c3QoKSB7XG5cbn07XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG4vKiogXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFVzZXIgQXR0cmlidXRlIFBhY2tldCAoVGFnIDE3KVxuICogIFRoZSBVc2VyIEF0dHJpYnV0ZSBwYWNrZXQgaXMgYSB2YXJpYXRpb24gb2YgdGhlIFVzZXIgSUQgcGFja2V0LiAgSXRcbiAqICBpcyBjYXBhYmxlIG9mIHN0b3JpbmcgbW9yZSB0eXBlcyBvZiBkYXRhIHRoYW4gdGhlIFVzZXIgSUQgcGFja2V0LFxuICogIHdoaWNoIGlzIGxpbWl0ZWQgdG8gdGV4dC4gIExpa2UgdGhlIFVzZXIgSUQgcGFja2V0LCBhIFVzZXIgQXR0cmlidXRlXG4gKiAgcGFja2V0IG1heSBiZSBjZXJ0aWZpZWQgYnkgdGhlIGtleSBvd25lciAoXCJzZWxmLXNpZ25lZFwiKSBvciBhbnkgb3RoZXJcbiAqICBrZXkgb3duZXIgd2hvIGNhcmVzIHRvIGNlcnRpZnkgaXQuICBFeGNlcHQgYXMgbm90ZWQsIGEgVXNlciBBdHRyaWJ1dGVcbiAqICBwYWNrZXQgbWF5IGJlIHVzZWQgYW55d2hlcmUgdGhhdCBhIFVzZXIgSUQgcGFja2V0IG1heSBiZSB1c2VkLlxuICpcbiAqICBXaGlsZSBVc2VyIEF0dHJpYnV0ZSBwYWNrZXRzIGFyZSBub3QgYSByZXF1aXJlZCBwYXJ0IG9mIHRoZSBPcGVuUEdQXG4gKiAgc3RhbmRhcmQsIGltcGxlbWVudGF0aW9ucyBTSE9VTEQgcHJvdmlkZSBhdCBsZWFzdCBlbm91Z2hcbiAqICBjb21wYXRpYmlsaXR5IHRvIHByb3Blcmx5IGhhbmRsZSBhIGNlcnRpZmljYXRpb24gc2lnbmF0dXJlIG9uIHRoZVxuICogIFVzZXIgQXR0cmlidXRlIHBhY2tldC4gIEEgc2ltcGxlIHdheSB0byBkbyB0aGlzIGlzIGJ5IHRyZWF0aW5nIHRoZVxuICogIFVzZXIgQXR0cmlidXRlIHBhY2tldCBhcyBhIFVzZXIgSUQgcGFja2V0IHdpdGggb3BhcXVlIGNvbnRlbnRzLCBidXRcbiAqICBhbiBpbXBsZW1lbnRhdGlvbiBtYXkgdXNlIGFueSBtZXRob2QgZGVzaXJlZC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrZXRfdXNlcl9hdHRyaWJ1dGUoKSB7XG5cdHRoaXMudGFnID0gMTc7XG5cdHRoaXMuYXR0cmlidXRlcyA9IFtdO1xuXG5cdC8qKlxuXHQgKiBwYXJzaW5nIGZ1bmN0aW9uIGZvciBhIHVzZXIgYXR0cmlidXRlIHBhY2tldCAodGFnIDE3KS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IHBheWxvYWQgb2YgYSB0YWcgMTcgcGFja2V0XG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gcG9zaXRpb24gcG9zaXRpb24gdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgaW5wdXQgYXQgcG9zaXRpb25cblx0ICogQHJldHVybiB7b3BlbnBncF9wYWNrZXRfZW5jcnlwdGVkZGF0YX0gb2JqZWN0IHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLnJlYWQgPSBmdW5jdGlvbihieXRlcykge1xuXHRcdHZhciBpID0gMDtcblx0XHR3aGlsZShpIDwgYnl0ZXMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgbGVuID0gb3BlbnBncF9wYWNrZXQucmVhZF9zaW1wbGVfbGVuZ3RoKGJ5dGVzKTtcblxuXHRcdFx0aSArPSBsZW4ub2Zmc2V0O1xuXHRcdFx0dGhpcy5hdHRyaWJ1dGVzLnB1c2goYnl0ZXMuc3Vic3RyKGksIGxlbi5sZW4pKTtcblx0XHRcdGkgKz0gbGVuLmxlbjtcblx0XHR9XG5cdH1cbn07XG4iLCIvLyBHUEc0QnJvd3NlcnMgLSBBbiBPcGVuUEdQIGltcGxlbWVudGF0aW9uIGluIGphdmFzY3JpcHRcbi8vIENvcHlyaWdodCAoQykgMjAxMSBSZWN1cml0eSBMYWJzIEdtYkhcbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuLy8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4vLyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vIFxuLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbi8vIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vLyBcbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQVxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwnKTtcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBjbGFzc2Rlc2MgSW1wbGVtZW50YXRpb24gb2YgdGhlIFVzZXIgSUQgUGFja2V0IChUYWcgMTMpXG4gKiBBIFVzZXIgSUQgcGFja2V0IGNvbnNpc3RzIG9mIFVURi04IHRleHQgdGhhdCBpcyBpbnRlbmRlZCB0byByZXByZXNlbnRcbiAqIHRoZSBuYW1lIGFuZCBlbWFpbCBhZGRyZXNzIG9mIHRoZSBrZXkgaG9sZGVyLiAgQnkgY29udmVudGlvbiwgaXRcbiAqIGluY2x1ZGVzIGFuIFJGQyAyODIyIFtSRkMyODIyXSBtYWlsIG5hbWUtYWRkciwgYnV0IHRoZXJlIGFyZSBub1xuICogcmVzdHJpY3Rpb25zIG9uIGl0cyBjb250ZW50LiAgVGhlIHBhY2tldCBsZW5ndGggaW4gdGhlIGhlYWRlclxuICogc3BlY2lmaWVzIHRoZSBsZW5ndGggb2YgdGhlIFVzZXIgSUQuIFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2tldF91c2VyaWQoKSB7XG5cdC8qKiBAdHlwZSB7U3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSB1c2VyIGlkLiBVc3VhbGx5IGluIHRoZSBmb3JtXG5cdCAqIEpvaG4gRG9lIDxqb2huQGV4YW1wbGUuY29tPiBcblx0ICovXG5cdHRoaXMudXNlcmlkID0gJyc7XG5cdFxuXHRcblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgdXNlciBpZCBwYWNrZXQgKHRhZyAxMykuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBwYXlsb2FkIG9mIGEgdGFnIDEzIHBhY2tldFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IHBvc2l0aW9uIHBvc2l0aW9uIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyaW5nXG5cdCAqIEBwYXJhbSB7SW50ZWdlcn0gbGVuIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9yIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mIGlucHV0IFxuXHQgKiBhdCBwb3NpdGlvblxuXHQgKiBAcmV0dXJuIHtvcGVucGdwX3BhY2tldF9lbmNyeXB0ZWRkYXRhfSBvYmplY3QgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0dGhpcy51c2VyaWQgPSB1dGlsLmRlY29kZV91dGY4KGJ5dGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1c2VyIGlkIHBhY2tldFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXNlcl9pZCB0aGUgdXNlciBpZCBhcyBzdHJpbmcgKFwiSm9obiBEb2UgPGpvaG4uZG9lQG1haWwudXNcIilcblx0ICogQHJldHVybiB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb25cblx0ICovXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdXRpbC5lbmNvZGVfdXRmOCh0aGlzLnVzZXJpZCk7XG5cdH1cbn1cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjIEltcGxlbWVudGF0aW9uIG9mIHR5cGUga2V5IGlkIChSRkM0ODgwIDMuMylcbiAqICBBIEtleSBJRCBpcyBhbiBlaWdodC1vY3RldCBzY2FsYXIgdGhhdCBpZGVudGlmaWVzIGEga2V5LlxuICAgSW1wbGVtZW50YXRpb25zIFNIT1VMRCBOT1QgYXNzdW1lIHRoYXQgS2V5IElEcyBhcmUgdW5pcXVlLiAgVGhlXG4gICBzZWN0aW9uIFwiRW5oYW5jZWQgS2V5IEZvcm1hdHNcIiBiZWxvdyBkZXNjcmliZXMgaG93IEtleSBJRHMgYXJlXG4gICBmb3JtZWQuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ga2V5aWQoKSB7XG5cdHZhciBieXRlcyA9ICcnO1xuXG5cdGZvcih2YXIgaSA9IDA7IGkgPCA4OyBpKyspXG5cdFx0Ynl0ZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTtcblx0LyoqXG5cdCAqIFBhcnNpbmcgbWV0aG9kIGZvciBhIGtleSBpZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgSW5wdXQgdG8gcmVhZCB0aGUga2V5IGlkIGZyb20gXG5cdCAqIEBwYXJhbSB7aW50ZWdlcn0gcG9zaXRpb24gUG9zaXRpb24gd2hlcmUgdG8gc3RhcnQgcmVhZGluZyB0aGUga2V5IFxuXHQgKiBpZCBmcm9tIGlucHV0XG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfdHlwZV9rZXlpZH0gVGhpcyBvYmplY3Rcblx0ICovXG5cdHRoaXMucmVhZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG5cdFx0dGhpcy5ieXRlcyA9IGJ5dGVzLnN1YnN0cigwLCA4KTtcblx0fVxuXG5cdHRoaXMud3JpdGUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5ieXRlcztcblx0fVxufTtcbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbi8vIEhpbnQ6IFdlIGhvbGQgb3VyIE1QSXMgYXMgYW4gYXJyYXkgb2Ygb2N0ZXRzIGluIGJpZyBlbmRpYW4gZm9ybWF0IHByZWNlZWRpbmcgYSB0d29cbi8vIG9jdGV0IHNjYWxhcjogTVBJOiBbYSxiLGMsZCxlLGZdXG4vLyAtIE1QSSBzaXplOiAoYSA8PCA4KSB8IGIgXG4vLyAtIE1QSSA9IGMgfCBkIDw8IDggfCBlIDw8ICgoTVBJLmxlbmd0aCAtMikqOCkgfCBmICgoTVBJLmxlbmd0aCAtMikqOClcblxudmFyIEJpZ0ludGVnZXIgPSByZXF1aXJlKCcuLi9jcnlwdG8vcHVibGljX2tleS9qc2JuLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyk7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAY2xhc3NkZXNjSW1wbGVtZW50YXRpb24gb2YgdHlwZSBNUEkgKFJGQzQ4ODAgMy4yKVxuICogTXVsdGlwcmVjaXNpb24gaW50ZWdlcnMgKGFsc28gY2FsbGVkIE1QSXMpIGFyZSB1bnNpZ25lZCBpbnRlZ2VycyB1c2VkXG4gKiB0byBob2xkIGxhcmdlIGludGVnZXJzIHN1Y2ggYXMgdGhlIG9uZXMgdXNlZCBpbiBjcnlwdG9ncmFwaGljXG4gKiBjYWxjdWxhdGlvbnMuXG4gKiBBbiBNUEkgY29uc2lzdHMgb2YgdHdvIHBpZWNlczogYSB0d28tb2N0ZXQgc2NhbGFyIHRoYXQgaXMgdGhlIGxlbmd0aFxuICogb2YgdGhlIE1QSSBpbiBiaXRzIGZvbGxvd2VkIGJ5IGEgc3RyaW5nIG9mIG9jdGV0cyB0aGF0IGNvbnRhaW4gdGhlXG4gKiBhY3R1YWwgaW50ZWdlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtcGkoKSB7XG5cdC8qKiBBbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgaW50ZWdlciAqL1xuXHR0aGlzLmRhdGEgPSBudWxsO1xuXG5cdC8qKlxuXHQgKiBQYXJzaW5nIGZ1bmN0aW9uIGZvciBhIG1waSAoUkZDIDQ4ODAgMy4yKS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFBheWxvYWQgb2YgbXBpIGRhdGFcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGlucHV0IFxuXHQgKiBzdHJpbmdcblx0ICogQHBhcmFtIHtJbnRlZ2VyfSBsZW4gTGVuZ3RoIG9mIHRoZSBwYWNrZXQgb3IgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgXG5cdCAqIGlucHV0IGF0IHBvc2l0aW9uXG5cdCAqIEByZXR1cm4ge29wZW5wZ3BfdHlwZV9tcGl9IE9iamVjdCByZXByZXNlbnRhdGlvblxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgYml0cyA9IChieXRlc1swXS5jaGFyQ29kZUF0KCkgPDwgOCkgfCBieXRlc1sxXS5jaGFyQ29kZUF0KCk7XG5cdFx0XG5cdFx0Ly8gQWRkaXRpb25hbCBydWxlczpcblx0XHQvL1xuXHRcdC8vICAgIFRoZSBzaXplIG9mIGFuIE1QSSBpcyAoKE1QSS5sZW5ndGggKyA3KSAvIDgpICsgMiBvY3RldHMuXG5cdFx0Ly9cblx0XHQvLyAgICBUaGUgbGVuZ3RoIGZpZWxkIG9mIGFuIE1QSSBkZXNjcmliZXMgdGhlIGxlbmd0aCBzdGFydGluZyBmcm9tIGl0c1xuXHRcdC8vXHQgIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLXplcm8gYml0LiAgVGh1cywgdGhlIE1QSSBbMDAgMDIgMDFdIGlzIG5vdFxuXHRcdC8vICAgIGZvcm1lZCBjb3JyZWN0bHkuICBJdCBzaG91bGQgYmUgWzAwIDAxIDAxXS5cblxuXHRcdC8vIFRPRE86IFZlcmlmaWNhdGlvbiBvZiB0aGlzIHNpemUgbWV0aG9kISBUaGlzIHNpemUgY2FsY3VsYXRpb24gYXNcblx0XHQvLyBcdFx0IHNwZWNpZmllZCBhYm92ZSBpcyBub3QgYXBwbGljYWJsZSBpbiBKYXZhU2NyaXB0XG5cdFx0dmFyIGJ5dGVsZW4gPSBNYXRoLmNlaWwoYml0cyAvIDgpO1xuXHRcdFxuXHRcdHZhciByYXcgPSBieXRlcy5zdWJzdHIoMiwgYnl0ZWxlbik7XG5cdFx0dGhpcy5mcm9tQnl0ZXMocmF3KTtcblxuXHRcdHJldHVybiAyICsgYnl0ZWxlbjtcblx0fVxuXG5cdHRoaXMuZnJvbUJ5dGVzID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR0aGlzLmRhdGEgPSBuZXcgQmlnSW50ZWdlcih1dGlsLmhleHN0cmR1bXAoYnl0ZXMpLCAxNik7IFxuXHR9XG5cblx0dGhpcy50b0J5dGVzID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMud3JpdGUoKS5zdWJzdHIoMik7XG5cdH1cblxuXHR0aGlzLmJ5dGVMZW5ndGggPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy50b0J5dGVzKCkubGVuZ3RoO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBtcGkgb2JqZWN0IHRvIGEgc3RyaW5nIGFzIHNwZWNpZmllZCBpbiBSRkM0ODgwIDMuMlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IG1waSBCeXRlIHJlcHJlc2VudGF0aW9uXG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS50b01QSSgpO1xuXHR9XG5cblx0dGhpcy50b0JpZ0ludGVnZXIgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmNsb25lKCk7XG5cdH1cblxuXHR0aGlzLmZyb21CaWdJbnRlZ2VyID0gZnVuY3Rpb24oYm4pIHtcblx0XHR0aGlzLmRhdGEgPSBibi5jbG9uZSgpO1xuXHR9XG59XG5cbiIsIi8vIEdQRzRCcm93c2VycyAtIEFuIE9wZW5QR1AgaW1wbGVtZW50YXRpb24gaW4gamF2YXNjcmlwdFxuLy8gQ29weXJpZ2h0IChDKSAyMDExIFJlY3VyaXR5IExhYnMgR21iSFxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4vLyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbi8vIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy8gXG4vLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVVxuLy8gTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vIFxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpY1xuLy8gTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBXG5cbnZhciBlbnVtcyA9IHJlcXVpcmUoJy4uL2VudW1zLmpzJyksXG5cdHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyksXG5cdGNyeXB0byA9IHJlcXVpcmUoJy4uL2NyeXB0bycpO1xuXG4vKipcbiAqIEBjbGFzc1xuICogQGNsYXNzZGVzYyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RyaW5nLXRvLWtleSBzcGVjaWZpZXIgKFJGQzQ4ODAgMy43KVxuICogU3RyaW5nLXRvLWtleSAoUzJLKSBzcGVjaWZpZXJzIGFyZSB1c2VkIHRvIGNvbnZlcnQgcGFzc3BocmFzZSBzdHJpbmdzXG4gICBpbnRvIHN5bW1ldHJpYy1rZXkgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGtleXMuICBUaGV5IGFyZSB1c2VkIGluIHR3b1xuICAgcGxhY2VzLCBjdXJyZW50bHk6IHRvIGVuY3J5cHQgdGhlIHNlY3JldCBwYXJ0IG9mIHByaXZhdGUga2V5cyBpbiB0aGVcbiAgIHByaXZhdGUga2V5cmluZywgYW5kIHRvIGNvbnZlcnQgcGFzc3BocmFzZXMgdG8gZW5jcnlwdGlvbiBrZXlzIGZvclxuICAgc3ltbWV0cmljYWxseSBlbmNyeXB0ZWQgbWVzc2FnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gczJrKCkge1xuXHQvKiogQHR5cGUge29wZW5wZ3AuaGFzaH0gKi9cblx0dGhpcy5hbGdvcml0aG0gPSAnc2hhMjU2Jztcblx0LyoqIEB0eXBlIHtvcGVucGdwX3R5cGVfczJrLnR5cGV9ICovXG5cdHRoaXMudHlwZSA9ICdpdGVyYXRlZCc7XG5cdHRoaXMuYyA9IDk2O1xuXHQvKiogQHR5cGUge29wZW5wZ3BfYnl0ZWFycmF5fSBcblx0ICogRWlnaHQgYnl0ZXMgb2Ygc2FsdC4gKi9cblx0dGhpcy5zYWx0ID0gY3J5cHRvLnJhbmRvbS5nZXRSYW5kb21CeXRlcyg4KTtcblxuXG5cdC8vIEV4cG9uZW4gYmlhcywgZGVmaW5lZCBpbiBSRkM0ODgwXG5cdHZhciBleHBiaWFzID0gNjtcblxuXHR0aGlzLmdldF9jb3VudCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAoMTYgKyAodGhpcy5jICYgMTUpKSA8PCAoKHRoaXMuYyA+PiA0KSArIGV4cGJpYXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNpbmcgZnVuY3Rpb24gZm9yIGEgc3RyaW5nLXRvLWtleSBzcGVjaWZpZXIgKFJGQyA0ODgwIDMuNykuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBQYXlsb2FkIG9mIHN0cmluZy10by1rZXkgc3BlY2lmaWVyXG5cdCAqIEByZXR1cm4ge0ludGVnZXJ9IEFjdHVhbCBsZW5ndGggb2YgdGhlIG9iamVjdFxuXHQgKi9cblx0dGhpcy5yZWFkID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dGhpcy50eXBlID0gZW51bXMucmVhZChlbnVtcy5zMmssIGJ5dGVzW2krK10uY2hhckNvZGVBdCgpKTtcblx0XHR0aGlzLmFsZ29yaXRobSA9IGVudW1zLnJlYWQoZW51bXMuaGFzaCwgYnl0ZXNbaSsrXS5jaGFyQ29kZUF0KCkpO1xuXG5cdFx0c3dpdGNoICh0aGlzLnR5cGUpIHtcblx0XHRjYXNlICdzaW1wbGUnOlxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdzYWx0ZWQnOlxuXHRcdFx0dGhpcy5zYWx0ID0gYnl0ZXMuc3Vic3RyKGksIDgpO1xuXHRcdFx0aSArPSA4O1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdpdGVyYXRlZCc6XG5cdFx0XHR0aGlzLnNhbHQgPSBieXRlcy5zdWJzdHIoaSwgOCk7XG5cdFx0XHRpICs9IDg7XG5cblx0XHRcdC8vIE9jdGV0IDEwOiBjb3VudCwgYSBvbmUtb2N0ZXQsIGNvZGVkIHZhbHVlXG5cdFx0XHR0aGlzLmMgPSBieXRlc1tpKytdLmNoYXJDb2RlQXQoKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnZ251Jzpcblx0XHRcdGlmKGJ5dGVzLnN1YnN0cihpLCAzKSA9PSBcIkdOVVwiKSB7XG5cdFx0XHRcdGkgKz0gMzsgLy8gR05VXG5cdFx0XHRcdHZhciBnbnVFeHRUeXBlID0gMTAwMCArIGJ5dGVzW2krK10uY2hhckNvZGVBdCgpO1xuXHRcdFx0XHRpZihnbnVFeHRUeXBlID09IDEwMDEpIHtcblx0XHRcdFx0XHR0aGlzLnR5cGUgPSBnbnVFeHRUeXBlO1xuXHRcdFx0XHRcdC8vIEdudVBHIGV4dGVuc2lvbiBtb2RlIDEwMDEgLS0gZG9uJ3Qgd3JpdGUgc2VjcmV0IGtleSBhdCBhbGxcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHMyayBnbnUgcHJvdGVjdGlvbiBtb2RlLlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzMmsgdHlwZS5cIik7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHMyayB0eXBlLlwiKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiBpO1xuXHR9XG5cdFxuXHRcblx0LyoqXG5cdCAqIHdyaXRlcyBhbiBzMmsgaGFzaCBiYXNlZCBvbiB0aGUgaW5wdXRzLlxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFByb2R1Y2VkIGtleSBvZiBoYXNoQWxnb3JpdGhtIGhhc2ggbGVuZ3RoXG5cdCAqL1xuXHR0aGlzLndyaXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGJ5dGVzID0gU3RyaW5nLmZyb21DaGFyQ29kZShlbnVtcy53cml0ZShlbnVtcy5zMmssIHRoaXMudHlwZSkpO1xuXHRcdGJ5dGVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZW51bXMud3JpdGUoZW51bXMuaGFzaCwgdGhpcy5hbGdvcml0aG0pKTtcblxuXHRcdHN3aXRjaCh0aGlzLnR5cGUpIHtcblx0XHRcdGNhc2UgJ3NpbXBsZSc6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2FsdGVkJzpcblx0XHRcdFx0Ynl0ZXMgKz0gdGhpcy5zYWx0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2l0ZXJhdGVkJzpcblx0XHRcdFx0Ynl0ZXMgKz0gdGhpcy5zYWx0O1xuXHRcdFx0XHRieXRlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuYyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gYnl0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogUHJvZHVjZXMgYSBrZXkgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXNzcGhyYXNlIGFuZCB0aGUgZGVmaW5lZCBcblx0ICogaGFzaEFsZ29yaXRobSBcblx0ICogQHBhcmFtIHtTdHJpbmd9IHBhc3NwaHJhc2UgUGFzc3BocmFzZSBjb250YWluaW5nIHVzZXIgaW5wdXRcblx0ICogQHJldHVybiB7U3RyaW5nfSBQcm9kdWNlZCBrZXkgd2l0aCBhIGxlbmd0aCBjb3JyZXNwb25kaW5nIHRvIFxuXHQgKiBoYXNoQWxnb3JpdGhtIGhhc2ggbGVuZ3RoXG5cdCAqL1xuXHR0aGlzLnByb2R1Y2Vfa2V5ID0gZnVuY3Rpb24ocGFzc3BocmFzZSwgbnVtQnl0ZXMpIHtcblx0XHRwYXNzcGhyYXNlID0gdXRpbC5lbmNvZGVfdXRmOChwYXNzcGhyYXNlKTtcblxuXHRcdGZ1bmN0aW9uIHJvdW5kKHByZWZpeCwgczJrKSB7XG5cdFx0XHR2YXIgYWxnb3JpdGhtID0gZW51bXMud3JpdGUoZW51bXMuaGFzaCwgczJrLmFsZ29yaXRobSk7XG5cblx0XHRcdHN3aXRjaChzMmsudHlwZSkge1xuXHRcdFx0XHRjYXNlICdzaW1wbGUnOlxuXHRcdFx0XHRcdHJldHVybiBjcnlwdG8uaGFzaC5kaWdlc3QoYWxnb3JpdGhtLCBwcmVmaXggKyBwYXNzcGhyYXNlKTtcblxuXHRcdFx0XHRjYXNlICdzYWx0ZWQnOlxuXHRcdFx0XHRcdHJldHVybiBjcnlwdG8uaGFzaC5kaWdlc3QoYWxnb3JpdGhtLCBcblx0XHRcdFx0XHRcdHByZWZpeCArIHMyay5zYWx0ICsgcGFzc3BocmFzZSk7XG5cblx0XHRcdFx0Y2FzZSAnaXRlcmF0ZWQnOlxuXHRcdFx0XHRcdHZhciBpc3AgPSBbXSxcblx0XHRcdFx0XHRcdGNvdW50ID0gczJrLmdldF9jb3VudCgpO1xuXHRcdFx0XHRcdFx0ZGF0YSA9IHMyay5zYWx0ICsgcGFzc3BocmFzZTtcblxuXHRcdFx0XHRcdHdoaWxlIChpc3AubGVuZ3RoICogZGF0YS5sZW5ndGggPCBjb3VudClcblx0XHRcdFx0XHRcdGlzcC5wdXNoKGRhdGEpO1xuXG5cdFx0XHRcdFx0aXNwID0gaXNwLmpvaW4oJycpO1x0XHRcdFxuXG5cdFx0XHRcdFx0aWYgKGlzcC5sZW5ndGggPiBjb3VudClcblx0XHRcdFx0XHRcdGlzcCA9IGlzcC5zdWJzdHIoMCwgY291bnQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNyeXB0by5oYXNoLmRpZ2VzdChhbGdvcml0aG0sIHByZWZpeCArIGlzcCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRcblx0XHR2YXIgcmVzdWx0ID0gJycsXG5cdFx0XHRwcmVmaXggPSAnJztcblxuXHRcdHdoaWxlKHJlc3VsdC5sZW5ndGggPD0gbnVtQnl0ZXMpIHtcblx0XHRcdHJlc3VsdCArPSByb3VuZChwcmVmaXgsIHRoaXMpO1xuXHRcdFx0cHJlZml4ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdC5zdWJzdHIoMCwgbnVtQnl0ZXMpO1xuXHR9XG59XG5cblxuIiwiLy8gR1BHNEJyb3dzZXJzIC0gQW4gT3BlblBHUCBpbXBsZW1lbnRhdGlvbiBpbiBqYXZhc2NyaXB0XG4vLyBDb3B5cmlnaHQgKEMpIDIwMTEgUmVjdXJpdHkgTGFicyBHbWJIXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Jcbi8vIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbi8vIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuLy8gdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vLyBcbi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4vLyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy8gXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4vLyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0FcblxudmFyIFV0aWwgPSBmdW5jdGlvbigpIHtcblxuXG5cblx0dGhpcy5yZWFkTnVtYmVyID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG5cdFx0dmFyIG4gPSAwO1xuXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRuIDw8PSA4O1xuXHRcdFx0biArPSBieXRlc1tpXS5jaGFyQ29kZUF0KClcblx0XHR9XG5cblx0XHRyZXR1cm4gbjtcblx0fVxuXG5cdHRoaXMud3JpdGVOdW1iZXIgPSBmdW5jdGlvbihuLCBieXRlcykge1xuXHRcdHZhciBiID0gJyc7XG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHtcblx0XHRcdGIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgobiA+PiAoOCAqIChieXRlcy0gaSAtIDEpKSkgJiAweEZGKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYjtcblx0fVxuXG5cblxuXHR0aGlzLnJlYWREYXRlID0gZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHR2YXIgbiA9IHRoaXMucmVhZE51bWJlcihieXRlcyk7XG5cdFx0dmFyIGQgPSBuZXcgRGF0ZSgpO1xuXHRcdGQuc2V0VGltZShuICogMTAwMCk7XG5cdFx0cmV0dXJuIGQ7XG5cdH1cblxuXHR0aGlzLndyaXRlRGF0ZSA9IGZ1bmN0aW9uKHRpbWUpIHtcblx0XHR2YXIgbnVtZXJpYyA9IE1hdGgucm91bmQodGltZS5nZXRUaW1lKCkgLyAxMDAwKTtcblxuXHRcdHJldHVybiB0aGlzLndyaXRlTnVtYmVyKG51bWVyaWMsIDQpO1xuXHR9XG5cbiAgICB0aGlzLmVtYWlsUmVnRXggPSAvW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkAoPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/Lztcblx0XG5cdHRoaXMuZGVidWcgPSBmYWxzZTtcblxuXHR0aGlzLmhleGR1bXAgPSBmdW5jdGlvbihzdHIpIHtcblx0ICAgIHZhciByPVtdO1xuXHQgICAgdmFyIGU9c3RyLmxlbmd0aDtcblx0ICAgIHZhciBjPTA7XG5cdCAgICB2YXIgaDtcblx0ICAgIHZhciBpID0gMDtcblx0ICAgIHdoaWxlKGM8ZSl7XG5cdCAgICAgICAgaD1zdHIuY2hhckNvZGVBdChjKyspLnRvU3RyaW5nKDE2KTtcblx0ICAgICAgICB3aGlsZShoLmxlbmd0aDwyKSBoPVwiMFwiK2g7XG5cdCAgICAgICAgci5wdXNoKFwiIFwiK2gpO1xuXHQgICAgICAgIGkrKztcblx0ICAgICAgICBpZiAoaSAlIDMyID09IDApXG5cdCAgICAgICAgXHRyLnB1c2goXCJcXG4gICAgICAgICAgIFwiKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiByLmpvaW4oJycpO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIENyZWF0ZSBoZXhzdHJpbmcgZnJvbSBhIGJpbmFyeVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyB0byBjb252ZXJ0XG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhleGFkZWNpbWFsIHZhbHVlc1xuXHQgKi9cblx0dGhpcy5oZXhzdHJkdW1wID0gZnVuY3Rpb24oc3RyKSB7XG5cdFx0aWYgKHN0ciA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdCAgICB2YXIgcj1bXTtcblx0ICAgIHZhciBlPXN0ci5sZW5ndGg7XG5cdCAgICB2YXIgYz0wO1xuXHQgICAgdmFyIGg7XG5cdCAgICB3aGlsZShjPGUpe1xuXHQgICAgICAgIGg9c3RyW2MrK10uY2hhckNvZGVBdCgpLnRvU3RyaW5nKDE2KTtcblx0ICAgICAgICB3aGlsZShoLmxlbmd0aDwyKSBoPVwiMFwiK2g7XG5cdCAgICAgICAgci5wdXNoKFwiXCIraCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gci5qb2luKCcnKTtcblx0fTtcblx0XG5cdC8qKlxuXHQgKiBDcmVhdGUgYmluYXJ5IHN0cmluZyBmcm9tIGEgaGV4IGVuY29kZWQgc3RyaW5nXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgSGV4IHN0cmluZyB0byBjb252ZXJ0XG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJpbmFyeSB2YWx1ZXNcblx0ICovXG5cdHRoaXMuaGV4MmJpbiA9IGZ1bmN0aW9uKGhleCkge1xuXHQgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXgubGVuZ3RoOyBpICs9IDIpXG5cdCAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4LnN1YnN0cihpLCAyKSwgMTYpKTtcblx0ICAgIHJldHVybiBzdHI7XG5cdH07XG5cdFxuXHQvKipcblx0ICogQ3JlYXRpbmcgYSBoZXggc3RyaW5nIGZyb20gYW4gYmluYXJ5IGFycmF5IG9mIGludGVnZXJzICgwLi4yNTUpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgQXJyYXkgb2YgYnl0ZXMgdG8gY29udmVydFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcnJheVxuXHQgKi9cblx0dGhpcy5oZXhpZHVtcCA9IGZ1bmN0aW9uKHN0cikge1xuXHQgICAgdmFyIHI9W107XG5cdCAgICB2YXIgZT1zdHIubGVuZ3RoO1xuXHQgICAgdmFyIGM9MDtcblx0ICAgIHZhciBoO1xuXHQgICAgd2hpbGUoYzxlKXtcblx0ICAgICAgICBoPXN0cltjKytdLnRvU3RyaW5nKDE2KTtcblx0ICAgICAgICB3aGlsZShoLmxlbmd0aDwyKSBoPVwiMFwiK2g7XG5cdCAgICAgICAgci5wdXNoKFwiXCIraCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gci5qb2luKCcnKTtcblx0fTtcblxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IGEgbmF0aXZlIGphdmFzY3JpcHQgc3RyaW5nIHRvIGEgc3RyaW5nIG9mIHV0ZjggYnl0ZXNcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiB7U3RyaW5nfSBBIHZhbGlkIHNxdWVuY2Ugb2YgdXRmOCBieXRlc1xuXHQgKi9cblx0dGhpcy5lbmNvZGVfdXRmOCA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgYSBzdHJpbmcgb2YgdXRmOCBieXRlcyB0byBhIG5hdGl2ZSBqYXZhc2NyaXB0IHN0cmluZ1xuXHQgKiBAcGFyYW0ge1N0cmluZ30gdXRmOCBBIHZhbGlkIHNxdWVuY2Ugb2YgdXRmOCBieXRlc1xuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEEgbmF0aXZlIGphdmFzY3JpcHQgc3RyaW5nXG5cdCAqL1xuXHR0aGlzLmRlY29kZV91dGY4ID0gZnVuY3Rpb24odXRmOCkge1xuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHV0ZjgpKTtcblx0fTtcblxuXHR2YXIgc3RyMmJpbiA9IGZ1bmN0aW9uKHN0ciwgcmVzdWx0KSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRcdHJlc3VsdFtpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cdFxuXHR2YXIgYmluMnN0ciA9IGZ1bmN0aW9uKGJpbikge1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRyZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGJpbltpXSkpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQuam9pbignJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgaW50ZWdlcnMoMC4yNTUpXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiB7SW50ZWdlcltdfSBBbiBhcnJheSBvZiAoYmluYXJ5KSBpbnRlZ2Vyc1xuXHQgKi9cblx0dGhpcy5zdHIyYmluID0gZnVuY3Rpb24oc3RyKSB7IFxuXHRcdHJldHVybiBzdHIyYmluKHN0ciwgbmV3IEFycmF5KHN0ci5sZW5ndGgpKTtcblx0fTtcblx0XG5cdFxuXHQvKipcblx0ICogQ29udmVydCBhbiBhcnJheSBvZiBpbnRlZ2VycygwLjI1NSkgdG8gYSBzdHJpbmcgXG5cdCAqIEBwYXJhbSB7SW50ZWdlcltdfSBiaW4gQW4gYXJyYXkgb2YgKGJpbmFyeSkgaW50ZWdlcnMgdG8gY29udmVydFxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFycmF5XG5cdCAqL1xuXHR0aGlzLmJpbjJzdHIgPSBiaW4yc3RyO1xuXHRcblx0LyoqXG5cdCAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBVaW50OEFycmF5XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNvbnZlcnRcblx0ICogQHJldHVybiB7VWludDhBcnJheX0gVGhlIGFycmF5IG9mIChiaW5hcnkpIGludGVnZXJzXG5cdCAqL1xuXHR0aGlzLnN0cjJVaW50OEFycmF5ID0gZnVuY3Rpb24oc3RyKSB7IFxuXHRcdHJldHVybiBzdHIyYmluKHN0ciwgbmV3IFVpbnQ4QXJyYXkobmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGgpKSk7IFxuXHR9O1xuXHRcblx0LyoqXG5cdCAqIENvbnZlcnQgYSBVaW50OEFycmF5IHRvIGEgc3RyaW5nLiBUaGlzIGN1cnJlbnRseSBmdW5jdGlvbnMgXG5cdCAqIHRoZSBzYW1lIGFzIGJpbjJzdHIuIFxuXHQgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJpbiBBbiBhcnJheSBvZiAoYmluYXJ5KSBpbnRlZ2VycyB0byBjb252ZXJ0XG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhcnJheVxuXHQgKi9cblx0dGhpcy5VaW50OEFycmF5MnN0ciA9IGJpbjJzdHI7XG5cdFxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyBhIDE2Yml0IHN1bSBvZiBhIHN0cmluZyBieSBhZGRpbmcgZWFjaCBjaGFyYWN0ZXIgXG5cdCAqIGNvZGVzIG1vZHVsdXMgNjU1MzVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHRleHQgU3RyaW5nIHRvIGNyZWF0ZSBhIHN1bSBvZlxuXHQgKiBAcmV0dXJuIHtJbnRlZ2VyfSBBbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHN1bSBvZiBhbGwgY2hhcmFjdGVyIFxuXHQgKiBjb2RlcyAlIDY1NTM1XG5cdCAqL1xuXHR0aGlzLmNhbGNfY2hlY2tzdW0gPSBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0dmFyIGNoZWNrc3VtID0geyAgczogMCwgYWRkOiBmdW5jdGlvbiAoc2FkZCkgeyB0aGlzLnMgPSAodGhpcy5zICsgc2FkZCkgJSA2NTUzNjsgfX07XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjaGVja3N1bS5hZGQodGV4dC5jaGFyQ29kZUF0KGkpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNoZWNrc3VtLnM7XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGEgZGVidWcgbWVzc2FnZS4gRGVidWcgXG5cdCAqIG1lc3NhZ2VzIGFyZSBvbmx5IHByaW50ZWQgaWZcblx0ICogb3BlbnBncC5jb25maWcuZGVidWcgaXMgc2V0IHRvIHRydWUuIFRoZSBjYWxsaW5nXG5cdCAqIEphdmFzY3JpcHQgY29udGV4dCBNVVNUIGRlZmluZVxuXHQgKiBhIFwic2hvd01lc3NhZ2VzKHRleHQpXCIgZnVuY3Rpb24uIExpbmUgZmVlZHMgKCdcXG4nKVxuXHQgKiBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gSFRNTCBsaW5lIGZlZWRzICc8YnIvPidcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0ciBTdHJpbmcgb2YgdGhlIGRlYnVnIG1lc3NhZ2Vcblx0ICogQHJldHVybiB7U3RyaW5nfSBBbiBIVE1MIHR0IGVudGl0eSBjb250YWluaW5nIGEgcGFyYWdyYXBoIHdpdGggYSBcblx0ICogc3R5bGUgYXR0cmlidXRlIHdoZXJlIHRoZSBkZWJ1ZyBtZXNzYWdlIGlzIEhUTUxlbmNvZGVkIGluLiBcblx0ICovXG5cdHRoaXMucHJpbnRfZGVidWcgPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZiAodGhpcy5kZWJ1Zykge1xuXHRcdFx0Y29uc29sZS5sb2coc3RyKTtcblx0XHR9XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGEgZGVidWcgbWVzc2FnZS4gRGVidWcgXG5cdCAqIG1lc3NhZ2VzIGFyZSBvbmx5IHByaW50ZWQgaWZcblx0ICogb3BlbnBncC5jb25maWcuZGVidWcgaXMgc2V0IHRvIHRydWUuIFRoZSBjYWxsaW5nXG5cdCAqIEphdmFzY3JpcHQgY29udGV4dCBNVVNUIGRlZmluZVxuXHQgKiBhIFwic2hvd01lc3NhZ2VzKHRleHQpXCIgZnVuY3Rpb24uIExpbmUgZmVlZHMgKCdcXG4nKVxuXHQgKiBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gSFRNTCBsaW5lIGZlZWRzICc8YnIvPidcblx0ICogRGlmZmVyZW50IHRoYW4gcHJpbnRfZGVidWcgYmVjYXVzZSB3aWxsIGNhbGwgaGV4c3RyZHVtcCBpZmYgbmVjZXNzYXJ5LlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyBvZiB0aGUgZGVidWcgbWVzc2FnZVxuXHQgKiBAcmV0dXJuIHtTdHJpbmd9IEFuIEhUTUwgdHQgZW50aXR5IGNvbnRhaW5pbmcgYSBwYXJhZ3JhcGggd2l0aCBhIFxuXHQgKiBzdHlsZSBhdHRyaWJ1dGUgd2hlcmUgdGhlIGRlYnVnIG1lc3NhZ2UgaXMgSFRNTGVuY29kZWQgaW4uIFxuXHQgKi9cblx0dGhpcy5wcmludF9kZWJ1Z19oZXhzdHJfZHVtcCA9IGZ1bmN0aW9uKHN0cixzdHJUb0hleCkge1xuXHRcdGlmICh0aGlzLmRlYnVnKSB7XG5cdFx0XHRzdHIgPSBzdHIgKyB0aGlzLmhleHN0cmR1bXAoc3RyVG9IZXgpO1xuXHRcdFx0Y29uc29sZS5sb2coc3RyKTtcblx0XHR9XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UuIFxuXHQgKiBUaGUgY2FsbGluZyBKYXZhc2NyaXB0IGNvbnRleHQgTVVTVCBkZWZpbmVcblx0ICogYSBcInNob3dNZXNzYWdlcyh0ZXh0KVwiIGZ1bmN0aW9uLiBMaW5lIGZlZWRzICgnXFxuJylcblx0ICogYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIEhUTUwgbGluZSBmZWVkcyAnPGJyLz4nXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIG9mIHRoZSBlcnJvciBtZXNzYWdlXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gQSBIVE1MIHBhcmFncmFwaCBlbnRpdHkgd2l0aCBhIHN0eWxlIGF0dHJpYnV0ZSBcblx0ICogY29udGFpbmluZyB0aGUgSFRNTCBlbmNvZGVkIGVycm9yIG1lc3NhZ2Vcblx0ICovXG5cdHRoaXMucHJpbnRfZXJyb3IgPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZih0aGlzLmRlYnVnKVxuXHRcdFx0dGhyb3cgc3RyO1xuXHRcdGNvbnNvbGUubG9nKHN0cik7XG5cdH07XG5cdFxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IGFuIGluZm8gbWVzc2FnZS4gXG5cdCAqIFRoZSBjYWxsaW5nIEphdmFzY3JpcHQgY29udGV4dCBNVVNUIGRlZmluZVxuXHQgKiBhIFwic2hvd01lc3NhZ2VzKHRleHQpXCIgZnVuY3Rpb24uIExpbmUgZmVlZHMgKCdcXG4nKVxuXHQgKiBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gSFRNTCBsaW5lIGZlZWRzICc8YnIvPicuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIG9mIHRoZSBpbmZvIG1lc3NhZ2Vcblx0ICogQHJldHVybiB7U3RyaW5nfSBBIEhUTUwgcGFyYWdyYXBoIGVudGl0eSB3aXRoIGEgc3R5bGUgYXR0cmlidXRlIFxuXHQgKiBjb250YWluaW5nIHRoZSBIVE1MIGVuY29kZWQgaW5mbyBtZXNzYWdlXG5cdCAqL1xuXHR0aGlzLnByaW50X2luZm8gPSBmdW5jdGlvbihzdHIpIHtcblx0XHRpZih0aGlzLmRlYnVnKVxuXHRcdFx0Y29uc29sZS5sb2coc3RyKTtcblx0fTtcblx0XG5cdHRoaXMucHJpbnRfd2FybmluZyA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdGNvbnNvbGUubG9nKHN0cik7XG5cdH07XG5cdFxuXHR0aGlzLmdldExlZnROQml0cyA9IGZ1bmN0aW9uIChzdHJpbmcsIGJpdGNvdW50KSB7XG5cdFx0dmFyIHJlc3QgPSBiaXRjb3VudCAlIDg7XG5cdFx0aWYgKHJlc3QgPT0gMClcblx0XHRcdHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGJpdGNvdW50IC8gOCk7XG5cdFx0dmFyIGJ5dGVzID0gKGJpdGNvdW50IC0gcmVzdCkgLyA4ICsxO1xuXHRcdHZhciByZXN1bHQgPSBzdHJpbmcuc3Vic3RyaW5nKDAsIGJ5dGVzKTtcblx0XHRyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0KHJlc3VsdCwgOC1yZXN0KTsgLy8gK1N0cmluZy5mcm9tQ2hhckNvZGUoc3RyaW5nLmNoYXJDb2RlQXQoYnl0ZXMgLTEpIDw8ICg4LXJlc3QpICYgMHhGRik7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNoaWZ0aW5nIGEgc3RyaW5nIHRvIG4gYml0cyByaWdodFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIHN0cmluZyB0byBzaGlmdFxuXHQgKiBAcGFyYW0ge0ludGVnZXJ9IGJpdGNvdW50IEFtb3VudCBvZiBiaXRzIHRvIHNoaWZ0IChNVVNUIGJlIHNtYWxsZXIgXG5cdCAqIHRoYW4gOSlcblx0ICogQHJldHVybiB7U3RyaW5nfSBSZXN1bHRpbmcgc3RyaW5nLiBcblx0ICovXG5cdHRoaXMuc2hpZnRSaWdodCA9IGZ1bmN0aW9uKHZhbHVlLCBiaXRjb3VudCkge1xuXHRcdHZhciB0ZW1wID0gdXRpbC5zdHIyYmluKHZhbHVlKTtcbiAgICAgICAgaWYgKGJpdGNvdW50ICUgOCAhPSAwKSB7XG4gICAgICAgIFx0Zm9yICh2YXIgaSA9IHRlbXAubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIFx0XHR0ZW1wW2ldID4+PSBiaXRjb3VudCAlIDg7XG4gICAgICAgIFx0XHRpZiAoaSA+IDApXG4gICAgICAgIFx0XHRcdHRlbXBbaV0gfD0gKHRlbXBbaSAtIDFdIDw8ICg4IC0gKGJpdGNvdW50ICUgOCkpKSAmIDB4RkY7XG4gICAgICAgIFx0fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICBcdHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXRpbC5iaW4yc3RyKHRlbXApO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIFJldHVybiB0aGUgYWxnb3JpdGhtIHR5cGUgYXMgc3RyaW5nXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbWVzc2FnZSB0eXBlXG5cdCAqL1xuXHR0aGlzLmdldF9oYXNoQWxnb3JpdGhtU3RyaW5nID0gZnVuY3Rpb24oYWxnbykge1xuXHRcdHN3aXRjaChhbGdvKSB7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFwiTUQ1XCI7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFwiU0hBMVwiO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBcIlJJUEVNRDE2MFwiO1xuXHRcdGNhc2UgODpcblx0XHRcdHJldHVybiBcIlNIQTI1NlwiO1xuXHRcdGNhc2UgOTpcblx0XHRcdHJldHVybiBcIlNIQTM4NFwiO1xuXHRcdGNhc2UgMTA6XG5cdFx0XHRyZXR1cm4gXCJTSEE1MTJcIjtcblx0XHRjYXNlIDExOlxuXHRcdFx0cmV0dXJuIFwiU0hBMjI0XCI7XG5cdFx0fVxuXHRcdHJldHVybiBcInVua25vd25cIjtcblx0fTtcbn07XG5cbi8qKlxuICogYW4gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZC4gXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gbmV3IFV0aWwoKTtcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiQUVTIFJpam5kYWVsIGNpcGhlciB0ZXN0IHdpdGggdGVzdCB2ZWN0b3JzIGZyb20gZWNiX3RibC50eHRcIiwgZnVuY3Rpb24oKSB7XG4gIHZhciBvcGVucGdwID0gcmVxdWlyZSgnLi4vLi4vLi4vJyk7XG4gIHZhciB1dGlsID0gb3BlbnBncC51dGlsO1xuXG4gIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoKTtcblxuICBmdW5jdGlvbiB0ZXN0X2FlcyhpbnB1dCwga2V5LCBvdXRwdXQpIHtcbiAgICB2YXIgYWVzID0gbmV3IG9wZW5wZ3AuY2lwaGVyLmFlczEyOCh1dGlsLmJpbjJzdHIoa2V5KSk7XG5cbiAgICB2YXIgcmVzdWx0ID0gdXRpbC5iaW4yc3RyKGFlcy5lbmNyeXB0KGlucHV0KSk7XG5cbiAgICByZXR1cm4gdXRpbC5oZXhzdHJkdW1wKHJlc3VsdCkgPT0gdXRpbC5oZXhzdHJkdW1wKHV0aWwuYmluMnN0cihvdXRwdXQpKTtcbiAgfTtcblxuICB2YXIgdGVzdHZlY3RvcnMxMjggPSBbW1sweDAwLDB4MDEsMHgwMiwweDAzLDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwQSwweDBCLDB4MEMsMHgwRCwweDBGLDB4MTAsMHgxMSwweDEyXSxbMHg1MCwweDY4LDB4MTIsMHhBNCwweDVGLDB4MDgsMHhDOCwweDg5LDB4QjksMHg3RiwweDU5LDB4ODAsMHgwMywweDhCLDB4ODMsMHg1OV0sWzB4RDgsMHhGNSwweDMyLDB4NTMsMHg4MiwweDg5LDB4RUYsMHg3RCwweDA2LDB4QjUsMHgwNiwweEE0LDB4RkQsMHg1QiwweEU5LDB4QzldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgxNCwweDE1LDB4MTYsMHgxNywweDE5LDB4MUEsMHgxQiwweDFDLDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMywweDI0LDB4MjUsMHgyNl0sWzB4NUMsMHg2RCwweDcxLDB4Q0EsMHgzMCwweERFLDB4OEIsMHg4QiwweDAwLDB4NTQsMHg5OSwweDg0LDB4RDIsMHhFQywweDdELDB4NEJdLFsweDU5LDB4QUIsMHgzMCwweEY0LDB4RDQsMHhFRSwweDZFLDB4NEYsMHhGOSwweDkwLDB4N0UsMHhGNiwweDVCLDB4MUYsMHhCNiwweDhDXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4MjgsMHgyOSwweDJBLDB4MkIsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzcsMHgzOCwweDM5LDB4M0FdLFsweDUzLDB4RjMsMHhGNCwweEM2LDB4NEYsMHg4NiwweDE2LDB4RTQsMHhFNywweEM1LDB4NjEsMHg5OSwweEY0LDB4OEYsMHgyMSwweEY2XSxbMHhCRiwweDFFLDB4RDIsMHhGQywweEIyLDB4QUYsMHgzRiwweEQ0LDB4MTQsMHg0MywweEI1LDB4NkQsMHg4NSwweDAyLDB4NUMsMHhCMV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDNDLDB4M0QsMHgzRSwweDNGLDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NiwweDQ3LDB4NDgsMHg0OSwweDRCLDB4NEMsMHg0RCwweDRFXSxbMHhBMSwweEVCLDB4NjUsMHhBMywweDQ4LDB4NzEsMHg2NSwweEZCLDB4MEYsMHgxQywweDI3LDB4RkYsMHg5OSwweDU5LDB4RjcsMHgwM10sWzB4NzMsMHgxNiwweDYzLDB4MkQsMHg1QywweDMyLDB4MjMsMHgzRSwweERDLDB4QjAsMHg3OCwweDA1LDB4NjAsMHhFQSwweEU4LDB4QjJdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg1MCwweDUxLDB4NTIsMHg1MywweDU1LDB4NTYsMHg1NywweDU4LDB4NUEsMHg1QiwweDVDLDB4NUQsMHg1RiwweDYwLDB4NjEsMHg2Ml0sWzB4MzUsMHg1MywweEVDLDB4RjAsMHhCMSwweDczLDB4OTUsMHg1OCwweEIwLDB4OEUsMHgzNSwweDBBLDB4OTgsMHhBMywweDlCLDB4RkFdLFsweDQwLDB4OEMsMHgwNywweDNFLDB4M0UsMHgyNSwweDM4LDB4MDcsMHgyQiwweDcyLDB4NjIsMHg1RSwweDY4LDB4QjgsMHgzNiwweDRCXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4NjQsMHg2NSwweDY2LDB4NjcsMHg2OSwweDZBLDB4NkIsMHg2QywweDZFLDB4NkYsMHg3MCwweDcxLDB4NzMsMHg3NCwweDc1LDB4NzZdLFsweDY3LDB4NDIsMHg5OSwweDY5LDB4NDksMHgwQiwweDk3LDB4MTEsMHhBRSwweDJCLDB4MDEsMHhEQywweDQ5LDB4N0EsMHhGRCwweEU4XSxbMHhFMSwweEY5LDB4NEQsMHhGQSwweDc3LDB4NjUsMHg5NywweEJFLDB4QUMsMHhBMiwweDYyLDB4RjIsMHhGNiwweDM2LDB4NkYsMHhFQV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDc4LDB4NzksMHg3QSwweDdCLDB4N0QsMHg3RSwweDdGLDB4ODAsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg3LDB4ODgsMHg4OSwweDhBXSxbMHg5MywweDM4LDB4NUMsMHgxRiwweDJBLDB4RUMsMHg4QiwweEVELDB4MTksMHgyRiwweDVBLDB4OEUsMHgxNiwweDFELDB4RDUsMHgwOF0sWzB4RjIsMHg5RSwweDk4LDB4NkMsMHg2QSwweDFDLDB4MjcsMHhENywweEIyLDB4OUYsMHhGRCwweDdFLDB4RTksMHgyQiwweDc1LDB4RjFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg4QywweDhELDB4OEUsMHg4RiwweDkxLDB4OTIsMHg5MywweDk0LDB4OTYsMHg5NywweDk4LDB4OTksMHg5QiwweDlDLDB4OUQsMHg5RV0sWzB4QjUsMHhCRiwweDk0LDB4NkIsMHhFMSwweDlCLDB4RUIsMHg4RCwweEIzLDB4OTgsMHgzQiwweDVGLDB4NEMsMHg2RSwweDhELDB4REJdLFsweDEzLDB4MUMsMHg4OCwweDZBLDB4NTcsMHhGOCwweEMyLDB4RTcsMHgxMywweEFCLDB4QTYsMHg5NSwweDVFLDB4MkIsMHg1NSwweEI1XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4QTAsMHhBMSwweEEyLDB4QTMsMHhBNSwweEE2LDB4QTcsMHhBOCwweEFBLDB4QUIsMHhBQywweEFELDB4QUYsMHhCMCwweEIxLDB4QjJdLFsweDQxLDB4MzIsMHgxRSwweEUxLDB4MEUsMHgyMSwweEJELDB4OTAsMHg3MiwweDI3LDB4QzQsMHg0NSwweDBGLDB4RjQsMHgyMywweDI0XSxbMHhEMiwweEFCLDB4NzYsMHg2MiwweERGLDB4OUIsMHg4QywweDc0LDB4MDIsMHgxMCwweEU1LDB4RUUsMHhCNiwweDFDLDB4MTksMHg5RF1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEI0LDB4QjUsMHhCNiwweEI3LDB4QjksMHhCQSwweEJCLDB4QkMsMHhCRSwweEJGLDB4QzAsMHhDMSwweEMzLDB4QzQsMHhDNSwweEM2XSxbMHgwMCwweEE4LDB4MkYsMHg1OSwweEM5LDB4MUMsMHg4NCwweDg2LDB4RDEsMHgyQywweDBBLDB4ODAsMHgxMiwweDRGLDB4NjAsMHg4OV0sWzB4MTQsMHhDMSwweDA1LDB4NTQsMHhCMiwweDg1LDB4OUMsMHg0OCwweDRDLDB4QUIsMHg1OCwweDY5LDB4QkIsMHhFNywweEM0LDB4NzBdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHhDOCwweEM5LDB4Q0EsMHhDQiwweENELDB4Q0UsMHhDRiwweEQwLDB4RDIsMHhEMywweEQ0LDB4RDUsMHhENywweEQ4LDB4RDksMHhEQV0sWzB4N0MsMHhFMCwweEZELDB4MDcsMHg2NywweDU0LDB4NjksMHgxQiwweDRCLDB4QkQsMHg5RiwweEFGLDB4OEEsMHgxMywweDcyLDB4RkVdLFsweERCLDB4NEQsMHg0OSwweDhGLDB4MEEsMHg0OSwweENGLDB4NTUsMHg0NCwweDVELDB4NTAsMHgyQywweDFGLDB4OUEsMHhCMywweEI1XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4REMsMHhERCwweERFLDB4REYsMHhFMSwweEUyLDB4RTMsMHhFNCwweEU2LDB4RTcsMHhFOCwweEU5LDB4RUIsMHhFQywweEVELDB4RUVdLFsweDIzLDB4NjAsMHg1QSwweDgyLDB4NDMsMHhEMCwweDc3LDB4NjQsMHg1NCwweDFCLDB4QzUsMHhBRCwweDM1LDB4NUIsMHgzMSwweDI5XSxbMHg2RCwweDk2LDB4RkUsMHhGNywweEQ2LDB4NjUsMHg5MCwweEE3LDB4N0EsMHg3NywweEJCLDB4MjAsMHg1NiwweDY2LDB4N0YsMHg3Rl1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEYwLDB4RjEsMHhGMiwweEYzLDB4RjUsMHhGNiwweEY3LDB4RjgsMHhGQSwweEZCLDB4RkMsMHhGRCwweEZFLDB4MDEsMHgwMCwweDAyXSxbMHgxMiwweEE4LDB4Q0YsMHhBMiwweDNFLDB4QTcsMHg2NCwweEZELDB4ODcsMHg2MiwweDMyLDB4QjQsMHhFOCwweDQyLDB4QkMsMHg0NF0sWzB4MzEsMHg2RiwweEI2LDB4OEUsMHhEQiwweEE3LDB4MzYsMHhDNSwweDNFLDB4NzgsMHg0NywweDdCLDB4RjksMHgxMywweDcyLDB4NUNdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgwNCwweDA1LDB4MDYsMHgwNywweDA5LDB4MEEsMHgwQiwweDBDLDB4MEUsMHgwRiwweDEwLDB4MTEsMHgxMywweDE0LDB4MTUsMHgxNl0sWzB4QkMsMHhBRiwweDMyLDB4NDEsMHg1RSwweDgzLDB4MDgsMHhCMywweDcyLDB4M0UsMHg1RiwweERELDB4ODUsMHgzQywweENDLDB4ODBdLFsweDY5LDB4MzYsMHhGMiwweEI5LDB4M0EsMHhGOCwweDM5LDB4N0YsMHhEMywweEE3LDB4NzEsMHhGQywweDAxLDB4MUMsMHg4QywweDM3XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0IsMHgzQywweDNELDB4M0VdLFsweDg5LDB4QUYsMHhBRSwweDY4LDB4NUQsMHg4MCwweDFBLDB4RDcsMHg0NywweEFDLDB4RTksMHgxRiwweEM0LDB4OUEsMHhERCwweEUwXSxbMHhGMywweEY5LDB4MkYsMHg3QSwweDlDLDB4NTksMHgxNywweDlDLDB4MUYsMHhDQywweDJDLDB4MkIsMHhBMCwweEIwLDB4ODIsMHhDRF1dXTtcbiAgXG4gIHZhciB0ZXN0dmVjdG9yczE5MiA9IFtbWzB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNSwweDA2LDB4MDcsMHgwOCwweDBBLDB4MEIsMHgwQywweDBELDB4MEYsMHgxMCwweDExLDB4MTIsMHgxNCwweDE1LDB4MTYsMHgxNywweDE5LDB4MUEsMHgxQiwweDFDXSxbMHgyRCwweDMzLDB4RUUsMHhGMiwweEMwLDB4NDMsMHgwQSwweDhBLDB4OUUsMHhCRiwweDQ1LDB4RTgsMHgwOSwweEM0LDB4MEIsMHhCNl0sWzB4REYsMHhGNCwweDk0LDB4NUUsMHgwMywweDM2LDB4REYsMHg0QywweDFDLDB4NTYsMHhCQywweDcwLDB4MEUsMHhGRiwweDgzLDB4N0ZdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgxRSwweDFGLDB4MjAsMHgyMSwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjgsMHgyOSwweDJBLDB4MkIsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzcsMHgzOCwweDM5LDB4M0FdLFsweDZBLDB4QTMsMHg3NSwweEQxLDB4RkEsMHgxNSwweDVBLDB4NjEsMHhGQiwweDcyLDB4MzUsMHgzRSwweDBBLDB4NUEsMHg4NywweDU2XSxbMHhCNiwweEZELDB4REUsMHhGNCwweDc1LDB4MjcsMHg2NSwweEUzLDB4NDcsMHhENSwweEQyLDB4REMsMHgxOSwweDZELDB4MTIsMHg1Ml1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDNDLDB4M0QsMHgzRSwweDNGLDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NiwweDQ3LDB4NDgsMHg0OSwweDRCLDB4NEMsMHg0RCwweDRFLDB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NSwweDU2LDB4NTcsMHg1OF0sWzB4QkMsMHgzNywweDM2LDB4NTEsMHg4QiwweDk0LDB4OTAsMHhEQywweEI4LDB4RUQsMHg2MCwweEVCLDB4MjYsMHg3NSwweDhFLDB4RDRdLFsweEQyLDB4MzYsMHg4NCwweEUzLDB4RDksMHg2MywweEIzLDB4QUYsMHhDRiwweDFBLDB4MTEsMHg0QSwweENBLDB4OTAsMHhDQiwweEQ2XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4NUEsMHg1QiwweDVDLDB4NUQsMHg1RiwweDYwLDB4NjEsMHg2MiwweDY0LDB4NjUsMHg2NiwweDY3LDB4NjksMHg2QSwweDZCLDB4NkMsMHg2RSwweDZGLDB4NzAsMHg3MSwweDczLDB4NzQsMHg3NSwweDc2XSxbMHhBQSwweDIxLDB4NDQsMHgwMiwweEI0LDB4NkMsMHhGRiwweEI5LDB4RjcsMHg2MSwweEVDLDB4MTEsMHgyNiwweDNBLDB4MzEsMHgxRV0sWzB4M0EsMHg3QSwweEMwLDB4MjcsMHg3NSwweDNFLDB4MkEsMHgxOCwweEMyLDB4Q0UsMHhBQiwweDlFLDB4MTcsMHhDMSwweDFGLDB4RDBdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg3OCwweDc5LDB4N0EsMHg3QiwweDdELDB4N0UsMHg3RiwweDgwLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NywweDg4LDB4ODksMHg4QSwweDhDLDB4OEQsMHg4RSwweDhGLDB4OTEsMHg5MiwweDkzLDB4OTRdLFsweDAyLDB4QUUsMHhBOCwweDZFLDB4NTcsMHgyRSwweEVBLDB4QjYsMHg2QiwweDJDLDB4M0EsMHhGNSwweEU5LDB4QTQsMHg2RiwweEQ2XSxbMHg4RiwweDY3LDB4ODYsMHhCRCwweDAwLDB4NzUsMHgyOCwweEJBLDB4MjYsMHg2MCwweDNDLDB4MTYsMHgwMSwweENELDB4RDAsMHhEOF1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDk2LDB4OTcsMHg5OCwweDk5LDB4OUIsMHg5QywweDlELDB4OUUsMHhBMCwweEExLDB4QTIsMHhBMywweEE1LDB4QTYsMHhBNywweEE4LDB4QUEsMHhBQiwweEFDLDB4QUQsMHhBRiwweEIwLDB4QjEsMHhCMl0sWzB4RTIsMHhBRSwweEY2LDB4QUMsMHhDMywweDNCLDB4OTYsMHg1QywweDRGLDB4QTEsMHhGOSwweDFDLDB4NzUsMHhGRiwweDZGLDB4MzZdLFsweEQxLDB4N0QsMHgwNywweDNCLDB4MDEsMHhFNywweDE1LDB4MDIsMHhFMiwweDhCLDB4NDcsMHhBQiwweDU1LDB4MTEsMHg2OCwweEIzXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4QjQsMHhCNSwweEI2LDB4QjcsMHhCOSwweEJBLDB4QkIsMHhCQywweEJFLDB4QkYsMHhDMCwweEMxLDB4QzMsMHhDNCwweEM1LDB4QzYsMHhDOCwweEM5LDB4Q0EsMHhDQiwweENELDB4Q0UsMHhDRiwweEQwXSxbMHgwNiwweDU5LDB4REYsMHg0NiwweDQyLDB4NzEsMHg2MiwweEI5LDB4NDMsMHg0OCwweDY1LDB4REQsMHg5NCwweDk5LDB4RjksMHgxRF0sWzB4QTQsMHg2OSwweERBLDB4NTEsMHg3MSwweDE5LDB4RkEsMHhCOSwweDU4LDB4NzYsMHhGNCwweDFELDB4MDYsMHhENCwweDBGLDB4RkFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHhEMiwweEQzLDB4RDQsMHhENSwweEQ3LDB4RDgsMHhEOSwweERBLDB4REMsMHhERCwweERFLDB4REYsMHhFMSwweEUyLDB4RTMsMHhFNCwweEU2LDB4RTcsMHhFOCwweEU5LDB4RUIsMHhFQywweEVELDB4RUVdLFsweDQ5LDB4QTQsMHg0MiwweDM5LDB4QzcsMHg0OCwweEZFLDB4QjQsMHg1NiwweEY1LDB4OUMsMHgyNywweDZBLDB4NTYsMHg1OCwweERGXSxbMHg2MCwweDkxLDB4QUEsMHgzQiwweDY5LDB4NUMsMHgxMSwweEY1LDB4QzAsMHhCNiwweEFELDB4MjYsMHhEMywweEQ4LDB4NjIsMHhGRl1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEYwLDB4RjEsMHhGMiwweEYzLDB4RjUsMHhGNiwweEY3LDB4RjgsMHhGQSwweEZCLDB4RkMsMHhGRCwweEZFLDB4MDEsMHgwMCwweDAyLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOSwweDBBLDB4MEIsMHgwQ10sWzB4NjYsMHgyMCwweDhGLDB4NkUsMHg5RCwweDA0LDB4NTIsMHg1QiwweERFLDB4REIsMHgyNywweDMzLDB4QjYsMHhBNiwweEJFLDB4MzddLFsweDcwLDB4RjksMHhFNiwweDdGLDB4OUYsMHg4RCwweEYxLDB4MjksMHg0MSwweDMxLDB4NjYsMHgyRCwweEM2LDB4RTYsMHg5MywweDY0XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4MEUsMHgwRiwweDEwLDB4MTEsMHgxMywweDE0LDB4MTUsMHgxNiwweDE4LDB4MTksMHgxQSwweDFCLDB4MUQsMHgxRSwweDFGLDB4MjAsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI3LDB4MjgsMHgyOSwweDJBXSxbMHgzMywweDkzLDB4RjgsMHhERiwweEM3LDB4MjksMHhDOSwweDdGLDB4NTQsMHg4MCwweEI5LDB4NTAsMHhCQywweDk2LDB4NjYsMHhCMF0sWzB4RDEsMHg1NCwweERDLDB4QUYsMHhBRCwweDhCLDB4MjAsMHg3RiwweEE1LDB4Q0IsMHhDOSwweDVFLDB4OTksMHg5NiwweEI1LDB4NTldXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHgyQywweDJELDB4MkUsMHgyRiwweDMxLDB4MzIsMHgzMywweDM0LDB4MzYsMHgzNywweDM4LDB4MzksMHgzQiwweDNDLDB4M0QsMHgzRSwweDQwLDB4NDEsMHg0MiwweDQzLDB4NDUsMHg0NiwweDQ3LDB4NDhdLFsweDYwLDB4NjgsMHgzNCwweEM4LDB4Q0UsMHgwNiwweDNGLDB4MzIsMHgzNCwweENGLDB4MTEsMHg0NSwweDMyLDB4NUQsMHhCRCwweDcxXSxbMHg0OSwweDM0LDB4RDUsMHg0MSwweEU4LDB4QjQsMHg2RiwweEEzLDB4MzksMHhDOCwweDA1LDB4QTcsMHhBRSwweEI5LDB4RTUsMHhEQV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweDRBLDB4NEIsMHg0QywweDRELDB4NEYsMHg1MCwweDUxLDB4NTIsMHg1NCwweDU1LDB4NTYsMHg1NywweDU5LDB4NUEsMHg1QiwweDVDLDB4NUUsMHg1RiwweDYwLDB4NjEsMHg2MywweDY0LDB4NjUsMHg2Nl0sWzB4RkUsMHhDMSwweEMwLDB4NEYsMHg1MiwweDlCLDB4QkQsMHgxNywweEQ4LDB4Q0UsMHhDRiwweENDLDB4NDcsMHgxOCwweEIxLDB4N0ZdLFsweDYyLDB4NTYsMHg0QywweDczLDB4OEYsMHgzRSwweEZFLDB4MTgsMHg2RSwweDFBLDB4MTIsMHg3QSwweDBDLDB4NEQsMHgzQywweDYxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbWzB4NjgsMHg2OSwweDZBLDB4NkIsMHg2RCwweDZFLDB4NkYsMHg3MCwweDcyLDB4NzMsMHg3NCwweDc1LDB4NzcsMHg3OCwweDc5LDB4N0EsMHg3QywweDdELDB4N0UsMHg3RiwweDgxLDB4ODIsMHg4MywweDg0XSxbMHgzMiwweERGLDB4OTksMHhCNCwweDMxLDB4RUQsMHg1RCwweEM1LDB4QUMsMHhGOCwweENBLDB4RjYsMHhEQywweDZDLDB4RTQsMHg3NV0sWzB4MDcsMHg4MCwweDVBLDB4QTAsMHg0MywweDk4LDB4NkUsMHhCMiwweDM2LDB4OTMsMHhFMiwweDNCLDB4RUYsMHg4RiwweDM0LDB4MzhdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbMHg4NiwweDg3LDB4ODgsMHg4OSwweDhCLDB4OEMsMHg4RCwweDhFLDB4OTAsMHg5MSwweDkyLDB4OTMsMHg5NSwweDk2LDB4OTcsMHg5OCwweDlBLDB4OUIsMHg5QywweDlELDB4OUYsMHhBMCwweEExLDB4QTJdLFsweDdGLDB4REMsMHgyQiwweDc0LDB4NkYsMHgzRiwweDY2LDB4NTIsMHg5NiwweDk0LDB4M0IsMHg4MywweDcxLDB4MEQsMHgxRiwweDgyXSxbMHhERiwweDBCLDB4NDksMHgzMSwweDAzLDB4OEIsMHhBRCwweEU4LDB4NDgsMHhERSwweEUzLDB4QjQsMHhCOCwweDVBLDB4QTQsMHg0Ql1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1sweEE0LDB4QTUsMHhBNiwweEE3LDB4QTksMHhBQSwweEFCLDB4QUMsMHhBRSwweEFGLDB4QjAsMHhCMSwweEIzLDB4QjQsMHhCNSwweEI2LDB4QjgsMHhCOSwweEJBLDB4QkIsMHhCRCwweEJFLDB4QkYsMHhDMF0sWzB4OEYsMHhCQSwweDE1LDB4MTAsMHhBMywweEM1LDB4QjgsMHg3RSwweDJFLDB4QUEsMHgzRiwweDdBLDB4OTEsMHg0NSwweDVDLDB4QTJdLFsweDU5LDB4MkQsMHg1RiwweERFLDB4RDcsMHg2NSwweDgyLDB4RTQsMHgxNCwweDNDLDB4NjUsMHgwOSwweDkzLDB4MDksMHg0NywweDdDXV1dO1xuICBcbiAgdmFyIHRlc3R2ZWN0b3JzMjU2ID0gW1tbMHgwMCwweDAxLDB4MDIsMHgwMywweDA1LDB4MDYsMHgwNywweDA4LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgwRiwweDEwLDB4MTEsMHgxMiwweDE0LDB4MTUsMHgxNiwweDE3LDB4MTksMHgxQSwweDFCLDB4MUMsMHgxRSwweDFGLDB4MjAsMHgyMSwweDIzLDB4MjQsMHgyNSwweDI2XSxbMHg4MywweDRFLDB4QUQsMHhGQywweENBLDB4QzcsMHhFMSwweEIzLDB4MDYsMHg2NCwweEIxLDB4QUIsMHhBNCwweDQ4LDB4MTUsMHhBQl0sWzB4MTksMHg0NiwweERBLDB4QkYsMHg2QSwweDAzLDB4QTIsMHhBMiwweEMzLDB4RDAsMHhCMCwweDUwLDB4ODAsMHhBRSwweEQ2LDB4RkNdXSxcbiAgICAgICAgICAgICAgW1sweDI4LDB4MjksMHgyQSwweDJCLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM3LDB4MzgsMHgzOSwweDNBLDB4M0MsMHgzRCwweDNFLDB4M0YsMHg0MSwweDQyLDB4NDMsMHg0NCwweDQ2LDB4NDcsMHg0OCwweDQ5LDB4NEIsMHg0QywweDRELDB4NEVdLFsweEQ5LDB4REMsMHg0RCwweEJBLDB4MzAsMHgyMSwweEIwLDB4NUQsMHg2NywweEMwLDB4NTEsMHg4RiwweDcyLDB4QjYsMHgyQiwweEYxXSxbMHg1RSwweEQzLDB4MDEsMHhENywweDQ3LDB4RDMsMHhDQywweDcxLDB4NTQsMHg0NSwweEVCLDB4REUsMHhDNiwweDJGLDB4MkYsMHhCNF1dLFxuICAgICAgICAgICAgICBbWzB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NSwweDU2LDB4NTcsMHg1OCwweDVBLDB4NUIsMHg1QywweDVELDB4NUYsMHg2MCwweDYxLDB4NjIsMHg2NCwweDY1LDB4NjYsMHg2NywweDY5LDB4NkEsMHg2QiwweDZDLDB4NkUsMHg2RiwweDcwLDB4NzEsMHg3MywweDc0LDB4NzUsMHg3Nl0sWzB4QTIsMHg5MSwweEQ4LDB4NjMsMHgwMSwweEE0LDB4QTcsMHgzOSwweEY3LDB4MzksMHgyMSwweDczLDB4QUEsMHgzQywweDYwLDB4NENdLFsweDY1LDB4ODUsMHhDOCwweEY0LDB4M0QsMHgxMywweEE2LDB4QkUsMHhBQiwweDY0LDB4MTksMHhGQywweDU5LDB4MzUsMHhCOSwweEQwXV0sXG4gICAgICAgICAgICAgIFtbMHg3OCwweDc5LDB4N0EsMHg3QiwweDdELDB4N0UsMHg3RiwweDgwLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NywweDg4LDB4ODksMHg4QSwweDhDLDB4OEQsMHg4RSwweDhGLDB4OTEsMHg5MiwweDkzLDB4OTQsMHg5NiwweDk3LDB4OTgsMHg5OSwweDlCLDB4OUMsMHg5RCwweDlFXSxbMHg0MiwweDY0LDB4QjIsMHg2OSwweDY0LDB4OTgsMHhERSwweDRELDB4RjcsMHg5NywweDg4LDB4QTksMHhGOCwweDNFLDB4OTMsMHg5MF0sWzB4MkEsMHg1QiwweDU2LDB4QTUsMHg5NiwweDY4LDB4MEYsMHhDQywweDBFLDB4MDUsMHhGNSwweEUwLDB4RjEsMHg1MSwweEVDLDB4QUVdXSxcbiAgICAgICAgICAgICAgW1sweEEwLDB4QTEsMHhBMiwweEEzLDB4QTUsMHhBNiwweEE3LDB4QTgsMHhBQSwweEFCLDB4QUMsMHhBRCwweEFGLDB4QjAsMHhCMSwweEIyLDB4QjQsMHhCNSwweEI2LDB4QjcsMHhCOSwweEJBLDB4QkIsMHhCQywweEJFLDB4QkYsMHhDMCwweEMxLDB4QzMsMHhDNCwweEM1LDB4QzZdLFsweEVFLDB4OTksMHgzMiwweEIzLDB4NzIsMHgxOCwweDA0LDB4RDUsMHhBOCwweDNFLDB4RjUsMHg5NCwweDkyLDB4NDUsMHhCNiwweEY2XSxbMHhGNSwweEQ2LDB4RkYsMHg0MSwweDRGLDB4RDIsMHhDNiwweDE4LDB4MTQsMHg5NCwweEQyLDB4MEMsMHgzNywweEYyLDB4QjgsMHhDNF1dLFxuICAgICAgICAgICAgICBbWzB4QzgsMHhDOSwweENBLDB4Q0IsMHhDRCwweENFLDB4Q0YsMHhEMCwweEQyLDB4RDMsMHhENCwweEQ1LDB4RDcsMHhEOCwweEQ5LDB4REEsMHhEQywweERELDB4REUsMHhERiwweEUxLDB4RTIsMHhFMywweEU0LDB4RTYsMHhFNywweEU4LDB4RTksMHhFQiwweEVDLDB4RUQsMHhFRV0sWzB4RTYsMHgyNCwweDhGLDB4NTUsMHhDNSwweEZELDB4Q0IsMHhDQSwweDlDLDB4QkIsMHhCMCwweDFDLDB4ODgsMHhBMiwweEVBLDB4NzddLFsweDg1LDB4MzksMHg5QywweDAxLDB4RjUsMHg5RiwweEZGLDB4QjUsMHgyMCwweDRGLDB4MTksMHhGOCwweDQ4LDB4MkYsMHgwMCwweEI4XV0sXG4gICAgICAgICAgICAgIFtbMHhGMCwweEYxLDB4RjIsMHhGMywweEY1LDB4RjYsMHhGNywweEY4LDB4RkEsMHhGQiwweEZDLDB4RkQsMHhGRSwweDAxLDB4MDAsMHgwMiwweDA0LDB4MDUsMHgwNiwweDA3LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRSwweDBGLDB4MTAsMHgxMSwweDEzLDB4MTQsMHgxNSwweDE2XSxbMHhCOCwweDM1LDB4OEUsMHg0MSwweEI5LDB4REYsMHhGNiwweDVGLDB4RDQsMHg2MSwweEQ1LDB4NUEsMHg5OSwweDI2LDB4NjIsMHg0N10sWzB4OTIsMHgwOSwweDdCLDB4NEMsMHg4OCwweEEwLDB4NDEsMHhERCwweEY5LDB4ODEsMHg0NCwweEJDLDB4OEQsMHgyMiwweEU4LDB4RTddXSxcbiAgICAgICAgICAgICAgW1sweDE4LDB4MTksMHgxQSwweDFCLDB4MUQsMHgxRSwweDFGLDB4MjAsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI3LDB4MjgsMHgyOSwweDJBLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0IsMHgzQywweDNELDB4M0VdLFsweEYwLDB4RTIsMHhENywweDIyLDB4NjAsMHhBRiwweDU4LDB4RTIsMHgxRSwweDAxLDB4NUEsMHhCMywweEE0LDB4QzAsMHhEOSwweDA2XSxbMHg4OSwweEJELDB4NUIsMHg3MywweEIzLDB4NTYsMHhBQiwweDQxLDB4MkEsMHhFRiwweDlGLDB4NzYsMHhDRSwweEEyLDB4RDYsMHg1Q11dLFxuICAgICAgICAgICAgICBbWzB4NDAsMHg0MSwweDQyLDB4NDMsMHg0NSwweDQ2LDB4NDcsMHg0OCwweDRBLDB4NEIsMHg0QywweDRELDB4NEYsMHg1MCwweDUxLDB4NTIsMHg1NCwweDU1LDB4NTYsMHg1NywweDU5LDB4NUEsMHg1QiwweDVDLDB4NUUsMHg1RiwweDYwLDB4NjEsMHg2MywweDY0LDB4NjUsMHg2Nl0sWzB4NDcsMHg1QiwweDhCLDB4ODIsMHgzQywweEU4LDB4ODksMHgzRCwweEIzLDB4QzQsMHg0QSwweDlGLDB4MkEsMHgzNywweDlGLDB4RjddLFsweDI1LDB4MzYsMHg5NiwweDkwLDB4OTMsMHhDNSwweDVGLDB4RjksMHg0NSwweDQ2LDB4OTIsMHhGMiwweEZBLDB4QzIsMHhGNSwweDMwXV0sXG4gICAgICAgICAgICAgIFtbMHg2OCwweDY5LDB4NkEsMHg2QiwweDZELDB4NkUsMHg2RiwweDcwLDB4NzIsMHg3MywweDc0LDB4NzUsMHg3NywweDc4LDB4NzksMHg3QSwweDdDLDB4N0QsMHg3RSwweDdGLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhCLDB4OEMsMHg4RCwweDhFXSxbMHg2OCwweDhGLDB4NTIsMHg4MSwweDk0LDB4NTgsMHgxMiwweDg2LDB4MkYsMHg1RiwweDMwLDB4NzYsMHhDRiwweDgwLDB4NDEsMHgyRl0sWzB4MDcsMHhGQywweDc2LDB4QTgsMHg3MiwweDg0LDB4M0YsMHgzRiwweDZFLDB4MDAsMHg4MSwweEVFLDB4OTMsMHg5NiwweEQ2LDB4MzddXSxcbiAgICAgICAgICAgICAgW1sweDkwLDB4OTEsMHg5MiwweDkzLDB4OTUsMHg5NiwweDk3LDB4OTgsMHg5QSwweDlCLDB4OUMsMHg5RCwweDlGLDB4QTAsMHhBMSwweEEyLDB4QTQsMHhBNSwweEE2LDB4QTcsMHhBOSwweEFBLDB4QUIsMHhBQywweEFFLDB4QUYsMHhCMCwweEIxLDB4QjMsMHhCNCwweEI1LDB4QjZdLFsweDA4LDB4RDEsMHhEMiwweEJDLDB4NzUsMHgwQSwweEY1LDB4NTMsMHgzNiwweDVELDB4MzUsMHhFNywweDVBLDB4RkEsMHhDRSwweEFBXSxbMHhFMywweDhCLDB4QTgsMHhFQywweDJBLDB4QTcsMHg0MSwweDM1LDB4OEQsMHhDQywweDkzLDB4RTgsMHhGMSwweDQxLDB4QzQsMHg5MV1dLFxuICAgICAgICAgICAgICBbWzB4QjgsMHhCOSwweEJBLDB4QkIsMHhCRCwweEJFLDB4QkYsMHhDMCwweEMyLDB4QzMsMHhDNCwweEM1LDB4QzcsMHhDOCwweEM5LDB4Q0EsMHhDQywweENELDB4Q0UsMHhDRiwweEQxLDB4RDIsMHhEMywweEQ0LDB4RDYsMHhENywweEQ4LDB4RDksMHhEQiwweERDLDB4REQsMHhERV0sWzB4ODcsMHgwNywweDEyLDB4MUYsMHg0NywweENDLDB4M0UsMHhGQywweEVDLDB4QTUsMHhGOSwweEE4LDB4NDcsMHg0OSwweDUwLDB4QTFdLFsweEQwLDB4MjgsMHhFRSwweDIzLDB4RTQsMHhBOCwweDkwLDB4NzUsMHhEMCwweEIwLDB4M0UsMHg4NiwweDhELDB4N0QsMHgzQSwweDQyXV0sXG4gICAgICAgICAgICAgIFtbMHhFMCwweEUxLDB4RTIsMHhFMywweEU1LDB4RTYsMHhFNywweEU4LDB4RUEsMHhFQiwweEVDLDB4RUQsMHhFRiwweEYwLDB4RjEsMHhGMiwweEY0LDB4RjUsMHhGNiwweEY3LDB4RjksMHhGQSwweEZCLDB4RkMsMHhGRSwweEZFLDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwNSwweDA2XSxbMHhFNSwweDFBLDB4QTAsMHhCMSwweDM1LDB4REIsMHhBNSwweDY2LDB4OTMsMHg5QywweDNCLDB4NjMsMHg1OSwweEE5LDB4ODAsMHhDNV0sWzB4OEMsMHhEOSwweDQyLDB4M0QsMHhGQywweDQ1LDB4OUUsMHg1NCwweDcxLDB4NTUsMHhDNSwweEQxLDB4RDUsMHgyMiwweEU1LDB4NDBdXSxcbiAgICAgICAgICAgICAgW1sweDA4LDB4MDksMHgwQSwweDBCLDB4MEQsMHgwRSwweDBGLDB4MTAsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUMsMHgxRCwweDFFLDB4MUYsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI2LDB4MjcsMHgyOCwweDI5LDB4MkIsMHgyQywweDJELDB4MkVdLFsweDA2LDB4OUEsMHgwMCwweDdGLDB4QzcsMHg2QSwweDQ1LDB4OUYsMHg5OCwweEJBLDB4RjksMHgxNywweEZFLDB4REYsMHg5NSwweDIxXSxbMHgwOCwweDBFLDB4OTUsMHgxNywweEVCLDB4MTYsMHg3NywweDcxLDB4OUEsMHhDRiwweDcyLDB4ODAsMHg4NiwweDA0LDB4MEEsMHhFM11dLFxuICAgICAgICAgICAgICBbWzB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNSwweDM2LDB4MzcsMHgzOCwweDNBLDB4M0IsMHgzQywweDNELDB4M0YsMHg0MCwweDQxLDB4NDIsMHg0NCwweDQ1LDB4NDYsMHg0NywweDQ5LDB4NEEsMHg0QiwweDRDLDB4NEUsMHg0RiwweDUwLDB4NTEsMHg1MywweDU0LDB4NTUsMHg1Nl0sWzB4NzIsMHg2MSwweDY1LDB4QzEsMHg3MiwweDNGLDB4QkMsMHhGNiwweEMwLDB4MjYsMHhENywweEQwLDB4MEIsMHgwOSwweDEwLDB4MjddLFsweDdDLDB4MTcsMHgwMCwweDIxLDB4MUEsMHgzOSwweDkxLDB4RkMsMHgwRSwweENELDB4RUQsMHgwQSwweEIzLDB4RTUsMHg3NiwweEIwXV1dO1xuXG4gIHZhciByZXMgPSB0cnVlO1xuICB2YXIgaiA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHZlY3RvcnMxMjgubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVzMiA9IHRlc3RfYWVzKHRlc3R2ZWN0b3JzMTI4W2ldWzFdLHRlc3R2ZWN0b3JzMTI4W2ldWzBdLHRlc3R2ZWN0b3JzMTI4W2ldWzJdKTtcbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgMTI4IGJpdCBrZXkgdmVjdG9yIHdpdGggYmxvY2sgXCIrXG4gICAgICAgIHV0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxMjhbaV1bMV0pK1xuICAgICAgICBcIiBhbmQga2V5IFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxMjhbaV1bMF0pK1xuICAgICAgICBcIiBzaG91bGQgYmUgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yczEyOFtpXVsyXSksXG4gICAgICAgIGZhbHNlKTtcbiAgICAgIGorKztcbiAgICB9XG4gIH1cbiAgaWYgKHJlcykge1xuICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIjEyOCBiaXQga2V5IHRlc3QgdmVjdG9ycyBjb21wbGV0ZWQuXCIsdHJ1ZSlcbiAgICBqKys7XG4gIH1cbiAgXG4gIHJlcyA9IHRydWU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHZlY3RvcnMxOTIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVzMiA9IHRlc3RfYWVzKHRlc3R2ZWN0b3JzMTkyW2ldWzFdLHRlc3R2ZWN0b3JzMTkyW2ldWzBdLHRlc3R2ZWN0b3JzMTkyW2ldWzJdKTtcbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgMTkyIGJpdCBrZXkgdmVjdG9yIHdpdGggYmxvY2sgXCIrXG4gICAgICAgIHV0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxOTJbaV1bMV0pK1xuICAgICAgICBcIiBhbmQga2V5IFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMxOTJbaV1bMF0pK1xuICAgICAgICBcIiBzaG91bGQgYmUgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yczE5MltpXVsyXSksXG4gICAgICAgIGZhbHNlKTtcbiAgICAgIGorKztcbiAgICB9XG4gIH1cbiAgaWYgKHJlcykge1xuICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIjE5MiBiaXQga2V5IHRlc3QgdmVjdG9ycyBjb21wbGV0ZWQuXCIsdHJ1ZSlcbiAgICBqKys7XG4gIH1cblxuICByZXMgPSB0cnVlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3R2ZWN0b3JzMjU2Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlczIgPSB0ZXN0X2Flcyh0ZXN0dmVjdG9yczI1NltpXVsxXSx0ZXN0dmVjdG9yczI1NltpXVswXSx0ZXN0dmVjdG9yczI1NltpXVsyXSk7XG4gICAgcmVzICY9IHJlczI7XG4gICAgaWYgKCFyZXMyKSB7XG4gICAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCJUZXN0aW5nIDI1NiBiaXQga2V5IHZlY3RvciB3aXRoIGJsb2NrIFwiK1xuICAgICAgICB1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzMjU2W2ldWzFdKStcbiAgICAgICAgXCIgYW5kIGtleSBcIit1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzMjU2W2ldWzBdKStcbiAgICAgICAgXCIgc2hvdWxkIGJlIFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnMyNTZbaV1bMl0pLFxuICAgICAgICBmYWxzZSk7XG4gICAgICBqKys7XG4gICAgfVxuICB9XG4gIGlmIChyZXMpIHtcbiAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCIyNTYgYml0IGtleSB0ZXN0IHZlY3RvcnMgY29tcGxldGVkLlwiLCB0cnVlKVxuICAgIGorKztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiQmxvd2Zpc2ggY2lwaGVyIHRlc3Qgd2l0aCB0ZXN0IHZlY3RvcnMgZnJvbSBodHRwOi8vd3d3LnNjaG5laWVyLmNvbS9jb2RlL3ZlY3RvcnMudHh0XCIsIGZ1bmN0aW9uKCkge1xuICB2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuICAgIHV0aWwgPSBvcGVucGdwLnV0aWwsXG4gICAgQkZlbmNyeXB0ID0gb3BlbnBncC5jaXBoZXIuYmxvd2Zpc2g7XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmdW5jdGlvbiB0ZXN0X2JmKGlucHV0LCBrZXksIG91dHB1dCkge1xuICAgIHZhciBibG93ZmlzaCA9IG5ldyBvcGVucGdwLmNpcGhlci5ibG93ZmlzaCh1dGlsLmJpbjJzdHIoa2V5KSk7XG4gICAgdmFyIHJlc3VsdCA9IHV0aWwuYmluMnN0cihibG93ZmlzaC5lbmNyeXB0KGlucHV0KSk7XG5cbiAgICByZXR1cm4gKHV0aWwuaGV4c3RyZHVtcChyZXN1bHQpID09IHV0aWwuaGV4c3RyZHVtcCh1dGlsLmJpbjJzdHIob3V0cHV0KSkpO1xuICB9XG4gIHZhciB0ZXN0dmVjdG9ycyA9IFtbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NEUsMHhGOSwweDk3LDB4NDUsMHg2MSwweDk4LDB4REQsMHg3OF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZdLFsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZdLFsweDUxLDB4ODYsMHg2RiwweEQ1LDB4QjgsMHg1RSwweENCLDB4OEFdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxXSxbMHg3RCwweDg1LDB4NkYsMHg5QSwweDYxLDB4MzAsMHg2MywweEYyXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMV0sWzB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMV0sWzB4MjQsMHg2NiwweERELDB4ODcsMHg4QiwweDk2LDB4M0MsMHg5RF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTFdLFsweDYxLDB4RjksMHhDMywweDgwLDB4MjIsMHg4MSwweEIwLDB4OTZdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExXSxbMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGXSxbMHg3RCwweDBDLDB4QzYsMHgzMCwweEFGLDB4REEsMHgxRSwweEM3XV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NEUsMHhGOSwweDk3LDB4NDUsMHg2MSwweDk4LDB4REQsMHg3OF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweEZFLDB4REMsMHhCQSwweDk4LDB4NzYsMHg1NCwweDMyLDB4MTBdLFsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweDBBLDB4Q0UsMHhBQiwweDBGLDB4QzYsMHhBMCwweEEyLDB4OERdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHg3QywweEExLDB4MTAsMHg0NSwweDRBLDB4MUEsMHg2RSwweDU3XSxbMHgwMSwweEExLDB4RDYsMHhEMCwweDM5LDB4NzcsMHg2NywweDQyXSxbMHg1OSwweEM2LDB4ODIsMHg0NSwweEVCLDB4MDUsMHgyOCwweDJCXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDEsMHgzMSwweEQ5LDB4NjEsMHg5RCwweEMxLDB4MzcsMHg2RV0sWzB4NUMsMHhENSwweDRDLDB4QTgsMHgzRCwweEVGLDB4NTcsMHhEQV0sWzB4QjEsMHhCOCwweENDLDB4MEIsMHgyNSwweDBGLDB4MDksMHhBMF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDA3LDB4QTEsMHgxMywweDNFLDB4NEEsMHgwQiwweDI2LDB4ODZdLFsweDAyLDB4NDgsMHhENCwweDM4LDB4MDYsMHhGNiwweDcxLDB4NzJdLFsweDE3LDB4MzAsMHhFNSwweDc3LDB4OEIsMHhFQSwweDFELDB4QTRdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgzOCwweDQ5LDB4NjcsMHg0QywweDI2LDB4MDIsMHgzMSwweDlFXSxbMHg1MSwweDQ1LDB4NEIsMHg1OCwweDJELDB4REYsMHg0NCwweDBBXSxbMHhBMiwweDVFLDB4NzgsMHg1NiwweENGLDB4MjYsMHg1MSwweEVCXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDQsMHhCOSwweDE1LDB4QkEsMHg0MywweEZFLDB4QjUsMHhCNl0sWzB4NDIsMHhGRCwweDQ0LDB4MzAsMHg1OSwweDU3LDB4N0YsMHhBMl0sWzB4MzUsMHgzOCwweDgyLDB4QjEsMHgwOSwweENFLDB4OEYsMHgxQV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAxLDB4MTMsMHhCOSwweDcwLDB4RkQsMHgzNCwweEYyLDB4Q0VdLFsweDA1LDB4OUIsMHg1RSwweDA4LDB4NTEsMHhDRiwweDE0LDB4M0FdLFsweDQ4LDB4RjQsMHhEMCwweDg4LDB4NEMsMHgzNywweDk5LDB4MThdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMSwweDcwLDB4RjEsMHg3NSwweDQ2LDB4OEYsMHhCNSwweEU2XSxbMHgwNywweDU2LDB4RDgsMHhFMCwweDc3LDB4NDcsMHg2MSwweEQyXSxbMHg0MywweDIxLDB4OTMsMHhCNywweDg5LDB4NTEsMHhGQywweDk4XV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4NDMsMHgyOSwweDdGLDB4QUQsMHgzOCwweEUzLDB4NzMsMHhGRV0sWzB4NzYsMHgyNSwweDE0LDB4QjgsMHgyOSwweEJGLDB4NDgsMHg2QV0sWzB4MTMsMHhGMCwweDQxLDB4NTQsMHhENiwweDlELDB4MUEsMHhFNV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDA3LDB4QTcsMHgxMywweDcwLDB4NDUsMHhEQSwweDJBLDB4MTZdLFsweDNCLDB4REQsMHgxMSwweDkwLDB4NDksMHgzNywweDI4LDB4MDJdLFsweDJFLDB4RUQsMHhEQSwweDkzLDB4RkYsMHhEMywweDlDLDB4NzldXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwNCwweDY4LDB4OTEsMHgwNCwweEMyLDB4RkQsMHgzQiwweDJGXSxbMHgyNiwweDk1LDB4NUYsMHg2OCwweDM1LDB4QUYsMHg2MCwweDlBXSxbMHhEOCwweDg3LDB4RTAsMHgzOSwweDNDLDB4MkQsMHhBNiwweEUzXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MzcsMHhEMCwweDZCLDB4QjUsMHgxNiwweENCLDB4NzUsMHg0Nl0sWzB4MTYsMHg0RCwweDVFLDB4NDAsMHg0RiwweDI3LDB4NTIsMHgzMl0sWzB4NUYsMHg5OSwweEQwLDB4NEYsMHg1QiwweDE2LDB4MzksMHg2OV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDFGLDB4MDgsMHgyNiwweDBELDB4MUEsMHhDMiwweDQ2LDB4NUVdLFsweDZCLDB4MDUsMHg2RSwweDE4LDB4NzUsMHg5RiwweDVDLDB4Q0FdLFsweDRBLDB4MDUsMHg3QSwweDNCLDB4MjQsMHhEMywweDk3LDB4N0JdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHg1OCwweDQwLDB4MjMsMHg2NCwweDFBLDB4QkEsMHg2MSwweDc2XSxbMHgwMCwweDRCLDB4RDYsMHhFRiwweDA5LDB4MTcsMHg2MCwweDYyXSxbMHg0NSwweDIwLDB4MzEsMHhDMSwweEU0LDB4RkEsMHhEQSwweDhFXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDIsMHg1OCwweDE2LDB4MTYsMHg0NiwweDI5LDB4QjAsMHgwN10sWzB4NDgsMHgwRCwweDM5LDB4MDAsMHg2RSwweEU3LDB4NjIsMHhGMl0sWzB4NzUsMHg1NSwweEFFLDB4MzksMHhGNSwweDlCLDB4ODcsMHhCRF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDQ5LDB4NzksMHgzRSwweEJDLDB4NzksMHhCMywweDI1LDB4OEZdLFsweDQzLDB4NzUsMHg0MCwweEM4LDB4NjksMHg4RiwweDNDLDB4RkFdLFsweDUzLDB4QzUsMHg1RiwweDlDLDB4QjQsMHg5RiwweEMwLDB4MTldXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHg0RiwweEIwLDB4NUUsMHgxNSwweDE1LDB4QUIsMHg3MywweEE3XSxbMHgwNywweDJELDB4NDMsMHhBMCwweDc3LDB4MDcsMHg1MiwweDkyXSxbMHg3QSwweDhFLDB4N0IsMHhGQSwweDkzLDB4N0UsMHg4OSwweEEzXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4NDksMHhFOSwweDVELDB4NkQsMHg0QywweEEyLDB4MjksMHhCRl0sWzB4MDIsMHhGRSwweDU1LDB4NzcsMHg4MSwweDE3LDB4RjEsMHgyQV0sWzB4Q0YsMHg5QywweDVELDB4N0EsMHg0OSwweDg2LDB4QUQsMHhCNV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAxLDB4ODMsMHgxMCwweERDLDB4NDAsMHg5QiwweDI2LDB4RDZdLFsweDFELDB4OUQsMHg1QywweDUwLDB4MTgsMHhGNywweDI4LDB4QzJdLFsweEQxLDB4QUIsMHhCMiwweDkwLDB4NjUsMHg4QiwweEM3LDB4NzhdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgxQywweDU4LDB4N0YsMHgxQywweDEzLDB4OTIsMHg0RiwweEVGXSxbMHgzMCwweDU1LDB4MzIsMHgyOCwweDZELDB4NkYsMHgyOSwweDVBXSxbMHg1NSwweENCLDB4MzcsMHg3NCwweEQxLDB4M0UsMHhGMiwweDAxXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMV0sWzB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweEFCLDB4Q0QsMHhFRl0sWzB4RkEsMHgzNCwweEVDLDB4NDgsMHg0NywweEIyLDB4NjgsMHhCMl1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDFGLDB4MUYsMHgxRiwweDFGLDB4MEUsMHgwRSwweDBFLDB4MEVdLFsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweEE3LDB4OTAsMHg3OSwweDUxLDB4MDgsMHhFQSwweDNDLDB4QUVdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHhFMCwweEZFLDB4RTAsMHhGRSwweEYxLDB4RkUsMHhGMSwweEZFXSxbMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGXSxbMHhDMywweDlFLDB4MDcsMHgyRCwweDlGLDB4QUMsMHg2MywweDFEXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRl0sWzB4MDEsMHg0OSwweDMzLDB4RTAsMHhDRCwweEFGLDB4RjYsMHhFNF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZdLFsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEYyLDB4MUUsMHg5QSwweDc3LDB4QjcsMHgxQywweDQ5LDB4QkNdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGXSxbMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHgyNCwweDU5LDB4NDYsMHg4OCwweDU3LDB4NTQsMHgzNiwweDlBXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4RkUsMHhEQywweEJBLDB4OTgsMHg3NiwweDU0LDB4MzIsMHgxMF0sWzB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRl0sWzB4NkIsMHg1QywweDVBLDB4OUMsMHg1RCwweDlFLDB4MEEsMHg1QV1dXTtcblxuICB2YXIgcmVzID0gdHJ1ZTtcbiAgdmFyIGogPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3R2ZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlczIgPSB0ZXN0X2JmKHRlc3R2ZWN0b3JzW2ldWzFdLHRlc3R2ZWN0b3JzW2ldWzBdLHRlc3R2ZWN0b3JzW2ldWzJdKTtcbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgdmVjdG9yIFwiK2krXCIgd2l0aCBibG9jayBcIitcbiAgICAgICAgdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVswXSkrXG4gICAgICAgIFwiIGFuZCBrZXkgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVsxXSkrXG4gICAgICAgIFwiIHNob3VsZCBiZSBcIit1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzW2ldWzJdKSwgZmFsc2UpO1xuICAgICAgaisrO1xuICAgIH1cbiAgfVxuICBpZiAocmVzKSB7XG4gICAgcmVzdWx0W2pdID0gbmV3IHVuaXQucmVzdWx0KFwiMzQgdGVzdCB2ZWN0b3JzIGNvbXBsZXRlZCBcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIHVuaXQgPSByZXF1aXJlKCcuLi8uLi91bml0LmpzJyk7XG5cbnVuaXQucmVnaXN0ZXIoXCJDQVNULTEyOCBjaXBoZXIgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIFJGQzIxNDRcIiwgZnVuY3Rpb24oKSB7XG5cdHZhciBvcGVucGdwID0gcmVxdWlyZSgnLi4vLi4vLi4vJyksXG5cdFx0dXRpbCA9IG9wZW5wZ3AudXRpbDtcblxuXHR2YXIgcmVzdWx0ID0gW107XG5cdGZ1bmN0aW9uIHRlc3RfY2FzdChpbnB1dCwga2V5LCBvdXRwdXQpIHtcblx0XHR2YXIgY2FzdDUgPSBuZXcgb3BlbnBncC5jaXBoZXIuY2FzdDUodXRpbC5iaW4yc3RyKGtleSkpO1xuXHRcdHZhciByZXN1bHQgPSB1dGlsLmJpbjJzdHIoY2FzdDUuZW5jcnlwdChpbnB1dCkpO1xuXG5cdFx0cmV0dXJuIHV0aWwuaGV4c3RyZHVtcChyZXN1bHQpID09IHV0aWwuaGV4c3RyZHVtcCh1dGlsLmJpbjJzdHIob3V0cHV0KSk7XG5cdH1cblx0XG5cdHZhciB0ZXN0dmVjdG9ycyA9IFtbWzB4MDEsMHgyMywweDQ1LDB4NjcsMHgxMiwweDM0LDB4NTYsMHg3OCwweDIzLDB4NDUsMHg2NywweDg5LDB4MzQsMHg1NiwweDc4LDB4OUFdLFsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZdLFsweDIzLDB4OEIsMHg0RiwweEU1LDB4ODQsMHg3RSwweDQ0LDB4QjJdXV07XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0dmVjdG9ycy5sZW5ndGg7IGkrKykge1xuXHRcdHJlc3VsdFtpXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgdmVjdG9yIHdpdGggYmxvY2sgXCIrXG5cdFx0XHRcdHV0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnNbaV1bMF0pK1xuXHRcdFx0XHRcIiBhbmQga2V5IFwiK3V0aWwuaGV4aWR1bXAodGVzdHZlY3RvcnNbaV1bMV0pK1xuXHRcdFx0XHRcIiBzaG91bGQgYmUgXCIrdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVsyXSksXG5cdFx0XHR0ZXN0X2Nhc3QodGVzdHZlY3RvcnNbaV1bMV0sdGVzdHZlY3RvcnNbaV1bMF0sdGVzdHZlY3RvcnNbaV1bMl0pKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgdW5pdCA9IHJlcXVpcmUoJy4uLy4uL3VuaXQuanMnKTtcblxudW5pdC5yZWdpc3RlcihcIlRyaXBsZURFUyAoRURFKSBjaXBoZXIgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9uaXN0cHVicy84MDAtMjAvODAwLTIwLnBkZlwiLCBmdW5jdGlvbigpIHtcbiAgdmFyIG9wZW5wZ3AgPSByZXF1aXJlKCcuLi8uLi8uLi8nKSxcbiAgICB1dGlsID0gb3BlbnBncC51dGlsO1xuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleSA9IHV0aWwuYmluMnN0cihbMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdKTtcbiAgdmFyIHRlc3R2ZWN0b3JzID0gW1tbMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg5NSwweEY4LDB4QTUsMHhFNSwweERELDB4MzEsMHhEOSwweDAwXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4REQsMHg3RiwweDEyLDB4MUMsMHhBNSwweDAxLDB4NTYsMHgxOV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweDJFLDB4ODYsMHg1MywweDEwLDB4NEYsMHgzOCwweDM0LDB4RUFdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg0QiwweEQzLDB4ODgsMHhGRiwweDZDLDB4RDgsMHgxRCwweDRGXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MjAsMHhCOSwweEU3LDB4NjcsMHhCMiwweEZCLDB4MTQsMHg1Nl1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweDU1LDB4NTcsMHg5MywweDgwLDB4RDcsMHg3MSwweDM4LDB4RUZdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg2QywweEM1LDB4REUsMHhGQSwweEFGLDB4MDQsMHg1MSwweDJGXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MEQsMHg5RiwweDI3LDB4OUIsMHhBNSwweEQ4LDB4NzIsMHg2MF1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEQ5LDB4MDMsMHgxQiwweDAyLDB4NzEsMHhCRCwweDVBLDB4MEFdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHg0MiwweDQyLDB4NTAsMHhCMywweDdDLDB4M0QsMHhEOSwweDUxXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4QjgsMHgwNiwweDFCLDB4N0UsMHhDRCwweDlBLDB4MjEsMHhFNV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEYxLDB4NUQsMHgwRiwweDI4LDB4NkIsMHg2NSwweEJELDB4MjhdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHhBRCwweEQwLDB4Q0MsMHg4RCwweDZFLDB4NUQsMHhFQiwweEExXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RTYsMHhENSwweEY4LDB4MjcsMHg1MiwweEFELDB4NjMsMHhEMV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEVDLDB4QkYsMHhFMywweEJELDB4M0YsMHg1OSwweDFBLDB4NUVdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHhGMywweDU2LDB4ODMsMHg0MywweDc5LDB4RDEsMHg2NSwweENEXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MkIsMHg5RiwweDk4LDB4MkYsMHgyMCwweDAzLDB4N0YsMHhBOV1dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweDg4LDB4OUQsMHhFMCwweDY4LDB4QTEsMHg2RiwweDBCLDB4RTZdXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHhFMSwweDlFLDB4MjcsMHg1RCwweDg0LDB4NkEsMHgxMiwweDk4XV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4MzIsMHg5QSwweDhFLDB4RDUsMHgyMywweEQ3LDB4MUEsMHhFQ11dLFxuICAgICAgICAgICAgICAgICAgICAgW1sweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDBdLFsweEU3LDB4RkMsMHhFMiwweDI1LDB4NTcsMHhEMiwweDNDLDB4OTddXSxcbiAgICAgICAgICAgICAgICAgICAgIFtbMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwXSxbMHgxMiwweEE5LDB4RjUsMHg4MSwweDdGLDB4RjIsMHhENiwweDVEXV0sXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4QTQsMHg4NCwweEMzLDB4QUQsMHgzOCwweERDLDB4OUMsMHgxOV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RkIsMHhFMCwweDBBLDB4OEEsMHgxRSwweEY4LDB4QUQsMHg3Ml1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NzUsMHgwRCwweDA3LDB4OTQsMHgwNywweDUyLDB4MTMsMHg2M11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4NjQsMHhGRSwweEVELDB4OUMsMHg3MiwweDRDLDB4MkYsMHhBRl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RjAsMHgyQiwweDI2LDB4M0IsMHgzMiwweDhFLDB4MkIsMHg2MF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4OUQsMHg2NCwweDU1LDB4NUEsMHg5QSwweDEwLDB4QjgsMHg1Ml1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RDEsMHgwNiwweEZGLDB4MEIsMHhFRCwweDUyLDB4NTUsMHhEN11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RTEsMHg2NSwweDJDLDB4NkIsMHgxMywweDhDLDB4NjQsMHhBNV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4RTQsMHgyOCwweDU4LDB4MTEsMHg4NiwweEVDLDB4OEYsMHg0Nl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMF0sWzB4QUUsMHhCNSwweEY1LDB4RUQsMHhFMiwweDJELDB4MUEsMHgzNl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMF0sWzB4RTksMHg0MywweEQ3LDB4NTYsMHg4QSwweEVDLDB4MEMsMHg1Q11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMF0sWzB4REYsMHg5OCwweEM4LDB4MjcsMHg2RiwweDU0LDB4QjAsMHg0Ql1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMF0sWzB4QjEsMHg2MCwweEU0LDB4NjgsMHgwRiwweDZDLDB4NjksMHg2Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMF0sWzB4RkEsMHgwNywweDUyLDB4QjAsMHg3RCwweDlDLDB4NEEsMHhCOF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMF0sWzB4Q0EsMHgzQSwweDJCLDB4MDMsMHg2RCwweEJDLDB4ODUsMHgwMl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMF0sWzB4NUUsMHgwOSwweDA1LDB4NTEsMHg3QiwweEI1LDB4OUIsMHhDRl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMF0sWzB4ODEsMHg0RSwweEVCLDB4M0IsMHg5MSwweEQ5LDB4MDcsMHgyNl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMF0sWzB4NEQsMHg0OSwweERCLDB4MTUsMHgzMiwweDkxLDB4OUMsMHg5Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMF0sWzB4MjUsMHhFQiwweDVGLDB4QzMsMHhGOCwweENGLDB4MDYsMHgyMV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgwMF0sWzB4QUIsMHg2QSwweDIwLDB4QzAsMHg2MiwweDBELDB4MUMsMHg2Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMF0sWzB4NzksMHhFOSwweDBELDB4QkMsMHg5OCwweEY5LDB4MkMsMHhDQV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMF0sWzB4ODYsMHg2RSwweENFLDB4REQsMHg4MCwweDcyLDB4QkIsMHgwRV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMF0sWzB4OEIsMHg1NCwweDUzLDB4NkYsMHgyRiwweDNFLDB4NjQsMHhBOF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMF0sWzB4RUEsMHg1MSwweEQzLDB4OTcsMHg1NSwweDk1LDB4QjgsMHg2Ql1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMF0sWzB4Q0EsMHhGRiwweEM2LDB4QUMsMHg0NSwweDQyLDB4REUsMHgzMV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMF0sWzB4OEQsMHhENCwweDVBLDB4MkQsMHhERiwweDkwLDB4NzksMHg2Q11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMF0sWzB4MTAsMHgyOSwweEQ1LDB4NUUsMHg4OCwweDBFLDB4QzIsMHhEMF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMF0sWzB4NUQsMHg4NiwweENCLDB4MjMsMHg2MywweDlELDB4QkUsMHhBOV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMF0sWzB4MUQsMHgxQywweEE4LDB4NTMsMHhBRSwweDdDLDB4MEMsMHg1Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMF0sWzB4Q0UsMHgzMywweDIzLDB4MjksMHgyNCwweDhGLDB4MzIsMHgyOF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMF0sWzB4ODQsMHgwNSwweEQxLDB4QUIsMHhFMiwweDRGLDB4QjksMHg0Ml1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMF0sWzB4RTYsMHg0MywweEQ3LDB4ODAsMHg5MCwweENBLDB4NDIsMHgwN11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMF0sWzB4NDgsMHgyMiwweDFCLDB4OTksMHgzNywweDc0LDB4OEEsMHgyM11dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMF0sWzB4REQsMHg3QywweDBCLDB4QkQsMHg2MSwweEZBLDB4RkQsMHg1NF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MF0sWzB4MkYsMHhCQywweDI5LDB4MUEsMHg1NywweDBELDB4QjUsMHhDNF1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MF0sWzB4RTAsMHg3QywweDMwLDB4RDcsMHhFNCwweEUyLDB4NkUsMHgxMl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyMF0sWzB4MDksMHg1MywweEUyLDB4MjUsMHg4RSwweDhFLDB4OTAsMHhBMV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMF0sWzB4NUIsMHg3MSwweDFCLDB4QzQsMHhDRSwweEVCLDB4RjIsMHhFRV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOF0sWzB4Q0MsMHgwOCwweDNGLDB4MUUsMHg2RCwweDlFLDB4ODUsMHhGNl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNF0sWzB4RDIsMHhGRCwweDg4LDB4NjcsMHhENSwweDBELDB4MkQsMHhGRV1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMl0sWzB4MDYsMHhFNywweEVBLDB4MjIsMHhDRSwweDkyLDB4NzAsMHg4Rl1dLFxyXG4gICAgICAgICAgICAgICAgICAgICBbWzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMV0sWzB4MTYsMHg2QiwweDQwLDB4QjQsMHg0QSwweEJBLDB4NEIsMHhENl1dXTtcclxuXG4gIHZhciByZXMgPSB0cnVlO1xuICB2YXIgaiA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHZlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzID0gbmV3IG9wZW5wZ3AuY2lwaGVyLmRlcyhrZXkpO1xuXG4gICAgdmFyIGVuY3IgPSB1dGlsLmJpbjJzdHIoZGVzLmVuY3J5cHQodGVzdHZlY3RvcnNbaV1bMF0sIGtleSkpO1xuICAgIHZhciByZXMyID0gZW5jciA9PSB1dGlsLmJpbjJzdHIodGVzdHZlY3RvcnNbaV1bMV0pO1xuXG4gICAgcmVzICY9IHJlczI7XG5cbiAgICBpZiAoIXJlczIpIHtcbiAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCJUZXN0aW5nIHZlY3RvciB3aXRoIGJsb2NrIFwiICtcbiAgICAgICAgdXRpbC5oZXhpZHVtcCh0ZXN0dmVjdG9yc1tpXVswXSkgK1xuICAgICAgICBcIiBhbmQga2V5IFwiICsgdXRpbC5oZXhzdHJkdW1wKGtleSkgK1xuICAgICAgICBcIiBzaG91bGQgYmUgXCIgKyB1dGlsLmhleGlkdW1wKHRlc3R2ZWN0b3JzW2ldWzFdKSArIFwiICE9IFwiICtcbiAgICAgICAgdXRpbC5oZXhpZHVtcChlbmNyKSxcbiAgICAgIGZhbHNlKTtcbiAgICBqKys7XG4gICAgfVxuICB9XG4gIGlmIChyZXMpIHtcbiAgICByZXN1bHRbal0gPSBuZXcgdW5pdC5yZXN1bHQoXCJBbGwgM0RFUyBFREUgdGVzdCB2ZWN0b3JzIGNvbXBsZXRlZFwiLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cblxudW5pdC5yZWdpc3RlcihcIkRFUyBlbmNyeXB0L2RlY3J5cHQgcGFkZGluZyB0ZXN0c1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuICAgICAgdXRpbCA9IG9wZW5wZ3AudXRpbDtcblxuICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgIHZhciBrZXkgPSB1dGlsLmJpbjJzdHIoWzB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUZdKTtcclxuICAgIHZhciB0ZXN0dmVjdG9ycyA9IG5ldyBBcnJheSgpO1xyXG4gICAgdGVzdHZlY3RvcnNbMF0gPSBbW1sweDAxXSwgWzB4MjQsIDB4QzcsIDB4NEEsIDB4OUEsIDB4NzksIDB4NzUsIDB4NEIsIDB4QzddXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDIsIDB4MDNdLCBbMHhBNywgMHg3QSwgMHg5QSwgMHg1OSwgMHg4QSwgMHg4NiwgMHg4NSwgMHhDNV1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwMywgMHgwNCwgMHgwNV0sIFsweDAxLCAweENGLCAweEVCLCAweDZBLCAweDc0LCAweDYwLCAweEY1LCAweDAyXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA0LCAweDA1LCAweDA2LCAweDA3XSwgWzB4QTgsIDB4RjAsIDB4M0QsIDB4NTksIDB4QkEsIDB4NkIsIDB4MEUsIDB4NzZdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDldLCBbMHg4NiwgMHg0MCwgMHgzMywgMHg2MSwgMHgzRiwgMHg1NSwgMHg3MywgMHg0OV1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQl0sIFsweDEzLCAweDIxLCAweDNFLCAweDBFLCAweENFLCAweDJDLCAweDk0LCAweDAxXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBEXSwgWzB4MzAsIDB4NDksIDB4OTcsIDB4QzEsIDB4REEsIDB4RDUsIDB4NTksIDB4QTVdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEZdLCBbMHg4MywgMHgyNSwgMHg3OSwgMHgwNiwgMHg1NCwgMHhBNCwgMHg0NCwgMHhEOV1dXTtcclxuICAgIHRlc3R2ZWN0b3JzWzFdID0gW1tbMHgwMV0sIFsweEYyLCAweEFCLCAweDFDLCAweDlFLCAweDcwLCAweDdELCAweENDLCAweDkyXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDAyLCAweDAzXSwgWzB4NkIsIDB4NEMsIDB4NjcsIDB4MjQsIDB4OUYsIDB4QjcsIDB4NEQsIDB4QUNdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDMsIDB4MDQsIDB4MDVdLCBbMHg2OCwgMHg5NSwgMHhBQiwgMHhBOCwgMHhFQSwgMHg1MywgMHgxMywgMHgyM11dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNCwgMHgwNSwgMHgwNiwgMHgwN10sIFsweEM4LCAweERFLCAweDYwLCAweDhGLCAweEY2LCAweDA5LCAweDkwLCAweEI1XV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5XSwgWzB4MTksIDB4MTMsIDB4NTAsIDB4MjAsIDB4NzAsIDB4NDAsIDB4MkUsIDB4MDldXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEJdLCBbMHhBOCwgMHgyMywgMHg0MCwgMHhDNiwgMHgxNywgMHhBNiwgMHgzMSwgMHg0QV1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRF0sIFsweDM2LCAweDYyLCAweEYyLCAweDk5LCAweDY4LCAweEQ0LCAweEJGLCAweDdDXV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGXSwgWzB4ODMsIDB4MjUsIDB4NzksIDB4MDYsIDB4NTQsIDB4QTQsIDB4NDQsIDB4RDksIDB4MDgsIDB4NkYsIDB4OUEsIDB4MUQsIDB4NzQsIDB4QzksIDB4NEQsIDB4NEVdXV07XHJcbiAgICB0ZXN0dmVjdG9yc1syXSA9IFtbWzB4MDFdLCBbMHg4MywgMHg2OCwgMHhFNCwgMHg5QywgMHg4NCwgMHhDQywgMHhDQiwgMHhGMF1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwMiwgMHgwM10sIFsweEJCLCAweEE4LCAweDBCLCAweDY2LCAweDFCLCAweDYyLCAweEM0LCAweEM4XV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDAzLCAweDA0LCAweDA1XSwgWzB4OUEsIDB4RDcsIDB4NUEsIDB4MjQsIDB4RkQsIDB4M0YsIDB4QkYsIDB4MjJdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDQsIDB4MDUsIDB4MDYsIDB4MDddLCBbMHgxNCwgMHg0RSwgMHg2OCwgMHg2RCwgMHgyRSwgMHhDMSwgMHhCNywgMHg1Ml1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOV0sIFsweDEyLCAweDBBLCAweDUxLCAweDA4LCAweEY5LCAweEEzLCAweDAzLCAweDc0XV0sXHJcblx0ICAgICAgICAgICAgICAgICAgW1sweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCXSwgWzB4QjIsIDB4MDcsIDB4RDEsIDB4MDUsIDB4RjYsIDB4NjcsIDB4QUYsIDB4QkFdXSxcclxuXHQgICAgICAgICAgICAgICAgICBbWzB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MERdLCBbMHhDQSwgMHg1OSwgMHg2MSwgMHgzQSwgMHg4MywgMHgyMywgMHgyNiwgMHhERF1dLFxyXG5cdCAgICAgICAgICAgICAgICAgIFtbMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRl0sIFsweDgzLCAweDI1LCAweDc5LCAweDA2LCAweDU0LCAweEE0LCAweDQ0LCAweEQ5XV1dO1xyXG5cclxuICAgIHZhciBkZXMgPSBuZXcgb3BlbnBncC5jaXBoZXIub3JpZ2luYWxEZXMoa2V5KTtcclxuXHJcbiAgICB2YXIgcmVzID0gdHJ1ZTtcclxuICAgIHZhciBqID0gMDtcclxuXHJcbiAgICBmb3IgKHZhciBwYWRkaW5nID0gMDsgcGFkZGluZyA8IDM7IHBhZGRpbmcrKykge1xyXG4gICAgICAgIHZhciB0aGlzVmVjdG9yU2V0ID0gdGVzdHZlY3RvcnNbcGFkZGluZ107XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpc1ZlY3RvclNldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jcnlwdGVkID0gZGVzLmVuY3J5cHQodGhpc1ZlY3RvclNldFtpXVswXSwgcGFkZGluZyk7XHJcbiAgICAgICAgICAgIHZhciBkZWNyeXB0ZWQgPSBkZXMuZGVjcnlwdChlbmNyeXB0ZWQsIHBhZGRpbmcpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlczIgPSAodXRpbC5iaW4yc3RyKGVuY3J5cHRlZCkgPT0gdXRpbC5iaW4yc3RyKHRoaXNWZWN0b3JTZXRbaV1bMV0pKTtcclxuICAgICAgICAgICAgdmFyIHJlczMgPSAodXRpbC5iaW4yc3RyKGRlY3J5cHRlZCkgPT0gdXRpbC5iaW4yc3RyKHRoaXNWZWN0b3JTZXRbaV1bMF0pKTtcclxuICAgICAgICAgICAgcmVzICY9IHJlczI7XHJcbiAgICAgICAgICAgIHJlcyAmPSByZXMzO1xyXG4gICAgICAgICAgICBpZiAoIXJlczIgfHwgIXJlczMpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcclxuICAgICAgICAgICAgICAgICAgICBcIlRlc3RpbmcgdmVjdG9yIHdpdGggYmxvY2sgW1wiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5oZXhpZHVtcCh0aGlzVmVjdG9yU2V0W2ldWzBdKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXSBhbmQga2V5IFtcIiArIHV0aWwuaGV4c3RyZHVtcChrZXkpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJdIGFuZCBwYWRkaW5nIFtcIiArIHBhZGRpbmcgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIl0gc2hvdWxkIGJlIFwiICsgdXRpbC5oZXhpZHVtcCh0aGlzVmVjdG9yU2V0W2ldWzFdKSArIFwiIC0gQWN0dWFsbHkgW0VOQzpcIiArIHV0aWwuaGV4aWR1bXAoZW5jcnlwdGVkKSArIFwiLCBERUM6XCIgKyB1dGlsLmhleGlkdW1wKGRlY3J5cHRlZCkgKyBcIl1cIixcclxuICAgICAgICAgICAgICAgICAgICBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBqKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgcmVzdWx0W2pdID0gbmV3IHVuaXQucmVzdWx0KFwiQWxsIERFUyB0ZXN0IHZlY3RvcnMgY29tcGxldGVkXCIsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufSk7XHJcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiVHdvZmlzaCB0ZXN0IHdpdGggdGVzdCB2ZWN0b3JzIGZyb20gaHR0cDovL3d3dy5zY2huZWllci5jb20vY29kZS9lY2JfaXZhbC50eHRcIiwgZnVuY3Rpb24oKSB7XG4gIHZhciBvcGVucGdwID0gcmVxdWlyZSgnLi4vLi4vLi4vJyksXG4gICAgdXRpbCA9IG9wZW5wZ3AudXRpbDtcblxuICBmdW5jdGlvbiBURmVuY3J5cHQoYmxvY2ssIGtleSkge1xuICAgIHZhciB0ZiA9IG5ldyBvcGVucGdwLmNpcGhlci50d29maXNoKGtleSk7XG5cbiAgICByZXR1cm4gdGYuZW5jcnlwdChibG9jayk7XG4gIH1cblxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN0YXJ0ID0gWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF07XG4gIHZhciBzdGFydF9zaG9ydCA9IFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXTtcbiAgdmFyIHRlc3R2ZWN0b3JzID0gW1sweDU3LDB4RkYsMHg3MywweDlELDB4NEQsMHhDOSwweDJDLDB4MUIsMHhENywweEZDLDB4MDEsMHg3MCwweDBDLDB4QzgsMHgyMSwweDZGXSxcbiAgICAgICAgICAgIFsweEQ0LDB4M0IsMHhCNywweDU1LDB4NkUsMHhBMywweDJFLDB4NDYsMHhGMiwweEEyLDB4ODIsMHhCNywweEQ0LDB4NUIsMHg0RSwweDBEXSxcbiAgICAgICAgICAgIFsweDkwLDB4QUYsMHhFOSwweDFCLDB4QjIsMHg4OCwweDU0LDB4NEYsMHgyQywweDMyLDB4REMsMHgyMywweDlCLDB4MjYsMHgzNSwweEU2XSxcbiAgICAgICAgICAgIFsweDZDLDB4QjQsMHg1NiwweDFDLDB4NDAsMHhCRiwweDBBLDB4OTcsMHgwNSwweDkzLDB4MUMsMHhCNiwweEQ0LDB4MDgsMHhFNywweEZBXSxcbiAgICAgICAgICAgIFsweDMwLDB4NTksMHhENiwweEQ2LDB4MTcsMHg1MywweEI5LDB4NTgsMHhEOSwweDJGLDB4NDcsMHg4MSwweEM4LDB4NjQsMHgwRSwweDU4XSxcbiAgICAgICAgICAgIFsweEU2LDB4OTQsMHg2NSwweDc3LDB4MDUsMHgwNSwweEQ3LDB4RjgsMHgwRSwweEY2LDB4OEMsMHhBMywweDhBLDB4QjMsMHhBMywweEQ2XSxcbiAgICAgICAgICAgIFsweDVBLDB4QjYsMHg3QSwweDVGLDB4ODUsMHgzOSwweEE0LDB4QTUsMHhGRCwweDlGLDB4MDMsMHg3MywweEJBLDB4NDYsMHgzNCwweDY2XSxcbiAgICAgICAgICAgIFsweERDLDB4MDksMHg2QiwweENELDB4OTksMHhGQywweDcyLDB4RjcsMHg5OSwweDM2LDB4RDQsMHhDNywweDQ4LDB4RTcsMHg1QSwweEY3XSxcbiAgICAgICAgICAgIFsweEM1LDB4QTMsMHhFNywweENFLDB4RTAsMHhGMSwweEI3LDB4MjYsMHgwNSwweDI4LDB4QTYsMHg4RiwweEI0LDB4RUEsMHgwNSwweEYyXSxcbiAgICAgICAgICAgIFsweDQzLDB4RDUsMHhDRSwweEMzLDB4MjcsMHhCMiwweDRBLDB4QjksMHgwQSwweEQzLDB4NEEsMHg3OSwweEQwLDB4NDYsMHg5MSwweDUxXV07XG4gIHRlc3R2ZWN0b3JzWzQ3XSA9ICBbMHg0MywweDEwLDB4NTgsMHhGNCwweERCLDB4QzcsMHhGNywweDM0LDB4REEsMHg0RiwweDAyLDB4RjAsMHg0QywweEM0LDB4RjQsMHg1OV07XG4gIHRlc3R2ZWN0b3JzWzQ4XSA9ICBbMHgzNywweEZFLDB4MjYsMHhGRiwweDFDLDB4RjYsMHg2MSwweDc1LDB4RjUsMHhERCwweEY0LDB4QzMsMHgzQiwweDk3LDB4QTIsMHgwNV07XG4gIHZhciByZXMgPSB0cnVlO1xuICB2YXIgaiA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDk7IGkrKykge1xuICAgIHZhciByZXMyID0gZmFsc2U7XG4gICAgdmFyIGJsaywga2V5LCBjdDtcbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgYmxrID0gc3RhcnRfc2hvcnQ7XG4gICAgICBrZXkgPSB1dGlsLmJpbjJzdHIoc3RhcnQpO1xuICAgICAgY3QgPSB0ZXN0dmVjdG9yc1swXTtcbiAgICAgIHJlczIgPSAodXRpbC5iaW4yc3RyKFRGZW5jcnlwdChibGssa2V5KSkgPT0gdXRpbC5iaW4yc3RyKGN0KSk7XG4gICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICBibGsgPSB0ZXN0dmVjdG9yc1swXTtcbiAgICAgIGtleSA9IHV0aWwuYmluMnN0cihzdGFydCk7XG4gICAgICBjdCA9IHRlc3R2ZWN0b3JzWzFdO1xuICAgICAgcmVzMiA9ICh1dGlsLmJpbjJzdHIoVEZlbmNyeXB0KGJsayxrZXkpKSA9PSB1dGlsLmJpbjJzdHIoY3QpKTtcbiAgICB9IGVsc2UgaWYgKGkgPT09IDIpIHtcbiAgICAgIGJsayA9IHRlc3R2ZWN0b3JzW2ktMV07XG4gICAgICBrZXkgPSB1dGlsLmJpbjJzdHIodGVzdHZlY3RvcnNbaS0yXS5jb25jYXQoc3RhcnRfc2hvcnQpKTtcbiAgICAgIGN0ID0gdGVzdHZlY3RvcnNbaV07XG4gICAgICByZXMyID0gKHV0aWwuYmluMnN0cihURmVuY3J5cHQoYmxrLGtleSkpID09IHV0aWwuYmluMnN0cihjdCkpO1xuICAgIH0gZWxzZSBpZiAoaSA8IDEwIHx8IGkgPiA0Nikge1xuICAgICAgYmxrID0gdGVzdHZlY3RvcnNbaS0xXTtcbiAgICAgIGtleSA9IHV0aWwuYmluMnN0cih0ZXN0dmVjdG9yc1tpLTJdLmNvbmNhdCh0ZXN0dmVjdG9yc1tpLTNdKSk7XG4gICAgICBjdCA9IHRlc3R2ZWN0b3JzW2ldO1xuICAgICAgcmVzMiA9ICh1dGlsLmJpbjJzdHIoVEZlbmNyeXB0KGJsayxrZXkpKSA9PSB1dGlsLmJpbjJzdHIoY3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVzdHZlY3RvcnNbaV0gPSBURmVuY3J5cHQodGVzdHZlY3RvcnNbaS0xXSx1dGlsLmJpbjJzdHIodGVzdHZlY3RvcnNbaS0yXS5jb25jYXQodGVzdHZlY3RvcnNbaS0zXSkpKTtcbiAgICAgIHJlczIgPSB0cnVlO1xuICAgIH1cbiAgICByZXMgJj0gcmVzMjtcbiAgICBpZiAoIXJlczIpIHtcbiAgICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgdmVjdG9yIHdpdGggYmxvY2sgXCIrdXRpbC5oZXhpZHVtcChibGspK1wiIHdpdGgga2V5IFwiKyB1dGlsLmhleHN0cmR1bXAoa2V5KSArXCIgc2hvdWxkIGJlIFwiK3V0aWwuaGV4aWR1bXAoY3QpK1wiIGJ1dCBpcyBcIit1dGlsLmhleGlkdW1wKFRGZW5jcnlwdChibGssa2V5KSksIGZhbHNlKTtcbiAgICAgIGorKztcbiAgICB9XG4gIH1cbiAgaWYgKHJlcykge1xuICAgIHJlc3VsdFtqXSA9IG5ldyB1bml0LnJlc3VsdChcIjQ5IHRlc3QgdmVjdG9ycyBjb21wbGV0ZWRcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIHVuaXQgPSByZXF1aXJlKCcuLi8uLi91bml0LmpzJyk7XG5cbnVuaXQucmVnaXN0ZXIoXCJNRDUgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIFJGQyAxMzIxXCIsIGZ1bmN0aW9uKCkge1xuXHR2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuXHRcdHV0aWwgPSBvcGVucGdwLnV0aWwsXG5cdFx0TUQ1ID0gb3BlbnBncC5oYXNoLm1kNTtcblxuXHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG5cdHJlc3VsdFswXSA9IG5ldyB1bml0LnJlc3VsdChcIk1ENSAoXFxcIlxcXCIpID0gZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2VcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChNRDUoXCJcIikpID09IFwiZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2VcIik7XG5cdHJlc3VsdFsxXSA9IG5ldyB1bml0LnJlc3VsdChcIk1ENSAoXFxcImFcXFwiKSA9IDBjYzE3NWI5YzBmMWI2YTgzMWMzOTllMjY5NzcyNjYxXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoTUQ1IChcImFiY1wiKSkgPT0gXCI5MDAxNTA5ODNjZDI0ZmIwZDY5NjNmN2QyOGUxN2Y3MlwiKTtcblx0cmVzdWx0WzJdID0gbmV3IHVuaXQucmVzdWx0KFwiTUQ1IChcXFwibWVzc2FnZSBkaWdlc3RcXFwiKSA9IGY5NmI2OTdkN2NiNzkzOGQ1MjVhMmYzMWFhZjE2MWQwXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoTUQ1IChcIm1lc3NhZ2UgZGlnZXN0XCIpKSA9PSBcImY5NmI2OTdkN2NiNzkzOGQ1MjVhMmYzMWFhZjE2MWQwXCIpO1xuXHRyZXN1bHRbM10gPSBuZXcgdW5pdC5yZXN1bHQoXCJNRDUgKFxcXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxcXCIpID0gYzNmY2QzZDc2MTkyZTQwMDdkZmI0OTZjY2E2N2UxM2JcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChNRDUgKFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIikpID09IFwiYzNmY2QzZDc2MTkyZTQwMDdkZmI0OTZjY2E2N2UxM2JcIik7XG5cdHJlc3VsdFs0XSA9IG5ldyB1bml0LnJlc3VsdChcIk1ENSAoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XFxcIikgPSBkMTc0YWI5OGQyNzdkOWY1YTU2MTFjMmM5ZjQxOWQ5ZlwiLFxuXHRcdFx0dXRpbC5oZXhzdHJkdW1wKE1ENSAoXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiKSkgPT0gXCJkMTc0YWI5OGQyNzdkOWY1YTU2MTFjMmM5ZjQxOWQ5ZlwiKTtcblx0cmVzdWx0WzVdID0gbmV3IHVuaXQucmVzdWx0KFwiTUQ1IChcXFwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBcXFwiKSA9IDU3ZWRmNGEyMmJlM2M5NTVhYzQ5ZGEyZTIxMDdiNjdhXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoTUQ1IChcIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIpKSA9PSBcIjU3ZWRmNGEyMmJlM2M5NTVhYzQ5ZGEyZTIxMDdiNjdhXCIpO1xuXHRyZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgdW5pdCA9IHJlcXVpcmUoJy4uLy4uL3VuaXQuanMnKTtcblxudW5pdC5yZWdpc3RlcihcIlJJUEUtTUQgMTYwIGJpdHMgdGVzdCB3aXRoIHRlc3QgdmVjdG9ycyBmcm9tIGh0dHA6Ly9ob21lcy5lc2F0Lmt1bGV1dmVuLmJlL35ib3NzZWxhZS9yaXBlbWQxNjAuaHRtbFwiLCBmdW5jdGlvbigpIHtcblxuXHR2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuXHRcdHV0aWwgPSBvcGVucGdwLnV0aWwsXG5cdFx0Uk1Ec3RyaW5nID0gb3BlbnBncC5oYXNoLnJpcGVtZDtcblxuXHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG5cdHJlc3VsdFswXSA9IG5ldyB1bml0LnJlc3VsdChcIlJNRHN0cmluZyAoXFxcIlxcXCIpID0gOWMxMTg1YTVjNWU5ZmM1NDYxMjgwODk3N2VlOGY1NDhiMjI1OGQzMVwiLFxuXHRcdFx0dXRpbC5oZXhzdHJkdW1wKFJNRHN0cmluZyhcIlwiKSkgPT0gXCI5YzExODVhNWM1ZTlmYzU0NjEyODA4OTc3ZWU4ZjU0OGIyMjU4ZDMxXCIpO1xuXHRyZXN1bHRbMV0gPSBuZXcgdW5pdC5yZXN1bHQoXCJSTURzdHJpbmcgKFxcXCJhXFxcIikgPSAwYmRjOWQyZDI1NmIzZWU5ZGFhZTM0N2JlNmY0ZGM4MzVhNDY3ZmZlXCIsXG5cdFx0XHR1dGlsLmhleHN0cmR1bXAoUk1Ec3RyaW5nKFwiYVwiKSkgPT0gXCIwYmRjOWQyZDI1NmIzZWU5ZGFhZTM0N2JlNmY0ZGM4MzVhNDY3ZmZlXCIpO1xuXHRyZXN1bHRbMl0gPSBuZXcgdW5pdC5yZXN1bHQoXCJSTURzdHJpbmcgKFxcXCJhYmNcXFwiKSA9IDhlYjIwOGY3ZTA1ZDk4N2E5YjA0NGE4ZTk4YzZiMDg3ZjE1YTBiZmNcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChSTURzdHJpbmcoXCJhYmNcIikpID09IFwiOGViMjA4ZjdlMDVkOTg3YTliMDQ0YThlOThjNmIwODdmMTVhMGJmY1wiKTtcblx0cmVzdWx0WzNdID0gbmV3IHVuaXQucmVzdWx0KFwiUk1Ec3RyaW5nIChcXFwibWVzc2FnZSBkaWdlc3RcXFwiKSA9IDVkMDY4OWVmNDlkMmZhZTU3MmI4ODFiMTIzYTg1ZmZhMjE1OTVmMzZcIixcblx0XHRcdHV0aWwuaGV4c3RyZHVtcChSTURzdHJpbmcoXCJtZXNzYWdlIGRpZ2VzdFwiKSkgPT0gXCI1ZDA2ODllZjQ5ZDJmYWU1NzJiODgxYjEyM2E4NWZmYTIxNTk1ZjM2XCIpO1xuXHRyZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgdW5pdCA9IHJlcXVpcmUoJy4uLy4uL3VuaXQuanMnKTtcblxuXG51bml0LnJlZ2lzdGVyKFwiU0hBKiB0ZXN0IHdpdGggdGVzdCB2ZWN0b3JzIGZyb20gTklTVCBGSVBTIDE4MC0yXCIsIGZ1bmN0aW9uKCkge1xuXHR2YXIgb3BlbnBncCA9IHJlcXVpcmUoJy4uLy4uLy4uLycpLFxuXHRcdHV0aWwgPSBvcGVucGdwLnV0aWwsXG5cdFx0aGFzaCA9IG9wZW5wZ3AuaGFzaDtcblxuXHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG5cdFxuXHRyZXN1bHRbMF0gPSBuZXcgdW5pdC5yZXN1bHQoXCJTSEExIC0gYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCA9IGhhc2guc2hhMShcXFwiYWJjXFxcIikgXCIsXG5cdFx0XHRcImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWRcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGExKFwiYWJjXCIpKSk7XG5cdHJlc3VsdFsxXSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTEgLSA4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxID0gaGFzaC5zaGExKFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCI4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxXCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhMShcImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxXCIpKSk7XG5cdHJlc3VsdFsyXSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTIyNCAtIDIzMDk3ZDIyMzQwNWQ4MjI4NjQyYTQ3N2JkYTI1NWIzMmFhZGJjZTRiZGEwYjNmN2UzNmM5ZGE3ID0gaGFzaC5zaGEyMjQoXFxcImFiY1xcXCIpIFwiLFxuXHRcdFx0XCIyMzA5N2QyMjM0MDVkODIyODY0MmE0NzdiZGEyNTViMzJhYWRiY2U0YmRhMGIzZjdlMzZjOWRhN1wiID09IHV0aWwuaGV4c3RyZHVtcChoYXNoLnNoYTIyNChcImFiY1wiKSkpO1xuXHRyZXN1bHRbM10gPSBuZXcgdW5pdC5yZXN1bHQoXCJTSEEyMjQgLSA3NTM4OGIxNjUxMjc3NmNjNWRiYTVkYTFmZDg5MDE1MGIwYzY0NTVjYjRmNThiMTk1MjUyMjUyNSA9IGhhc2guc2hhMjI0KFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCI3NTM4OGIxNjUxMjc3NmNjNWRiYTVkYTFmZDg5MDE1MGIwYzY0NTVjYjRmNThiMTk1MjUyMjUyNVwiID09IHV0aWwuaGV4c3RyZHVtcChoYXNoLnNoYTIyNChcImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxXCIpKSk7XG5cdHJlc3VsdFs0XSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTI1NiAtIGJhNzgxNmJmOGYwMWNmZWE0MTQxNDBkZTVkYWUyMjIzYjAwMzYxYTM5NjE3N2E5Y2I0MTBmZjYxZjIwMDE1YWQgPSBoYXNoLnNoYTI1NihcXFwiYWJjXFxcIikgXCIsXG5cdFx0XHRcImJhNzgxNmJmOGYwMWNmZWE0MTQxNDBkZTVkYWUyMjIzYjAwMzYxYTM5NjE3N2E5Y2I0MTBmZjYxZjIwMDE1YWRcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGEyNTYoXCJhYmNcIikpKTtcblx0cmVzdWx0WzVdID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBMjU2IC0gMjQ4ZDZhNjFkMjA2MzhiOGU1YzAyNjkzMGMzZTYwMzlhMzNjZTQ1OTY0ZmYyMTY3ZjZlY2VkZDQxOWRiMDZjMSA9IGhhc2guc2hhMjU2KFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCIyNDhkNmE2MWQyMDYzOGI4ZTVjMDI2OTMwYzNlNjAzOWEzM2NlNDU5NjRmZjIxNjdmNmVjZWRkNDE5ZGIwNmMxXCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhMjU2KFwiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHFcIikpKTtcblx0cmVzdWx0WzZdID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBMzg0IC0gY2IwMDc1M2Y0NWEzNWU4YmI1YTAzZDY5OWFjNjUwMDcyNzJjMzJhYjBlZGVkMTYzMWE4YjYwNWE0M2ZmNWJlZDgwODYwNzJiYTFlN2NjMjM1OGJhZWNhMTM0YzgyNWE3ID0gaGFzaC5zaGEzODQoXFxcImFiY1xcXCIpIFwiLFxuXHRcdFx0XCJjYjAwNzUzZjQ1YTM1ZThiYjVhMDNkNjk5YWM2NTAwNzI3MmMzMmFiMGVkZWQxNjMxYThiNjA1YTQzZmY1YmVkODA4NjA3MmJhMWU3Y2MyMzU4YmFlY2ExMzRjODI1YTdcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGEzODQoXCJhYmNcIikpKTtcblx0cmVzdWx0WzddID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBMzg0IC0gMzM5MWZkZGRmYzhkYzczOTM3MDdhNjViMWI0NzA5Mzk3Y2Y4YjFkMTYyYWYwNWFiZmU4ZjQ1MGRlNWYzNmJjNmIwNDU1YTg1MjBiYzRlNmY1ZmU5NWIxZmUzYzg0NTJiID0gc3RyMzg0KFxcXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVxcXCIpIFwiLFxuXHRcdFx0XCIzMzkxZmRkZGZjOGRjNzM5MzcwN2E2NWIxYjQ3MDkzOTdjZjhiMWQxNjJhZjA1YWJmZThmNDUwZGU1ZjM2YmM2YjA0NTVhODUyMGJjNGU2ZjVmZTk1YjFmZTNjODQ1MmJcIiA9PSB1dGlsLmhleHN0cmR1bXAoaGFzaC5zaGEzODQoXCJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcVwiKSkpO1x0XHRcdFx0XHRcblx0cmVzdWx0WzhdID0gbmV3IHVuaXQucmVzdWx0KFwiU0hBNTEyIC0gZGRhZjM1YTE5MzYxN2FiYWNjNDE3MzQ5YWUyMDQxMzExMmU2ZmE0ZTg5YTk3ZWEyMGE5ZWVlZTY0YjU1ZDM5YTIxOTI5OTJhMjc0ZmMxYTgzNmJhM2MyM2EzZmVlYmJkNDU0ZDQ0MjM2NDNjZTgwZTJhOWFjOTRmYTU0Y2E0OWYgPSBoYXNoLnNoYTUxMihcXFwiYWJjXFxcIikgXCIsXG5cdFx0XHRcImRkYWYzNWExOTM2MTdhYmFjYzQxNzM0OWFlMjA0MTMxMTJlNmZhNGU4OWE5N2VhMjBhOWVlZWU2NGI1NWQzOWEyMTkyOTkyYTI3NGZjMWE4MzZiYTNjMjNhM2ZlZWJiZDQ1NGQ0NDIzNjQzY2U4MGUyYTlhYzk0ZmE1NGNhNDlmXCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhNTEyKFwiYWJjXCIpKSk7XG5cdHJlc3VsdFs5XSA9IG5ldyB1bml0LnJlc3VsdChcIlNIQTUxMiAtIDIwNGE4ZmM2ZGRhODJmMGEwY2VkN2JlYjhlMDhhNDE2NTdjMTZlZjQ2OGIyMjhhODI3OWJlMzMxYTcwM2MzMzU5NmZkMTVjMTNiMWIwN2Y5YWExZDNiZWE1Nzc4OWNhMDMxYWQ4NWM3YTcxZGQ3MDM1NGVjNjMxMjM4Y2EzNDQ1ID0gaGFzaC5zaGE1MTIoXFxcImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxXFxcIikgXCIsXG5cdFx0XHRcIjIwNGE4ZmM2ZGRhODJmMGEwY2VkN2JlYjhlMDhhNDE2NTdjMTZlZjQ2OGIyMjhhODI3OWJlMzMxYTcwM2MzMzU5NmZkMTVjMTNiMWIwN2Y5YWExZDNiZWE1Nzc4OWNhMDMxYWQ4NWM3YTcxZGQ3MDM1NGVjNjMxMjM4Y2EzNDQ1XCIgPT0gdXRpbC5oZXhzdHJkdW1wKGhhc2guc2hhNTEyKFwiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHFcIikpKTtcdFx0XHRcdFx0XG5cdHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciB1bml0ID0gcmVxdWlyZSgnLi4vdW5pdC5qcycpO1xuXG51bml0LnJlZ2lzdGVyKFwiRnVuY3Rpb25hbCB0ZXN0aW5nIG9mIG9wZW5wZ3AuY3J5cHRvLiogbWV0aG9kc1wiLCBmdW5jdGlvbigpIHtcblx0dmFyIG9wZW5wZ3AgPSByZXF1aXJlKCcuLi8uLi8nKTtcbiAgdmFyIHV0aWwgPSBvcGVucGdwLnV0aWw7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIFJTQXB1Yk1QSXN0cnMgPSBbXG4gICAgICAgICAgICAgIHV0aWwuYmluMnN0cihbMHgwOCwweDAwLDB4YWMsMHgxNSwweGIzLDB4ZDYsMHhkMiwweDBmLDB4ZjAsMHg3YSwweGRkLDB4MjEsMHhiNyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJmLDB4NjEsMHhmYSwweGNhLDB4OTMsMHg4NiwweGM4LDB4NTUsMHg1YSwweDRiLDB4YTYsMHhhNCwweDFhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAsMHhhMiwweDNhLDB4MzcsMHgwNiwweDA4LDB4ZDgsMHgxNSwweDhlLDB4ODUsMHg0NSwweGFhLDB4YjcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZCwweDdiLDB4MGIsMHg3MywweDk0LDB4NTUsMHgwYywweDVjLDB4ZWMsMHhjMCwweDIyLDB4NGIsMHhhMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY0LDB4MjAsMHg3ZCwweDRkLDB4YTgsMHg5NiwweDFhLDB4NjQsMHgzOCwweDkzLDB4Y2QsMHhlYywweDczLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NWQsMHhmOSwweDg5LDB4ODgsMHgyNCwweDNkLDB4NDgsMHhmZiwweDNiLDB4ODcsMHg2MiwweGQwLDB4ODQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhlYSwweGZmLDB4MzksMHhiNSwweDI3LDB4NzAsMHhlYSwweDRhLDB4YjIsMHgyZSwweDlkLDB4ZjEsMHg3YyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIzLDB4ZWMsMHhmNCwweDVlLDB4ZWEsMHg2MSwweDNkLDB4ZTUsMHhkOCwweDBkLDB4ZjksMHg1OSwweDZkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgsMHgwMCwweGViLDB4Y2IsMHhjOSwweDU1LDB4MDAsMHg3MiwweDMwLDB4MWYsMHg2NSwweDlkLDB4ZDYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNywweDU4LDB4NWYsMHhhNiwweDRhLDB4YTAsMHhkZCwweGUxLDB4NzYsMHhmMiwweGVmLDB4MjEsMHg5ZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0LDB4ZmMsMHhhYSwweDViLDB4NTIsMHg2ZSwweGMxLDB4YTIsMHhiOSwweGJkLDB4YjksMHhmNCwweDllLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDksMHg5MiwweGYyLDB4YWYsMHg1NywweDg2LDB4ZjIsMHhlZiwweDcwLDB4YmYsMHg1MSwweDQwLDB4ZmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiZiwweDU2LDB4NTEsMHhlOCwweDJjLDB4YTIsMHg0ZiwweGY4LDB4YTQsMHhkNywweDM2LDB4MTgsMHg4NSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNlLDB4MDksMHgwZCwweGJjLDB4OGQsMHg2NSwweDVlLDB4OGEsMHgxZCwweDk4LDB4YjAsMHg0ZCwweDlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzEsMHhjZiwweDgyLDB4ZTEsMHhiNywweDQzLDB4NWQsMHg1YSwweDcyLDB4Y2QsMHg1NSwweGQyLDB4ZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMSwweGI0LDB4NzgsMHhiZiwweGExLDB4N2QsMHhhYywweGQ5LDB4MWIsMHhjNCwweGZhLDB4MzksMHgzNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkyLDB4MDksMHhmOSwweDA4LDB4MmEsMHg2YiwweDlkLDB4MTQsMHg1NiwweDEyLDB4NGMsMHhlOSwweGE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjksMHhjMSwweGYzLDB4YTksMHgwYiwweGZjLDB4MzEsMHg3NSwweDU4LDB4NzQsMHgyYSwweDg4LDB4YWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhlZSwweGM5LDB4YTQsMHhjZCwweDE1LDB4ZGMsMHgxYiwweDhkLDB4NjQsMHhjMSwweDM2LDB4MTcsMHhjNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhkLDB4NWUsMHg5OSwweDdhLDB4NWIsMHg5ZiwweDM5LDB4ZDAsMHgwMCwweDZlLDB4ZjldKSxcbiAgICAgICAgICAgICAgdXRpbC5iaW4yc3RyKFsweDAwLDB4MTEsMHgwMSwweDAwLDB4MDFdKV07XG4gIHZhciBSU0FzZWNNUElzdHJzID0gW1xuICAgICAgICAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDcsMHhmZSwweDIzLDB4ZmYsMHhjZSwweDQ1LDB4NmMsMHg2MCwweDY1LDB4NDAsMHg2ZSwweGFlLDB4MzUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwweDU2LDB4NjAsMHhlZSwweGFiLDB4ZmEsMHgxMCwweDQyLDB4YmEsMHhjNywweDA0LDB4YWYsMHg2MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGNkLDB4M2YsMHg2MiwweGNhLDB4NGIsMHhmYSwweGUxLDB4YTksMHg3MCwweGNkLDB4MzQsMHg4YiwweGM4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGUsMHhlNCwweGM0LDB4YmEsMHg4MywweDE3LDB4NWYsMHhhNCwweGI4LDB4ZWEsMHg2MCwweGMyLDB4NGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YSwweGYyLDB4YTksMHgwMywweGViLDB4ZjYsMHhhYSwweGMyLDB4YjgsMHg4YiwweDQzLDB4MTIsMHhlOSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGY3LDB4ODgsMHhkMiwweDVhLDB4YTYsMHhhYSwweDIzLDB4NzEsMHgzMSwweDc0LDB4ZGIsMHgxOSwweDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUsMHg0MSwweDFiLDB4NDMsMHg2OCwweDYyLDB4ZDgsMHhjMCwweDkzLDB4OTEsMHhlOCwweGZjLDB4YjEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhOSwweDlhLDB4NTIsMHg2YywweGUwLDB4YmYsMHg0MywweDAxLDB4YTgsMHgzNywweDE0LDB4MjgsMHhiZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBiLDB4MTUsMHg1NiwweDNlLDB4YTUsMHg3OSwweGEwLDB4YzQsMHg0MiwweDg4LDB4ZWUsMHhlYiwweDFiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjQsMHg3YSwweDRhLDB4NTgsMHgzMSwweDU4LDB4ODEsMHhkMiwweDNlLDB4ZGUsMHgwNywweDY0LDB4OTIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMCwweDYwLDB4ZDMsMHg5YSwweDI5LDB4Y2EsMHhjNiwweDY3LDB4NzUsMHgwNywweGNhLDB4OTIsMHgzOSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU2LDB4ZjYsMHgxMSwweDg0LDB4YmEsMHg2ZCwweDRiLDB4ZTYsMHg2ZiwweDY2LDB4YzIsMHgxNywweGViLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDYsMHg2OSwweDFjLDB4YmIsMHhkZiwweGMwLDB4MzgsMHgwMCwweGQ2LDB4MDEsMHhlNiwweDcwLDB4OWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YiwweDliLDB4NzAsMHhlZCwweDVjLDB4YjgsMHhjZiwweGU4LDB4NjgsMHg3MSwweGJlLDB4MjQsMHg2ZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIxLDB4YTMsMHgxMywweGNjLDB4ZjEsMHhiYywweDY3LDB4ZGMsMHhlMCwweDY5LDB4MDksMHg4MiwweDNjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2IsMHgwZiwweDE0LDB4OTgsMHg0OCwweDMwLDB4YjIsMHg3MCwweGM2LDB4OWUsMHhmYSwweDQ2LDB4OGYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMSwweGMwLDB4NjUsMHg4ZSwweGM2LDB4YWUsMHhkYywweDQ3LDB4OTEsMHgxMywweDFlLDB4ZDYsMHg0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYyLDB4YWQsMHhkYSwweGMyLDB4YzcsMHgzOSwweDc4LDB4OTksMHhkZSwweDU3LDB4MTQsMHg0NSwweDdmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzIsMHgzOCwweGEzLDB4NDQsMHgwZiwweGU3LDB4MzksMHg0YywweDZmLDB4MGYsMHgzMiwweDdlLDB4ZjEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1YywweDg0LDB4OTcsMHhkZCwweGEwLDB4MGMsMHg4NywweDY2LDB4N2QsMHg3NSwweDc5XSksXG4gICAgICAgICAgICAgIHV0aWwuYmluMnN0cihbMHgwNCwweDAwLDB4YzIsMHhiYywweDcxLDB4ZjcsMHg0MSwweDRhLDB4MDksMHg2NiwweDcwLDB4MDIsMHg2OCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhiLDB4ZWIsMHhlMiwweDM0LDB4ZDEsMHgxMiwweDgzLDB4OTMsMHg3NSwweGU5LDB4NzEsMHgzMiwweGUyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZWQsMHgxOCwweDZmLDB4OGUsMHgzYSwweGZmLDB4MjIsMHg3MCwweDI4LDB4MDEsMHhiZiwweDRhLDB4MzksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSwweGJiLDB4M2MsMHg0YSwweGJjLDB4YjgsMHgxMywweGZjLDB4MTQsMHhmNiwweDcxLDB4YTEsMHg0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFjLDB4MDIsMHhhMSwweDczLDB4ODEsMHhjYywweGEwLDB4MzUsMHgwMiwweDNlLDB4OTcsMHhiNSwweGM0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTQsMHgzMywweGYxLDB4ZDEsMHhkZiwweDE0LDB4M2YsMHhmYiwweDhmLDB4YjksMHg3NSwweDcwLDB4ZGMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NCwweDNmLDB4MDcsMHgzNSwweDhmLDB4NTMsMHhhYSwweGIyLDB4ZDYsMHg4OCwweDUxLDB4NzEsMHg0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxLDB4MjQsMHhlYywweDdkLDB4Y2EsMHhmNiwweGEyLDB4YjMsMHhiYiwweGFkLDB4MmUsMHg2MCwweGZiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWMsMHhlZSwweDQ5LDB4ZDAsMHg0ZSwweDVjLDB4ZTMsMHgxZiwweDg4LDB4NDgsMHhlNCwweDY4LDB4MTQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZCwweDcxLDB4YmEsMHhkNywweDRkLDB4MzUsMHgxMCwweDg2LDB4MzcsMHg2MiwweGUwLDB4YTUsMHgwYl0pLFxuICAgICAgICAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDQsMHgwMCwweGUyLDB4MzgsMHhmOSwweGM4LDB4M2MsMHhkMSwweGNmLDB4NjIsMHg5MywweGMzLDB4NzcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NiwweDk3LDB4NDQsMHhlOCwweGM4LDB4Y2EsMHg5MywweDlhLDB4ZWYsMHhmMCwweDYzLDB4NzYsMHgyNSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNiLDB4MWMsMHg0NiwweGZmLDB4OTAsMHgxMywweDkxLDB4MTUsMHg5NywweDdlLDB4ODgsMHg5NSwweGQ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2YsMHgyZiwweDUyLDB4NmUsMHgwZCwweDU1LDB4NTUsMHgyZSwweGYxLDB4NTgsMHg1YywweDdlLDB4NTYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhkNCwweDQ4LDB4YWEsMHhkYiwweDhjLDB4NDQsMHg0ZCwweDg0LDB4NjksMHgzMywweDg3LDB4MDcsMHhiMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdlLDB4ZjUsMHhhMCwweDYwLDB4ZmIsMHg3MywweDU5LDB4NDYsMHgyOSwweGNiLDB4MWUsMHgzZiwweDdjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmYsMHhhNiwweDUzLDB4ZTMsMHg4YywweGVmLDB4ZDUsMHhlYiwweGJiLDB4YzgsMHg5YSwweDhlLDB4NjYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0YSwweDQ3LDB4MmYsMHhlMSwweGJhLDB4NWUsMHgzMiwweGQ0LDB4NTIsMHgwNCwweDg4LDB4OWQsMHg2MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNlLDB4YmEsMHg3MSwweDJkLDB4ZjcsMHg2MSwweGQ1LDB4ZmMsMHgyNiwweGJmLDB4ZDgsMHg2MCwweDkyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2IsMHg5NCwweGY4LDB4NmYsMHgzZCwweDk3LDB4MGIsMHgwYywweDUyLDB4OGMsMHhiMywweGI2LDB4OGJdKSxcbiAgICAgICAgICAgICAgdXRpbC5iaW4yc3RyKFsweDA0LDB4MDAsMHhiNywweGM1LDB4NGQsMHg2ZSwweDJmLDB4ZGQsMHhlZiwweGVjLDB4MDcsMHg3MCwweGEyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2MsMHgxYywweDlkLDB4OGUsMHg2NiwweDYwLDB4N2MsMHg2MSwweDFlLDB4NDUsMHhlOSwweGRjLDB4ODIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyZiwweGM1LDB4N2UsMHgxYSwweGM2LDB4ZDAsMHg5MiwweGM1LDB4MjIsMHg5YiwweDlhLDB4ZmIsMHg3MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk1LDB4OTksMHhmMiwweDdjLDB4ZGIsMHgyYSwweDkzLDB4N2IsMHg1YSwweDI5LDB4NzMsMHgyNCwweDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEsMHg0OSwweGI1LDB4ZjIsMHg1ZiwweGJlLDB4ZTcsMHg2NCwweDRkLDB4ZGEsMHg1MiwweDllLDB4YzEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSwweDQwLDB4NWUsMHgwMywweDkyLDB4OGQsMHgzOSwweDk1LDB4MWYsMHg2OCwweDlmLDB4MDAsMHgyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjLDB4NmYsMHhjZiwweGQ5LDB4NmQsMHg2OCwweGY3LDB4MDAsMHg0ZiwweDBlLDB4YzgsMHgwYiwweGZhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTEsMHhlMCwweDIyLDB4ZjAsMHhmZiwweGE3LDB4NDIsMHhkNCwweGRlLDB4MGIsMHg0NywweDhmLDB4MmIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmNSwweDRkLDB4MDQsMHgzMiwweDkxLDB4ODksMHg0YiwweDBlLDB4MDUsMHg4ZCwweDcwLDB4ZjksMHhiYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGU3LDB4ZDYsMHg3NiwweGVhLDB4MGUsMHgxYSwweDkwLDB4MzAsMHhmNSwweDk4LDB4MDEsMHhjNSwweDczXSldO1xuICBcbiAgdmFyIERTQXB1Yk1QSXN0cnMgPSBbXG4gICAgICAgICAgdXRpbC5iaW4yc3RyKFsweDA4LDB4MDAsMHhhOCwweDg1LDB4NWMsMHgyOCwweDA1LDB4OTQsMHgwMywweGJlLDB4MDcsMHg2YywweDEzLDB4M2UsMHg2NSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmIsMHhiNSwweGUxLDB4OTksMHg3YywweGZhLDB4ODQsMHhlMywweGFjLDB4NDcsMHhhNSwweGM0LDB4NDYsMHhkOCwweDVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHg0NCwweGU5LDB4YzEsMHg2YiwweDY5LDB4ZjcsMHgxMCwweDc2LDB4NDksMHhhNywweDI1LDB4ODUsMHhmNCwweDFiLDB4ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAweGM2LDB4NjAsMHhjNCwweDViLDB4YWEsMHhkNCwweDg3LDB4ZDYsMHg4ZiwweDkyLDB4NTYsMHg3ZCwweDU1LDB4M2YsMHg0NSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4YWUsMHgxMiwweDczLDB4ZGEsMHgyOSwweDhjLDB4YmEsMHgzMiwweGNjLDB4ZDcsMHhhNCwweGQwLDB4MjQsMHhiMCwweDdjLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHhkOCwweDBjLDB4M2EsMHg5MSwweDZmLDB4OTgsMHg0MCwweDljLDB4OWEsMHhhOCwweGNjLDB4MjgsMHgyNywweDk1LDB4MGIsXG4gICAgICAgICAgICAgICAgICAgICAgICAweGUxLDB4NWIsMHhiOSwweDNiLDB4MWMsMHgxYywweGQyLDB4ZWMsMHhhYiwweDA3LDB4MjUsMHg4ZCwweDdhLDB4MmEsMHgyYixcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYsMHgxNCwweGU4LDB4ZGEsMHg3MSwweGQyLDB4YWIsMHhiYSwweDg1LDB4MTQsMHgwZCwweGM1LDB4ZTAsMHg4OCwweGViLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHhhNSwweGUyLDB4ZDUsMHg0OCwweDNkLDB4NzQsMHgwYywweDQxLDB4ZWIsMHhmZCwweGI2LDB4NGUsMHhmOSwweDJjLDB4ODIsXG4gICAgICAgICAgICAgICAgICAgICAgICAweDE3LDB4ZGQsMHg2NCwweDFlLDB4MTksMHgzOSwweGEzLDB4N2YsMHhmOSwweDAwLDB4Y2QsMHg5YiwweGRhLDB4MmUsMHhiZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4NzEsMHgxMiwweGRmLDB4MGQsMHg3YywweDBhLDB4NmIsMHgyZCwweDIxLDB4M2IsMHg5YywweDY2LDB4OTMsMHg0YSwweDFlLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHg5MCwweDc5LDB4ZDMsMHg1YSwweDViLDB4ZTUsMHhiOSwweDk0LDB4MWIsMHhlNiwweDQ3LDB4OTksMHgwNiwweDk4LDB4ZDgsXG4gICAgICAgICAgICAgICAgICAgICAgICAweDJhLDB4ZTUsMHhlMiwweGE2LDB4OTUsMHg2YSwweDA3LDB4YzgsMHhhYywweDdjLDB4ZTksMHhmYywweGEyLDB4NmEsMHgxNixcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MmMsMHg5NCwweDk4LDB4YmQsMHg5MSwweDBhLDB4N2MsMHg3YywweDJjLDB4YjksMHg3ZSwweGEyLDB4NTEsMHg4YiwweDQ1LFxuICAgICAgICAgICAgICAgICAgICAgICAgMHgxZCwweDQ2LDB4MzQsMHhhOCwweDUyLDB4MmIsMHhkZCwweGQ5LDB4YTgsMHhiYywweDQ2LDB4NzgsMHg2NiwweGUxLDB4NzIsXG4gICAgICAgICAgICAgICAgICAgICAgICAweDExLDB4ZjEsMHhjYiwweDFhLDB4YjYsMHg0ZSwweDA1LDB4NTQsMHhmNywweGU5LDB4YmUsMHg0YywweDI1LDB4NTksMHgwOCxcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4OWYsMHhmOCwweGVhLDB4MjUsMHg5NywweDMzLDB4ZDYsMHhjOSwweDBmLDB4NTksMHgwZSwweGZkLDB4OWYsMHhkYywweGUyLFxuICAgICAgICAgICAgICAgICAgICAgICAgMHhjMCwweGNmLDB4MmZdKSxcbiAgICAgIHV0aWwuYmluMnN0cihbMHgwMSwweDAwLDB4ZTEsMHg3MiwweDJjLDB4ZDAsMHhiYiwweDFhLDB4NGYsMHhiNiwweGI2LDB4OTUsMHg3NywweDcxLDB4MmUsXG4gICAgICAgICAgICAgICAgICAgIDB4MDEsMHg0OCwweDNlLDB4MzUsMHg1NCwweDY0LDB4MmIsMHhlZCwweDQwLDB4NWYsMHg2NSwweDBjLDB4NTcsMHgyOCwweDVmLFxuICAgICAgICAgICAgICAgICAgICAweGZkLDB4ZmQsMHhmZiwweGQ3XSksXG4gICAgICB1dGlsLmJpbjJzdHIoWzB4MDcsMHhmZiwweDVkLDB4OWYsMHhjNCwweGI1LDB4NjMsMHgyNSwweDlkLDB4NzIsMHg4OCwweGU1LDB4NTMsMHg0NiwweDk4LFxuICAgICAgICAgICAgICAgICAgICAweGUzLDB4ZTksMHg2MiwweGNiLDB4MGMsMHhhMSwweGI3LDB4NzUsMHg5ZiwweDE4LDB4NDEsMHg5NCwweDMyLDB4MjgsMHgyOSxcbiAgICAgICAgICAgICAgICAgICAgMHg2ZCwweDY5LDB4ZTAsMHgzZiwweDdkLDB4N2IsMHgyYiwweDA2LDB4NWEsMHgzMywweDVjLDB4ZDQsMHgzNiwweDMxLDB4MDksXG4gICAgICAgICAgICAgICAgICAgIDB4NTQsMHg4NSwweDlkLDB4YjgsMHgyMCwweGZlLDB4ZGEsMHhmYywweGNkLDB4MWYsMHhiMSwweDJjLDB4MTUsMHgwOCwweDlkLFxuICAgICAgICAgICAgICAgICAgICAweDMyLDB4NTMsMHgyZiwweGMxLDB4NDIsMHgyMiwweDY5LDB4ZmYsMHg2NywweDJlLDB4MzksMHg5NywweDUwLDB4NjYsMHgzOSxcbiAgICAgICAgICAgICAgICAgICAgMHhkYSwweGNmLDB4ZmQsMHg2NCwweDZmLDB4OTEsMHgwNSwweDY0LDB4MzcsMHhjNSwweDA3LDB4MjQsMHhhYSwweDQwLDB4YTAsXG4gICAgICAgICAgICAgICAgICAgIDB4NzUsMHg4MiwweDFkLDB4OTcsMHg5NiwweDEyLDB4ZjEsMHhiZCwweDllLDB4MDksMHgyNiwweDNjLDB4OTcsMHg1ZCwweDU3LFxuICAgICAgICAgICAgICAgICAgICAweGI4LDB4NWMsMHg3ZCwweDg5LDB4MDMsMHg4MiwweGNkLDB4NDAsMHhlNSwweDAzLDB4ZTYsMHg0YSwweGZiLDB4YmMsMHhkMixcbiAgICAgICAgICAgICAgICAgICAgMHhlZiwweDdhLDB4ODksMHgwMiwweDA4LDB4YzgsMHg1MiwweGZhLDB4OTcsMHg3NCwweDY2LDB4MzIsMHhhZSwweGE2LDB4NTIsXG4gICAgICAgICAgICAgICAgICAgIDB4NGIsMHhlZiwweDVmLDB4Y2UsMHg5MSwweDIzLDB4M2YsMHhhYiwweDlkLDB4NjIsMHgyMSwweGVmLDB4NDgsMHg2ZCwweDA3LFxuICAgICAgICAgICAgICAgICAgICAweDVhLDB4YmEsMHhkZiwweDAwLDB4OTEsMHg1NCwweGVhLDB4NWMsMHhmYSwweDRiLDB4MTYsMHgyOCwweDFhLDB4Y2UsMHg0OCxcbiAgICAgICAgICAgICAgICAgICAgMHhiNywweDVjLDB4NTAsMHhhNSwweDU5LDB4YTQsMHhiNCwweGFmLDB4MWYsMHhlYiwweDhkLDB4NTgsMHgzZiwweDBhLDB4YTUsXG4gICAgICAgICAgICAgICAgICAgIDB4OTcsMHgyYiwweDUxLDB4NTYsMHhlOCwweDg4LDB4ZjYsMHgwNywweGJjLDB4ZGYsMHhmYSwweDJiLDB4N2IsMHg4OCwweGUwLFxuICAgICAgICAgICAgICAgICAgICAweDQ2LDB4YzgsMHg3YSwweDNlLDB4ZDgsMHg4MCwweGRiLDB4NGQsMHg4NywweDYxLDB4NGYsMHg2NCwweGNkLDB4ZWIsMHhlOCxcbiAgICAgICAgICAgICAgICAgICAgMHgwZCwweDg2LDB4MTYsMHhjYywweGRkLDB4NmMsMHg3NiwweDY2LDB4YzEsMHg3MywweGI3LDB4MDgsMHg5OCwweDg5LDB4MmYsXG4gICAgICAgICAgICAgICAgICAgIDB4NjcsMHg2OSwweGQxLDB4ZmMsMHg5NywweDRkLDB4YTIsMHhjZSwweGFkLDB4YmIsMHg2ZiwweGFiLDB4YTUsMHhkNiwweDE4LFxuICAgICAgICAgICAgICAgICAgICAweGIzLDB4MWEsMHg5NiwweDAyLDB4YmMsMHgzMSwweDQyLDB4YTIsMHhhZCwweDc3LDB4ZTgsMHhlMiwweDRjLDB4OTksMHhmOSxcbiAgICAgICAgICAgICAgICAgICAgMHhkZCwweGJlLDB4Y2RdKSxcbiAgICAgIHV0aWwuYmluMnN0cihbMHgwNywweGZmLDB4NWQsMHhmZSwweDljLDB4OTgsMHhlZiwweDNhLDB4YTYsMHg0OSwweGYwLDB4MTAsMHg2NywweDc5LDB4MmEsXG4gICAgICAgICAgICAgICAgICAgIDB4OWQsMHg3OSwweDQzLDB4MDYsMHhhNCwweGE4LDB4NmIsMHgxYSwweDZkLDB4MWYsMHg3NywweDZlLDB4MDAsMHgzMSwweGI5LFxuICAgICAgICAgICAgICAgICAgICAweGVkLDB4YzksMHg2NiwweGZmLDB4ZjEsMHgyMSwweDMyLDB4ZmEsMHg2MiwweDQzLDB4Y2QsMHg5NywweGQzLDB4M2QsMHhhZixcbiAgICAgICAgICAgICAgICAgICAgMHhiNCwweDI5LDB4MjksMHgyNiwweDRlLDB4MWMsMHhhMCwweGFkLDB4MWMsMHgwNywweDI4LDB4M2YsMHhlNSwweDQzLDB4MTAsXG4gICAgICAgICAgICAgICAgICAgIDB4YmEsMHhiNCwweDA4LDB4ZTAsMHhkYywweGEyLDB4YzMsMHg1YiwweDFmLDB4YmQsMHg5NCwweGM3LDB4NDMsMHhlNSwweGYyLFxuICAgICAgICAgICAgICAgICAgICAweDE3LDB4MzAsMHg1NCwweDdmLDB4MTQsMHhiZSwweGY0LDB4YmQsMHg5MSwweDNiLDB4ZTQsMHgzNiwweGE0LDB4NTAsMHg1YixcbiAgICAgICAgICAgICAgICAgICAgMHgzNywweDg5LDB4NWUsMHhjYywweGM3LDB4NzQsMHg1NCwweDMyLDB4MjAsMHgwOSwweDYzLDB4OTgsMHhiNywweGQ5LDB4YWYsXG4gICAgICAgICAgICAgICAgICAgIDB4N2YsMHhiMCwweDZjLDB4MjcsMHg0MywweGZlLDB4NTIsMHhlNiwweDFhLDB4ODgsMHg1OSwweDI1LDB4ZmMsMHhlYiwweDQzLFxuICAgICAgICAgICAgICAgICAgICAweDUwLDB4YzcsMHg2NSwweDQzLDB4YzEsMHg4NiwweDczLDB4NTgsMHg1MywweDNhLDB4Y2YsMHg3YSwweGEzLDB4MWQsMHg1NixcbiAgICAgICAgICAgICAgICAgICAgMHhjOCwweDRhLDB4ODAsMHg3MCwweGI3LDB4YmYsMHhmMiwweGEzLDB4ZWMsMHhlOCwweDc3LDB4MDUsMHgzMywweDA5LDB4OWQsXG4gICAgICAgICAgICAgICAgICAgIDB4YWEsMHhjYSwweGEwLDB4ZTEsMHg2NCwweDY0LDB4NmYsMHg3NiwweDk5LDB4NDEsMHg3NSwweDc4LDB4OTAsMHhmNiwweGU3LFxuICAgICAgICAgICAgICAgICAgICAweDIzLDB4ZTYsMHhlYywweDUwLDB4ZTUsMHg5OSwweGE4LDB4M2UsMHgxYSwweDRiLDB4YzksMHg4OCwweDU4LDB4NjYsMHhhZSxcbiAgICAgICAgICAgICAgICAgICAgMHgxYSwweDUzLDB4NWUsMHhlNCwweGI3LDB4ODYsMHhjZiwweGE2LDB4ZTUsMHhhZCwweGI0LDB4ODAsMHhhMCwweGYxLDB4MGQsXG4gICAgICAgICAgICAgICAgICAgIDB4OTYsMHhiOCwweDQxLDB4ZDAsMHgwNywweDlhLDB4MjEsMHg4ZCwweDUwLDB4N2YsMHg0ZiwweDczLDB4MTMsMHhhMiwweGUyLFxuICAgICAgICAgICAgICAgICAgICAweDAyLDB4MDcsMHhjMywweGEzLDB4MGYsMHgwOSwweDE4LDB4N2YsMHhmNywweDZiLDB4OTAsMHg3MCwweGMwLDB4ZjksMHgwYyxcbiAgICAgICAgICAgICAgICAgICAgMHg2NywweDhkLDB4OWQsMHgxNCwweGI2LDB4OWQsMHgzMiwweDgyLDB4ZDAsMHhiNSwweGM2LDB4NTcsMHhmMCwweDkxLDB4ZDksXG4gICAgICAgICAgICAgICAgICAgIDB4YzMsMHgyNiwweGFlLDB4OWYsMHhhOSwweDY3LDB4NDksMHg5NiwweDVjLDB4MDcsMHgzZSwweDQ3LDB4NWMsMHhlZCwweDYwLFxuICAgICAgICAgICAgICAgICAgICAweDA3LDB4YWMsMHg2YV0pXTtcbiAgdmFyIERTQXNlY01QSXN0cnMgPSBbdXRpbC5iaW4yc3RyKFsweDAxLDB4MDAsMHg5YiwweDU4LDB4YTgsMHhmNCwweDA0LDB4YjEsMHhkNSwweDE0LDB4MDksMHhlMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTEsMHhhMSwweDhhLDB4MGIsMHhhMywweGMzLDB4YTMsMHg2NiwweGFhLDB4MjcsMHg5OSwweDUwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYywweDRkLDB4YmEsMHgyNCwweGVlLDB4ZGYsMHhkZiwweGI4LDB4OGUsMHg4ZV0pXTtcbiAgICAgICAgICAgIFxuICB2YXIgRWxnYW1hbHB1Yk1QSXN0cnMgPSBcbiAgICAgICAgICBbdXRpbC5iaW4yc3RyKFsweDA4LDB4MDAsMHhlYSwweGNjLDB4YmUsMHhlMiwweGU0LDB4NWEsMHg1MSwweDE4LDB4OTMsMHhhMSwweDEyLDB4MmYsXG4gICAgICAgICAgICAgICAgICAgICAweDAwLDB4OTksMHg0MiwweGQ4LDB4NWMsMHgxYywweDJmLDB4YjYsMHgzYywweGQ5LDB4OTQsMHg2MSwweGI0LDB4NTUsXG4gICAgICAgICAgICAgICAgICAgICAweDhkLDB4NGUsMHg3MywweGU2LDB4NjksMHhiYywweDFkLDB4MzMsMHhlMywweDJkLDB4OTEsMHgyMywweDY5LDB4OTUsXG4gICAgICAgICAgICAgICAgICAgICAweDk4LDB4ZDcsMHgxOCwweDVhLDB4YWYsMHhhNywweDkzLDB4YzYsMHgwNSwweDkzLDB4M2EsMHhjNywweGVhLDB4ZDAsXG4gICAgICAgICAgICAgICAgICAgICAweGIxLDB4YTksMHhjNywweGFiLDB4NDEsMHg4OSwweGM4LDB4MzgsMHg5OSwweGRjLDB4MWEsMHg1NywweDM1LDB4MWEsXG4gICAgICAgICAgICAgICAgICAgICAweDI3LDB4NjIsMHg0MCwweDcxLDB4OWYsMHgzNiwweDFjLDB4NmQsMHgxOCwweDFjLDB4OTMsMHhmNywweGJhLDB4MzUsXG4gICAgICAgICAgICAgICAgICAgICAweDA2LDB4ZWQsMHgzMCwweGI4LDB4ZDksMHg4YSwweDdjLDB4MDMsMHhhZiwweGJhLDB4NDAsMHgxZiwweDYyLDB4ZjEsXG4gICAgICAgICAgICAgICAgICAgICAweDZkLDB4ODcsMHgyYywweGE2LDB4MmUsMHg0NiwweGIwLDB4YWEsMHhiYywweGJjLDB4OTMsMHhmYSwweDliLDB4NDcsXG4gICAgICAgICAgICAgICAgICAgICAweDNmLDB4NzAsMHgxZiwweDJhLDB4YzIsMHg2NiwweDljLDB4N2MsMHg2OSwweGUwLDB4MmIsMHgwNSwweGVlLDB4YjcsXG4gICAgICAgICAgICAgICAgICAgICAweGE3LDB4N2YsMHhmMywweDIxLDB4NDgsMHg4NSwweGMyLDB4OTUsMHg1ZiwweDZmLDB4MWUsMHhiMywweDliLDB4OTcsXG4gICAgICAgICAgICAgICAgICAgICAweGY4LDB4MTQsMHhjMywweGZmLDB4NGQsMHg5NywweDI1LDB4MjksMHg5NCwweDQxLDB4NGIsMHg5MCwweGQ4LDB4YmEsXG4gICAgICAgICAgICAgICAgICAgICAweDcxLDB4NDUsMHg0YiwweDFlLDB4MmYsMHhjYSwweDgyLDB4NWYsMHg1NiwweDc3LDB4ZTksMHhkMywweDg4LDB4NWQsXG4gICAgICAgICAgICAgICAgICAgICAweDhiLDB4ZWMsMHg5MiwweDhiLDB4OGEsMHgyMywweDg4LDB4MDUsMHhmOCwweDJjLDB4YTgsMHhmMSwweDcwLDB4NzYsXG4gICAgICAgICAgICAgICAgICAgICAweGU3LDB4YmYsMHg3NSwweGE4LDB4MzEsMHgxNCwweDhlLDB4NzYsMHhjOCwweDAxLDB4YTYsMHgyNSwweDI3LDB4NDksXG4gICAgICAgICAgICAgICAgICAgICAweGFmLDB4ZGMsMHhmNCwweGY2LDB4ZjQsMHhjZSwweDkwLDB4ODQsMHgxNSwweDJiLDB4NGQsMHhiMywweGNjLDB4NzcsXG4gICAgICAgICAgICAgICAgICAgICAweGRiLDB4NjUsMHg3MSwweDc1LDB4ZDMsMHgwMCwweDFkLDB4MjIsMHhjNSwweDQyLDB4MmYsMHg1MSwweGZhLDB4N2IsXG4gICAgICAgICAgICAgICAgICAgICAweGViLDB4NmUsMHgwMywweGQ5LDB4NDEsMHhkZCwweDJkLDB4MWEsMHhkZCwweDA3LDB4NzQsMHg4YiwweGI3LDB4YTIsXG4gICAgICAgICAgICAgICAgICAgICAweGZhLDB4YjIsMHg1OSwweDBlLDB4MGUsMHg5NCwweDdjLDB4MDAsMHhhZCwweDk1LDB4MjMsMHg0MiwweDkxLDB4MTgsXG4gICAgICAgICAgICAgICAgICAgICAweDRjLDB4OTcsMHhmMSwweDI3LDB4NjIsMHg3N10pLFxuICAgICAgIHV0aWwuYmluMnN0cihbMHgwMCwweDAzLDB4MDVdKSxcbiAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDcsMHhmZiwweDU3LDB4MTksMHg3NiwweGZjLDB4MDksMHg2YSwweDdhLDB4ZjcsMHhiYSwweGIyLDB4NDIsMHhiZixcbiAgICAgICAgICAgICAgICAgICAgIDB4Y2QsMHgyYiwweGMxLDB4MWEsMHg3OSwweDI1LDB4OGMsMHhhZCwweGY0LDB4M2EsMHgwYSwweDdhLDB4OWIsMHg0YyxcbiAgICAgICAgICAgICAgICAgICAgIDB4NDYsMHgzYywweGUwLDB4NGYsMHhjYywweDZlLDB4ZTUsMHg3YSwweDMzLDB4M2EsMHg0ZSwweDgwLDB4Y2IsMHhkMyxcbiAgICAgICAgICAgICAgICAgICAgIDB4NjIsMHhkNywweDhmLDB4ZTIsMHhjOCwweGIwLDB4ZDAsMHhjYiwweDQ5LDB4YzksMHg5ZSwweDJkLDB4OTcsMHgxNixcbiAgICAgICAgICAgICAgICAgICAgIDB4M2EsMHg3ZCwweGIxLDB4ZTEsMHhkMywweGQ5LDB4ZDcsMHgzZiwweDIwLDB4NjAsMHhlMywweDNlLDB4NzcsMHhlYSxcbiAgICAgICAgICAgICAgICAgICAgIDB4MGMsMHhlNCwweDdiLDB4ZjAsMHgzOSwweDFhLDB4MGQsMHhkOSwweDhmLDB4NzMsMHhkMiwweDUxLDB4YjgsMHgwYyxcbiAgICAgICAgICAgICAgICAgICAgIDB4MGUsMHgxNSwweDFlLDB4YWQsMHg3YywweGQ4LDB4OWQsMHg3NCwweDZlLDB4YTIsMHgxNywweDZiLDB4NTgsMHgxNCxcbiAgICAgICAgICAgICAgICAgICAgIDB4MmIsMHhiNywweGFkLDB4OGEsMHhkNywweDY2LDB4YzAsMHhkZiwweGVhLDB4MmQsMHhmYywweGM0LDB4NmUsMHg2OCxcbiAgICAgICAgICAgICAgICAgICAgIDB4YjYsMHg0YywweDlhLDB4MTYsMHhhNCwweDNkLDB4YzIsMHgyNiwweDBjLDB4YjcsMHhkNCwweDEzLDB4N2IsMHgyMixcbiAgICAgICAgICAgICAgICAgICAgIDB4ZmQsMHg4NCwweGQ3LDB4MGYsMHhkYywweDQyLDB4NzUsMHgwNSwweDg1LDB4MjksMHgwMCwweDMxLDB4MWQsMHhlYyxcbiAgICAgICAgICAgICAgICAgICAgIDB4NGUsMHgyMiwweDhiLDB4ZjYsMHgzNywweDgzLDB4NDUsMHhlNSwweGIzLDB4MzEsMHg2MSwweDJjLDB4MDIsMHhhMSxcbiAgICAgICAgICAgICAgICAgICAgIDB4YzYsMHg5ZCwweGVhLDB4YmEsMHgzZCwweDhhLDB4YWIsMHgwZiwweDYxLDB4NWUsMHgxNCwweDY0LDB4NjksMHgxZSxcbiAgICAgICAgICAgICAgICAgICAgIDB4YTAsMHgxNSwweDQ4LDB4ODYsMHhlNSwweDExLDB4MDYsMHhlOCwweGRlLDB4MzQsMHhjNywweGE3LDB4M2QsMHgzNSxcbiAgICAgICAgICAgICAgICAgICAgIDB4ZDEsMHg3NiwweGMyLDB4YmUsMHgwMSwweDgyLDB4NjEsMHg4ZCwweGU3LDB4N2UsMHgyOCwweDFkLDB4NGUsMHg4YyxcbiAgICAgICAgICAgICAgICAgICAgIDB4YjksMHhlOCwweDdlLDB4YTQsMHg1ZiwweGE2LDB4M2EsMHg5ZSwweDVkLDB4YWMsMHhmMywweDYwLDB4MjIsMHgxNCxcbiAgICAgICAgICAgICAgICAgICAgIDB4ZDUsMHhkNSwweGJlLDB4MWYsMHhmMCwweDE5LDB4ZTYsMHg4MSwweGZkLDB4NWQsMHhlMSwweGY4LDB4NzYsMHg1ZixcbiAgICAgICAgICAgICAgICAgICAgIDB4ZTMsMHhkYSwweGJhLDB4MTksMHhmMywweGNiLDB4MTAsMHhhMCwweDZiLDB4ZDAsMHgyZCwweGJlLDB4NDAsMHg0MixcbiAgICAgICAgICAgICAgICAgICAgIDB4N2IsMHg5YiwweDE1LDB4YTQsMHgyZCwweGVjLDB4Y2YsMHgwOSwweGQ2LDB4ZTMsMHg5MiwweGMzLDB4OGQsMHg2NSxcbiAgICAgICAgICAgICAgICAgICAgIDB4NmIsMHg2MCwweDk3LDB4ZGEsMHg2YiwweGNhXSldO1xuXG4gIHZhciBFbGdhbWFsc2VjTVBJc3RycyA9IFtcbiAgICAgICAgICAgICB1dGlsLmJpbjJzdHIoWzB4MDEsMHg1MiwweDAyLDB4ODAsMHg4NywweGY2LDB4ZTQsMHg0OSwweGQ3LDB4MmUsMHgzZSwweGZlLDB4NjAsMHhiOSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTMsMHgyYSwweGYwLDB4NjcsMHg1OCwweGU5LDB4ZjYsMHg0NywweDgzLDB4ZGUsMHg3ZSwweGZiLDB4YmIsMHhiZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZGYsMHg0OCwweDEyLDB4MWIsMHgwNiwweDdkLDB4MTMsMHhiYywweDNiLDB4NDksMHhmOSwweDg2LDB4ZDQsMHg1MyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZWQsMHgyZCwweDY4XSldO1xuXG4gIHZhciBSU0FwdWJNUElzID0gW107XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgUlNBcHViTVBJc1tpXSA9IG5ldyBvcGVucGdwLm1waSgpO1xuICAgIFJTQXB1Yk1QSXNbaV0ucmVhZChSU0FwdWJNUElzdHJzW2ldKTtcbiAgfVxuXG4gIHZhciBSU0FzZWNNUElzID0gW107XG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBSU0FzZWNNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgUlNBc2VjTVBJc1tpXS5yZWFkKFJTQXNlY01QSXN0cnNbaV0pO1xuICB9XG4gICAgXG4gIHZhciBEU0FzZWNNUElzID0gW107XG4gIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHtcbiAgICBEU0FzZWNNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRFNBc2VjTVBJc1tpXS5yZWFkKERTQXNlY01QSXN0cnNbaV0pO1xuICB9XG4gICAgXG4gIHZhciBEU0FwdWJNUElzID0gW107XG4gIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBEU0FwdWJNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRFNBcHViTVBJc1tpXS5yZWFkKERTQXB1Yk1QSXN0cnNbaV0pO1xuICB9XG4gIHZhciBFbGdhbWFsc2VjTVBJcyA9IFtdO1xuICBmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7XG4gICAgRWxnYW1hbHNlY01QSXNbaV0gPSBuZXcgb3BlbnBncC5tcGkoKTtcbiAgICBFbGdhbWFsc2VjTVBJc1tpXS5yZWFkKEVsZ2FtYWxzZWNNUElzdHJzW2ldKTtcbiAgfVxuICAgIFxuICB2YXIgRWxnYW1hbHB1Yk1QSXMgPSBbXTtcbiAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIEVsZ2FtYWxwdWJNUElzW2ldID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRWxnYW1hbHB1Yk1QSXNbaV0ucmVhZChFbGdhbWFscHViTVBJc3Ryc1tpXSk7XG4gIH1cblxuICAvL09yaWdpbmFsbHkgd2UgcGFzc2VkIHB1YmxpYyBhbmQgc2VjcmV0IE1QSSBzZXBhcmF0ZWx5LCBub3cgdGhleSBhcmUgam9pbmVkLiBJcyB0aGlzIHdoYXQgd2Ugd2FudCB0byBkbyBsb25nIHRlcm0/XG4gIC8vIFJTQVxuICB2YXIgUlNBc2lnbmVkRGF0YSA9IG9wZW5wZ3Auc2lnbmF0dXJlLnNpZ24oMiwgMSwgUlNBcHViTVBJcy5jb25jYXQoUlNBc2VjTVBJcyksIFwiZm9vYmFyXCIpO1xuICB2YXIgUlNBc2lnbmVkRGF0YU1QSSA9IG5ldyBvcGVucGdwLm1waSgpO1xuICBSU0FzaWduZWREYXRhTVBJLnJlYWQoUlNBc2lnbmVkRGF0YSk7XG4gIHJlc3VsdFswXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3RpbmcgUlNBIFNpZ24gYW5kIFZlcmlmeVwiLFxuICAgICAgb3BlbnBncC5zaWduYXR1cmUudmVyaWZ5KDEsIDIsIFtSU0FzaWduZWREYXRhTVBJXSwgUlNBcHViTVBJcywgXCJmb29iYXJcIikpO1xuXG4gIC8vIERTQSBcbiAgdmFyIERTQXNpZ25lZERhdGEgPSBvcGVucGdwLnNpZ25hdHVyZS5zaWduKDIsIDE3LCBEU0FwdWJNUElzLmNvbmNhdChEU0FzZWNNUElzKSwgXCJmb29iYXJcIik7XG4gIFxuICB2YXIgRFNBbXNnTVBJcyA9IFtdO1xuICAgIERTQW1zZ01QSXNbMF0gPSBuZXcgb3BlbnBncC5tcGkoKTtcbiAgICBEU0Ftc2dNUElzWzFdID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gICAgRFNBbXNnTVBJc1swXS5yZWFkKERTQXNpZ25lZERhdGEuc3Vic3RyaW5nKDAsMzQpKTtcbiAgICBEU0Ftc2dNUElzWzFdLnJlYWQoRFNBc2lnbmVkRGF0YS5zdWJzdHJpbmcoMzQsNjgpKTtcbiAgcmVzdWx0WzFdID0gbmV3IHVuaXQucmVzdWx0KFwiVGVzdGluZyBEU0EgU2lnbiBhbmQgVmVyaWZ5XCIsXG4gICAgICBvcGVucGdwLnNpZ25hdHVyZS52ZXJpZnkoMTcsIDIsIERTQW1zZ01QSXMsIERTQXB1Yk1QSXMsIFwiZm9vYmFyXCIpKTtcbiAgXG4gIHZhciBzeW1tQWxnbyA9IFwiYWVzMjU2XCI7IC8vIEFFUzI1NlxuICB2YXIgc3ltbUtleSA9IG9wZW5wZ3AuZ2VuZXJhdGVTZXNzaW9uS2V5KHN5bW1BbGdvKTtcbiAgdmFyIHN5bW1lbmNEYXRhT0NGQiA9IG9wZW5wZ3AuY2ZiLmVuY3J5cHQob3BlbnBncC5nZXRQcmVmaXhSYW5kb20oc3ltbUFsZ28pLCBzeW1tQWxnbywgXCJmb29iYXJmb29iYXIxMjM0NTY3ODkwXCIsIHN5bW1LZXksIHRydWUpO1xuICB2YXIgc3ltbWVuY0RhdGFDRkIgID0gb3BlbnBncC5jZmIuZW5jcnlwdChvcGVucGdwLmdldFByZWZpeFJhbmRvbShzeW1tQWxnbyksIHN5bW1BbGdvLCBcImZvb2JhcmZvb2JhcjEyMzQ1Njc4OTBcIiwgc3ltbUtleSwgZmFsc2UpO1xuICBcbiAgcmVzdWx0WzJdID0gbmV3IHVuaXQucmVzdWx0KFwiVGVzdGluZyBzeW1tZXRyaWMgZW5jcnlwdCBhbmQgZGVjcnlwdCB3aXRoIE9wZW5QR1AgQ0ZCIHJlc3luY1wiLFxuICAgICAgb3BlbnBncC5jZmIuZGVjcnlwdChzeW1tQWxnbyxzeW1tS2V5LHN5bW1lbmNEYXRhT0NGQix0cnVlKSA9PSBcImZvb2JhcmZvb2JhcjEyMzQ1Njc4OTBcIik7XG4gIHJlc3VsdFszXSA9IG5ldyB1bml0LnJlc3VsdChcIlRlc3Rpbmcgc3ltbWV0cmljIGVuY3J5cHQgYW5kIGRlY3J5cHQgd2l0aG91dCBPcGVuUEdQIENGQiByZXN5bmMgKHVzZWQgaW4gbW9kaWZpY2F0aW9uIGRldGVjdGlvbiBjb2RlIFxcXCJNRENcXFwiIHBhY2tldHMpXCIsXG4gICAgICBvcGVucGdwLmNmYi5kZWNyeXB0KHN5bW1BbGdvLHN5bW1LZXksc3ltbWVuY0RhdGFDRkIsZmFsc2UpID09IFwiZm9vYmFyZm9vYmFyMTIzNDU2Nzg5MFwiKTtcbiAgXG4gIHZhciBSU0FVbmVuY3J5cHRlZERhdGEgPSBuZXcgb3BlbnBncC5tcGkoKTtcbiAgUlNBVW5lbmNyeXB0ZWREYXRhLmZyb21CeXRlcyhvcGVucGdwLnBrY3MxLmVtZS5lbmNvZGUoc3ltbUtleSwgUlNBcHViTVBJc1swXS5ieXRlTGVuZ3RoKCkpKTtcbiAgdmFyIFJTQUVuY3J5cHRlZERhdGEgPSBvcGVucGdwLnB1YmxpY0tleUVuY3J5cHQoXCJyc2FfZW5jcnlwdF9zaWduXCIsIFJTQXB1Yk1QSXMsIFJTQVVuZW5jcnlwdGVkRGF0YSk7XG5cbiAgcmVzdWx0WzRdID0gbmV3IHVuaXQucmVzdWx0KFwiVGVzdGluZyBhc3ltbWV0cmljIGVuY3J5cHQgYW5kIGRlY3J5cHQgdXNpbmcgUlNBIHdpdGggZW1lX3BrY3MxIHBhZGRpbmdcIixcbiAgICAgIG9wZW5wZ3AucGtjczEuZW1lLmRlY29kZShvcGVucGdwLnB1YmxpY0tleURlY3J5cHQoXCJyc2FfZW5jcnlwdF9zaWduXCIsIFJTQXB1Yk1QSXMuY29uY2F0KFJTQXNlY01QSXMpLCBSU0FFbmNyeXB0ZWREYXRhKS53cml0ZSgpLnN1YnN0cmluZygyKSwgUlNBcHViTVBJc1swXS5ieXRlTGVuZ3RoKCkpID09IHN5bW1LZXkpO1xuXG4gIHZhciBFbGdhbWFsVW5lbmNyeXB0ZWREYXRhID0gbmV3IG9wZW5wZ3AubXBpKCk7XG4gIEVsZ2FtYWxVbmVuY3J5cHRlZERhdGEuZnJvbUJ5dGVzKG9wZW5wZ3AucGtjczEuZW1lLmVuY29kZShzeW1tS2V5LCBFbGdhbWFscHViTVBJc1swXS5ieXRlTGVuZ3RoKCkpKTtcbiAgdmFyIEVsZ2FtYWxFbmNyeXB0ZWREYXRhID0gb3BlbnBncC5wdWJsaWNLZXlFbmNyeXB0KFwiZWxnYW1hbFwiLCBFbGdhbWFscHViTVBJcywgRWxnYW1hbFVuZW5jcnlwdGVkRGF0YSk7XG5cbiAgcmVzdWx0WzVdID0gbmV3IHVuaXQucmVzdWx0KFwiVGVzdGluZyBhc3ltbWV0cmljIGVuY3J5cHQgYW5kIGRlY3J5cHQgdXNpbmcgRWxnYW1hbCB3aXRoIGVtZV9wa2NzMSBwYWRkaW5nXCIsXG4gICAgICBvcGVucGdwLnBrY3MxLmVtZS5kZWNvZGUob3BlbnBncC5wdWJsaWNLZXlEZWNyeXB0KFwiZWxnYW1hbFwiLCBFbGdhbWFscHViTVBJcy5jb25jYXQoRWxnYW1hbHNlY01QSXMpLCBFbGdhbWFsRW5jcnlwdGVkRGF0YSkud3JpdGUoKS5zdWJzdHJpbmcoMiksIEVsZ2FtYWxwdWJNUElzWzBdLmJ5dGVMZW5ndGgoKSkgPT0gc3ltbUtleSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIHVuaXQgPSByZXF1aXJlKCcuLi91bml0LmpzJyk7XG5cbnVuaXQucmVnaXN0ZXIoXCJUZXN0aW5nIG9mIGJpbmFyeSBzaWduYXR1cmUgY2hlY2tpbmdcIiwgZnVuY3Rpb24oKSB7XG4gIHZhciBvcGVucGdwID0gcmVxdWlyZSgnLi4vLi4vJyk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZGVidWdnZXI7XG4gIHZhciBwcml2X2tleSA9IG9wZW5wZ3AucmVhZF9wcml2YXRlS2V5KFtcbiAgICAgICAgJy0tLS0tQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLLS0tLS0nLFxuICAgICAgICAnVmVyc2lvbjogR251UEcgdjEuNC4xMSAoR05VL0xpbnV4KScsXG4gICAgICAgICcnLFxuICAgICAgICAnbFFIaEJGRVJuck1SQkFEbU0waElma0kzeW9zamdiV285djBMbnIzQ0NFKzhLc01zemdWUytoQnUwWGZHcmFLbScsXG4gICAgICAgICdpdmNBMmFhSmltSHFWWU9QN2dFbndGQXhIQkJwZVRKY3U1d3pDRnlKd0VZcVZlUzNubmFJaEJQcGxTRjE0RHVmJyxcbiAgICAgICAgJ2k2YkI5UlY3S3hWQWc2YXVubU0ydEF1dHFDK2EweTJyRGFmN2prSm9aOWdXSmUyekkrdnJhRDZmaXdDZ3h2SG8nLFxuICAgICAgICAnM0lnVUxCOVJxSXFwTG9NZ1hmY2pDK2NELzFqZUpsS1JtK243MXJ5WXdUL0VDS3NzcEZ6N1MzNno2cTNYeVM4UScsXG4gICAgICAgICdRZnJzVXoycDFmYkZpY3ZKd0lPSjhCMjBKL04yL25pdDRQMGdCVVRVeHYzUUVhN1hDTS81Ni94ckdreUJ6c2NXJyxcbiAgICAgICAgJ0F6Qm95L0FLOUs3R042ejEzUm96dUFTNjBGMXhPN01RYzZZaTJWVTNlQVNEUUVLaXlML1ViZi9zL3JrWitzR2onLFxuICAgICAgICAneUppekJBQ3R3Q2JRekErejlYQlpOVWF0NU5QZ2NaejVRZWgxbndGOU54bnI2cHlCdjd0a3JMaC8zZ3hSR0hxRycsXG4gICAgICAgICcwNjNkTWJVazhwbVVjSnpCVXlSc05pSVBEb0VVc0xqWTV6bVpabXAvd2FBaHBSRXNuSzI5V0xDYnFMZHBVb3JzJyxcbiAgICAgICAgJ2MxSkpCc09ia0ExSU04VFpZOFlVbXZzTUV2QkxDQ2FudUtwY2xaWlhxZVJBZU9ISjB2NERBd0s4V2Z1VGU1QisnLFxuICAgICAgICAnTTJCT09lWmJOOEJwZmlBMWwvL2ZNTUhMUlMzVXZiTEJ2NFAxKzRTeXZoeVlUUjdNNzZRMHhQYzAzTUZPV0hMKycsXG4gICAgICAgICdTOVZ1bWJRV1ZHVnpkRElnUEhSbGMzUXlRSFJsYzNRdVkyOXRQb2hpQkJNUkFnQWlCUUpSRVo2ekFoc0RCZ3NKJyxcbiAgICAgICAgJ0NBY0RBZ1lWQ0FJSkNnc0VGZ0lEQVFJZUFRSVhnQUFLQ1JBUko1UUR5eGFlK01YTkFLQ3pXU0RSM3RNclRyRGInLFxuICAgICAgICAnVEFyaTczTjFYYjNqMUFDZlNsOXkrU0FhaDJxN0d2bWlSMSs2Ky9la3FKR2RBVmdFVVJHZXN4QUVBTmxwTVpqVycsXG4gICAgICAgICczM2pNeGxLSERkeVJGWHRLT3E4UnJlWGhxMDBwbG9ySGJnejl6RkVXbTRWRjUzK0UvS0dubUhHeVk1Q3k4VEt5JyxcbiAgICAgICAgJ1pqYXVlWlo5WHVHMGh1Wmc1SWY2OGlyRmZOWnR4ZEEyNmp2OC8vUGRaMFVqK1g2SjNSVmEycGVNTEREc3dUWUwnLFxuICAgICAgICAnT0wxWk8xZnhkdERENDBmZEFpSVoxUXlqd0VHMEFQdHo0MUVmQUFNRkJBQzUvZHRnQkJQdEhlOFVqREJhVWU0bicsXG4gICAgICAgICdOekh1VUJCcDZYRStIN2VxSE5GQ3VaQUo3eXFKTEdWSE5JYVFSNDE5Y055MDgvT08vK1lVUTdyZzc4THhqRml2JyxcbiAgICAgICAgJ0NIN0l6aGZVKzZ5dkVMU2JnUk1pY1k2RW5BUDJHVCtiMStNdEZOYTNsQkd0QkhjSmxhNTJjMnJUQUh0aFlaV2snLFxuICAgICAgICAnZlQ1UjVEbkp1UTJjSkhCTVM5SFd5UDREQXdLOFdmdVRlNUIrTTJDN2EvWUpTVXY2U2V4ZEdDYWlhVGNBbTZnLycsXG4gICAgICAgICdQdkE2aHcvRkx6SUVQNjdRY1FTU1RtaGZ0UUl3bmRkdDRTNE15SkpIM1U0ZkphRmZZUTF6Q25pWUpvaEpCQmdSJyxcbiAgICAgICAgJ0FnQUpCUUpSRVo2ekFoc01BQW9KRUJFbmxBUExGcDc0UWJNQW4zVjQ4NTd4d25POS8rdnpJVm5MOTNXM2swLzgnLFxuICAgICAgICAnQUtDOG9tWVBQb21OMUUvVUpGZlhkTERJTWk1TG9BPT0nLFxuICAgICAgICAnPUxTclcnLFxuICAgICAgICAnLS0tLS1FTkQgUEdQIFBSSVZBVEUgS0VZIEJMT0NLLS0tLS0nXG4gICAgICBdLmpvaW4oXCJcXG5cIikpO1xuICB2YXIgcHViX2tleSA9IG9wZW5wZ3AucmVhZF9wdWJsaWNLZXkoXG4gICAgICBbICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0nLFxuICAgICAgICAnVmVyc2lvbjogR251UEcgdjEuNC4xMSAoR05VL0xpbnV4KScsXG4gICAgICAgICcnLFxuICAgICAgICAnbVFHaUJGRVJsdzRSQkFENkJtY2YydzFkdFVtdENMa2R4ZXFaTEFyazN2WW9RQWpkaWJ4QTNnWFZ5dXI3ZnNXYicsXG4gICAgICAgICdybzBqVmJCSHFPQ3RDNmpEeEUybDUyTlA5K3RUbFdlVk1hcXFOdlVFNDdMU2FQcTJER0k4V3gxUmo2YkYzbVRzJyxcbiAgICAgICAgJ29iWUV3aEdiR2gvTWhKbk1FOUFIT0RhcnZrOEFaYnpvMCtrMUV3ckJXRjZkVFVCUGZxTzdyR1UyZXdDZzgwV1YnLFxuICAgICAgICAneDVwdDNldmo4clJLM2pROFNNS1ROUnNELzFQaFRkeGRaVGRYQVJBRnpjVzFWYWFydVdXMFJyMStYSEtLd0RDeicsXG4gICAgICAgICdpN0hFNzZTTzlxam5RZlpDWkc3NUNkUXhJMGg4R0ZlTjN6c0RxbWhvYjJpU3oyYUoxa3J0ak0raVoxRkJGZDU3JyxcbiAgICAgICAgJ09xQ1Y2d21rNUlUMFJCTjEyWnpNUzE5WXZ6Ti9PTlhIcm1UWmxLRXhkOU1oOVJLTGVWTncrYmY2SnNLUUV6Y1knLFxuICAgICAgICAnSnpGa0JBQ1g5WCtoRFljaE8vMmhpVHd4NGlPTzlGaHN1aDdlSVd1bUIzZ3QrYVVwbTFqclNiYXMvUUxUeW1taycsXG4gICAgICAgICd1WnVRVlhJNE50bmx2emxOZ1d2NEw1czVSVTVXcU5HRzdXU2FLTmRjcnZKWlJDMmRnYlVKdDA0SjVDS3JXcDZSJyxcbiAgICAgICAgJ2FJWWFsLzgxVXQxNzc4bFUwMVBFdDU2M1RjUW5VQmxualU1T1IyNUtoZlNlTjVDWlk3UVVWR1Z6ZENBOGRHVnonLFxuICAgICAgICAnZEVCMFpYTjBMbU52YlQ2SVlnUVRFUUlBSWdVQ1VSR1hEZ0liQXdZTENRZ0hBd0lHRlFnQ0NRb0xCQllDQXdFQycsXG4gICAgICAgICdIZ0VDRjRBQUNna1Fpa0RsWksvVXZMU3NwZ0NmY05hT3BUZzFXMnVjUjFKd0JiQkd2YUVSZnVNQW5SZ3QzL3JzJyxcbiAgICAgICAgJ0VwbHFFYWtNY2tDdGlrRW5weFllJyxcbiAgICAgICAgJz1iMkxuJyxcbiAgICAgICAgJy0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0nXG4gICAgICBdLmpvaW4oXCJcXG5cIikpO1xuICB2YXIgbXNnID0gb3BlbnBncC5yZWFkX21lc3NhZ2UoW1xuICAgICAgICAnLS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tJyxcbiAgICAgICAgJ1ZlcnNpb246IEdudVBHIHYxLjQuMTEgKEdOVS9MaW51eCknLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2hRRU9BMU40T0NTU2pFQ0JFQVAvZGlESkNRbjRlODgxOTNQZ3FoYmZBa29oazlSUTB2ME1QblhwSmJDUlRIS08nLFxuICAgICAgICAnOHI5bnhpQXIvVFF2NFpPaW5nWGRBcDJKWkVvRTlwWHhaM3IxVVdldzA0Y3p4bWdKOEZQMXp0WllXVkZBV0ZWaScsXG4gICAgICAgICdUajkzMFRCRDdMMWZZL01ENGZLNnhqRUc3ejVHVDhrNHRuNG1MbS9QcFdNYmFySWdsZk1vcFR5MU0vcHkyY0lEJyxcbiAgICAgICAgJy8yU2o3SWtoM1VGaUcrem00c1ZpWWM1cm9OYk15OGl4ZW9LaXh4aTk5TXg4SU5hMmN4TmZxYmFiamJsRnljMFonLFxuICAgICAgICAnQndtYkljK1ppWTJtZVJOSTV5L3RrMGdSRDdoVDg0SVhHR2w2L21IMDBic1gva2tXZEtHZVR2ejhzNUc4UkRIYScsXG4gICAgICAgICdaYTRIZ0xiWEl0a1gvUWFydlJTOWt2a0QwMXVqSGZqKzFadmdtT0J0dE5mUDBwOEJRTElJQ3F2ZzFlWUQ5YVBCJyxcbiAgICAgICAgJytHdE9aMkYzK2s1VnlCTDV5SW4vczY1U0JqTk84RnFzM2FMMHgrcDdzMWNmVXp4OEo4YThuV3BxcS9xSVFJcWcnLFxuICAgICAgICAnWkpINk1aUkt1UXdzY3dINk5XZ3NTVndjblZDQVhuWU9wYkh4RlErajdSYkYvK3VpdXFVK0RGSC9SZDVwaWs4YicsXG4gICAgICAgICcwRHFucDB5ZmVmcmtqUTBudXZ1YmdCNlJ2ODltSHBudnVKZkZKUklucGc0bHJId0x2UndkcE4ySERvekZIY0tLJyxcbiAgICAgICAgJ2FPVT0nLFxuICAgICAgICAnPTRpR3QnLFxuICAgICAgICAnLS0tLS1FTkQgUEdQIE1FU1NBR0UtLS0tLSdcbiAgICAgIF0uam9pbihcIlxcblwiKSk7XG4gIHByaXZfa2V5WzBdLnN1YktleXNbMF0uZGVjcnlwdFNlY3JldE1QSXMoXCJhYmNkXCIpO1xuICB2YXIgcmV0ID0gbXNnWzBdLmRlY3J5cHRBbmRWZXJpZnlTaWduYXR1cmUoXG4gICAgICB7IGtleTogcHJpdl9rZXlbMF0sIGtleW1hdGVyaWFsOiBwcml2X2tleVswXS5zdWJLZXlzWzBdfSxcbiAgICAgIG1zZ1swXS5zZXNzaW9uS2V5c1swXSxcbiAgICAgIFt7b2JqOnB1Yl9rZXlbMF0sIGtleUlkOiBwdWJfa2V5WzBdLmdldEtleUlkKCl9XSk7XG4gIHJlc3VsdFswXSA9IG5ldyB0ZXN0X3Jlc3VsdChcIlRlc3Rpbmcgc2lnbmF0dXJlIGNoZWNraW5nIG9uIENBU1Q1LWVuY2lwaGVyZWQgbWVzc2FnZVwiLFxuICAgICAgICAgIHJldC52YWxpZFNpZ25hdHVyZXNbMF0gPT0gdHJ1ZSk7XG5cbiAgLy8gZXhlcmNpc2VzIHRoZSBHbnVQRyBzMmsgdHlwZSAxMDAxIGV4dGVuc2lvbjpcbiAgLy8gdGhlIHNlY3JldHMgb24gdGhlIHByaW1hcnkga2V5IGhhdmUgYmVlbiBzdHJpcHBlZC5cbiAgdmFyIHByaXZfa2V5X2dudXBnX2V4dCA9IG9wZW5wZ3AucmVhZF9wcml2YXRlS2V5KFtcbiAgICAgICAgJy0tLS0tQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLLS0tLS0nLFxuICAgICAgICAnVmVyc2lvbjogR251UEcgdjEuNC4xMSAoR05VL0xpbnV4KScsXG4gICAgICAgICcnLFxuICAgICAgICAnbFFHcUJGRVJuck1SQkFEbU0waElma0kzeW9zamdiV285djBMbnIzQ0NFKzhLc01zemdWUytoQnUwWGZHcmFLbScsXG4gICAgICAgICdpdmNBMmFhSmltSHFWWU9QN2dFbndGQXhIQkJwZVRKY3U1d3pDRnlKd0VZcVZlUzNubmFJaEJQcGxTRjE0RHVmJyxcbiAgICAgICAgJ2k2YkI5UlY3S3hWQWc2YXVubU0ydEF1dHFDK2EweTJyRGFmN2prSm9aOWdXSmUyekkrdnJhRDZmaXdDZ3h2SG8nLFxuICAgICAgICAnM0lnVUxCOVJxSXFwTG9NZ1hmY2pDK2NELzFqZUpsS1JtK243MXJ5WXdUL0VDS3NzcEZ6N1MzNno2cTNYeVM4UScsXG4gICAgICAgICdRZnJzVXoycDFmYkZpY3ZKd0lPSjhCMjBKL04yL25pdDRQMGdCVVRVeHYzUUVhN1hDTS81Ni94ckdreUJ6c2NXJyxcbiAgICAgICAgJ0F6Qm95L0FLOUs3R042ejEzUm96dUFTNjBGMXhPN01RYzZZaTJWVTNlQVNEUUVLaXlML1ViZi9zL3JrWitzR2onLFxuICAgICAgICAneUppekJBQ3R3Q2JRekErejlYQlpOVWF0NU5QZ2NaejVRZWgxbndGOU54bnI2cHlCdjd0a3JMaC8zZ3hSR0hxRycsXG4gICAgICAgICcwNjNkTWJVazhwbVVjSnpCVXlSc05pSVBEb0VVc0xqWTV6bVpabXAvd2FBaHBSRXNuSzI5V0xDYnFMZHBVb3JzJyxcbiAgICAgICAgJ2MxSkpCc09ia0ExSU04VFpZOFlVbXZzTUV2QkxDQ2FudUtwY2xaWlhxZVJBZU9ISjB2NERaUUpIVGxVQnRCWlUnLFxuICAgICAgICAnWlhOME1pQThkR1Z6ZERKQWRHVnpkQzVqYjIwK2lHSUVFeEVDQUNJRkFsRVJuck1DR3dNR0N3a0lCd01DQmhVSScsXG4gICAgICAgICdBZ2tLQ3dRV0FnTUJBaDRCQWhlQUFBb0pFQkVubEFQTEZwNzR4YzBBb0xOWklOSGUweXRPc050TUN1THZjM1ZkJyxcbiAgICAgICAgJ3ZlUFVBSjlLWDNMNUlCcUhhcnNhK2FKSFg3cjc5NlNva1owQldBUlJFWjZ6RUFRQTJXa3htTmJmZU16R1VvY04nLFxuICAgICAgICAnM0pFVmUwbzZyeEd0NWVHclRTbVdpc2R1RFAzTVVSYWJoVVhuZjRUOG9hZVljYkpqa0xMeE1ySm1OcTU1bG4xZScsXG4gICAgICAgICc0YlNHNW1Ea2gvcnlLc1Y4MW0zRjBEYnFPL3ovODkxblJTUDVmb25kRlZyYWw0d3NNT3pCTmdzNHZWazdWL0YyJyxcbiAgICAgICAgJzBNUGpSOTBDSWhuVkRLUEFRYlFBKzNQalVSOEFBd1VFQUxuOTIyQUVFKzBkN3hTTU1GcFI3aWMzTWU1UUVHbnAnLFxuICAgICAgICAnY1Q0ZnQ2b2MwVUs1a0Fudktva3NaVWMwaHBCSGpYMXczTFR6ODQ3LzVoUkR1dUR2d3ZHTVdLOElmc2pPRjlUNycsXG4gICAgICAgICdySzhRdEp1QkV5Snhqb1NjQS9ZWlA1dlg0eTBVMXJlVUVhMEVkd21Wcm5aemF0TUFlMkZobGFSOVBsSGtPY201JyxcbiAgICAgICAgJ0Rad2tjRXhMMGRiSS9nTURBcnhaKzVON2tINHpZTHRyOWdsSlMvcEo3RjBZSnFKcE53Q2JxRDgrOERxSEQ4VXYnLFxuICAgICAgICAnTWdRL3J0QnhCSkpPYUYrMUFqQ2QxMjNoTGd6SWtrZmRUaDhsb1Y5aERYTUtlSmdtaUVrRUdCRUNBQWtGQWxFUicsXG4gICAgICAgICduck1DR3d3QUNna1FFU2VVQThzV252aEJzd0NmZFhqem52SENjNzMvNi9NaFdjdjNkYmVUVC93QW9MeWlaZzgrJyxcbiAgICAgICAgJ2lZM1VUOVFrVjlkMHNNZ3lMa3VnJyxcbiAgICAgICAgJz1HUXNZJyxcbiAgICAgICAgJy0tLS0tRU5EIFBHUCBQUklWQVRFIEtFWSBCTE9DSy0tLS0tJyxcbiAgICAgIF0uam9pbihcIlxcblwiKSk7XG4gIHByaXZfa2V5X2dudXBnX2V4dFswXS5zdWJLZXlzWzBdLmRlY3J5cHRTZWNyZXRNUElzKFwiYWJjZFwiKTtcbiAgdmFyIHJldDIgPSBtc2dbMF0uZGVjcnlwdEFuZFZlcmlmeVNpZ25hdHVyZShcbiAgICAgIHsga2V5OiBwcml2X2tleV9nbnVwZ19leHRbMF0sIGtleW1hdGVyaWFsOiBwcml2X2tleV9nbnVwZ19leHRbMF0uc3ViS2V5c1swXX0sXG4gICAgICBtc2dbMF0uc2Vzc2lvbktleXNbMF0sXG4gICAgICBbe29iajpwdWJfa2V5WzBdLCBrZXlJZDogcHViX2tleVswXS5nZXRLZXlJZCgpfV0pO1xuICByZXN1bHRbMV0gPSBuZXcgdGVzdF9yZXN1bHQoXCJUZXN0aW5nIEdudVBHIHN0cmlwcGVkLWtleSBleHRlbnNpb25zXCIsXG4gICAgICAgICAgcHJpdl9rZXlfZ251cGdfZXh0WzBdLnByaXZhdGVLZXlQYWNrZXQuczJrLnR5cGUgPT0gMTAwMSAmJlxuICAgICAgICAgIHJldC52YWxpZFNpZ25hdHVyZXNbMF0gPT0gdHJ1ZSk7XG5cbiAgLy8gRXhlcmNpc2VzIHRoZSBhYmlsaXR5IG9mIG9wZW5wZ3Bfa2V5cmluZy5nZXRQdWJsaWNLZXlzRm9yS2V5SWQgdG8gcmV0dXJuIHN1YmtleXNcbiAgdmFyIHRlc3Rfa2V5cmluZyA9IG5ldyBvcGVucGdwX2tleXJpbmcoKTtcbiAgdGVzdF9rZXlyaW5nLmluaXQoKTtcbiAgdGVzdF9rZXlyaW5nLmltcG9ydFB1YmxpY0tleShbXG4gICAgICAgICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0nLFxuICAgICAgICAnVmVyc2lvbjogR251UEcgdjEuNC4xMSAoR05VL0xpbnV4KScsXG4gICAgICAgICcnLFxuICAgICAgICAnbVFHaUJGRVJ2STRSQkFEME0vSEdnbEN0Vk5YUEY3MmVoVDhyaUFYcmwwclNlYzRSSkM2MUJoK1VBT2h4bjUrVScsXG4gICAgICAgICdmRGdvczVwMVNwSXpZbW4rTTg3Sm9TU1ZMQWpmYWtGazBnSGdSOUkzYnU3U0l3cTNCaWtrMVZ3M2dPK3lEU082JyxcbiAgICAgICAgJ1RLcExVRkdZRGlCU1NFMU1HZHhCYWRXTEUxaGxSZjVCMng2MmduR21qU3BTVmJseTMzUEZrb0RtcndDZzlyQXAnLFxuICAgICAgICAnUm1uY25GOUdoV2pPTEZrRW9RdzlZeDhFQU9zeHZxOElnNVoxZ2srWktmRFplZnRwSFJlM0ZkclJ0Ym5oeHZZWScsXG4gICAgICAgICc3eit3OXV6MUVwb1pVd0RSNUc0WDNoVHdKUTdsWG1JT3NrZy8rZVJNTEVBcUVZN2IvN3RXNlJhVUoyZDZFaHNpJyxcbiAgICAgICAgJ2RPUzg5Zkl4RWx3akFPblZPTTVTMjRmMEZEUVRUdG83UUJPb3hjTlRma0VKQ0hYU2xwb09VbUdBUDg1ZlhoM2wnLFxuICAgICAgICAneVBUR0JBQ0pmS2M3NlVuM1VXQzFzV0lSRHhZaXloM1pwWnlORXNrb1Y2RVNXOGpFSTFSbk1udjVUcmZHSkg1SycsXG4gICAgICAgICdFOGpXWDdUVG5vRnlQSnRCVGpsdWNBdGtRYVM0QmI3ZGcxTExqYTE3ekFxS05HT0pLMmI5ZmIyWitsblRqUGlZJyxcbiAgICAgICAgJ2k3RFBIMVhIbmZhRWV4amxoL1U3bVlhNVJyd0lwaFJ4Tmk4Z0N1eHY4NzRaTW1oRW43UVdWR1Z6ZERNZ1BIUmwnLFxuICAgICAgICAnYzNRelFIUmxjM1F1WTI5dFBvaGlCQk1SQWdBaUJRSlJFYnlPQWhzREJnc0pDQWNEQWdZVkNBSUpDZ3NFRmdJRCcsXG4gICAgICAgICdBUUllQVFJWGdBQUtDUkMwdThPME1vYTJKWXh5QUo5T2kyVWxjVVQwVkpOZ3dqeWwvVkY5WGNqZjlnQ2VKUHZ5JyxcbiAgICAgICAgJ2cvZnA0RUFVOE1KSWFOMnlNSThwTEZTNUFhSUVVUkc4bmhFRUFLVmdlTkR1WURQdWZMdUowR3JKVi9DYlhFamonLFxuICAgICAgICAnYUVQQTBpVFVxVjBuVENQZEFmUS9ubUUzZ2g1VWxOTXIvelNISitjNEZRaFlkTHJ6UkdET1N6VittZlBISDN0KycsXG4gICAgICAgICdZVngrd2F0MEJZd0FCcEhBdHNJdUxJVm8yUlFxWVpZSDg1dGF0d0JrbTcxSEhUM2ptbEVBdnI2TkZIMzgrdjNzJyxcbiAgICAgICAgJzN3NFdsMC9zZEh5YWVpU1hBS0N4SjRYMWVPZE43TDFycmJKb3pRL2dEQ0Z1VlFQL2RjVjZLc3NzOEF3NDQzakcnLFxuICAgICAgICAnQVlCTEhXaDZvNEdoQVk2L2gxa2lqRjB4RCt1Yyt0Tm1UUW5RaTF0RU9vVGVJWk1YblNSd3RrOFhFdUpra2JBUCcsXG4gICAgICAgICcrdXl2TWd5VjN3cms5emthVEFpbjducmpBRVJ4ZXpGT2RCRU90bkIxQ292Snh0TW4rUlJ4YU1FR3BDNEduRVR5JyxcbiAgICAgICAgJ041KzZGa0x1TGNOWGlDUVA3NWFqek9BTjFhSUQvanVOalVOcEJiTnBmcUJWN2oxSytLbjBuOUhZVHlRbDlnaHknLFxuICAgICAgICAnMDI2Ky80YzhhZzJIVitiZzNCRDdjMlZUVnU5eEJPREhzZnUwcThRbC9RQjlXOHRtWXVnVTZEZVhNSGFlV1BVSCcsXG4gICAgICAgICdwaDk4Z3VNOWtGMnlISWlSQnZBZDVpN3dPanduK0kvSXI2bkJSMnl4SjNwMzFDRFVuVWxialRQWWc3bXRRdkhXJyxcbiAgICAgICAgJ0VZMkNwNFNXaUpFRUdCRUNBQWtGQWxFUnZKNENHd0lBVWdrUXRMdkR0REtHdGlWSElBUVpFUUlBQmdVQ1VSRzgnLFxuICAgICAgICAnbmdBS0NSQU1pTWVSMjk2WTJTanlBSjlWM3dSSkoyU3phenFhbDRraFdHZkx1NVI2L3dDZlFRSVJEMjR5VmR6OCcsXG4gICAgICAgICcyYSsyZUNyd3lBTFQyR0FpaEFDZlMwbldNM2EwZ3RJVHFuZ3BKc1J3cytFcCtlSUFuMTVxRDJpdHV0eE5iOE5JJyxcbiAgICAgICAgJ2JSMmdCQjVRbVZKMycsXG4gICAgICAgICc9cEdBNicsXG4gICAgICAgICctLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tJ1xuICAgICAgICBdLmpvaW4oXCJcXG5cIikpO1xuXG4gIHZhciBtc2cyID0gb3BlbnBncC5yZWFkX21lc3NhZ2UoW1xuICAgICAgICAnLS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tJyxcbiAgICAgICAgJ1ZlcnNpb246IEdudVBHIHYxLjQuMTEgKEdOVS9MaW51eCknLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2tBMERBQUlSRElqSGtkdmVtTmtCckIxaUIyWnZieTUwZUhSUkViejNWRVZUVkNCRVFWUkJJREV5TXpRMU5vaEcnLFxuICAgICAgICAnQkFBUkFnQUdCUUpSRWJ6M0FBb0pFQXlJeDVIYjNwaloyVGNBbjMyTHBERXVIZTlRclNSbHl2U3VSRUtOT0Z3eicsXG4gICAgICAgICdBSjl6aDR6c0s0R0lQdUV1ODFZUE5tSHNqdTdEWWc9PScsXG4gICAgICAgICc9V2FTeCcsXG4gICAgICAgICctLS0tLUVORCBQR1AgTUVTU0FHRS0tLS0tJ1xuICAgICAgICBdLmpvaW4oXCJcXG5cIikpO1xuICB2YXIgcHViS2V5ID0gdGVzdF9rZXlyaW5nLmdldFB1YmxpY0tleXNGb3JLZXlJZChtc2cyWzFdLnNpZ25hdHVyZS5pc3N1ZXJLZXlJZCk7XG4gIHJlc3VsdFsyXSA9IG5ldyB0ZXN0X3Jlc3VsdChcIlRlc3Rpbmcga2V5cmluZyBwdWJsaWMgc3Via2V5IHN1cHBvcnRcIixcbiAgICAgICAgICBwdWJLZXkgIT0gbnVsbCAmJiBcbiAgICAgICAgICBwdWJLZXkubGVuZ3RoID09IDEgJiYgXG4gICAgICAgICAgbXNnMlsxXS5zaWduYXR1cmUudmVyaWZ5KG1zZzJbMF0uZGF0YSwgcHViS2V5WzBdKSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vdW5pdC5qcycpO1xuXG5yZXF1aXJlKCcuL2NyeXB0by9oYXNoL3NoYS5qcycpO1xucmVxdWlyZSgnLi9jcnlwdG8vaGFzaC9tZDUuanMnKTtcbnJlcXVpcmUoJy4vY3J5cHRvL2hhc2gvcmlwZW1kLmpzJyk7XG5cbnJlcXVpcmUoJy4vY3J5cHRvL2NpcGhlci9hZXMuanMnKTtcbnJlcXVpcmUoJy4vY3J5cHRvL2NpcGhlci9ibG93ZmlzaC5qcycpO1xucmVxdWlyZSgnLi9jcnlwdG8vY2lwaGVyL2Nhc3Q1LmpzJyk7XG5yZXF1aXJlKCcuL2NyeXB0by9jaXBoZXIvZGVzLmpzJyk7XG5yZXF1aXJlKCcuL2NyeXB0by9jaXBoZXIvdHdvZmlzaC5qcycpO1xuXG5yZXF1aXJlKCcuL2NyeXB0by9vcGVucGdwLmNyeXB0by5qcycpO1xucmVxdWlyZSgnLi9jcnlwdG8vb3BlbnBncC5zaWdjaGVjay5qcycpO1xuXG4iLCJ2YXIgcHJvY2Vzcz1yZXF1aXJlKFwiX19icm93c2VyaWZ5X3Byb2Nlc3NcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0dGVzdHM6IFtdLFxuXHRyZWdpc3RlcjogZnVuY3Rpb24oc3RyX3RpdGxlLCBmdW5jX3J1bnRlc3QpIHtcblx0XHR0aGlzLnRlc3RzLnB1c2goeyB0aXRsZTogc3RyX3RpdGxlLCBydW46IGZ1bmNfcnVudGVzdCB9KTtcblx0fSxcblx0XG5cdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHRlc3QgPSB0aGlzLnRlc3RzLnNoaWZ0KCk7XG5cblx0XHR2YXIgcmVzdWx0ID0ge1xuXHRcdFx0dGl0bGU6IHRlc3QudGl0bGVcblx0XHR9O1xuXG5cblx0XHRyZXN1bHQudGVzdHMgPSB0ZXN0LnJ1bigpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHRydW5fYWxsOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgcGFzc2VkID0gdHJ1ZTtcblxuXHRcdHdoaWxlKHRoaXMudGVzdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IHRoaXMucnVuKCk7XG5cblx0XHRcdGNvbnNvbGUubG9nKCdUZXN0OiAnICsgcmVzdWx0LnRpdGxlKTtcblxuXHRcdFx0Zm9yKHZhciBpIGluIHJlc3VsdC50ZXN0cykge1xuXG5cdFx0XHRcdHZhciByZXMgPSByZXN1bHQudGVzdHNbaV0ucmVzdWx0ID9cblx0XHRcdFx0XHQnU1VDQ0VTUycgOiAnRkFJTEVEJztcblxuXHRcdFx0XHRjb25zb2xlLmxvZyhyZXN1bHQudGVzdHNbaV0uZGVzY3JpcHRpb24gKyAnICcgKyByZXMpO1xuXG5cdFx0XHRcdHBhc3NlZCA9IHBhc3NlZCAmJiByZXN1bHQudGVzdHNbaV0ucmVzdWx0O1xuXHRcdFx0fVx0XHRcdFx0XG5cdFx0fVxuXG5cdFx0aWYoIXBhc3NlZCkgcHJvY2Vzcy5leGl0KDEpO1xuXHR9LFxuXHRcdFxuXHRyZXN1bHQ6IGZ1bmN0aW9uKHN0cl9kZXNjcmlwdGlvbiwgYm9vbGVhbl9yZXN1bHQpIHtcblx0XHR0aGlzLmRlc2NyaXB0aW9uID0gc3RyX2Rlc2NyaXB0aW9uO1xuXHRcdHRoaXMucmVzdWx0ID0gYm9vbGVhbl9yZXN1bHQ7XG5cdH1cbn1cblxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxucHJvY2Vzcy5uZXh0VGljayA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNhblNldEltbWVkaWF0ZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnNldEltbWVkaWF0ZTtcbiAgICB2YXIgY2FuUG9zdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgJiYgd2luZG93LnBvc3RNZXNzYWdlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyXG4gICAgO1xuXG4gICAgaWYgKGNhblNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGYpIHsgcmV0dXJuIHdpbmRvdy5zZXRJbW1lZGlhdGUoZikgfTtcbiAgICB9XG5cbiAgICBpZiAoY2FuUG9zdCkge1xuICAgICAgICB2YXIgcXVldWUgPSBbXTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChldi5zb3VyY2UgPT09IHdpbmRvdyAmJiBldi5kYXRhID09PSAncHJvY2Vzcy10aWNrJykge1xuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goZm4pO1xuICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKCdwcm9jZXNzLXRpY2snLCAnKicpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgICB9O1xufSkoKTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuXG4vLyBUT0RPKHNodHlsbWFuKVxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG4iXX0= ; \ No newline at end of file